ݺߣ

ݺߣShare a Scribd company logo
Тензорные
разложения
на Spark
План
1. Что такое Zvooq?
2. Рекомендательные системы и ALS
3. Тензорный ALS и Spark
Что такое
Zvooq?
Zvooq — это музыка
на любой случай жизни
Zvooq — это
• миллион активных
пользователей
• 30+ миллионов треков
• сотни плейлистов
Рекомендательные
системы и ALS
Коллаборативная фильтрация
• Рекомендации на основе пользовательской истории
• Похожая история — похожие предпочтения
• Никаких знаний о доменной области
Типы данных
• Explicit feedback — оценки по шкале от 1 до 10
• Implicit feedback — лайки, просмотры
Матричные разложения
Пользователи
Объекты
Оценки X
ОбъектыПользователи
Векторы Векторы
Alternating Least Squares
+ Популярный
+ Точный
Alternating Least Squares
- Не гибкий
- Не позволяет учитывать другие факторы
- Не учитывает разносортный feedback
Что позволяет ALS?
Строим модель
Считаем вектора
Находим похожие треки
Составляем
ежедневную подборку
Отбираем
релизы в жанре
Как это работает?
Тензорный ALS
Зачем?
• Рекомендации покруче 😎
• Остаться в старой парадигме
Тензорный ALS
Оценки
Объекты
Пользователи
Пользователи Объекты Контекст
Векторы Векторы ВекторыХ Х
Тензорный ALS
• Те же события
• Новые сущности
• Та же парадигма
Контекст
• Предыдущий объект
• Период времени
• Что угодно
Предыдущий объект как
контекст
Было: Стало:
(user, item,
#playevents)
(user, item,
previous_item,
#playevents)
Предыдущий объект как
контекст
• Обучение поведенческим паттернам
• Предсказывание последовательностей
Период времени как
контекст
Было: Стало:
(user, item,
#playevents)
(user, item, period,
#playevents)
Период времени как
контекст
• Разбить сутки на часы
• Месяцы на дни
• Годы на сезоны
«Музыка для вашего вечера»
«Летние мелодии»
Есть ли границы?
• Игра не стоит свеч
• Больше размерность — более разреженные данные 👎
• Время обучения растет 👎
Реализация. Почему Spark?
• Python
• Многопоточность
• Данные не влезали на одну машину
iTALS
Проблема: Skew
Партиции здорового человека Партиции курильщика
Решение: Salting
• Добавим в каждый элемент случайную «соль»
• Join по (ключ, соль)
• Reduce’им и удаляем «соль»
Решение:
изолированный Join
• Фильтруем изолированные ключи
• Делаем Map/Join/Aggregate
• Делаем Reduce на оставшихся
• Заканчиваем Union’ом
Сравнение
Время
обучения, с
Recall Precision
Base ALS 251.32 0.199 0.032
Single-thread
iTALS
1822.25 0.243 0.047
iTALS+CG 402.58 0.230 0.045
Контейнеры Ядра Память
5 3 15 Gb
Сравнение
Вопросы?
Алексей Петров
Data / ML engineer
ap@zvooq.com
Telegram: @petrovale

More Related Content

Тензорные разложения для рекомендаций на Spark