Рекомендательные системы
Последовательные рекомендации
Netflix 2016. RNN-based рекомендации заменяют matrix factorization. Ключевое открытие: история просмотров - это последовательность, а не набор. Следующий фильм определяется последними 3-5 просмотренными, а не усреднением всей истории. TikTok идёт дальше: Transformer over 100-item sequence предсказывает следующее видео за < 10 мс. Архитектура эволюционирует от GRU4Rec до SASRec до BERT4Rec - каждый шаг раскрывает новый аспект пользовательского поведения во времени.
- TikTok: Transformer over 100-item session sequence предсказывает следующее видео, учитывая паттерны досмотра и переключений
- Spotify Discover Weekly: sequential patterns в listening history выявляют «настроение дня» через временные переходы между жанрами
- Amazon: «customers also viewed» переосмыслен через SASRec - порядок просмотров товаров кодирует намерение покупки
- Booking.com: sequential hotel recommendations через BERT4Rec-based model учитывают историю поездок и сезонные паттерны
Предварительные знания
- Нейросетевые рекомендательные модели (NCF, эмбеддинги)
- Рекуррентные сети и механизм внимания как способы обработки упорядоченных данных
- Понятие истории взаимодействий пользователя с товарами
От GRU4Rec к BERT4Rec: эпоха моделей последовательностей
В 2016 году Balazs Hidasi с коллегами опубликовал GRU4Rec - первую работу, где сессия просмотров моделируется как последовательность через рекуррентную сеть, а не как набор товаров. Она показала, что порядок несёт намерение. В 2018 году Wang-Cheng Kang и Julian McAuley заменили RNN на self-attention в SASRec: модель напрямую обращается к любому предыдущему элементу последовательности и обучается заметно быстрее. В 2019 году Fei Sun с коллегами из Alibaba представил BERT4Rec, применив masked-item задачу из BERT, чтобы использовать контекст с обеих сторон. За три года последовательные рекомендации прошли путь от нишевой идеи до архитектуры, стоящей за лентами TikTok, Amazon и Booking.com.
GRU4Rec: рекуррентные сети для сессий
Netflix 2016. Команда по рекомендациям заменяет matrix factorization рекуррентной сетью. Наблюдение: история просмотров - это последовательность, а не набор. Следующий фильм зависит от последних нескольких просмотренных, а не от усреднения всей истории. GRU4Rec (Hidasi et al., 2016) - первая работа, применившая GRU к session-based рекомендациям. Входные данные: последовательность item ID в сессии. Выход на каждом шаге: распределение вероятностей по всем item.
GRU предпочтительнее LSTM для рекомендаций: меньше параметров на одну сессию (2 гейта вместо 3), быстрее на коротких сессиях (5-20 item). Zalando использовал GRU4Rec для session-based рекомендаций в e-commerce и получил +15% CTR против item-KNN.
Session-parallel mini-batches - ключевой трюк GRU4Rec. Каждая позиция в батче - отдельная сессия. Скрытые состояния сохраняются между шагами внутри сессии, но не между сессиями. Это позволяет обрабатывать тысячи сессий параллельно без трункации.
Ограничение GRU4Rec: нет механизма внимания к удалённым item. Если пользователь смотрел фильм 15 позиций назад, GRU постепенно «забывает» его. Для длинных сессий (Netflix, YouTube) это критично - именно это мотивирует переход к self-attention.
Почему GRU4Rec использует session-parallel mini-batches вместо стандартного батчинга?
Self-Attention для последовательностей item
2018 год. Self-attention для NLP уже показал, что длинные зависимости можно захватывать напрямую - без рекуррентного прохода. Та же идея применяется к item-последовательностям. Каждый item в истории пользователя «смотрит» на все остальные item и взвешивает их по релевантности. Positional embeddings кодируют порядок: item на позиции 1 и item на позиции 10 имеют разные контексты даже при одинаковом ID.
Сложность self-attention: $O(L^2 d)$, где $L$ - длина последовательности, $d$ - размерность. RNN: $O(L d^2)$. При $L < d$ attention быстрее. Типичные сессии: $L = 50{-}200$, $d = 64{-}256$. При $L = 100$, $d = 256$: attention за $O(2.56M)$, RNN за $O(6.55M)$ операций.
Positional encoding критичен для рекомендаций. Пример: пользователь смотрит Action-фильм, затем Comedy, затем Action. Без позиций модель не различает «первый Action» и «третий Action». Netflix обнаружил, что последние 3-5 item имеют несоразмерно высокое влияние на следующий выбор - это напрямую кодируется через learnable positional embeddings.
При каком соотношении L и d self-attention эффективнее RNN по вычислительной сложности?
SASRec: однонаправленный Transformer для рекомендаций
Self-Attentive Sequential Recommendation (Wang-Cheng Kang, Julian McAuley, 2018). Идея проста: взять Transformer decoder (только past items), убрать cross-attention, оставить 2 слоя self-attention с causal mask. Causal mask означает, что item на позиции $t$ видит только item $1, 2, ..., t-1$ - никакого будущего. Inference: последнее скрытое состояние умножается на матрицу item-эмбеддингов, top-K по inner product - это и есть рекомендации.
SASRec стал стандартным бейзлайном для sequential recommendations. На Amazon Beauty: NDCG@10 = 0.0735 (SASRec) vs 0.0627 (GRU4Rec) vs 0.0481 (Caser). На MovieLens-1M: HR@10 = 0.8295 vs 0.7367 (GRU4Rec). При этом SASRec требует в 2-3 раза меньше параметров, чем BERT4Rec.
Binary cross-entropy с negative sampling - предпочтительнее softmax для SASRec. Для каждого позитивного item семплируется 1 негативный (не взаимодействовавший). Softmax по всем item (100K+) слишком дорог. Approximated softmax через negative sampling сохраняет качество при в 50-100 раз меньших вычислениях.
Почему SASRec использует causal (однонаправленный) attention, а не bidirectional?
BERT4Rec: двунаправленное обучение для рекомендаций
BERT4Rec (Sun et al., 2019) применяет идею BERT к item-последовательностям. Cloze task: случайно маскируется 15-20% item в сессии, модель обучается восстанавливать их по контексту в обе стороны. Bidirectional attention означает, что item[3] видит item[1], item[2] и item[5], item[6] - если item[4] замаскирован. Hypothesis: двунаправленный контекст даёт более богатые item-представления.
Inference в BERT4Rec: в конец последовательности добавляется [MASK] токен, модель предсказывает его - это и есть следующий item. Парадокс: при тренировке модель использует двунаправленный контекст, при инференсе - нет. [MASK] на последней позиции видит только прошлое (нет будущего), что близко к unidirectional setup.
Сравнение на MovieLens-20M: BERT4Rec NDCG@10 = 0.2711 vs SASRec = 0.2713. Разница в пределах шума. На Amazon Books (sparse): SASRec лучше на 8%. Вывод: bidirectional обучение даёт преимущество на плотных датасетах, проигрывает на разреженных. Большинство production систем используют SASRec или его вариации.
Bidirectional attention всегда лучше unidirectional для sequential recommendations
SASRec (unidirectional) сопоставим или лучше BERT4Rec на большинстве бенчмарков, особенно на sparse данных
Bidirectional обучение через Cloze task - это proxy objective, не совпадающий с целью next-item prediction. При инференсе [MASK] токен видит только прошлое, что воспроизводит unidirectional setup. Преимущество bidirectional появляется только на dense датасетах с длинными сессиями, где богатство контекста важнее точности train/inference alignment.
Какой ключевой компромисс в BERT4Rec между тренировкой и инференсом?
Ключевые идеи
- **GRU4Rec** (2016) - первое применение RNN к сессионным рекомендациям. Session-parallel батчинг сохраняет скрытые состояния. Ограничение: нет прямого доступа к удалённым item.
- **Self-Attention** захватывает зависимости на любом расстоянии за $O(L^2 d)$. Positional embeddings кодируют порядок item. Эффективнее RNN при $L < d$.
- **SASRec** (2018) - 2-слойный Transformer с causal mask. Unidirectional attention соответствует задаче next-item prediction. Стандартный бейзлайн для sequential rec.
- **BERT4Rec** (2019) - Cloze task с bidirectional attention. Train/inference mismatch: при инференсе [MASK] видит только прошлое. Преимущество только на dense датасетах.
Связанные темы
Sequential recommendations соединяют NLP-архитектуры с задачами рекомендательных систем:
- Deep Learning для рекомендаций — GRU4Rec и SASRec строятся на neural CF и embedding-подходах из предыдущего урока
- Коллаборативная фильтрация — Sequential модели решают проблему статичности CF: user и item embeddings обновляются с каждым взаимодействием
- Transformer и Self-Attention — SASRec и BERT4Rec - прямые адаптации Transformer для дискретных item-последовательностей
- Метрики оценки моделей — NDCG@K, HR@K, MRR - стандартные метрики для оценки sequential рекомендаций
- API интеграция AI-сервисов — Деплой sequential рекомендаций требует real-time inference API с < 10 мс latency
Вопросы для размышления
- SASRec использует learnable positional embeddings, а не sinusoidal. При чём здесь разница между «абсолютной позицией в сессии» и «относительным расстоянием до последнего item»? Какой подход лучше для рекомендаций?
- Если пользователь просмотрел 500 item за полгода, а модель обучена на sequences длиной до 200 - как правильно трункировать? С начала (удалить старые) или с конца (удалить новые)? Как это влияет на качество?
- BERT4Rec показывает преимущество на dense датасетах и проигрывает на sparse. Какой механизм объясняет это? Связано ли это с train/inference mismatch или с качеством item-представлений?