Collaborative Filtering на собеседовании Data Scientist

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Карьерник — Duolingo для аналитиков: 10 минут в день тренируй SQL, Python, A/B, статистику, метрики и ещё 3 темы собеса. 1500+ вопросов в Telegram-боте. Бесплатно.

Зачем разбирать на собесе

Recsys — топовая ML-задача в индустрии. Collaborative filtering — фундамент. На собесе DS: «как работает MF», «ALS vs SGD», «implicit vs explicit feedback».

Memory-based: user-based и item-based

User-based. «Users like you also liked X».

Для пользователя u:

  1. Найти k ближайших пользователей (по cosine / Pearson similarity их рейтингов).
  2. Рекомендовать items, которые им нравились, но u ещё не видел.

Item-based. «Item similar to what you bought».

  1. Для каждой пары items посчитать similarity (по co-occurrence в рейтингах).
  2. Для пользователя — items, похожие на те, что ему нравились.

Item-based обычно лучше:

  • Items стабильнее (меньше меняются, чем users).
  • Similarity items предпосчитывается оффлайн.
  • Меньше холодного старта.

Минусы memory-based:

  • O(N²) similarity matrix — не масштабируется.
  • Sparse data — similarity нестабильна.
  • Не учитывает latent факторы.

Matrix factorization

R (users × items) — sparse матрица рейтингов / интеракций.

R ≈ U · Vᵀ

U: users × k       embeddings пользователей
V: items × k       embeddings товаров

k — размерность latent space, обычно 32-256.

Loss (для explicit feedback):

L = Σ_{(u,i)∈observed} (R_ui - U_u · V_iᵀ)² + λ(||U||² + ||V||²)

Минимизация только по наблюдённым ячейкам.

Optimization: SGD или ALS.

# SGD
for u, i, r in observed:
    e = r - U[u] @ V[i]
    U[u] += lr * (e * V[i] - λ * U[u])
    V[i] += lr * (e * U[u] - λ * V[i])

После обучения:

  • Скор для (u, i) = U_u · V_i.
  • Топ-K items для пользователя — top по dot product.
  • Похожие items — cosine между V[i].

ALS — Alternating Least Squares

Альтернатива SGD, особенно для distributed (Spark MLlib).

Идея. Зафиксировать U, оптимизировать V — это linear least squares (closed form). Потом наоборот. Повторять.

∂L/∂V_i = 0  →  V_i = (Σ_u U_u U_uᵀ + λI)⁻¹ Σ_u r_ui U_u

Каждая итерация — paralelizable.

Преимущества:

  • Convergence быстрая.
  • Distributed-friendly.
  • Не требует learning rate.

В Spark MLlib ALS — стандарт для коллаборативной фильтрации на больших данных.

BPR для implicit feedback

В проде у нас обычно implicit feedback — клики, просмотры, покупки. Не явные рейтинги. Подход «predict click probability» с MSE — неправильный (отсутствие клика ≠ negative feedback).

BPR (Bayesian Personalized Ranking). Pairwise loss: для positive (u, i+) и negative sampled (u, i-) — модель должна давать score(u, i+) > score(u, i-).

L = -Σ log σ(U_u · V_{i+}ᵀ - U_u · V_{i-}ᵀ) + regularization

WALS / Implicit ALS. Альтернатива — ALS с весами доверия (c_ui = 1 + α·r_ui):

L = Σ_all c_ui (r_ui - U_u · V_iᵀ)² + reg

r_ui = 1 если interaction, 0 иначе. Implicit ALS в Spark — для implicit data.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Проблема cold start

User cold start. Новый пользователь без истории. Рекомендация на основе:

  • Popularity (топ-N).
  • Onboarding (опрос интересов).
  • Demographic features.
  • Hybrid models с content-based.

Item cold start. Новый item без интеракций. Рекомендации через:

  • Content features (метаданные, embeddings из description).
  • Two-tower / DSSM с item features.

Sparse data. Малая активность. Помогает popularity baseline + регуляризация.

Современные подходы

Two-tower (DSSM). User и item — отдельные нейросети, learnable embeddings.

user_embedding = UserTower(user_features)
item_embedding = ItemTower(item_features)
score = dot(user_embedding, item_embedding)

Sequential models.

  • SASRec — self-attention sequential recommendation.
  • BERT4Rec — masked LM подход.

Graph approaches.

  • LightGCN — простое graph convolution.
  • PinSage (Pinterest).

Multi-stage architecture.

Candidate generation (recall) → Ranking → Re-ranking
1M items                       → 1000   → 50 → top 10

Современный production recsys.

Частые ошибки

Использовать MSE для implicit feedback. Модель учит «нет клика = 0 score». Лечение — BPR / WALS.

Игнорировать popularity bias. MF учит «популярное» лучше, чем нишевое. Lechение — sampling, debiasing.

Cosine similarity на raw counts. Без нормализации — длинные истории доминируют.

Случайный train/test split. В recsys нужен temporal split — train < t, test ≥ t.

Тестировать только offline. Hit@K в офлайне ≠ CTR в проде. A/B обязателен.

Cold start без fallback. Новый user не должен видеть пустую страницу. Popularity baseline.

Связанные темы

FAQ

Сколько latent factors выбирать?

32-256 типично. Кросс-валидация на NDCG / Hit@K.

MF подходит для производства?

Да, для baseline. Spark ALS работает на миллиардах interactions. Two-tower обычно лучше.

Что такое FM (Factorization Machines)?

Generalization MF + linear regression — учит interactions всех пар features. Полезно для cold start (с фичами).

Это официальная информация?

Нет. Статья основана на работах (Koren 2009 «MF for Recommender Systems», Rendle 2009 «BPR»).


Тренируйте Data Science — откройте тренажёр с 1500+ вопросами для собесов.