Рекомендательная система должна идеально адаптироваться к изменениям по мере их появления.

Learning Rate - это информационный бюллетень для тех, кто интересуется миром AI и MLOps. Каждую пятницу вы будете получать от меня обновления и мысли о последних новостях и статьях об искусственном интеллекте. Подпишитесь здесь!

Часть II этой истории теперь публикуется на сайте Towards Data Science ниже.



Требования или предварительные условия

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

Вступление

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

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

Эта история - первая часть серии, в которой мы исследуем, как адаптировать идею инкрементального обучения к рекомендательным системам, используя практический подход. В первой части мы воспроизводим результаты, представленные в публикации Жоао Винагре и др. Быстрая инкрементная матричная факторизация для рекомендаций с только положительной обратной связью с использованием библиотеки python, построенной на Pytorch, которая называется CF Step . Далее мы будем стремиться выше, применив несколько приемов.

Быстрая инкрементная матричная факторизация

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

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

Алгоритм и методология

Давайте теперь более подробно рассмотрим алгоритм инкрементного стохастического градиентного спуска (ISGD), представленный в статье.

Данные, которые у нас есть, представляют собой кортежи или взаимодействия пользователя с элементом. Помните, что все это положительные взаимодействия. На вход алгоритма поступают три числа; feat - размеры пространства для встраивания пользователя или элемента, λ - коэффициент регуляризации и η - скорость обучения. Результатом работы алгоритма являются две матрицы внедрения: A для пользователей и B для элементов. Размеры этих матриц: number_of_users x feat для A и number_of_items x feat для B. Затем у нас есть несколько отдельных шагов:

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

Внедрение и оценка

Для этой реализации мы будем использовать библиотеку Python CF Step и хорошо известный набор данных Movielens. CF Step - это библиотека с открытым исходным кодом, написанная на Python и построенная на Pytorch, которая позволяет быстро внедрять рекомендательные системы для инкрементального обучения. Библиотека является побочным продуктом европейского исследовательского проекта CloudDBAppliance. Вы можете легко установить библиотеку, выполнив следующую команду:

pip install cf-step

Затем загрузите набор данных Movielens 1m и извлеките файл ratings.dat в удобное место, например, в папку tmp в Linux. Для этой реализации нам нужен только этот файл. Остальные файлы (users.dat и movies.dat) содержат метаданные о пользователях и фильмах. Мы будем использовать панды для загрузки файлов в память:

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

Если мы напечатаем эти числа, мы увидим, что мы работаем с 6040 уникальными пользователями и 3706 уникальными фильмами. Затем мы отсортируем данные по метке времени, чтобы имитировать события потоковой передачи.

Как мы уже говорили, алгоритм поддерживает только положительную обратную связь. Таким образом, мы будем рассматривать оценку 5 как положительный отзыв и отбросить любую другую. Мы хотим идентифицировать лайки с помощью 1 и антипатии с 0 и создать новый столбец под названием preference, чтобы сохранить их. Тогда мы можем фильтровать только preference == 1.

Далее давайте инициализируем нашу модель. Для этого нам нужна архитектура модели, целевая функция (то есть функция потерь) и оптимизатор. Мы будем использовать сеть SimpleCF в качестве архитектуры модели, встроенную архитектуру нейронной сети, предлагаемую CF Step. В качестве целевой функции мы будем использовать простую lambda функцию, которая принимает прогноз и цель и вычитает прогноз из цели. В нашем случае целью всегда является 1. В качестве оптимизатора мы будем использовать реализацию SGD Pytorch. Количество факторов, которые мы выбираем, составляет 128, а скорость обучения 0.06. Теперь мы готовы инициализировать Step модель.

Методология оценки следующая:

  • Загрузите модель, обучив ее на первых 20% данных.
  • Смоделируйте поток данных и оцените производительность модели, используя recall@k в качестве показателя.
  • Если пользователь известен, сделайте прогноз и вычислите recall@k для этого прогноза. Затем постепенно обучайте алгоритм, используя это взаимодействие пользователя с элементом.
  • Если пользователь неизвестен, просто обучайте алгоритм постепенно, используя это взаимодействие пользователя с элементом.

Для этого возьмем первые 20% данных, создадим загрузчики данных и подгоним их под модель.

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

Наконец, смоделируйте поток и оцените модель с помощью recall@10. На графическом процессоре этот шаг занимает от пяти до шести минут.

Мы можем визуализировать результаты нашего обучения, используя приведенный ниже код. Для этого мы будем использовать скользящее среднее 5k скользящего окна, как в публикации. Мы видим, что график следует результатам, представленным в документе для набора данных о кинообъективах. Чтобы сохранить модель, используйте встроенный метод model.save() и передайте действительный путь.

Заключение

В этой статье мы рассказали о важности инкрементального обучения в рекомендательных системах и воспроизвели результаты публикации Жоао Винагре и др. Быстрая инкрементальная матричная факторизация для рекомендаций с только положительной обратной связью. Мы представили библиотеку Python CF Step, библиотеку с открытым исходным кодом, которая позволяет быстро внедрять рекомендательные системы для инкрементального обучения. В следующей главе мы пойдем немного дальше и попытаемся повысить точность алгоритма.

Меня зовут Димитрис Поулопулос, я исследователь машинного обучения в BigDataStack и доктор философии в Пирейском университете, Греция. Я работал над разработкой и внедрением AI и программных решений для крупных клиентов, таких как Европейская комиссия, Евростат, МВФ, Европейский центральный банк, ОЭСР и IKEA. Если вы хотите прочитать больше сообщений о машинном обучении, глубоком обучении и науке о данных, подпишитесь на меня в Medium, LinkedIn или @ james2pl в твиттере.