Deep learning для рекомендаций

Урок обзорно проходит по нейросетевым моделям рекомендаций: нейро-CF, последовательные модели и трансформеры, которые учитывают порядок действий пользователя.

Последовательная рекомендация предсказывает следующий объект по упорядоченной истории действий пользователя, а не по неупорядоченному множеству оценок.

Нейро-CF: нелинейность поверх эмбеддингов

Матричное разложение комбинирует эмбеддинги простым скалярным произведением — это линейная операция. Neural Collaborative Filtering (NCF) заменяет произведение многослойной сетью: эмбеддинги пользователя и товара склеиваются и пропускаются через несколько слоёв, которые могут выучить сложные, нелинейные взаимодействия признаков. Так модель ловит закономерности, недоступные чистому матричному разложению.

Порядок имеет значение

Классические CF и MF видят историю как мешок оценок без времени. Но в реальности порядок важен: купив телефон, человек дальше ищет чехол; досмотрев первый сезон, хочет второй, а не первый. Последовательные модели учитывают именно порядок взаимодействий.

  • RNN/GRU (например, GRU4Rec). Рекуррентная сеть «прочитывает» историю по шагам, держа скрытое состояние интересов, и предсказывает следующий объект.
  • Трансформеры (SASRec, BERT4Rec). Механизм внимания позволяет каждому действию «смотреть» на все предыдущие и взвешивать их важность напрямую — то же self-attention, что в языковых моделях, но над последовательностью товаров вместо слов.
история:  [телефон] -> [чехол?] -> [наушники?]
                 attention смотрит на весь контекст и предсказывает следующий товар

Иллюстрация: предсказание следующего по биграммам

Полноценный трансформер требует torch, но саму идею «следующий зависит от предыдущего» легко показать счётной моделью на stdlib: соберём статистику переходов и предскажем следующий товар.

from collections import defaultdict, Counter

sessions = [
    ["телефон", "чехол", "наушники"],
    ["телефон", "чехол", "стекло"],
    ["телефон", "наушники"],
    ["ноутбук", "мышь", "сумка"],
    ["ноутбук", "мышь", "коврик"],
]
trans = defaultdict(Counter)
for s in sessions:
    for a, b in zip(s, s[1:]):
        trans[a][b] += 1

def next_item(prev):
    if prev not in trans:
        return None
    return trans[prev].most_common(1)[0][0]

print("После 'телефон' ->", next_item("телефон"))
print("После 'ноутбук' ->", next_item("ноутбук"))
print("После 'мышь'    ->", next_item("мышь"))

Вывод:

После 'телефон' -> чехол
После 'ноутбук' -> мышь
После 'мышь'    -> сумка

Это, конечно, лишь марковская «игрушка»: она смотрит только на один предыдущий шаг. Трансформер же взвешивает весь контекст сессии и обобщает на невиданные последовательности — но интуиция «следующее зависит от пройденного пути» ровно такая.

Как работает под капотом

Последовательные нейромодели обучают как языковые: на каждом шаге предсказать следующий объект, маскируя будущее. Эмбеддинги товаров плюс позиционные кодировки подаются в стек self-attention слоёв; на выходе — распределение по каталогу. Преимущество — учёт контекста и порядка; цена — вычислительная сложность и потребность в больших объёмах последовательных логов. Такие модели сегодня лежат в основе лент TikTok, YouTube Shorts и крупных маркетплейсов.

Частые ошибки

  • Игнорировать порядок там, где он важен. Для «следующего эпизода» или «следующей покупки» мешок оценок теряет ключевой сигнал.
  • Утечка будущего. При обучении последовательных моделей нельзя показывать модели то, что было после предсказываемого шага.
  • Сложная нейросеть вместо проверки baseline. Иногда простая последовательная эвристика уже близка — сравнивайте.

Итоги

  • NCF заменяет линейное произведение факторов обучаемой нелинейной сетью.
  • Последовательные модели (RNN, трансформеры) учитывают порядок действий.
  • Self-attention позволяет каждому действию взвешивать весь контекст сессии.
  • Такие модели лежат в основе современных лент и требуют больших последовательных логов.
Проверьте себя
1. Что отличает последовательные модели рекомендаций от классической CF?
AОни не используют эмбеддинги
BОни учитывают порядок взаимодействий, а не неупорядоченное множество
CОни работают только с оценками
DОни игнорируют историю пользователя
2. Что нового добавляет Neural Collaborative Filtering поверх матричного разложения?
AУдаляет эмбеддинги
BЗаменяет линейное скалярное произведение факторов обучаемой нелинейной сетью
CДелает модель линейной
DОтказывается от обучения