Системы рекомендаций повсеместно используются в нашей повседневной жизни. Это позволило нам принимать решения, проникая в такие приложения, как Netflix, Amazon, YouTube, Spotify и т. д. Сердце этих систем построено с использованием алгоритма, известного как совместная фильтрация. Вкратце, совместная фильтрация опирается на мудрость толпы, чтобы делать прогнозы о человеке. Здесь, используя PyTorch, fastai и принципы матричной факторизации, я собираюсь построить модель совместной фильтрации с использованием Jester Dataset.

Что такое совместная фильтрация?

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

Набор данных шута

Набор данных Jester, первоначально выпущенный Кеном Голдбергом из Калифорнийского университета в Беркли, содержит 4,1 миллиона непрерывных оценок (от -10,00 до +10,00) 100 шуток от 73 496 пользователей [2]. Юмористический вкус человека представляет собой сложное явление и рассматривается как проявление его социальных, эмоциональных и интеллектуальных факторов, что делает категоризацию его юмористического вкуса с целью построения системы рекомендаций по шуткам чрезвычайно сложной задачей. Создав модель совместной фильтрации, мы можем обойти эту проблему, разработав набор скрытых факторов, представляющих как пользователей, так и шутки, которые можно использовать для поиска и рекомендации шуток пользователям со схожими вкусами в юморе. Я собираюсь использовать подмножество исходного набора данных Jester, который содержит оценки 24 983 пользователей.

Предварительная обработка данных

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

Импортированный фрейм данных содержит 24 983 строки и 100 столбцов, представляющих 24 983 пользователя и 100 шуток. Чтобы сохранить разборчивость, мы рассматриваем здесь только первые 11 столбцов. Далее я собираюсь использовать несколько операций Pandas, а именно удалить, вытолкнуть, заменить и расплавить, чтобы уменьшить этот фрейм данных всего до 3 столбцов, представляющих пользователей, шутки и рейтинги.

Теперь мы готовы приступить к созданию конвейера для построения модели.

Обучение модели

Я использую API-интерфейс загрузчика данных (CollabDataLoaders) от fastai для создания наших наборов данных для обучения и проверки. Вы также можете использовать метод обучения scikit train_test_split, если это то, что вы предпочитаете.

Мы успешно создали 31 228 и 7 808 пакетов обучающих и проверочных наборов соответственно, где каждый пакет содержит 64 записи из фрейма данных «шутки».

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

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

Я собираюсь случайным образом выбрать пользователя (18 661) и пошутить (43), чтобы сравнить его прогноз с фактическим рейтингом.

Фактический рейтинг для выбранной точки данных был -6,94, а наш прогноз был -6,21, что впечатляет, учитывая, что это было изучено без каких-либо знаний о внутренних качествах пользователя и/или шутки.

Что дальше

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

Рекомендации

  1. Нгоупею Тонджи Л. Система веб-рекомендаций для поиска работы и найма, 2018.
  2. Голдберг, К., и др., Eigentaste: Алгоритм совместной фильтрации с постоянным временем. Информационный поиск, 2001. 4(2): с. 133–151.
  3. Нассар, М.А., Л.А.А. Эль-Сайед и Ю. Таха. GPU_MF_SGD: новый метод стохастического градиентного спуска на основе графического процессора для матричной факторизации. 2019. Чам: Springer International Publishing.