Облегченное обучение представлению для эффективных и масштабируемых рекомендаций

В 2019 году мы создали команду для обновления моделей машинного обучения, лежащих в основе нашего механизма рекомендаций в Criteo. Существующий двигатель был оптимизирован в течение многих лет. Он был основан на крупномасштабной логистической регрессии и совместной фильтрации (документ RecSys’15). Пришло время для преображения.

Мы попробовали несколько подходов, прежде чем остановились на эффективной архитектуре кодер-декодер. Мы отправили его в производство и значительно увеличили доход Criteo.

Мы назвали наш подход LED, что означает облегченный кодировщик-декодер. LED обеспечивает 30-кратное ускорение времени вывода с небольшой потерей производительности по сравнению с лучшими известными базовыми показателями. Этот пост в блоге представляет собой легкое введение в бумагу.

В документе представлено подробное описание архитектуры нашей системы, от автономного обучения до онлайн-вывода, обеспечивающей 3200 запросов в секунду с задержкой менее миллисекунды на стандартных серверах центра обработки данных. Далее мы демонстрируем его работу в течение нескольких месяцев в масштабе.

Мы открываем код в виде модульной библиотеки для обучения модели тензорного потока под названием DeepR. Наша работа должна представлять интерес для практиков, желающих развернуть эффективную крупномасштабную рекомендательную систему в реальном мире.

Рекомендация в реальном мире

Ключевые ограничения типичного рекомендательного механизма веб-масштабирования следующие:

Масштаб. Система рекомендаций должна работать в масштабе миллиардов пользователей и сотен миллионов элементов.

Задержка. Система должна реагировать в течение нескольких миллисекунд, чтобы удовлетворить потребность в отображении баннеров в мобильных и веб-приложениях.

Отток: пользователи входят в систему и выходят из нее гораздо чаще, чем изменения в каталоге продуктов. Система не должна пересчитывать свои параметры для каждого обновления в пользовательской базе.

Множественные отзывы. Собираемые данные обычно включают разные типы отзывов (просмотры товаров и продажи, клики по баннерам). Мы ищем дизайн, который позволит извлечь как можно больше информации из доступных данных.

Эффективные модели для рекомендации

Хотя по системам рекомендаций в целом существовало значительное количество литературы, мы обнаружили, что лишь немногие из них ориентированы на эффективность в масштабе. Мы основывали наш подход на четырех вариантах дизайна:

Быстрый поиск ближайшего соседа: благодаря этой формулировке мы можем использовать эффективные методы приближенного ближайшего соседа во время вывода.

Амортизированный вывод. Использование амортизированного вывода заключается в использовании одной и той же процедуры для вычисления представлений пользователей, что фактически делает количество изучаемых параметров независимым от количества пользователей и решает проблему оттока пользователей. Это одна из сильных сторон вариационных автокодировщиков (VAE).

Потери на основе выборки. Вычислительная сложность комплексных потерь, таких как полиномиальная и гауссовская вероятности, линейна по количеству элементов, что делает их непригодными для наших требований. Вместо этого мы можем использовать потери на основе ранжирования, такие как байесовское персонализированное ранжирование (BPR), отрицательная выборка (NS) или методы на основе аппроксимации, такие как выборка суммы комплементарности (CSS).

Предварительное обучение. Хотя окончательная система рекомендаций оценивается по событиям кликов, мы можем использовать большой объем исторических данных (в основном просмотр событий) для предварительного обучения модели. На практике мы предварительно обучаем встраивания элементов в события просмотра, используя крупномасштабную матричную факторизацию.

Легкий энкодер-декодер

Из этих принципов мы разработали простой, но мощный подход. Модель имеет несколько параметров, одно встраивание и одно смещение на элемент. Он кодирует временную шкалу каждого пользователя, чтобы получить представление пользователя через простое среднее значение. Встраивания элементов предварительно обучаются с использованием крупномасштабной рандомизированной библиотеки SVD, исходный код которой был открыт Criteo за несколько лет до этого (spark-rsvd). Следующий рисунок суммирует алгоритм. Насколько это может быть проще? :)

Вот как выглядит архитектура.

Ориентиры

Мы сравнили LED с лучшими методами, доступными в то время, включая VAE и взвешенную матричную факторизацию. Вот результаты.

Мы заметили небольшое снижение производительности по сравнению с наиболее эффективным методом (VAE с полиномиальной потерей). Сейчас мы приближаемся к моменту, когда вступают в силу промышленные проблемы. Чисто ориентированный на производительность подход был бы недоволен потерей производительности и покончил бы с этим. В реальном мире все обстоит иначе: что, если мы добавим в смесь сложность системы и производительность в реальном времени?

Во-первых, мы оценили наш метод в производстве. Мы заметили, что светодиод работает лучше, чем все другие методы, включая упомянутый выше VAE. Это можно объяснить разницей в характере и распределении между реальным набором данных и ML20M.

Анализ сложности

История становится еще интереснее, если мы проведем анализ сложности. Обозначим 𝑑 размер встраивания, 𝐼 количество элементов и 𝑈 количество пользователей. Количество параметров LED линейно по количеству элементов (встраивания элементов 𝐼 × 𝑑 и смещения 𝐼), но не зависит от количества пользователей 𝑈 (в отличие от методов NCF или матричной факторизации). При использовании метода тонкой настройки проекта количество обучаемых параметров еще меньше, 𝑑 × 𝑑 +𝐼.

Для обучения требуется несколько обновлений на каждой временной шкале пользователя. Каждое обновление с использованием одной из выбранных потерь является линейным по количеству элементов на временной шкале и количеству негативов 𝑁. В результате окончательная сложность обучения составляет O(𝑈 × 𝑇 × 𝑁), преимущество которой заключается в том, что она не является квадратичной по 𝑈 или 𝐼 (в отличие от EASE в O(𝐼².376) или Mult-VAE в O(𝑈 × 𝐼)).

Таким образом, вычисление пользовательского представления является линейным только по количеству элементов на входной временной шкале, в то время как поиск лучших лучших рекомендаций составляет примерно O (log (𝐼)) благодаря эффективным методам приближенных ближайших соседей.

Именно это делает LED настолько эффективным, что позволяет нам за несколько часов обучить модель для миллионов элементов и миллиардов пользователей и обслуживать миллиарды запросов в день. Ниже приведены показатели производительности на экземпляр. В документе подробно рассказывается о том, как мы достигли такой скорости.

Покажи мне деньги!

Мы отправили наш алгоритм в производство и наблюдали значительное увеличение доходов по сравнению с наивным наиболее популярным подходом (GBO) и подходом на основе кластеризации (CBO). Мы буквально утроили рост продаж компании. Излишне говорить, что с тех пор наш подход работает в продакшене :)

Заключение

Мы рады поделиться нашей работой над эффективными и масштабными рекомендациями. Светодиодная архитектура достигает нового компромисса между сложностью, масштабом и производительностью. Комбинируя предварительное обучение, выборочные потери и амортизированный вывод, LED обеспечивает 30-кратное увеличение задержки, достигая производительности вариационных автокодировщиков по стандартным рекомендуемым метрикам. Если интересно, ознакомьтесь с кодом и бумагой!

Хотите принять участие? Подайте заявку сегодня!