Упрощать и искать похожие детали, очень полезный навык! Предлагаю быстро пробежаться и попробовать найти ту самую серебряную пулю в 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

  • Дофайнтюниться на свою задачу, если нужно

Потихоньку начинаю писать в @noisetosignal — идёмте вместе!

Заключение

Этим хотел показать, общий вид DL RecSys и на самом деле все кроется в маленьких деталях. Абсолютно точно, для каждой задачи нужно относиться критически и замерять профит от каждого действия, что в рексисе является очень не простой задачей!


Если статья была полезна — ставьте лайк, подписывайтесь и делитесь своим опытом в комментариях!