Какой фильм мне посмотреть сегодня вечером? - приходилось ли вам хоть раз отвечать на этот вопрос, приходя с работы домой? Что касается нас - да, и не раз. Здесь мы скажем несколько слов о том, над чем мы работали последние полгода: об интерактивной системе рекомендаций по фильмам Movix.ai. Система основана на глубоком обучении и адаптируется к предпочтениям пользователя в режиме реального времени. Как большие любители кино, мы чувствовали потребность в такой услуге и верим, что она будет полезна каждому любителю кино.

Рекомендуемый фильм. Как родилась идея

В Deep Systems мы занимаемся созданием решений и продуктов на основе машинного обучения и Deep Learning. Среди наших проектов: разработка« ума прототипа беспилотного автомобиля» и автоматическое обнаружение дефектов дорог и взлетно-посадочных полос. Важной частью нашей работы являются рекомендательные системы. Сильное желание создать нашу версию рекомендательной системы давно мешало нам спокойно спать.

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

От мечты к реальному продукту

Вот фраза Я. Шмидхубера *, от которой мы не можем избавиться:

Google будущего вместе со всеми его сервисами - это всего лишь один гигантский LSTM.

Здесь имеется в виду, что существует одна большая нейронная сеть, которая взаимодействует с пользователем и решает множество его задач.

* не совсем уверен, что Юрген действительно сказал это, но исследователи глубокого обучения теперь знают, насколько опасно не цитировать его :-)

Идея кажется слишком амбициозной, возможно, утопической. Мы попытались «приземлить» эту идею и найти область, в которой одна большая нейронная сеть может решить все задачи за пользователя. Так родилась идея создать систему рекомендаций по фильмам, которая будет разумно взаимодействовать с пользователем и смоделировать взаимодействие «от начала до конца» с помощью глубокой lstm-подобной сети.

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

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

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

Почему именно глубокое обучение?

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

Ответим пошагово. Говоря о совместной фильтрации, мы должны четко различать следующие две задачи: (1) прогнозирование рейтинга и (2) первые N рекомендаций.

Задача прогнозирования рейтингов стала гораздо более популярной, и, как следствие, существует множество статей и библиотек с открытым исходным кодом. Однако, если говорить о рекомендательных задачах из топ-N, то здесь ситуация прямо противоположная. Причина - Netflix Challenge (2006–2009) с призовым фондом в 1 миллион долларов, где участников просили предсказать, как пользователь u оценит фильм m.

Однако в большинстве бизнес-приложений требуется давать первые N рекомендаций. Типичные случаи: на основе исторических данных для конкретного пользователя показать 10 предметов, которые он, скорее всего, купит, или, как в нашем случае, показать 10 фильмов, которые он, скорее всего, захочет посмотреть.

Без сомнения, задачу (2) можно свести к задаче (1) следующим наивным способом: взять пользователя, спрогнозировать рейтинги для всех фильмов из нашего каталога, отсортировать фильмы в порядке убывания по прогнозируемым рейтингам, затем возьмите 10 лучших фильмов и порекомендуйте их. Звучит неплохо, но есть одна проблема - это не работает (эту ошибку сделали мы). Так что когда смотришь на рекомендации, тебе это не нравится (метрики тоже отражают внутренние ощущения)!

На этом проблема с прогнозированием рейтинга закончена, давайте вернемся к первым N рекомендациям. Опять же, есть два способа решения проблемы: (а) матричная факторизация, (б) подход ближайших соседей.

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

Ближайшие соседи интерактивны. Педро Домингос относит этот подход к «ленивым методам машинного обучения», поскольку процедура обучения приравнивается к сохранению новых обучающих примеров в базе данных. Итак, с точки зрения вычислительных затрат, обучение бесплатное, и вся работа выполняется на этапе вывода. Но когда дело доходит до метрики, лучшее, что можно сделать, - это полагаться на какую-то эвристику. Если мы хотим выйти за рамки фильмов и работать также с другими объектами, такими как теги, проблема с метрикой еще больше.

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

Первая проблема рекомендаций с точки зрения глубокого обучения

Революция в области глубокого обучения сначала коснулась распознавания речи, затем компьютерного зрения, а затем и обработки естественного языка (НЛП). Многие задачи НЛП сводятся к ответу на вопрос: каково распределение вероятностей следующего слова, если мы знаем N предыдущих слов? Или просто - угадать следующее слово в предложении (в тексте).

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

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

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

Рассмотрим очень простой пример:

“100 200 123/0 100 10 300/0 1 2 3 4 5/0”

Мы это видим

  • В нашей базе 3 пользователя
  • Первому пользователю нравятся фильмы с идентификаторами: 100 200 123
  • Второй: 100 10 300
  • Третий: 1 2 3 4 5
  • «/ 0» - специальный символ для разделения разных пользователей

Идентификаторы пользователей не важны, важны только идентификаторы фильмов (и их относительный порядок).

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

