Понимание рекомендательных систем

Вы когда-нибудь задумывались, как Netflix рекомендует подходящий контент, специально подобранный для пользователя? Это глубокое погружение сфокусировано на рекомендательных системах и встраиваниях [скрытых факторах] для извлечения смысла из взаимодействий между пользователем и предметом. Если вы раньше не работали с рекомендательными системами, этот блог станет для вас идеальным началом. Модель, описанная в этой статье, использует библиотеку fast.ai и предполагает, что у вас есть базовые знания языка программирования Python, а также PyTorch. Давайте приступим.

Анализ данных

Для начала давайте познакомимся с набором данных «кинообъективы». Чтобы перенести данные в записную книжку jupyter, просто запустите указанные ниже ячейки. Все остальное функция fast.ai сделает за вас.

Примечание. В этом наборе данных используется подмножество 100 000 рейтингов фильмов.

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

Понимание скрытых факторов

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

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

Попробуйте запустить блоки кода, следующие за этим отрывком:

Здесь предполагается, что скрытые факторы находятся в диапазоне от -1 до 1, где положительные числа указывают на сильное совпадение, а отрицательные числа указывают на слабое совпадение. Категории в этом примере - «научная фантастика», «боевик» и «старый фильм». С учетом сказанного, у фильма «the_force_awakens» есть латентный фактор: 1 как 0,98, указывающий, «насколько это фантастика», латентный фактор: 2 как 0,9, указывающий «как действие», и латентный фактор: 3 как -0,9, указывающий « сколько ему лет.

Что мы здесь делали? Мы в основном перемножили два скрытых вектора / фактора и суммировали их результат. Если вы хотите использовать жаргон науки о данных, вы можете назвать это «скалярным произведением». Довольно просто, правда? Это происходит для каждого пользователя и каждого фильма в наборе данных, и это основной принцип этой модели. Из приведенного выше примера ясно видно, что мне нравятся научно-фантастические фильмы и боевики, поэтому the_force_awakens [2015] оценивается выше, чем «Рождение звезды» [1937].

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

Вот и все - давайте начнем с самого кода :)

Создание загрузчиков данных

Чтобы сделать это упражнение интересным, давайте введем названия фильмов в наш набор данных и объединим их с данными оценок. Таблица u.item состоит из идентификаторов фильмов, сопоставленных с заголовками, поэтому давайте перетащим их.

Объект Dataloaders обычно принимает первый столбец как пользователь, второй столбец как элемент и рейтинги как третий столбец. Поскольку наши товары являются фильмами, мы переименовываем их в "title" с размером партии 64.

PyTorch представление совместной фильтрации

Скрытые факторы должны быть представлены тем или иным образом, чтобы мы могли разобраться в модели. В pyTorch они представлены с помощью матриц. Это делается с помощью функции «torch.randn». Как это работает - PyTorch случайным образом создает скрытые факторы для пользователей и фильмов на основе общего количества пользователей и фильмов. Затем для получения оценок требуется скалярное произведение. Мы это уже установили. Но чтобы получить это скалярное произведение, мы должны найти индекс фильма в матрице скрытых факторов фильма и индекс пользователя в пользовательской матрице. Это не то, что модели глубокого обучения знают. Это требует встраивания [очень простая тема].

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

Вложения

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

Довольно просто, правда? Первый блок создает скрытые факторы пользователя и фильма с использованием вложений, а второй блок умножает два (скалярное произведение).

Здесь важно понять, что модель принимает в качестве входных данных тензор формы (batch_size x 2). Здесь первый столбец представляет идентификатор пользователя, а второй - идентификатор фильма. Слои внедрения используются для представления матрицы скрытых факторов пользователя и фильма. Опять же, немного исследуйте данные самостоятельно. Взгляните, например, на x и y по отдельности.

Модель-ученик

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

Результаты вполне приличные. Мы могли бы улучшить его, используя sigmoid_range, чтобы гарантировать, что наши прогнозируемые рейтинги находятся между 0 и 5.

Давайте попробуем запустить модель сейчас

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

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

Намного лучше. Наши результаты наконец улучшились. Давайте сделаем некоторые визуальные эффекты и выводы из рекомендаций.

Интерпретация предубеждений и предубеждений

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

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

Я полностью согласен с моделью. Это плохие фильмы (некоторые из них неслыханные, по крайней мере, для меня - например, Showgirls, Bio-Dome имеют рейтинг в Интернете менее 5)

В этом смысле вот код, позволяющий снимать фильмы с самыми высокими предубеждениями.

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

PCA для визуализации фильмов

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

Этот сюжет весьма содержательный. Если вы обратили внимание, у нас есть несколько научно-фантастических фильмов, таких как «Империя наносит ответный удар», «Возвращение джедая», «Звездный путь», «Индиана Джонс», снятых рядом друг с другом. А слева у нас есть несколько нео-нуарных фильмов, таких как «Крестный отец» и «Фарго». Итак, это пара примеров того, насколько похожие фильмы представлены в скрытом пространстве.

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