Скрытые факторы и идея SVD
Урок объясняет идею скрытых факторов: вместо сравнения соседей мы учим компактные векторы пользователей и товаров, перемножение которых восстанавливает оценки.
Матричное разложение представляет каждого пользователя и каждый товар вектором из небольшого числа скрытых факторов так, что скалярное произведение этих векторов приближает известную оценку.
От соседей к факторам
Коллаборативная фильтрация сравнивает строки или столбцы матрицы напрямую и страдает от разреженности: если два пользователя не пересеклись по товарам, их похожесть посчитать нельзя. Матричное разложение решает это иначе — оно ищет скрытую структуру. Идея: каждый фильм описывается небольшим набором «осей» (доля боевика, доля романтики, серьёзность, бюджетность), а каждый пользователь — своими предпочтениями по тем же осям. Тогда оценка = насколько вкусы пользователя совпадают с профилем фильма.
R (n_users x n_items) ≈ P (n_users x K) · Q^T (K x n_items)
фильмы факторы факторы->фильмы
польз | 5 ? 4 | польз | 0.9 0.1 | | 0.8 ... |
| ? 1 5 | ≈ | 0.2 0.8 | · | 0.1 ... |
| 1 5 ? | | 0.1 0.9 | | ... |K (число факторов) обычно от 10 до нескольких сотен — гораздо меньше числа товаров. Эти факторы скрытые: модель сама выводит их из данных, и они не обязаны иметь человеческое название вроде «комедийность». Важно лишь, что перемноженные обратно векторы хорошо восстанавливают известные оценки и осмысленно заполняют пропуски.
SVD и ALS
Классически такое разложение связывают с SVD (сингулярное разложение) из линейной алгебры. Но чистый SVD требует полной матрицы, а наша — почти пустая. Поэтому в рекомендациях используют приближённые методы, которые учат факторы только по известным ячейкам:
- SGD (стохастический градиентный спуск) — итеративно подправляет векторы, уменьшая ошибку на известных оценках. Его мы реализуем в следующем уроке.
- ALS (alternating least squares) — поочерёдно фиксирует то пользователей, то товары и решает задачу наименьших квадратов; хорошо распараллеливается и популярен для неявных данных.
Почему это работает на разреженности
Поскольку каждый пользователь и товар сжаты в K чисел, модель вынуждена обобщать. Она не запоминает оценки, а ловит закономерности: «любители фантастики ставят высокие баллы фильмам с высоким фактором фантастики». Благодаря этому она даёт осмысленный прогноз даже для пары пользователь-товар, которая в данных никогда вместе не встречалась, — чего CF по соседям сделать не может.
Как работает под капотом
Обучение минимизирует ошибку восстановления известных оценок плюс регуляризацию (штраф за слишком большие векторы, чтобы не переобучиться). Прогноз для пары (u, i) — это скалярное произведение их векторов, часто плюс поправки на «общую щедрость» пользователя и «общую популярность» товара (bias-члены). Размер модели — это всего лишь (n_users + n_items) * K чисел, что компактно даже для огромных каталогов.
Частые ошибки
- Учить по нулям как по оценкам. Для явного фидбэка обучаемся только на известных ячейках, иначе модель решит, что «не смотрел» = «оценка 0».
- Брать слишком большой K. Много факторов без регуляризации ведут к переобучению.
- Ждать интерпретируемых осей. Скрытые факторы не обязаны соответствовать понятным жанрам.
Итоги
- Матричное разложение сжимает пользователей и товары в K скрытых факторов.
- Оценка приближается скалярным произведением их векторов.
- В рекомендациях используют SGD и ALS, обучаясь только по известным ячейкам.
- Сжатие заставляет модель обобщать, что побеждает разреженность.