Вопрос или проблема
Я довольно новичок в машинном обучении и, кстати, в нейронных сетях, но последние несколько дней решил попробовать решить довольно классическую и практическую задачу нейронных сетей/машинного обучения, такую как рекомендательные системы.
Извините, если это ненужно широкий вопрос, но мне было трудно найти ресурсы, отвечающие на этот конкретный вопрос. Мой основной вопрос заключается в том, как вообще моделировать проблему (или какие направления/советы существуют по ее моделированию)?
Пусть $M$ обозначает набор всех фильмов, которые вы можете рекомендовать, каждый из которых имеет свой идентификатор. Как именно будет выглядеть ввод в модель (и вывод) и как вы будете разделять обучающие данные и наблюдаемые результаты? Например, если у меня есть строка обучающих данных (строка размера $|M|$, и каждый элемент представляет собой число от $1$ до $10$, обозначающее оценку пользователя, или $0$, если пользователь еще не видел фильм), просто удалить, скажем, половину оценок пользователя в строке (оценки от $1$ до $10$, которые значимы) и заменить их на $0$ в строке обучения, а затем в моей наблюдаемой строке (для тестирования) будет вся строка без пропущенных оценок, как показано ниже?
$$\underbrace{[9 \ 0 \ 0 \ 5 \ 7 \ 0 \ … \ 8 \ 0 \ 10 \ 0]}_{Информация} \rightarrow \underbrace{[0 \ 0 \ 0 \ 0 \ 0 \ 0 \ … \ 8 \ 0 \ 10 \ 0]}_{Обучение} \rightarrow \underbrace{[9 \ 0 \ 0 \ 5 \ 7 \ 0 \ … \ 8 \ 0 \ 10 \ 0]}_{Наблюдение} $$
Несколько очевидных наивных подходов:
Размер ввода = $|M|$, размер вывода = $|M|$
Каждый входной нейрон получает соответствующую пользовательскую оценку для $i^{th}$ фильма. Предположить некоторое количество промежуточных слоев, и затем мы добираемся до размера выхода, который представляет собой $|M|$ выходных нейронов, каждый из которых пытается предсказать оценку пользователя для этого фильма. Это кажется странным, потому что почти все входные нейроны получат $0$, и почти все выходные нейроны попытаются выдать $0$ (так как, вероятно, пользователь видел только незначительную часть всех $|M|$ фильмов). Это не похоже на то, чтобы нейронная сеть смогла выучить что-то полезное. И что делать с фильмами, которые пользователь не видел? Просто считать, что это $0$ потеря? Таким образом, функция потерь для нейрона $i$ просто:
$$\text{Потеря}(y^{(i)}) = 0 \ \text{если пользователь не видел i-й фильм, иначе: } \ \phi{(y^{(i)}, t^{(i)})}$$
Где $\phi$ – это некоторая функция потерь предсказанного выхода нейрона $y^{(i)}$ и наблюдаемого значения (фактическая оценка пользователя) $t^{(i)}$. Мне трудно поверить, что это приведет к каким-то полезным оценкам, поскольку потеря не имеет никакого эффекта на бессмысленные выходы моей нейронной сети (это не влияет на значения i-х нейронов, если пользователь еще не видел фильм). Это также создает проблему того, как тогда делать предсказание. Просто взять все самые высокие предсказанные значения от нейронной сети и вернуть соответствующие фильмы?
Из-за вышеописанных проблем я попытался выразить модель по-другому, но не думаю, что существует способ преодолеть разреженность данных и тот факт, что размер вывода должен быть $|M|$, так как я не могу пытаться предсказать дискретные целочисленные идентификаторы фильмов. Кто-то может просветить меня по этой теме или предоставить какие-либо возможные инсайты по очевидным ошибкам, которые я совершаю?
Вам не обязательно использовать полные входные и выходные вектора, чтобы предсказать оценки для пользователя.
Используйте идею вложений и создайте пары (user_id, movie_id) для обучения. Таким образом, ваш ввод может выглядеть так: (112,1456)=7
, это означает, что пользователь с идентификатором 112
посмотрел фильм номер 1456
и оценка была 7
. Так что размер вложения для пользователя — это |уникальные пользователи| и фильмы — |уникальные фильмы|, называем это |M|.
С помощью этого трюка мы изменили структуру проблемы на ту, что нам уже известна. Это регрессия!
Теперь вы можете добавить все смещения (и все, что пожелаете) к вложениям для фильмов и пользователей. Используйте известные функции потерь для регрессии, такие как RMSE
, и все готово. Конечно, вы можете добавить другие линейные слои, relu и dropouts поверх этих вложений и сделать это так, как если бы это была полностью связанная нейронная сеть, и получить даже лучшие результаты.
Ответ или решение
Рекомендательные системы на основе коллаборативной фильтрации – это фундаментальная задача в области машинного обучения, особенно популярная в нейросетях. Ваша задача заключается в предсказании оценок, которые пользователи могут дать тем или иным фильмам. Решение этой проблемы традиционно сталкивается с двумя основными сложностями: разреженностью данных и моделированием задачи предсказания. Давайте рассмотрим каждый аспект детально.
Разреженность данных в коллаборативной фильтрации
Когда задача коллаборативной фильтрации решается с использованием матричного представления, возникает проблема разреженности: пользователи обычно оценивают лишь небольшое множество доступных фильмов. Это приводит к большой доле нулевых значений в этих матрицах, что затрудняет обучение нейросети, так как она должна предсказывать значения для множества ненаполненных данных.
Для решения этой проблемы часто используется подход с векторными представлениями ("эмбеддинг"). Вместо создания полного вектора размером $|M|$, где $|M|$ – это общее число фильмов, можно представлять данные в виде пар (user_id, movie_id), где значение пары соответствует рейтингу данного пользователя для конкретного фильма. Это делает данные более компактными и избавляет от ненужных нулевых значений.
Моделирование задачи предсказания
Для предсказания оценок уместно использовать модели регрессии. В вашем случае, пара (user_id, movie_id) преобразуется в предсказанную оценку. В таких моделях потеря может быть измерена привычными функциями для регрессии, такими как среднеквадратичная ошибка (RMSE).
Конкретное решение
-
Эмбеддинг пользователей и фильмов: Создавайте эмбеддинги для пользователей и фильмов, где каждый пользователь и каждый фильм имеют свое векторное представление.
-
Архитектура сети: Используйте двухслойную нейронную сеть с одним или несколькими скрытыми слоями. Это может достигается через линейные слои, функции активации (например, ReLU) и регуляризацию (например, Dropout).
-
Задача предсказания: Модель принимает пару (user_id, movie_id) и выдает предсказание рейтинга. Потери можно оптимизировать с использованием RMSE или другой схожей функции.
-
Тренировка и тестирование: Для обучения модели разбейте данные на обучающую и тестовую выборки. Обучающие данные могут содержать пары (user_id, movie_id) с соответствующими рейтингами пользователей. Для тестирования можно использовать заранее спрогнозированное значение по известным парам.
Дополнительные улучшения
Для улучшения качества рекомендаций можно внедрить дополнительные техники, такие как добавление биасов для пользователей и фильмов, использование более сложных моделей, например, с несколькими развернутыми слоями и регуляризациями.
Этот подход позволяет эффективно справляться с проблемой разреженности и улучшать качество рекомендаций для сложных сетей. Используя embedding’и и заранее разметив данные, вы сможете адаптировать модель под конкретные потребности бизнеса.