
Упрощать и искать похожие детали, очень полезный навык! Предлагаю быстро пробежаться и попробовать найти ту самую серебряную пулю в RecSys !
Введение
Постановка задачи обычно такова: у нас есть запрос и множество документов, из которых нужно выбрать наиболее релевантный. Это может быть пользователь и музыкальный трек, текстовый запрос и рекламный баннер или даже документы из одного домена.
В современных системах чаще используются модели с поздним связыванием (late interaction): есть две независимые башни для query и doc, которые преобразуют их в вектора. Далее релевантность аппроксимируется через скалярное произведение: . Это может быть клик/не клик или ручная разметка.
Важно: скалярное произведение не нормировано, так как качество выше, если модель сама учит регулизацию. Если грамотной регулизации нет — лучше использовать нормированые вектора(aka косинусная мера).
Почему это удобно?
Можно независимо в оффлайне пересчитывать документы, не зависеть от рантайма.
Не нужно каждый раз пересчитывать декартово произведение (doc, query) векторов.
Можно построить KNN и искать быстро!
Универсальный интерфейс, подходящий для многих задач.
Можно эффективно считать FPS (Full Product Softmax) — ранее связывание + претраин FPS + SFT эффективнее, чем позднее связывание без FPS претраина.
Что такое DSSM? Звучит мощно, не так ли?
В 2008 году Microsoft выпустили статью Learning Deep Structured Semantic Models for Web Search using Clickthrough Data, где показали DSSM (Deep Semantic Similarity Model): две башни (query, doc) и в таргете клик! С тех пор это название закрепилось за таким дизайном моделей.
Теперь ты знаешь, что значит это сокращение захватившее все продакшены бигтехов там где есть DL :D

Запросная часть обычно считается в рантайме, поэтому её делают легче, чем документную. Есть трюки для оптимизации нагрузки: кеширование, горизонтальный рост и др.
Классический пример башен — трансформеры над последовательностями + MLP (для категориальных/вещественных признаков и результата трансформера).
Ранжирующие лоссы
В поиске самого релевантного документа оказывается, что абсолютные скоры не важны — важен порядок! Здесь открывается пространство для ранжирующих функций ошибок.
В течении написания наткнулся на офигетельный хендбук Яндекса по рексису. Многое буду брать от туда
Важное наблюдение:
Некоторые авторы пытались вместо косинусной меры использовать обучаемый MLP, но это оказалось неэффективно.
Обозначения
,
— эмбеддинги объектов
— релевантность (помним, при нормализации векторов)
Основной трюк в обучении рекомендательных систем — сбор сэмплов из клика (обычно одного) и множества негативов (практически любой другой документ). Но использовать слишком много негативов неразумно! Здесь помогает negative sampling (ещё из Word2Vec). Обычно берём 1 позитив () и
–20 негативов (
).
PointWise | Softmax Loss
Классический способ — предсказывать абсолютную вероятность:
Pairwise loss | PairCE + TripletLoss
Теперь важно лишь, что релевантнее
.
Pair Cross-Entropy loss (PairCE):
Triplet loss:
Все эти лоссы учат отталкивать разнорелевантные пары. Softmax Loss дополнительно учит предсказывать вероятность, что усложняет задачу для сетки, ведь для ранжирования это избыточно.
ListWise | FPSLoss
Часто используют PairCE/TripletLoss с одним кликом и кучей негативов — это похоже на ListWise, но можно ли придумать что-то новое? Да! В игру мощно врывается — CLIP (2021), решает задачу — определение семантической близости картинки и текста, где найден эффективный способ получения негативов.

Full Product Softmax loss (FPSLoss):
Собираем батч размера :
, где
— запрос,
— документ,
— релевантность (обычно положительная, часто клик и равен 1).
Составляем матрицу эмбеддингов запросов , документов
и вектор таргетов
.
Тогда перемножение матриц — это эффективный подсчёт dotproduct, а далее и вероятностей:

Остаётся, как и в Softmax, взять элементы только с диагонали:
Интуитивно понятно, что учится относительная вероятность при условии query . Обращу внимание, что легко можно добиться смену местами query и doc.
Также заметим, как хитро и качественно теперь негативы собираются!
А что с этим делать?

Предлагается следующее:
Определить архитектуры башен: наверняка это должна быть комбинации BERT + MLP
Собрать очень много данных для FPS лосса (обычно яркий положительный фидбек пользователя)
Сделать долгий претраин на FPS
Дофайнтюниться на свою задачу, если нужно
Заключение
Этим хотел показать, общий вид DL RecSys и на самом деле все кроется в маленьких деталях. Абсолютно точно, для каждой задачи нужно относиться критически и замерять профит от каждого действия, что в рексисе является очень не простой задачей!
Если статья была полезна — ставьте лайк, подписывайтесь и делитесь своим опытом в комментариях!