Более года назад мы взяли Набор данных MovieLens, проект НЛП на основе torch7 и выполнили описанную выше процедуру, чтобы получить наш первый прототип рекомендательного фильма.

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

Фильмы и теги, соединяем все вместе

Гипотеза состоит в том, что, позволяя пользователю управлять как фильмами, так и тегами, мы ускоряем его путь к списку соответствующих фильмов, отражающих его текущее настроение.

Возникает задача построения архитектуры нейронной сети, способной работать с двумя упомянутыми сущностями. См. Рисунок 1.

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

  1. Вектор встраивания фильмов
  2. Среднее значение следующих векторов:
  • Теги встраивания векторов, связанных с текущим фильмом
  • Теги встраивают векторы, связанные со следующим фильмом в последовательности (на рисунке 1 мы называем эти векторы «тегами будущего фильма в последовательности»)

Выходные данные двухслойного LSTM (выходной вектор верхней правой ячейки LSTM) поступают на два разделенных полносвязных уровня (FC). Затем слои softmax позволяют оценить вероятность «подобного» для каждого хода и тега в базе данных. Пользователю показаны N лучших фильмов и тегов.

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

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

Стек технологий и данные обучения

Наша глубокая модель - это нейронная сеть на основе LSTM, построенная с использованием фреймворка TensorFlow.

Для создания обучающих данных мы использовали набор данных MovieLens, в котором мы взяли настройки фильмов пользователя. Мы проанализировали IMDB и использовали API Movie DB для формирования базы данных тегов.

API взаимодействует с TensorFlow через ZeroMQ, а Elastic Search действует как хранилище для поиска информации о фильмах.

Интерфейс выполнен с использованием Vue.js и Element UI.

Возможности Movix.ai

Movix позволяет выполнять следующие действия:

  • Нравится и не нравится как фильмы, так и теги;
  • Изменить порядок «понравившихся» или «не понравившихся» фильмов (чем правее, тем важнее);
  • Фильтровать рекомендации по рейтингу и дате выпуска;
  • Посмотреть трейлер и кадры из фильма;
  • Сохраните свои любимые фильмы.

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

Что необходимо сделать: аспекты глубокого обучения

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

  • Кнопка отрицательного отзыва или не нравится. На данный момент реализация этой функции - это небольшой взлом за пределами нейронной сети. Конечно, на этапе обучения необходимо моделировать отрицательную обратную связь. Наши нынешние попытки сделать это не привели к ожидаемым результатам. Часто, если какой-то фильм настоятельно рекомендован моделью, то, что она не любит этот фильм, не заставляет модель передумать, нейросеть все равно рекомендует этот фильм. Проблема во многом связана со структурой нейронной сети, целевой функцией и способом генерации обучающих данных.
  • Более короткий путь к релевантным фильмам. В некоторых случаях вам нужно поставить отметку "Нравится" несколько фильмов, чтобы получить что-то актуальное. И ключевой вопрос: чему наша модель обучена? В настоящее время модель обучена угадывать следующий фильм в последовательности для данного пользователя. Так что, если пользователю понравился только один фильм (т.е. у нас очень мало информации для определения его предпочтений), не будет лишним, по крайней мере, с человеческой точки зрения, предположить, что следующий фильм будет блокбастером.
  • Дополнительные методы глубокого обучения. Существует ряд методов глубокого обучения, которые являются ключами к достижению высочайшего уровня производительности в различных задачах - внимании, поиске луча, двунаправленных RNN и других. Нам нужно выяснить, как использовать современные подходы, чтобы сделать систему умнее.
  • Наши мечты о глубоком обучении. Нам бы очень хотелось создать по-настоящему интеллектуальную нейронную сеть в четко определенной области, такой как рекомендации фильмов. Например, нейронная сеть может задавать вопросы пользователю, чтобы он мог быстро найти фильм для просмотра. В конце концов, умение задавать правильные вопросы - хороший признак интеллекта. Например, такими вопросами могут быть: «Вы заинтересованы в фильмах до года X или позже?», «Нравится ли вам актер / режиссер Y» и т. Д. Хорошая новость заключается в том, что обучающие наборы данных (MovieLens + то, что возможно для синтаксического анализа из Интернета) имеют достаточно информации, чтобы обучить систему задавать такие вопросы и использовать ответы, чтобы рекомендовать лучше. Плохо - эти вопросы слишком банальны, мы хотим чего-то большего. Мы попытаемся сформулировать: мы хотим обучить нейронную сеть, чтобы максимально повысить «качество взаимодействия с пользователем». Любые идеи? Дайте нам знать!

Выводы

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

Мы очень ценим любые отзывы, комментарии, идеи и предложения!

Надеемся, вы откроете для себя свой фильм!

Пресса о нас: Movix использует искусственный интеллект, чтобы предлагать вам лучшие фильмы