Рекомендательные системы
Как из миллионов кандидатов выбрать десять для конкретного пользователя: коллаборативная фильтрация и матричное разложение, two-tower и ANN, холодный старт, метрики и петли обратной связи.
Интуиция
Задача рекомендательной системы (recommender system) — предсказать, что понравится пользователю, и сделать это среди каталога в миллионы объектов за десятки миллисекунд. Классических источника сигнала два. Коллаборативная фильтрация (collaborative filtering) опирается на поведение: люди с похожими вкусами любят похожее. User-based вариант ищет похожих пользователей и берёт их любимое, item-based — похожие объекты («те, кто смотрел X, смотрели и Y»). Признаки контента ей не нужны вовсе — только история взаимодействий. Контентный подход (content-based) — наоборот: рекомендует по признакам самого объекта (жанр, текст описания, эмбеддинг обложки), поэтому работает даже для объектов, которые ещё никто не видел.
Матричное разложение
Представь таблицу «пользователи × фильмы» с оценками — заполненную на пару процентов. Матричное разложение (matrix factorization) приближает её произведением двух узких матриц:
У каждого пользователя и каждого фильма появляется латентный вектор из k чисел, а предсказание — их скалярное произведение. Оси этого пространства никто не размечал: обучение (SGD по известным клеткам или ALS — попеременный пересчёт U и V) само находит скрытые «жанры», вдоль которых вкусы различаются. Подход прославился на конкурсе Netflix Prize и по сути даёт эмбеддинги пользователей и объектов в общем пространстве — ту же геометрию смысла, что и в семантическом поиске.
В проде явных оценок почти не бывает — есть неявный фидбек (implicit feedback): клики, просмотры, дочитывания, покупки. Важная тонкость: отсутствие клика не значит «не нравится» — пользователь мог просто не увидеть объект, поэтому пропуски трактуют осторожно, со взвешиванием уверенности.
Известные оценки обведены рамкой, предсказания — бледные. Смотри, как RMSE на скрытом holdout падает, хотя модель этих клеток не видела: латентная структура «двух жанров» восстанавливается из 40% наблюдений. Включи «+ новый (cold start)» — у новичка нет ни одной оценки, его вектор так и стоит у нуля, и все предсказания около среднего.
Прод-пайплайн: retrieval → ranking
Прогнать тяжёлую модель по миллионам кандидатов на каждый запрос невозможно, поэтому современный пайплайн двухэтапный — как в поиске. Retrieval: two-tower модель — «башня» пользователя и «башня» объекта кодируют каждого в эмбеддинг; векторы объектов не зависят от пользователя, поэтому их предвычисляют и складывают в ANN-индекс. На запрос считается только вектор пользователя, и ANN за миллисекунды отбирает сотни кандидатов. Обучение башен — контрастивное, по сути то же, что у эмбеддинг-моделей. Ranking: тяжёлая модель (бустинг или нейросеть) с сотнями признаков — контекст, время суток, свежесть, история — точно упорядочивает эти сотни. Поверх — переранжирование бизнес-правилами: разнообразие (привет MMR), свежесть, «не показывать уже купленное».
Холодный старт, метрики и ловушки
Холодный старт (cold start): у нового объекта нет взаимодействий — спасают контентные признаки (жанр, описание, эмбеддинг текста) и разведочные показы; у нового пользователя нет истории — показывают популярное, спрашивают интересы при онбординге, быстро дообучаются на первых кликах. Разведку формализуют многорукие бандиты (multi-armed bandits): часть трафика тратится на исследование, а не эксплуатацию.
Метрики двухслойные: оффлайн — recall@k и nDCG на отложенных по времени взаимодействиях (nDCG учитывает не только попадание, но и позицию: полезное наверху ценнее), онлайн — CTR, время в продукте, удержание. Они регулярно расходятся: логи собраны старой системой, клики смещены к верхним позициям, поэтому оффлайн-выигрыш не гарантирует онлайн-эффекта, и финальный судья — A/B-тест. Ловушки: popularity bias (популярное побеждает всегда и везде), фильтр-пузырь (пользователь замыкается в узком круге тем) и петля обратной связи.
- «Спроектируй ленту рекомендаций» — классика ML system design: двухэтапка retrieval → ranking, оффлайн/онлайн-метрики, план на холодный старт и фолбэк на популярное при отказе модели.
- «Что такое two-tower и причём тут ANN?» — раздельные энкодеры пользователя и объекта; векторы объектов предвычислены и лежат в ANN-индексе — retrieval за миллисекунды.
- «Как бороться с холодным стартом?» — контентные признаки для новых объектов, популярное и онбординг для новых пользователей, бандиты для разведки.
- «Оффлайн nDCG вырос — раскатываем?» — нет: оффлайн-метрика лишь гипотеза, решение принимает A/B-тест на онлайн-метриках.