Основы и классика
~14 мин

Collaborative Filtering

User-based, item-based CF, матричная факторизация (SVD, ALS).

Коллаборативная фильтрация — сила толпы

Загрузка интерактивного виджета...

Идея проста: если тебе и Маше нравятся одни и те же фильмы, то фильм, который Маша посмотрела, а ты ещё нет, скорее всего тебе понравится. Это коллаборативная фильтрация — рекомендации на основе коллективного поведения.

User-based vs Item-based

Два взгляда на одну задачу. User-based: находим похожих пользователей, смотрим что они любят. Item-based: находим похожие айтемы на основе паттернов оценок. На практике item-based стабильнее — айтемы меняются реже, чем вкусы пользователей.

Матричная факторизация — ядро CF

Коллаборативная фильтрация: User-based и Item-based подходы с матричной факторизацией
Коллаборативная фильтрация раскладывает разреженную матрицу пользователь-айтем на латентные факторы для предсказания оценок

Матрица «пользователь × айтем» огромная и на 99% пустая. Матричная факторизация раскладывает её на две маленькие: пользователи × скрытые факторы и факторы × айтемы. Скрытые факторы — это «вкусы»: любит боевики, предпочитает короткие видео и т.д.

Предсказание = скалярное произведение векторов пользователя и айтема

Netflix Prize — $1M за 10%

В 2006 году Netflix предложил миллион долларов за 10% улучшение рекомендаций. Победила матричная факторизация (SVD++) + ансамбль моделей. Это сделало CF мейнстримом в индустрии.

SVD и ALS — как обучать

SVD (Singular Value Decomposition) — классическое разложение, но не работает напрямую с пропусками. Для рекомендаций используют модифицированный SVD с регуляризацией или ALS (Alternating Least Squares) — фиксирует одну матрицу, оптимизирует другую, и наоборот.

from implicit.als import AlternatingLeastSquares
model = AlternatingLeastSquares(factors=64, iterations=20)
model.fit(user_item_sparse_matrix)
# Рекомендации для пользователя 42
recs = model.recommend(42, user_item_sparse_matrix[42])

BPR — стандарт для неявных данных

BPR (Bayesian Personalized Ranking) — pairwise-подход для неявной обратной связи. Идея: если пользователь кликнул айтем A, но не кликнул B — значит A > B для этого пользователя. Модель учится ранжировать взаимодействия выше невзаимодействий.

BPR-лосс: максимизируем разницу скоров между положительным (i) и отрицательным (j) айтемами

Проблемы CF

  • Холодный старт — нет истории = нет рекомендаций
  • Разреженность — 99%+ матрицы пустые, мало сигнала
  • Популярность — модель скатывается в рекомендации хитов всем подряд
  • Масштаб — миллионы пользователей × миллионы айтемов, нужна аппроксимация

Что спрашивают на собесе

Чем ALS лучше SGD для матричной факторизации? ALS параллелизуется — можно обучать на кластере (Spark). SGD — последовательный, но сходится быстрее на маленьких данных. Для неявной обратной связи: implicit ALS (Hu, Koren, 2008) — стандарт индустрии.

🎯 Суть для собеса

• ALS vs SGD для матричной факторизации? (ALS — параллелится, стабильнее для implicit. SGD — быстрее на sparse) • Проблема холодного старта в CF? (нет истории → нет рекомендаций. Решение: контентные фичи или popularity fallback) • User-based vs Item-based CF? (item-based стабильнее — айтемы меняются реже, чем вкусы пользователей) • Что такое implicit ALS? (Hu, Koren, Volinsky 2008: confidence = 1 + alpha * interactions, минимизируем weighted MSE) • Почему CF не работает для новых пользователей? (cold start, нужен fallback на контентный подход)