Машинное обучение

Рекомендательные системы

Netflix оценивает, что их рекомендательная система экономит 1 миллиард в год, снижая отток пользователей. Рекомендации YouTube обеспечивают 70% всего времени просмотра. Amazon приписывает 35% выручки блоку "покупатели также покупали". Рекомендательные системы - самое коммерчески ценное применение machine learning в мире.

  • **Netflix и Spotify** используют гибридные рекомендации: коллаборативная фильтрация для зрелых пользователей, content-based для новых фильмов и треков, матричная факторизация для выявления скрытых предпочтений - все вместе формируют персональную ленту из миллионов единиц контента
  • **YouTube и TikTok** применяют deep learning пайплайн с candidate generation (two-tower модели, ANN-индексы), ranking (сотни features, трансформеры) и re-ranking (diversity, freshness) - весь цикл за менее чем 100ms на каждый запрос при каталоге из миллиардов видео
  • **Amazon и e-commerce** комбинируют item-based коллаборативную фильтрацию ("с этим товаром покупают"), content-based ("похожие товары") и персонализированный ranking, что обеспечивает до 35% общей выручки через рекомендации на главной странице, в корзине и email-рассылках

Предварительные знания

  • Policy Gradient

GroupLens, Amazon и Netflix Prize: как взрослели рекомендательные системы

Рекомендательные системы стали отдельной областью исследований в 1994 году, когда Пол Резник с коллегами построил GroupLens, систему, рекомендовавшую статьи в Usenet с помощью коллаборативной фильтрации: идеи о том, что люди, чьи вкусы совпадали в прошлом, совпадут снова. Подход быстро вышел в коммерцию. В 2003 году Грег Линден с командой в Amazon опубликовал метод item-to-item коллаборативной фильтрации, который масштабировал рекомендации на миллионы пользователей и товаров за счёт предрасчёта похожести между товарами, а не между пользователями, и он до сих пор обеспечивает значительную долю продаж Amazon. Поворотным моментом для всей области стал Netflix Prize, открытый конкурс с 2006 по 2009 год с наградой в миллион долларов за улучшение алгоритма Netflix на 10 процентов. Конкурс популяризировал матричную факторизацию: в 2009 году Йехуда Корен с соавторами показал, как латентно-факторные модели улавливают скрытые измерения вкуса. Победившие техники определили целое десятилетие промышленных рекомендателей, пока их не сменил глубокий обучение.

Коллаборативная фильтрация

Коллаборативная фильтрация (collaborative filtering) - самая интуитивная идея в рекомендательных системах: **если пользователи похоже оценивали товары в прошлом, они будут похоже оценивать их в будущем**. Вам не нужно знать ничего о самих товарах - ни жанр фильма, ни автора книги. Только история оценок. Есть два варианта: найти похожих *пользователей* (user-based) или похожие *товары* (item-based).

В основе лежит **матрица user-item** - таблица, где строки это пользователи, столбцы это товары, а значения это оценки. Проблема: эта матрица **крайне разреженная (sparse)**. Netflix имеет ~200 млн пользователей и ~15000 фильмов. Каждый пользователь посмотрел в среднем ~200 фильмов - это значит, что заполнено всего 1.3% ячеек. 98.7% матрицы пустые.

**Cosine similarity - мера похожести:** Для сравнения пользователей или товаров используют cosine similarity - косинус угла между векторами оценок: sim(A, B) = (A * B) / (||A|| * ||B||) - sim = 1: идентичные вкусы - sim = 0: никакой связи - sim = -1: противоположные вкусы Почему cosine, а не евклидово расстояние? Cosine игнорирует масштаб: пользователь, который ставит 3-5, и пользователь, который ставит 1-3, могут иметь одинаковые *предпочтения*, просто разные шкалы.

**Cold start problem - главная слабость коллаборативной фильтрации:** - **Новый пользователь:** нет оценок --> нет похожих пользователей --> нечего рекомендовать - **Новый товар:** никто не оценил --> не может быть рекомендован никому - **Sparsity:** даже для существующих пользователей, если общих оценок мало, similarity ненадежна На практике cold start решают гибридами: новому пользователю показывают популярное или content-based рекомендации, пока не накопится история.

**Item-based vs User-based на практике:** Amazon использует item-based подход. Почему? Вкусы пользователей меняются со временем (сегодня хочется комедию, завтра - триллер), а похожесть товаров стабильна ("Властелин колец" всегда похож на "Хоббита"). Кроме того, товаров обычно меньше, чем пользователей, что ускоряет вычисления: вместо матрицы 200M x 200M (пользователи) считаем 15K x 15K (фильмы).

Новый пользователь зарегистрировался на платформе и ещё не поставил ни одной оценки. Какая проблема возникает при коллаборативной фильтрации?

Content-based фильтрация

Content-based фильтрация решает задачу с другой стороны: вместо поиска похожих пользователей, она анализирует **свойства самих товаров**. Если пользователь купил три книги по machine learning - рекомендуем четвертую книгу по ML, а не книгу, которую купил похожий пользователь. Для этого нужен **профиль товара** (жанр, автор, теги, описание) и **профиль пользователя** (предпочтения, вычисленные из истории).

