Как стать автором
Обновить

Как устроены алгоритмы онлайн-кинотеатра. Разбираем на примере

Время на прочтение8 мин
Количество просмотров4.9K

Вы приходите домой и включаете любимый стриминг. Лента сразу же выдаёт вам несколько фильмов и сериалов, которые… действительно хочется смотреть. Сегодня разберём, как именно рождается эта магия вне Хогвартса, и что сидит под капотом рекомендательного движка онлайн-кинотеатра.

Это крайне сложный мем про онлайн-кинотеатры и всю индустрию стриминга в целом. Просьба отнестись с пониманием и проникнуться глубиной!
Это крайне сложный мем про онлайн-кинотеатры и всю индустрию стриминга в целом. Просьба отнестись с пониманием и проникнуться глубиной!

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

Итак, погнали:

Этого стриминга в Химках видал, неточными рекомендациями торгует!

Давайте пойдём поэтапно. Что нужно сделать онлайн-кинотеатру, чтобы быть классным? Рискну предположить, что сначала ему нужно вот что:

  1. Составить хорошую библиотеку. Добавить к себе сериалов и фильмов крутых и разных, да побольше!

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

Итак, у нас есть контент, и у нас есть пользователи. Говоря более научно, есть item, и есть user. И теперь кинотеатру нужно сделать третий шаг, ключевой:

  1. Соединить user и item. Проще говоря, дать пользователю Васе именно тот фильм, сериал или аниме по манге (мало ли от чего прётся наш Василий), который ему а) нужен в целом и б) актуален прямо сейчас.

Но как это сделать?

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

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

Но Вася проходит мимо и садится смотреть турецкий сериал с Серканом Болатом, или как там его зовут. Почему? Да хрен его знает. Может после того сериала у него детективный передоз, и больше он не хочет смотреть на мрачные расследования? А может Вася планирует поездку в Турцию, и хочет полюбоваться видами Стамбула? Или ещё проще - у Васи появилась девушка, и пульт теперь у неё (ну или мы просто чего-то о нём не знаем). Люди - существа иррациональные, причин может быть очень много, а на поверхности - ни одной.

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

Как видите, чистый user-based и item-based - это упражнение, конечно, интересное, но полезное лишь для общего развития. А для точных стриминговых рекомендаций нужно что-то позабористее. Но что?

Существует три вида лжи…

… ложь, наглая ложь и статистика. Так про статистику говорил то ли Бенджамин Дизраэли, то ли Марк Твен (но не Ленин, как многие думают, Ильич как раз статистику очень любил и уважал). Смысл цитаты в том, что статистическими выводами можно:

  • а) вертеть как угодно

  • и б) делать это на максимально серьёзных щщах

Ведь вывод будет подкреплён (ну, типа) анализом выборки, а не просто взят с потолка.

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

В рекомендательных системах онлайн-кинотеатра выбор на основе большой статистики воплощён в виде коллаборативной фильтрации (КФ). КФ - это база-основа любого годного стриминга, от Ютуба до Яндекс Музыки. Онлайн-кинотеатры в целом, и Кинопоиск в частности - не исключение.

Давайте разберём, что это такое:

Коллаборативная фильтрация работает на предположении, что:

Пользователи, которые одинаково оценили какие-либо тайтлы (т.е. фильмы/ сериалы) в прошлом, склонны давать похожие оценки другим тайтлам в будущем.

То есть, если фильм "Ромашка" понравился многим пользователям с похожей историей просмотров, то он скорее всего понравится и другим пользователям с такой же (или почти такой же) историей просмотров.

Давайте на примере (очень упрощённо и схематично):

Допустим, недавно Вася посмотрел до конца и поставил высокую оценку вот таким тайтлам:

  • Мастер и Маргарита

  • Атака Титанов

  • Фишер

  • Игры

А Петя сделал то же самое вот с таким контентом:

  • Киберслав

  • Атака Титанов

  • Фишер

  • Игры

Итак, у Васи и Пети все тайтлы одинаковые, кроме одного различия: Мастер и Маргарита против Киберслава (ставьте лайк, если хотели бы увидеть такой кроссовер). По логике КФ, если пользователи “обменяются” своими 4 тайтлами (Вася глянет Киберслава, а Петя М&М), то им должно понравиться. Собственно, отсюда и слово “коллаборативная” в названии - пользователи как бы сотрудничают, подкидывая наилучшие рекомендации друг другу.

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

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

