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 позволяет каждому действию взвешивать весь контекст сессии.
- Такие модели лежат в основе современных лент и требуют больших последовательных логов.