Кейс «Кино Mail.Ru»: построение рекомендательной системы фильмов на основе нейросети Статьи редакции

Команда сервиса о том, какие технологии подойдут для формирования наиболее точных рекомендаций.

Почти два года назад мы впервые запустили систему рекомендаций. До этого в проекте «Кино Mail.Ru» редакция уже готовила различные оригинальные тематические подборки. А также создавала отдельные страницы со списками фильмов и сериалов. На них можно отфильтровать фильмы по году, жанру, стране и увидеть, что доступно для онлайн-просмотра. А для сериалов ещё предусмотрены фильтры по количеству серий и статусу (закончился или ещё идет).

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

С чего всё начиналось

Сейчас сложно представить крупный онлайн-сервис без системы рекомендаций. Собственные или готовые продукты используют все крупные онлайн-магазины, а также кинотеатры (отечественный — ivi.ru, зарубежные — Netflix и Hulu), сервисы для прослушивания музыки — Zvooq, «Яндекс.Музыка», Last FM. И, конечно, социальные сети.

Рекомендации помогают повысить продажи, увеличить глубину, просмотры и просто сделать пользователей счастливее. А значит — обеспечить себе устойчивое количество прямых заходов, лояльных подписчиков или покупателей.

Изначально для получения рекомендаций мы сделали отдельную страницу. Когда пользователь попадал на неё впервые, ему предлагалось оценить десять фильмов и сериалов, чтобы система могла получить первичное представление о его предпочтениях.

При этом ставить оценки мог только зарегистрированный пользователь. Да, мы теряли в конверсии, зато могли собирать и анализировать всю возможную информацию о пользователях. А если они ещё переходили внутри сайта под своими почтовыми аккаунтами, то и на странице рекомендаций, и в блоке с фильмами и сериалами им показывались персональные рекомендации.

В конце июня 2017 года мы изменили дизайн страницы с рекомендациями — теперь там можно фильтровать фильмы и сериалы по жанру, году и стране, а возможность ставить оценки получили даже незарегистрированные пользователи.

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

«Холодные» против «горячих»

В проекте «Кино Mail.Ru» используется несколько моделей рекомендаций. Их можно сгруппировать по решаемым ими задачам. А именно:

  • Генерирование «холодных» рекомендаций для пользователей с малым количеством оценок (и даже совсем без них).
  • «Горячие» модели — для пользователей, активно ставящих оценки. Пользователь становится «горячим» после того, как поставит десять оценок.

Пожалуй, самое интересное — именно «горячая» часть системы рекомендаций. Как уже упоминалось, сейчас у нас 16 млн оценок, поэтому основной «рабочей лошадкой» выступает модель, основанная на матричном разложении, более известная как SVD. Это модель предиктивного типа, она позволяет предсказать, какую оценку пользователь мог бы поставить тому или иному фильму или сериалу.

SVD-модели в различных вариантах достаточно давно и широко применяются в рекомендательных системах, а после пресловутого Netflix Prize начался настоящий бум их популярности. Если вас интересует факторизация матриц в задачах коллаборативной фильтрации, на эту тему существует большое количество публикаций, а мы лишь коснёмся основных моментов.

Смысл этих моделей заключается в преобразовании большой матрицы оценок [Users х Movies] в две матрицы меньшего размера: U — [Users х Features] и VT — [Movies х Features], где Features — некие латентные характеристики.

Если взять какого-то пользователя, вытащить его вектор из U и скалярно перемножить с матрицей VT, то получим вектор Ruser, полностью состоящий из приближенных оценок пользователя по всем фильмам и сериалам в наборе.

Самое пикантное в SVD-моделях — те самые Features. Ведь фактически для каждого фильма и пользователя формируется вектор, который наилучшим образом описывает вкусы зрителя и свойства кинокартины. При желании эти числа можно даже как-то интерпретировать.

Впрочем, на то эти характеристики и «латентные» — интерпретации они поддаются с трудом. Зато если взять матрицу характеристик фильмов [Movies х Features] и посчитать попарное косинусное расстояние между векторами, то получим матрицу коэффициентов сходства фильмов между собой. К той же матрице можно аккуратно применить определённый алгоритм визуализации, и тогда можно построить карту сходств фильмов.

Карта мирового кино. Оригинал в большом разрешении доступен по ссылке

Поскольку мы обучаем модель на огромном массиве оценок, то полученную матрицу фильмов можно «зафиксировать» и использовать в дальнейшем для подгонки рекомендаций под новые оценки пользователей «на лету». То есть не нужно выполнять полный пересчёт всей модели целиком, достаточно пересчитать только конкретный вектор пользователя. Это логично, ведь влияние оценок одного человека на общую матрицу характеристик фильмов ничтожно мало.

Домашняя нейросеть

Кроме SVD-моделей мы используем небольшую нейросеть, которая называется ограниченной машиной Больцмана (Restricted Boltzmann Machine, RBM). Это стохастическая, генеративная нейронная сеть глубокого обучения. Почитать о применении этой нейросети в контексте коллаборативной фильтрации можно в целом ряде англоязычных источников, в частности, у самого Джеффри Хинтона.

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

Если описывать нейросеть без технико-математических подробностей, то это два слоя «нейронов», взвешенно-связанных между собой (при этом внутри одного слоя нейроны не связаны). Один слой «видимый» — это одновременно и вход, и выход; второй слой — «скрытый».

Обученная RBM работает как чёрный ящик: мы «показываем» её входным нейронам какие-то неполные данные (это может быть обрезанная фотография или массив оценок фильмов) и после волшебных вычислений видим на том же месте дополненный вариант данных — восстановленную фотографию или полный набор оценок на все фильмы.

