Рекомендательные системы
RecSys at Scale: Netflix, YouTube, TikTok
В 2009 году Netflix заплатил $1M команде BellKor's Pragmatic Chaos за RMSE-улучшение в 10.06% и не задеплоил победный ансамбль. В 2016 году Google опубликовал статью о YouTube DNN, где двухстадийная архитектура стала каноном для всей индустрии. В 2022 ByteDance раскрыл Monolith - online-обучение через Parameter Server, превратившее TikTok-фид в как будто 'читающий мысли' алгоритм. Эти три эпизода - не разные подходы, а эволюция одной задачи: 'как уложиться в 100мс с миллиардным корпусом и сделать так, чтобы метрика на тренинге соответствовала цели бизнеса'. За масштабом скрываются конкретные инженерные паттерны: two-stage retrieval, ANN, feature stores, multi-task learning. Без них billion-scale RecSys принципиально неосуществим.
- **YouTube DNN**: каноническая статья Covington et al. 2016 - двухстадийная архитектура candidate gen + ranking, до сих пор cтандарт
- **TikTok Monolith**: ByteDance 2022, online-обучение через Parameter Server, sub-minute feedback loop
- **Netflix Prize 2009**: $1M победителю, ансамбль 107 моделей не задеплоен - классический пример разрыва между метрикой и бизнес-целью
- **Spotify Discover Weekly**: использует похожий two-stage stack с ANN-поиском в каталоге 100M треков для 600M пользователей
Предварительные знания
- Two-stage retrieval: candidate generation + ranking
- Matrix factorization и embeddings
- Approximate nearest neighbour поиск (ANN)
YouTube DNN: двухстадийная архитектура становится каноном
В 2016 году на конференции RecSys инженеры Google Paul Covington, Jay Adams и Emre Sargin опубликовали статью «Deep Neural Networks for YouTube Recommendations». Они разбили задачу на две стадии: candidate generation сокращает миллиарды видео до нескольких сотен через ANN-поиск в embedding-пространстве, а отдельная ranking-сеть упорядочивает их по ожидаемому времени просмотра. Эта декомпозиция стала отраслевым стандартом: применить тяжёлую модель к миллиарду документов невозможно, к 500 кандидатам - дёшево. Спустя три года Netflix Prize (2006-2009) уже показал, что чистый rating prediction плохо переносится в продакшн, а ByteDance Monolith (2022) добавил online-обучение поверх той же two-stage схемы. TikTok как продукт стартовал в 2016 году в Китае и вышел на глобальный рынок в 2018 после слияния с Musical.ly.
YouTube: candidate generation + ranking
Архитектура YouTube DNN из канонической статьи Covington et al. 2016 разводит задачу на **две стадии**: **candidate generation** и **ranking**. Первая нейросеть превращает миллиарды видео в несколько сотен кандидатов через approximate nearest neighbour поиск в embedding-пространстве. Вторая - более сложная сеть с сотнями фичей - ранжирует именно эти кандидаты по ожидаемому времени просмотра. Такая декомпозиция критична: применить сложную модель к миллиарду документов нереально, но к 500 кандидатам - просто. Каждая стадия оптимизируется отдельно: candidate gen - метрика recall@500, ranking - watch-time per impression.
YouTube использует **video embeddings** как user history представление: сэмпл из последних просмотренных видео усредняется, конкатенируется с user context (search history, demographic features) и через MLP проецируется в общее embedding-пространство. На inference запрос к ANN-индексу (Google ScaNN или FAISS) занимает 1-2 мс на запрос даже для миллиардной коллекции. С 2019 года YouTube перешёл на multi-task learning: одна модель предсказывает несколько целей (CTR, watch-time, like rate, dislike rate) с разными головами.
Почему YouTube использует двухстадийную архитектуру вместо одной end-to-end модели на все видео?
TikTok Monolith: real-time learning без батчей
TikTok-фид построен на системе **Monolith** (опубликована в работе ByteDance 2022) - принципиально online-модели, где каждое взаимодействие пользователя обновляет параметры в течение секунд. Это отличает её от YouTube, где модель тренируется батчами раз в часы или сутки. Ключевая инновация - **collisionless embedding table**: хэш-таблица гигантского размера, где каждый user/item получает свой dedicated slot и backpropagation не страдает от collision-induced noise. Параметры синхронизируются через Parameter Server между training-кластером и inference-кластером с задержкой меньше минуты.
Эффект 'For You Page' основан именно на скорости обратной связи. Когда пользователь досматривает ролик до конца, dwell-time сигнал летит в Monolith за ~10 секунд, обновляет user embedding, и следующий запрос к фиду уже учитывает свежее предпочтение. Это создаёт ощущение, что система 'читает мысли' - в реальности она читает поведенческую статистику с лагом в десятки секунд, не часы. ByteDance специально не использует Federated Learning для feed-рекомендаций именно из-за этого требования к скорости update.
В чём ключевое архитектурное отличие Monolith от классического batched-training рекомендательной системы?
Netflix Prize: дилемма победы и продакшна
**Netflix Prize** (2006-2009) - $1M открытое соревнование на улучшение RMSE предсказания рейтингов 5-звёздочных оценок. Победила команда BellKor's Pragmatic Chaos с ансамблем из 107 моделей: матричная факторизация, RBM, kNN, временные эффекты. Они улучшили RMSE на 10.06% над baseline Cinematch. Netflix заплатил приз, но **никогда не задеплоил победный ансамбль**: вычислительная сложность была неприемлемой, а конкурс измерял rating prediction, тогда как настоящая бизнес-метрика - watch-time. Этот эпизод стал учебником про разрыв между академическими RecSys-метриками и продакшн-метриками.
После 2009 года Netflix перешёл от рейтингов на implicit feedback (что смотрит, как долго, когда бросает) и от RMSE на retention и watch hours. Их recommendation stack сегодня - комбинация candidate gen (контекстуальный bandit), ranking (gradient-boosted trees + neural net) и personalisation row layout. Главный урок Netflix Prize: оптимизация известной метрики на статическом датасете не гарантирует production lift, потому что offline-метрика отражает прошлое, а online-feedback - будущее распределение, формируемое самими рекомендациями.
Почему Netflix не задеплоил победный ансамбль Netflix Prize, несмотря на победу в собственном конкурсе?
Инженерия billion-scale: shared patterns
За YouTube, TikTok и Netflix скрываются общие инженерные паттерны billion-scale рекомендательных систем. **Two-stage retrieval**: candidate gen через ANN + ranking сложной моделью - конструктивно необходим при миллиардах документов. **Feature store + serving store**: фичи рассчитываются батчами и пишутся в low-latency KV-store (например Bigtable, RocksDB), откуда serving подтягивает их за единицы миллисекунд. **Approximate nearest neighbour индексы**: ScaNN, FAISS, HNSW дают O(log N) на запрос вместо O(N). **Multi-task learning**: одна модель обучается на 5-10 целях одновременно с разными головами, экономит на тренинге и улучшает обобщение через regularisation.
Все три компании сейчас активно используют **causal inference в RecSys** - чтобы отличить корреляцию ('пользователь видит и кликает') от каузации ('пользователь кликнул бы и без рекомендации'). Алгоритмы IPS (Inverse Propensity Scoring) и Doubly Robust estimators позволяют оценить, насколько рекомендация реально влияет на поведение, а не следует за ним. Это критично для long-term retention: рекомендация, угадывающая интерес, который пользователь и так бы удовлетворил, не создаёт ценности и съедает inventory.
Billion-scale RecSys - это просто 'обычная модель на больших данных'
Billion-scale - это инженерная задача с конструктивными ограничениями: ANN-индексы заменяют O(N) поиск, feature stores отделяют batch-вычисления от serving, multi-stage decomposition позволяет применить сложные модели к финальному shortlist'у вместо всего корпуса.
На N=10^4 любая модель работает. На N=10^9 нет места для 'просто обучения модели' - архитектура определяется тем, как уложиться в 100мс latency budget при corpus в миллиард. Это меняет требования к самой ML-модели: candidate gen должна быть совместима с ANN-search (dot product), ranking должна обучаться на shortlist'е (sample selection bias), и весь pipeline должен быть совместим с online learning или near-online updates.
Какой паттерн принципиально необходим для real-time scoring при миллиардах кандидатов?
Ключевые идеи
- **YouTube DNN**: двухстадийная архитектура candidate gen + ranking - конструктивно необходима при миллиардах кандидатов; разрешает применить сложные модели на финальном shortlist'е
- **TikTok Monolith**: online learning через Parameter Server даёт sub-minute feedback loop; ценой значительно более сложной инфраструктуры с collisionless embedding tables
- **Netflix Prize**: победный ансамбль никогда не задеплоен - urлок про разрыв между академической метрикой (RMSE) и бизнес-целью (watch-time + retention)
- **Billion-scale паттерны**: ANN-индексы для O(log N) поиска, feature stores для отделения batch от serving, multi-task learning, causal inference для отличия корреляции от каузации
- **Бюджет latency 50-100мс на запрос диктует архитектуру**: каждая стадия имеет конкретный sub-budget, и модель проектируется под него
Связанные темы
Billion-scale RecSys пересекается с несколькими ML- и инфраструктурными направлениями:
- Approximate Nearest Neighbour — ScaNN, FAISS, HNSW - алгоритмы, без которых candidate gen с миллиардным корпусом невозможен; вытекают из задач IR и similarity search
- Multi-task learning — Одна модель с несколькими головами оптимизирует CTR, watch-time, like rate одновременно - экономит compute и улучшает обобщение
- Causal inference — IPS, Doubly Robust estimators применяются для оценки эффекта рекомендации vs наблюдаемая корреляция; критично для long-term retention
Вопросы для размышления
- Если Monolith даёт sub-minute feedback loop, почему YouTube и Netflix всё ещё работают на batch-retraining? Какие ограничения и trade-offs определяют этот выбор?
- Netflix Prize показал, что оптимизация offline-метрики не транслируется в бизнес-результат. Какие косвенные сигналы можно использовать в offline-evaluation, чтобы лучше предсказать production lift?
- Если ANN-индексы дают recall@500 около 95-99%, как RecSys-команды узнают, какие правильные кандидаты отсеиваются и какой их вклад в потерю качества?
Связанные уроки
- rec-12 — Предыдущий урок по RecSys для перехода к масштабу
- ml-16-clustering-kmeans — Кластеризация пользователей - стандартный приём в промышленных RecSys
- aie-10-vector-databases — Vector DB - основа ANN поиска в YouTube/TikTok scale RecSys
- prob-04-bayes — Bayesian update предпочтений - альтернатива коллаборативной фильтрации
- ds-04-consistent-hashing — Consistent hashing для распределения нагрузки в RecSys кластерах
- dist-14-sharding