Для текстового контента (описания товаров, статьи, новости) профиль строят через **TF-IDF** - меру важности слова в документе. TF (term frequency) считает, как часто слово встречается в документе. IDF (inverse document frequency) понижает вес общих слов ("и", "в", "на") и повышает вес уникальных ("нейросеть", "квантовый"). Результат - вектор фиксированной длины для каждого товара, который можно сравнивать через cosine similarity.

**Преимущества content-based:** - **Нет cold start для товаров:** новый фильм можно рекомендовать сразу по его жанру и описанию, даже без единой оценки - **Прозрачность:** можно объяснить рекомендацию ("мы рекомендуем это, потому что вы любите sci-fi") - **Независимость от других пользователей:** работает даже для первого пользователя на платформе **Недостатки:** - **Cold start для пользователей:** без истории нет профиля - **Filter bubble (пузырь фильтрации):** система рекомендует только похожее на уже просмотренное, пользователь застревает в одном жанре - **Feature engineering:** нужно вручную определять признаки товаров (жанр, теги, описание)

На практике **чистый content-based подход используется редко**. Большинство систем комбинируют его с коллаборативной фильтрацией. Netflix использует content-based для решения cold start (новый фильм рекомендуется по жанру и актерам), а коллаборативную фильтрацию - для зрелых пользователей с длинной историей. Spotify строит профиль трека через audio features (темп, энергия, танцевальность) и NLP-анализ текстов песен, но основные рекомендации идут от коллаборативных сигналов.

Content-based система рекомендует пользователю только научно-фантастические фильмы, хотя он мог бы оценить и другие жанры. Как называется эта проблема?

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

Матричная факторизация (matrix factorization) - прорывной подход, который объединил силу коллаборативной фильтрации с эффективностью компактного представления. Идея: **разложить огромную разреженную матрицу user-item R (M пользователей x N товаров) на произведение двух маленьких плотных матриц** - U (M x K) и V (N x K), где K << M и K << N. Каждый пользователь и каждый товар получают вектор из K чисел - **латентные факторы**.

Что означают латентные факторы? Они обучаются автоматически, но часто соответствуют интуитивным категориям. Для фильмов: фактор 1 может отражать ось "экшн vs драма", фактор 2 - "голливуд vs авторское кино", фактор 3 - "новое vs классика". Пользователь с вектором [0.9, -0.3, 0.5] любит экшн, авторское кино и новинки. Фильм с похожим вектором получит высокий предсказанный рейтинг.

**Два алгоритма обучения:** **SVD (Singular Value Decomposition):** классическое разложение матрицы из линейной алгебры. Проблема: требует заполненную матрицу. Для разреженных данных используется "Funk SVD" - стохастический градиентный спуск, который обучается только на известных оценках. **ALS (Alternating Least Squares):** чередующийся метод наименьших квадратов. Фиксируем U, оптимизируем V. Фиксируем V, оптимизируем U. Повторяем. Преимущество ALS - легко параллелизуется (каждый пользователь обновляется независимо), поэтому это выбор Spark MLlib для больших данных. Обе минимизируют: sum((r_ij - U[i]*V[j])^2) + lambda*(||U||^2 + ||V||^2)

**Netflix Prize (2006-2009)** - легендарное соревнование, которое подтолкнуло рекомендательные системы на новый уровень. Netflix предложил 1 000 000 за улучшение их алгоритма CineMatch на 10% по RMSE. Команда BellKor's Pragmatic Chaos победила с улучшением 10.06%, и ключевым компонентом была именно матричная факторизация (SVD++ Саймона Функа). Интересный факт: Netflix так и не внедрил выигравшее решение в продакшн - оно было слишком сложным для их инфраструктуры в 2009 году.

Матрица user-item содержит 200 миллионов пользователей и 15000 фильмов, заполнена на 1.3%. Что делает матричная факторизация?

Deep Learning рекомендации

Матричная факторизация работает, но ограничена: она моделирует взаимодействие user-item как линейное скалярное произведение. **Neural Collaborative Filtering (NCF)** заменяет скалярное произведение нейросетью, которая может выучить нелинейные зависимости. Вместо r = U[i] * V[j] мы получаем r = f(U[i], V[j]), где f - нейросеть произвольной сложности. Это позволяет захватывать паттерны вроде "пользователь любит экшн, но только с рейтингом PG-13 и длительностью до 2 часов".

**Wide & Deep (Google, 2016)** - архитектура, решающая дилемму memorization vs generalization. **Wide** часть - линейная модель, которая запоминает конкретные паттерны ("пользователь X всегда покупает товар Y по пятницам"). **Deep** часть - нейросеть, которая обобщает ("пользователи, похожие на X, покупают товары, похожие на Y"). Вместе они дают лучший результат, чем по отдельности. Google Play Store получил +3.9% к установкам приложений после внедрения Wide & Deep.

