Как понять, чего хочет пользователь, без единого запроса? Строим рекомендательную систему. Андрей Федоровский, fedorovsky@gmail.com Дмитрий Исайкин, isaykin@corp.mai.ru Варвара Логачева, v.logacheva@corp.mail.ru Рекомендательные системы: зачем они? Цель – изучить вкусы пользователя и понять, какие объекты из коллекции он оценит выше других. Анализируем - Его оценки объектов и лог его действий - Оценки и действия других пользователей Как это делать? Как это делать? 1) Показать 10 самых лучших объектов Как это делать? 1) Показать 10 самых лучших объектов 2) Совместная встречаемость объектов в сессиях Как это делать? 1) Показать 10 самых лучших объектов 2) Совместная встречаемость объектов в сессиях 3) Ввести рубрикацию/теги объектов Как это делать? 1) Показать 10 самых лучших объектов 2) Совместная встречаемость объектов в сессиях 3) Ввести рубрикацию/теги объектов Малое число тегов на объект Нет отрицательных отношений Подходы Подходы Content-based: теги = ключевые термины из описания объекта Подходы Content-based: теги = ключевые термины из описания объекта Collaborative filtering: учет оценок других пользователей Подходы Content-based: теги = ключевые термины из описания объекта Collaborative filtering: учет оценок других пользователей Neighbourhood-based CF: учитываем оценки близких пользователей Подходы Content-based: теги = ключевые термины из описания объекта Collaborative filtering: учет оценок других пользователей Neighbourhood-based CF: учитываем оценки близких пользователей В каком пространстве? Подходы Content-based: теги = ключевые термины из описания объекта Collaborative filtering: учет оценок других пользователей Neighbourhood-based CF: учитываем оценки близких пользователей Matrix factorization: построение профилей из скрытых признаков Требования к системе 1) Масштабирование до миллиардов оценок 2) Высокая скорость работы 3) Универсальная работа с разными наборами данных 4) Явные оценки и неявные (логи действий) 5) Добавление новых оценок, объектов, пользователей без рестарта Требования к системе 1) Масштабирование до миллиардов оценок 2) Высокая скорость работы 3) Универсальная работа с разными наборами данных не получилось 4) Явные оценки и неявные (логи действий) 5) Добавление новых оценок, объектов, пользователей без рестарта MF 𝑅 ∈ ℝ𝑁×𝑀 = 𝑟𝑢𝑖 𝑅 ≈ 𝑅 = 𝑃𝑄 𝑃 ∈ ℝ𝑁×𝐾 - профили пользователей 𝑄 ∈ ℝ𝐾×𝑀 - профили объектов 𝑟𝑢𝑖 − 𝑟𝑢𝑖 2 𝑅𝑀𝑆𝐸 = | 𝑟𝑢𝑖 ∈ 𝑅 | 𝑟𝑢𝑖 ∈𝑅 ISMF 𝑅𝑀𝑆𝐸 = 𝑟𝑢𝑖 ∈𝑅 𝑟𝑢𝑖 − 𝑟𝑢𝑖 2 | 𝑟𝑢𝑖 ∈ 𝑅 | 𝐾 𝑟𝑢𝑖 = 𝑝𝑢 𝑞𝑖 = ∀𝑟𝑢𝑖 𝑘=1 𝑝𝑢𝑘 𝑞𝑘𝑖 ∀𝑘 𝑝′ 𝑢𝑘 = 𝑝𝑢𝑘 + 𝜂𝑝 𝑒𝑢𝑖 𝑞𝑘𝑖 ∀𝑘 𝑞′ 𝑘𝑖 = 𝑞𝑘𝑖 + 𝜂𝑞 𝑒𝑢𝑖 𝑝𝑢𝑘 RISMF 𝑅𝑀𝑆𝐸 = 𝑟𝑢𝑖 ∈𝑅 𝑟𝑢𝑖 − 𝑟𝑢𝑖 2 | 𝑟𝑢𝑖 ∈ 𝑅 | 𝐾 𝑟𝑢𝑖 = 𝑝𝑢 𝑞𝑖 = ∀𝑟𝑢𝑖 𝑘=1 𝑝𝑢𝑘 𝑞𝑘𝑖 ∀𝑘 𝑝′ 𝑢𝑘 = 𝑝𝑢𝑘 + 𝜂𝑝 𝑒𝑢𝑖 𝑞𝑘𝑖 − 𝜆𝑝 𝑝𝑢𝑘 ∀𝑘 𝑞′ 𝑘𝑖 = 𝑞𝑘𝑖 + 𝜂𝑞 𝑒𝑢𝑖 𝑝𝑢𝑘 − 𝜆𝑞 𝑞𝑘𝑖 BRISMF 𝑟𝑢𝑖 = 𝑟𝑢𝑖 − 𝑅 сред 𝑟𝑢𝑖 = 𝑟𝑢𝑖 − 𝑟𝑢 сред 𝑟𝑢𝑖 = 𝑟𝑢𝑖 − 𝑟𝑖 сред Оптимизация параметров системы 𝑅𝑀𝑆𝐸 𝜂𝑝 , 𝜂𝑞 , 𝜆𝑝 , 𝜆𝑞 , 𝑃𝑚𝑎𝑥 , 𝑄𝑚𝑎𝑥 1) Градиентные методы не подходят. Выбрали покоординатный спуск. 2) Переобучение: 1) Несколько запусков, разные семплы 2) Регуляризация в модели 3) Validation set Неявные данные 50к оценок против 400М действий Неявные данные 50к оценок против 400М действий Проблема – матрица НЕразрежена. Неявные данные 50к оценок против 400М действий Проблема – матрица НЕразрежена. Синтетические явные оценки: 𝑅𝑎𝑡𝑒 = 𝑓0 𝑤𝑖 𝑓𝑖 𝑐𝑖 Неявные данные 50к оценок против 400М действий Проблема – матрица НЕразрежена. Синтетические явные оценки: 𝑅𝑎𝑡𝑒 = 𝑓0 𝑤𝑖 𝑓𝑖 𝑐𝑖 NB: Чем плотнее матрица, тем лучше идет обучение. Поэтому лучше начинать с ядра. NB2: Объекты с единичными оценками кластеризуем Архитектура Построение выдачи RMSE – качество на всей коллекции. А нам важны 10 лучших для пользователя. Построение выдачи: мера качества RMSE – качество на всей коллекции. А нам важны 10 лучших для пользователя. ARP: есть T результатов. Лучшие – на местах 1 ≤ 𝑛1 < … < 𝑛𝑡 𝑡 𝑖=1 𝑛𝑖 − 𝑖 𝐴𝑅𝑃𝑢 = 𝑡∗ 𝑇−𝑡 ARP = 0 – идеал. ARP = 1 – идеально плохо. Построение выдачи: сортировка 𝑘 𝑅𝑒𝑙𝑒𝑣𝑎𝑛𝑐𝑒𝐵𝑖𝑎𝑠 = 𝐵 + 𝑏𝑢 + 𝑏𝑖 + 𝑝𝑢𝑗 𝑞𝑖𝑗 𝑗=1 Построение выдачи: сортировка 𝑘 𝑅𝑒𝑙𝑒𝑣𝑎𝑛𝑐𝑒𝐵𝑖𝑎𝑠 = 𝐵 + 𝑏𝑢 + 𝑏𝑖 + 𝑝𝑢𝑗 𝑞𝑖𝑗 𝑗=1 𝑘 𝑅𝑒𝑙𝑒𝑣𝑎𝑛𝑐𝑒𝑆𝑃 = 𝑝𝑢𝑗 𝑞𝑖𝑗 𝑗=1 Построение выдачи: скорость Случайные проекции LSH 𝑙1 … 𝑙𝑚 - гиперплоскости в ℝ𝑘 𝐻𝑚 𝑣 = ℎ1 … ℎ𝑚 : ℎ𝑖 = 𝑠𝑖𝑔𝑛 𝑙𝑖 ∙ 𝑣 Задано разбиение на сектора, а 𝐻𝑚 𝑣 их m-битная нумерация. Сортируем только объекты, близкие к пользователю (попавшие в один сектор) Наборы данных Польз-й Объектов Оценок 480 000 18 000 100 000 000 1,16% DenseNetflix 56 000 1 000 2 500 000 MailRuApps 8 000 22 000 000* 0,4% Netflix 650 000 * на основе 400 000 000 действий Плотность 4,4% Результаты DenseNetflix RMSE ARP1 Время(с) K=5 0.8782 0.2784 7.1 K=10 0.8527 0.2479 11.2 K=20 0.8390 0.2298 18.6 K=50 0.8232 0.2156 35.8 K=100 0.8211 0.2109 69.3 Результаты MailRuApps ARP1 Full-Bias 0.1678 Full-SP 0.1349 LSH1-Bias 0.1896 LSH1-SP 0.1529 LSH4-Bias 0.1756 LSH4-SP 0.1412 UB-Bias 0.1783 UB-SP 0.1407 Время(мс) 1257 19 51 219 Результаты 1) Адаптировали BRISMF для неявных данных 2) LSH4 выдает приемлемое качество с высокой скоростью 3) Система умеет добавлять новые оценки, пользователей, объекты на лету, без пересчета матриц. Спасибо! Вопросы?