Результаты работы RBM и SVD-моделей различаются: нейросеть рекомендует другие фильмы. Но по метрикам (и субъективно), она им не уступает, особенно в ансамбле с прочими моделями. Классическая RBM имеет ряд преимуществ:

  • Её не нужно дообучать после каждой новой оценки. В SVD приходится пересчитывать вектор характеристик пользователя, а нейросеть уже «всё узнает», как только увидит оценки.
  • Машина Больцмана всегда потребляет одно и то же количество памяти. Неважно, сколько у вас оценок и пользователей, объем RBM постоянен, и вам не нужно хранить подсчитанные векторы характеристик.

Конечно, есть некоторые нюансы. Для работы RBM нужно держать в памяти весь объём весов. И хотя потребление памяти у неё постоянное, но вместе с тем и достаточно приличное — даже если прибегнуть к таким хитростям, как факторизация весов.

К тому же обучать её без использования вычислительных ресурсов видеокарт получается слишком долго, а серверные видеокарты пока ещё довольно дефицитная вещь. В итоге мы написали свой трейнер на Cython с использованием OpenMP. Это было увлекательно, но всё же не совсем тривиально. Как вишенка на торте: RBM довольно сложно как-то проинтерпретировать, хотя люди пытаются.

Как вы помните, в проекте существует и целый набор моделей для генерирования «холодных» рекомендаций по косвенным признакам. Дело в том, что пользователей без оценок гораздо больше, чем тех, кто ставит оценки, так что анализ их предпочтений — важная для нас задача.

Здесь в ход идёт вся неявная информация:

  • ​Демографические данные: год рождения и пол, если пользователь авторизовался и указал эту информацию в профиле.
  • Информация о простых посещениях страниц и просмотрах видео на сайте.
  • Также мы учимся обрабатывать таргетинговую информацию, чтобы с чистой совестью рекомендовать, например, мультфильмы посетителям сайта «Дети Mail.Ru» или все серии «Форсажа» — завсегдатаям сайта «Авто Mail.Ru». Нередко подобные рекомендации могут быть не столь очевидными, а порой очень неожиданными.

Построение хорошей рекомендательной системы — достаточно сложный процесс. Даже несмотря на то, что за последние десять лет в этой области появилось множество хорошо изученных и отработанных решений, в задаче всегда остаётся некоторая неопределенность и простор для исследований.

Ведь с чем на деле взаимодействует система рекомендаций, подо что она в итоге «подгоняется» при обучении? Под человеческие желания, причем ещё не высказанные. И хотя, как показывает практика, часто вкусы людей и их желания можно статистически «усреднить» и показать полноэкранный баннер с рекламой чего-то, что «нравится всем», в деталях эти вкусы крайне разнятся.

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

0
9 комментариев
Написать комментарий...
Владимир Гончаров

Вы бы договорились с imonet.ru об импорте пользовательских оценок или сделали возможность у себя в интерфейсе загружать оценки из файла скаченного из имхонета.
Куча людей там ставило оценки годами и начинать это делать заново не торопится.

Ответить
Развернуть ветку
Ekaterina Staroverova

Владимир, возможность импортировать оценки из Имхонета мы сделали через несколько дней после того, как портал предложил пользователям выгрузить свои оценки. Импортировать оценки можно тут https://kino.mail.ru/user/ratings/import/. После этого вы сможете получить персональные рекомендации и видеть предсказанные оценки на карточках фильмов и сериалов.
Если будут вопросы и пожелания - пишите [email protected]

Ответить
Развернуть ветку
Михаил Першин

* Вставить в заголовок слово "нейросеть"
* Обучать SVD и RBM, как в старом-добром 2007 (в буквальном смысле! например http://www.machinelearning.org/proceedings/icml2007/papers/407.pdf)
* ???
* PROFIT

Ответить
Развернуть ветку
Vladimir Zaytsev

Статья устарела лет на десять.

Ответить
Развернуть ветку
Koiru Zero

нейросеть-то судя по всему и комменты писать горазда!

Ответить
Развернуть ветку
Фёдор Серяков

Но зачем?..
В идеале, допустим, я вспомню всё, что смотрел в жизни, и все свои впечатления. Составлю идеально точную базу. Нейросеть это переварит и выдаст фильм, который я ещё не видел, и который, при этом, подходит под критерии идеального фильма.
Но мне будет неинтересно его смотреть, т.к. он повторяет все детали, которые я считаю (и, хуже того, неосознанно ощущаю) образцом чего-либо.
Как в тех случаях, когда посмотрел подряд три фильма, а помнишь только про два, т.к. один - ну, как бы, совпал с фоном, оказался в точности на своём месте.

Ответить
Развернуть ветку
Владимир Гончаров

не совсем так...
нейросеть подскажет вам фильм, который понравился людям с оценками других фильмов похожих на ваших.
т.е. найдёт всех людей с максимально похожими на ваши интересами, а потом предложит то что вы ещё не смотрели, а они уже посмотрели и им очень понравилось.
причём фильм может быть того жанра или с теми актёрами, которых вы обычно обходите стороной не давая им шанса, а тут вам будут обещать, что с вероятностью 95% вы оцените это фильм на 9 из 10. В таком случае трудно устоять, а посмотрев его можно очень сильно удивиться, что фильм-то действительно отличный оказался.

Ответить
Развернуть ветку
Фёдор Серяков

Понятно, это совсем другое дело, спасибо!

Ответить
Развернуть ветку
Аналитика на Диване

На хакатоне Нетфликса лет 6 назад такое делали и кажется в итоге не стали внедрять. А так да, ~2009 года статья. Майкл Джексон, Гугл Вэйв, Свинной грип, SVD и RBM.

Ответить
Развернуть ветку
6 комментариев
Раскрывать всегда