Внутренние представления в рекомендациях интереснее, чем кажутся
В реальных рекомендательных системах из-за высокой нагрузки глубокое обучение можно применять не любым образом. Обычно мы ограничиваем себя следующей схемой:
- Пользователь в момент запроса представлен эмбеддингом u
- Документ-кандидат представлен эмбеддингом d
Далее мы их перемножаем и получаем "релевантность".
В самой базовой модели оба эти эмбеддинга - это обучаемые векторы, но в современных системах эмбеддинг пользователя - это выход из модели (например, трансформера), который запускают над последовательностью исторических событий. Однако, в теории "пропускная способность" тут не выше, чем у базовой! Мы получаем вектор той же размерности, как если бы его просто обучали, как параметр. Может быть, мы могли бы в теории просто выучить такие же "глубокие" векторы в базовой модели?
Не совсем, и на это есть ряд причин:
1) У трансформера меньше параметров (внезапно) и он их более равномерно утилизирует.
Допустим, 100 миллионов пользователей с векторами по 512 флотов - это 200 гигабайт весов. При этом веса редких пользователей обучаются мало шагов, частых - много. Наши трансформеры весят порядка 1гб, и на каждом сэмпле используются все веса модели.
2) Задавая пользователя его историей, а не конкретным вектором, мы готовы к изменению пользователя со временем и к новым пользователям.
3) Может звучать мутновато, но в ходе обучения базовой модели на каждом шаге происходит обмен информацией между 2 сущностями. Когда мы обучаем трансформер, то информацией обмениваются все сущности - документы из истории и основной документ. Это позволяет эмбеддингам документов быстрее "синхронизироваться" между собой.
Недавно стало понятно, что мой слабый разум был заперт в трансформерном пузыре, и на самом деле можно пойти ещё дальше в усилении этих позитивных эффектов. Мои дорогие коллеги из команды направили меня на путь развития, и в следующих постах я обязательно поделюсь этим с вами.
@knowledge_accumulator
Post #118
1.87K
- 👍 14
- 🔥 7