Представьте какой-нибудь суперумный фитнес-зал (ИИшка видит его так), где камеры под потолком анализируют ВСЕ действия ВСЕХ посетителей.
Представьте какой-нибудь суперумный фитнес-зал (ИИшка видит его так), где камеры под потолком анализируют ВСЕ действия ВСЕХ посетителей.

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

Однако, что будет, если вам нельзя делать румынскую тягу по медицинским показаниям, а во время французского жима вы год назад уронили гантелину на голову и теперь у вас психологический блок на это упражнение? Или ещё прикольнее - система подобрала целых 10/ 20/ 50/ да хоть тысячу статистически актуальных упражнений. Какое порекомендовать первым, а какое последним? И вообще, зачем всех под одну гребёнку пихать? Я же уникальная снежинка, предложи мне что-нибудь эдакое!

Вот и с контентом в онлайн-кинотеатре то же самое.

  • А что если Вася сильно отличается от других юзеров, которые смотрели похожие тайтлы?

  • А если актуальных рекомендаций много, то какую порекомендовать первой, второй, двадцать седьмой?

  • И вообще, настроение у Василия игривое, он хочет сюрпризов, удивите!

  • Или ещё сложнее - что если Вася только-только зарегался на Кинопоиске, и у него ещё нет никакой истории (a.k.a. “холодный юзер”)?

(Cat)бустим коллаборативную фильтрацию

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

Итак, градиентный бустинг - это такой метод машинного обучения, когда несколько “небольших” моделей применяются последовательно, и каждая из них исправляет ошибки предыдущей. Шаг за шагом ошибка становится всё меньше и меньше, а результат всё точнее и точнее.

Логика примерно такая. Берём дерево решений и пускаем по нему алгоритм. Смотрим, насколько существенна ошибка функции. Добавляем ещё дерево и запускаем новую итерацию. Ошибка становится меньше. И так далее, пока ошибка не минимизируется.
Логика примерно такая. Берём дерево решений и пускаем по нему алгоритм. Смотрим, насколько существенна ошибка функции. Добавляем ещё дерево и запускаем новую итерацию. Ошибка становится меньше. И так далее, пока ошибка не минимизируется.

Множество маленьких моделек градиентного бустинга ещё называют “ансамбль моделей”. По-французски emsemble значит "вместе", ну вы поняли.

Давайте разберём на примере пиццы. Ну а что, в зал мы уже сходили, так что имеем право.

Итак, допустим, вы понятия не имеете, как готовить пиццу (= не знаете юзера Васю), но слышали, что её делают из теста и сыра. Вы кидаете кусок теста и сыра в печку. Получилась дрянь. Вы думаете: “А что, если раскатать тесто и положить на него сыр?”. Уже лучше, но тесто сгорело. Вы повторяете попытку, уменьшая жар. Ещё лучше, но сыр подгорел. Вы насыпаете его более равномерно. Отлично, но не хватает томатной пасты. Вы добавляете пасту. Теперь это уже похоже на пиццу, но всё равно есть что улучшать. Вы можете дальше повторять итеграции, играясь с рецептом и технологией готовке, пока у вас не получится идеальная пицца как у дядюшки Джузеппе.

Градиентный бустинг в онлайн-кинотеатре работает точно так же, только шагов и ошибок в “дереве решений” может быть гораздо-гораздо больше, ну и тесто с сыром не нужно портить (это ж машинное обучение, в конце концов).

У Кинопоиска за градиентный бустинг отвечает штука под названием CatBoost.

Кэт буст. Вижу так.
Кэт буст. Вижу так.

CatBoost - это набор библиотек (= готовых шаблонов и решений) градиентного бустинга, который Яндекс использует во многих своих сервисах: в маркетплейсе, прогнозе погоды, рекламных системах, музыкальном стриминге и т.д. Ну и в онлайн-кинотеатре, само собой.

“Cat” здесь значит “категориальный”, то есть модель заточена на работу с категориями, а не только с числовыми данными. Она умеет мыслить не только понятиями "один-ноль" и “больше-меньше”, но и отличать кошечку от собачки, Турцию от Кореи (а Южную Корею от Северной), детектив от триллера (или от комедии, хоррора, пеплума, …), Юру Борисова от Ванпанчмена и т.д.

