From 14282fc4d08627f993dd8affa43d64a0a31dd6e0 Mon Sep 17 00:00:00 2001 From: Nikolay Lysenko Date: Thu, 4 Jul 2024 13:37:33 +0300 Subject: [PATCH] feat: Describe transformers in recommender systems --- .../recommender_systems.ipynb | 38 +++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/notes/machine_learning/recommender_systems.ipynb b/notes/machine_learning/recommender_systems.ipynb index e23fa92..96a387c 100644 --- a/notes/machine_learning/recommender_systems.ipynb +++ b/notes/machine_learning/recommender_systems.ipynb @@ -59,7 +59,7 @@ " - градиентного бустинга,\n", " - нейронных сетей:\n", " - адаптации [DSSM](__home_url__/notes/DSSM (Deep Semantic Similarity Model)) под рекомендательные системы,\n", - " - [BERT4Rec](__home_url__/notes/BERT4Rec).\n", + " - [BERT4Rec](__home_url__/notes/Трансформерные модели в рекомендациях), [SASRec](__home_url__/notes/Трансформерные модели в рекомендациях), etc.\n", "\n", "Некоторые из перечисленных вариантов могут быть использованы и для извлечения кандидатов, если они достаточно быстры в рантайме. Действительно, top-$k$ товаров, отранжированных каким-либо методом, можно рассматривать в качестве кандидатов для более сложного метода.\n", "\n", @@ -357,9 +357,9 @@ ] }, "source": [ - "## BERT4Rec\n", + "## Трансформерные модели в рекомендациях\n", "\n", - "#### Классический вариант\n", + "#### BERT4Rec\n", "\n", "Задача выдачи рекомендаций на основании последовательности действий (sequential recommendation) ставится как предсказание следующего «предмета», с которым у пользователя будет положительное взаимодействие, исключительно по упорядоченному списку «предметов», с которыми до этого были положительные взаимодействия. Для решения этой задачи в статье [Sun et al., 2019](https://arxiv.org/pdf/1904.06690) модель [BERT](__home_url__/notes/BERT (Bidirectional Encoder Representations from Transformers)) адаптируется под предметную область рекомендательных систем.\n", "\n", @@ -369,13 +369,37 @@ "\n", "#### SASRec\n", "\n", - "Более ранний вариант BERT4Rec описан в статье [Kang et al., 2018](https://arxiv.org/abs/1808.09781) и называется Self-Attentive Sequential Recommender (SASRec). В нём задача восстановления скрытых токенов не нуждается в модификациях, потому что вместо этого модифицированы связи между трансформерными блоками. Модель сделана однонаправленной, то есть $i$-й в истории действий пользователя «предмет» может повлиять на векторное представление $j$-го, только если $j \\le i$.\n", + "Более ранний вариант BERT4Rec описан в статье [Kang et al., 2018](https://arxiv.org/abs/1808.09781) и называется Self-Attentive Sequential Recommender (SASRec). В нём задача восстановления скрытых токенов не нуждается в модификациях, потому что вместо этого модифицированы связи между трансформерными блоками. Модель сделана однонаправленной, то есть $i$-й в истории действий пользователя «предмет» может повлиять на векторное представление $j$-го, только если $i \\le j$.\n", "\n", - "#### Обобщения\n", + "#### Учёт признаков\n", "\n", - "Очевидно, что история действий пользователя не описывает его целиком, есть и другие пользовательские признаки. Также есть и признаки «предметов». Для совмещения способности модели BERT4Rec обрабатывать историю действий с возможностью учитывать иные признаки, можно доработать [двубашенную архитектуру](__home_url__/notes/Нейросетевые методы для заполнения кросс-табуляционной матрицы).\n", + "Очевидно, что история действий пользователя не описывает его целиком, ведь есть и другие пользовательские признаки. Также есть и признаки «предметов». Чтобы их учитывать, можно ввести нейронную сеть с [двубашенной архитектурой](__home_url__/notes/Нейросетевые методы для заполнения кросс-табуляционной матрицы).\n", "\n", - "<Заметка будет дописана.>" + "Пользовательская «башня» состоит из трансформерных блоков, где в качестве входов берутся:\n", + "* исторические действия, представленные как сумма трёх векторов размерности $d$:\n", + " - вложение «предмета» (обучаемое или заготовленное заранее на основании его контентных признаков, таких как название, описание, изображение и т.д.),\n", + " - обучаемое вложение типа действия, которое было совершено (клик, заказ и т.п.),\n", + " - вложение позиции в истории действий;\n", + "* любые иные признаки, сгруппированные по векторам размерности $d$, чтобы их можно было обрабатывать в том же трансформере;\n", + "* произвольное вложение \\-токена.\n", + "\n", + "Выходом пользовательской «башни» является векторное представление \\-токена.\n", + "\n", + "Для «предметов» же «башня» является многослойным перцептроном, как-либо обрабатывающим их признаки, а её выход имеет размерность $d$. Скалярное произведение этого вектора на выход пользовательской «башни» можно считать оценкой степени соответствия «предмета» пользователю.\n", + "\n", + "#### Индуктивность\n", + "\n", + "Ещё одна точка роста связана с тем, что BERT4Rec и SASRec работают с идентификаторами «предметов». Во-первых, из-за этого они трансдуктивны, то есть не способны ни делать предсказания для новых «предметов», ни учитывать их появление в истории пользователя. Во-вторых, количество обучаемых параметров как минимум пропорционально количеству «предметов», из-за чего для маркетплейсов, видеоплатформ и социальных сетей оно становится слишком большим. Действительно, если есть $l$ «предметов» и для каждого на входе в трансформер есть получение вложения размерности $d$ по его индексу (embedding lookup), то это уже $l \\times d$ обучаемых параметров.\n", + "\n", + "Способы решения этой проблемы таковы:\n", + "* использовать только заранее обученные векторные вложения (но тогда не будет возможности влиять на них),\n", + "* обучать вложения не для «предметов», а для токенов, входящих в их названия; это имеет смысл, если токенов меньше, чем «предметов» — тогда уменьшение количества обучаемых параметров также окажет регуляризационный эффект; и тут есть варианты:\n", + " - в качестве вложения «предмета» взять сумму вложений его токенов, то есть «предмет» рассматривается как «мешок токенов»,\n", + " - каждый токен считать самостоятельным элементом истории, который подаётся в трансформер (может оказаться вычислительно затратным, если история бывает длинной).\n", + "\n", + "#### Графовые нейронные сети\n", + "\n", + "Помимо истории действий текущего пользователя есть история действий всех пользователей с текущим «предметом». Чтобы учитывать и её, позволив похожим пользователям обмениваться информацией друг о друге, можно применить [графовые нейронные сети](__home_url__/tags/графы) к двудольному графу, вершинами которого являются пользователи и «предметы», а рёбрами являются взаимодействия. Трансформеры будут применяться в свёрточных слоях для агрегации вложений соседних вершин." ] }, {