**Продакшн пайплайн рекомендаций (YouTube, TikTok, Amazon):** **Этап 1: Candidate Generation (отбор кандидатов)** - Из миллионов товаров выбрать ~1000 кандидатов - Быстрая модель: two-tower + ANN (Approximate Nearest Neighbors) - Latency: < 10ms **Этап 2: Ranking (ранжирование)** - Из 1000 кандидатов выбрать ~100 лучших - Тяжелая модель: Wide & Deep, DCN, или трансформер - Использует сотни features: контекст, время, устройство - Latency: < 50ms **Этап 3: Re-ranking (пере-ранжирование)** - Из 100 товаров финальный список с учётом бизнес-правил - Diversity: не показывать 10 одинаковых товаров подряд - Freshness: подмешивать новый контент - Policy: фильтровать нежелательный контент - Latency: < 5ms

В реальном мире масштаб рекомендательных систем поражает. YouTube обрабатывает миллиарды видео и сотни миллионов пользователей. Для candidate generation используется ANN (Approximate Nearest Neighbors) - индекс, который находит ближайшие item-векторы к user-вектору за O(log N) вместо O(N). Библиотеки FAISS (Facebook) и ScaNN (Google) позволяют искать среди миллиардов векторов за миллисекунды. Ранжирование использует десятки моделей, работающих параллельно, и сотни features: от времени суток до скорости прокрутки.

Рекомендательные системы - это просто коллаборативная фильтрация

Современные системы - сложные пайплайны из десятков моделей с real-time personalization, candidate generation, ranking, re-ranking, diversity и feedback loops

Коллаборативная фильтрация - лишь один из кирпичиков. Продакшн система YouTube или TikTok включает: two-tower модели для candidate generation, wide & deep для ranking, трансформеры для sequential рекомендаций, бандитские алгоритмы для exploration, feature store с сотнями сигналов, ANN-индексы для real-time поиска среди миллиардов элементов, и систему непрерывного переобучения. Это инженерный пайплайн масштаба, который не сводится к одной формуле similarity.

Зачем в продакшн рекомендательных системах используется многоступенчатый пайплайн (candidate generation -> ranking -> re-ranking), а не одна модель?

Итоги

  • **Коллаборативная фильтрация** находит похожих пользователей (user-based) или товары (item-based) через cosine similarity матрицы оценок, но страдает от cold start для новых пользователей и товаров, а также от разреженности матрицы
  • **Content-based фильтрация** анализирует свойства товаров (жанр, описание через TF-IDF, теги), решает cold start для товаров, но создает filter bubble - замыкает пользователя в пузыре однотипного контента
  • **Матричная факторизация (SVD, ALS)** раскладывает разреженную user-item матрицу на компактные латентные векторы, сжимая данные в сотни раз и обобщая на пропуски - подход, принесший победу на Netflix Prize
  • **Deep Learning рекомендации** (two-tower, NCF, wide & deep) заменяют линейное скалярное произведение нейросетью и работают в многоступенчатом пайплайне: candidate generation, ranking, re-ranking - именно так устроены системы, которые стоят за тем самым миллиардом Netflix, 70% YouTube и 35% Amazon из нашего введения

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

Рекомендательные системы стоят на пересечении линейной алгебры, NLP, deep learning и системного дизайна:

  • Word Embeddings — Латентные факторы в матричной факторизации - прямой аналог word embeddings: и пользователи, и слова представлены как плотные векторы в обученном пространстве, где близость означает похожесть. Item2Vec - это Word2Vec, но для товаров вместо слов
  • Search и Ranking — Ranking модель рекомендательной системы - та же задача learning to rank, что и в поисковых системах. Two-tower модель используется и для рекомендаций (user-item), и для поиска (query-document). Один и тот же пайплайн candidate generation + ranking
  • Нейронные сети — NCF, wide & deep, two-tower модели - всё это глубокие нейросети. Embedding слои, fully connected layers, функции активации - весь аппарат deep learning применяется для моделирования предпочтений пользователей
  • PCA — SVD в матричной факторизации - тот же SVD, что лежит в основе PCA. Латентные факторы рекомендательной системы - аналог главных компонент: они захватывают максимум информации в минимуме измерений

Вопросы для размышления

  • Коллаборативная фильтрация и content-based подход имеют дополняющие слабости: первая не справляется с cold start для новых товаров, вторая создает filter bubble. Как бы вы спроектировали гибридную систему, которая использует сильные стороны обоих подходов?
  • Матричная факторизация сжимает матрицу 200M x 15K в два вектора размерности K=100. Какую информацию мы теряем при таком сжатии, и почему это может быть даже полезным (вспомните regularization)?
  • YouTube рекомендует видео 2 миллиардам пользователей из каталога в 800 миллионов видео за < 100ms. Почему невозможно обойтись одной моделью и необходим многоступенчатый пайплайн? Какие компромиссы (tradeoffs) стоят за каждой ступенью?

Связанные уроки

  • ml-35-word-embeddings — Эмбеддинги объектов питают рекомендации
  • ml-52-search-ranking — Оба ранжируют объекты по релевантности
  • ml-19-pca — Матричная факторизация снижает размерность
  • ml-05-evaluation — Precision@k и recall оценивают рекомендации
  • la-15-svd — Коллаборативная фильтрация использует SVD
  • la-13-eigenvectors
Рекомендательные системы

0

1

Войти