В прошлом посте мы поставили задачу Next Item Prediction (NIP). Теперь давайте разбирать первый «классический» подход, который обычно открывает эту тему — SASRec (Self-Attentive Sequential Recommendation).
Как всегда, держим в голове маркетплейс и нашу матрицу U × D, где у каждого пользователя есть последовательность из последних D действий.
💡 Идея SASRec в двух словах
SASRec — это Transformer-only модель, которая использует self-attention, чтобы понять, какие прошлые действия пользователя важны для предсказания следующего айтема. Ключевая мысль простая: не все предыдущие покупки одинаково полезны. Купил чехол для iPhone год назад — сомнительно, что это важно сейчас. Купил айфон вчера — совсем другое дело.
🧱 Из чего состоит SASRec
Разберём по шагам.
1️⃣ Embedding-слой
Каждый айтем
Item_i кодируется в эмбеддинг размерности H, раскладывающийся на• Item Embedding
• Positional Embedding (очень важно!)
Почему позиция важна? Потому что последовательности:
iPhone → Чехол и Чехол → iPhone — это вообще разные истории.
На выходе получаем тензор размера: U × D × H
2️⃣ Masked Self-Attention
SASRec использует causal masking, то есть при предсказании айтема на позиции
t модель не видит будущие позиции t+1, t+2, ... Иначе был бы читинг. Self-attention отвечает на вопрос, на какие прошлые айтемы стоит обратить внимание, чтобы угадать следующий?Формально — обычный Transformer Encoder:
• Multi-Head Attention
• Residual connections
• LayerNorm
Без энкодер-декодер истории, всё строго sequential.
3️⃣ Предсказание Next Item
Для каждой позиции
t модель пытается предсказать айтем t+1.На практике чаще всего:
• берем последнюю позицию
• сравниваем её эмбеддинг со всеми
M айтемами• считаем
softmax или sampled softmax
• обучаемся максимизировать вероятность правильного следующего айтема.🧊 Что с холодными пользователями?
SASRec спокойно работает с паддингами:
• паддинги маскируются
• attention их просто игнорирует
Но важно понимать: SASRec — это purely sequential модель. Что это значит?
Если у пользователя 0 или 1 действие, сигнал слабый.
Для совсем холодного старта чаще приходится:
• добавлять популярные айтемы
• комбинировать с non-personalized логикой
👍 Почему SASRec так популярен
✔ Простая и понятная архитектура
✔ Отлично ловит long-range зависимости (по крайней мере, так было в 2018 🤷♂️)
✔ Хорошо масштабируется на большое число айтемов
Не зря его до сих пор используют как точку отсчета почти во всех статьях про NIP.
👀 Ограничения, о которых важно помнить
✖ Нет bidirectional-контекста (в отличие от BERT4Rec)
✖ Не использует user features
✖ Плохо решает cold start без костылей
✖ Использует только позтивные действия в истории пользователя (в то время, как негативные действия могут быть полезны для понимания контекста, что отображено в статьях про Аргус). Так например, для онлайн-кинотеатра мы будем использовать только историю просмотра, хотя могли бы учитывать и те фильмы, от просмотра которых юзер отказался.
Но как первый серьезный Transformer для рекомендаций — это абсолютная классика
Изображение взято из статьи на Хабре