С последним могут возникнуть проблемы. Не, ну правда, тут придётся очень много моделек запускать.
С последним могут возникнуть проблемы. Не, ну правда, тут придётся очень много моделек запускать.

Итак, вернёмся к нашему юзеру Васе. 

Сценарий первый. Коллаборативная фильтрация отобрала ему 50 самых-самых релевантных фильмов. И ещё 10 сериалов в качестве бонуса. Как всю эту очередь расставить в ленте?

Допустим, в списке есть Начало и Интерстеллар. Кого поставить выше? CatBoost видит, что Вася ставил всем фильмам Нолана оценку 8+ (любит он Нолана, в общем). Также он видит, что Вася плюс-минус одинаково хорошо смотрит и Ди Каприо, и Макконахи. Он идёт дальше, перебирает другие факторы. И видит, что по вечерам Васе чуть лучше заходит космическая тематика. А ещё он в Яндексе недавно чёрные дыры искал - совпадение? Сейчас как раз вечер, так что поставим Интерстеллара чуть выше Начала.

Понятно, что в реальности алгоритм будет ранжировать (да, забыл сказать, такая операция называется “ранжирование”) из множества единиц контента и одновременно учитывать сотни и тысячи единиц информации о пользователе. Но логика такая.

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

Ну например, увидит сериал “Игры” и такой: “О, это мне надо, хочу смотреть на младшего Верника в антураже брежневского Союза”. И оформит подписку. 

И алгоритмы такие: “Ага, ему нравится младший Верник (ну или Серебряков, единственный в своём роде), антураж СССР, спортивная тематика, драмы с элементами детектива, современные российские сериалы, …”. Это всё гипотезы, каждую из них CatBoost может начать отрабатывать. Рекомендовать, смотреть на результат. Рекомендовать дальше, улучшать результат, отрабатывать ошибку. И так далее, далее, далее. Повышая знание о пользователе, учитывая всё новые факторы, делая “градиент” всё более плавненьким. В какой-то момент у Василия будет достаточно истории, и его получится нормально запихнуть в коллаборативную фильтрацию.

Если Вася всё же пришёл из ниоткуда (действительно холодный юзер), то ему сначала дадут глянуть что-нибудь из самого популярного. Посмотрят, как он реагирует на разные тайтлы из топ-10, а дальше см. выше.

Знания о пользователе крутятся, кэт бустится.
Знания о пользователе крутятся, кэт бустится.

Здесь ещё можно было бы разобрать, какие факторы учитываются в градиентном бустинге, как именно алгоритм достаёт эти данные, с какой скоростью он учится… и многое другое.

Однако, статья и так получилась чуть больше, чем я планировал, поэтому на этой ноте откланяюсь. Напоследок держите набор простейших действий, способных здорово помочь КэтБусту и натренировать Кинопоиск. С другими онлайн-кинотеатрами тоже должно сработать - вплоть до Netflix или даже Youtube (последний - это тоже своего рода стриминг). Итак:

  • Ставим высокие оценки фильмам и сериалам, которые вам нравятся, и низкие - тем, которые не зашли. Для этого в конце просмотра есть специальная голосовалка, не пропускаем её.

  • Если листаем ленту и видим что-то прикольное, не стесняемся добавлять в “Буду смотреть”.

  • Если видим, что рекомендательная система прогадала и запихнула в ленту залётные неактуальные тайтлы, то прожимаем кнопку "Неинтересно".

  • Если вас зацепил какой-то фильм или сериал из ленты, но вы не хотите его смотреть прямо сейчас, то можно включить его хотя бы на пару минут (а лучше минут на 5-10). Это станет важным сигналом для рекомендательных систем.

Если не забывать про эти простые шаги, то алгоритмы скажут вам “спасибо”, коллаборативная фильтрация станет ещё более меткой, а вы сможете тратить ещё меньше времени на поиск персонализированной актуалочки.

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

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


Если вам понравилось, то подписывайтесь на мой тг-канал Дизраптор, где я человечьим языком разбираю интересное из технологий, инноваций и бизнеса. А на втором канале Фичизм выходят самые кайфовые фичи и всё такое.

Теги:
Хабы:
+35
Комментарии17

Публикации

Истории

Работа

Data Scientist
62 вакансии

Ближайшие события

27 марта
Deckhouse Conf 2025
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань