Написать пост

Как работает система рекомендаций онлайн-кинотеатра

Логотип компании МТС

Рассказываем как устроена рекомендательная система, как она подбирает контент, и что сделать, чтобы построить крутую модель.

Рассказываем про систему рекомендаций нашего онлайн-кинотеатра KION. Как она устроена, как подбирает контент для пользователей, и что сделать, чтобы построить модель, которая станет действительно полезной для зрителей.

Как устроен онлайн-кинотеатр

KION — онлайн-кинотеатр, входящий в экосистему МТС. Он позволяет смотреть ТВ, сериалы и фильмы на смартфоне, планшете, компьютере, Smart TV и ТВ-приставках.

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

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

Как устроена система рекомендаций

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

Мы используем несколько алгоритмов: и простые эвристики (например, популярность внутри сегмента пользователей), и сложные нейросетевые подходы. Так, для учёта непохожих интересов одного юзера берутся мультимодальные эмбеддинги на базе DSSM.

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

Дальше оцениваем релевантность фильма, сравнивая векторы пользователя и вектор контента. Чтобы сделать рекомендации разнообразнее, добавляем небольшой штраф от разных моделей — за близость векторов юзера.

Сейчас выдача рекомендаций выглядит так:

  1. От клиентов в near real-time в kafka приходят данные по событиям в приложениях и на вебе.
  2. Данные прогоняются через DQ-систему, валидируются и преобразуются в конечные витрины.
  3. Раз в сутки на этих витринах происходит обучение моделей. Их у нас несколько — по числу мест, куда поставляются рекомендации.
  4. Скоринг. В зависимости от места поставки он происходит с частотой от получаса до суток. В результате мы получаем либо user/item векторы, либо готовые, отранжированные списки наиболее релевантных айтемов.
  5. Всё это отгружается в быстрые хранилища — redis или aerospike, — откуда по api поставляется клиенту.
  6. Раз в час срабатывает сервис мониторинга качества рекомов, который алертит в случае серьёзных нарушений бизнес-логики. Например, если пользователям начали выдавать слишком мало айтемов или подборки стали слишком однообразными. А также отслеживает соответствие мягким критериям качества.

За время развития рекомендательного движка мы успели поэкспериментировать с knn, implicit als, light fm, dssm. Старались идти от простого к сложному, чтобы выявлять инсайты на примере более объяснимых моделей и применять их в дальнейшем для развития системы рекомендаций KION. Сегодня в «чистом» виде не используется ни одна из них.

Ещё примерно полтора года назад мы тестировали гибридные подходы. Пробовали наивный байес или коллаборативные модели для быстрого отбора кандидатов, которые затем ранжировали более ресурсоёмким catboost.

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

В итоге мы сделали алгоритм персонализации более контролируемым. Сначала отбираем кандидатов через item2item рекомендации, а затем ранжируем на основе атрибутов просмотра «родительского» айтема клиентом.

Как построить крутую систему рекомендаций для онлайн-кинотеатра?

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

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

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

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

Какие проблемы возникают при работе над рекомендательной системой

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

Следующая проблема – сложность адекватной оффлайн-оценки рекомов. Любая оффлайн-оценка на ретро-данных рискует привести к тому, что самой точной моделью окажется та, что больше похожа на «ретро» витрину.

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

Исчерпывающего решения этой проблемы, насколько мне известно, нет. В KION мы разбираемся с ней одновременно тремя способами:

  • Отслеживаем метрики: precision@k, mrr, dcg, novelty, diversity, coverage.
  • Оцениваем модель на соответствие бизнес-логике. Она проверяет соответствие выдачи продуктовым целям (которые, кстати, могут не совпадать с «классическими» метриками).
  • «Глазами» проверяем адекватность выдачи на некотором количестве сгенерированных пользователей.

Ещё одна проблема — новизна контента. Пользователям нравится витрина, которая периодически обновляется — особенно если при изменении она учитывает внешний контекст.

И если обновление можно устроить, просто добавив в модель рандом, то для полноценного учёта внешнего контекста пока что недостаточно данных. Нужно «ручное» вмешательство. Например, формирование специальных подборок в честь церемонии Оскара или дня рождения Бреда Питта и так далее.

Вместо заключения

В конце кратко повторю, как построить систему рекомендаций онлайн-кинотеатра

  1. Чем больше данных — тем лучше и точнее будет система.
  2. Не бросайтесь сходу внедрять сложные нейросетевые алгоритмы. Так, рискуете пропустить важные инсайты, без которых не получится сформулировать гипотезы для дальнейшего улучшения моделей.
  3. Учитывайте внешний контекст и показывайте пользователям разный контент, в том числе событийный и популярный у других зрителей.
  4. Проводите А/В-тесты — чем больше, тем лучше. Готового универсального решения, которое сделает систему рекомендаций идеальной, нет, но исследования со временем к нему приведут.

Делитесь в комментариях, какие странные и глупые рекомендации вам выдавали онлайн-кинотеатры.

Следите за новыми постами
Следите за новыми постами по любимым темам
3К открытий3К показов