Рекомендательные системы
Учебник для тех, кто готовится к собеседованию и не хочет заучивать определения. Здесь формулы выводятся, числа считаются, а у каждого приёма разбирается не только как он работает, но и где ломается.
- Всё проверяется. Каждое число посчитано скриптом из этого же репозитория или сверено с исходником. Математика виджетов сверена с независимой реализацией на Python — расхождение допускается до 1e-9.
- Виджеты, а не картинки. Двадцать шесть интерактивных демонстраций, где параметр можно подвигать и увидеть, что происходит с метрикой. Это не иллюстрации: внутри настоящие вычисления.
- Разбор живой системы. Отдельная часть читает открытый код реальной ленты — по дорожке запроса, с реальными весами из конфигов.
Из чего состоит
Девятнадцать глав по дорожке запроса. Каждая часть отвечает на свой вопрос, а внутри главы идут так, что следующая опирается на предыдущую. Читать можно подряд или брать нужную секцию отдельно — врезки «что унести из главы» и «шпаргалка одним экраном» для этого и сделаны.
Часть I · Постановка и измерение
С чего начинается любая система: что она вообще оптимизирует, откуда берутся данные и почему измерить качество труднее, чем его получить.
Глава 1
Задача и воронка
Почти всё устройство системы выводится из двух фактов: спрос крайне неравномерен, а на ответ есть десятки миллисекунд. Отсюда и персонализация, и холодный старт, и многостадийность.
Глава 2
Данные и смещения
Система учится не на предпочтениях, а на логах, отфильтрованных предыдущей версией самой себя. Четыре следствия и каталог смещений, о которых спрашивают всегда.
Глава 3
Метрики
У кандидатогенерации и ранжирования разные задачи, поэтому и метрики разные: полнота против порядка. Плюс тонкости, на которых ловят: Recall при фиксированном K, AUC без калибровки, усреднение по запросам.
Глава 4
Валидация и эксперимент
Метрику посчитать легко, поверить ей трудно. Случайный сплит завышает качество, офлайн систематически расходится с онлайном, а привычка подглядывать превращает пять процентов ложных срабатываний в двадцать.
Часть II · Кандидатогенерация
Как из миллионов кандидатов достать сотню за миллисекунды и не потерять по дороге нужное.
Глава 5
Коллаборативная фильтрация
Первый работающий подход и до сих пор основа половины продовых кандидатогенераторов. Вся конструкция держится на выборе меры похожести — и он меняет выдачу сильнее большинства архитектурных решений.
Глава 6
Матричная факторизация
Тот же коллаборативный сигнал, но обобщение через сжатие в несколько координат: факторизация видит связи там, где соседи видят пустоту, и ломается там, где соседи работают.
Глава 7
Двухбашенные модели
Ранжирующий лосс, отличный на второй стадии, для кандидатогенератора смертелен — и причина не в качестве модели, а в вырожденности задачи. Отсюда софтмакс по каталогу и три инженерные поправки.
Глава 8
Кодирование объектов
Свободная таблица эмбеддингов — самая мощная модель объекта, и вся глава про то, что этой мощностью почти невозможно воспользоваться. Выход один: заставить редкое наследовать знание от частого.
Глава 9
ANN и semantic IDs
Векторы обучены — осталось по ним искать. Почему точный перебор не влезает в бюджет, как устроен HNSW и какой ручкой в нём меняют полноту на скорость.
Часть III · Ранжирование
Сотня кандидатов есть — теперь их надо упорядочить: чему учить модель, что подавать ей на вход и как совместить несколько целей сразу.
Глава 10
Обучение ранжированию
«Какой лосс взять» выглядит выбором из каталога, а на деле это выбор того, что именно вы объявляете правдой: релевантность, наблюдаемый порядок или структуру показанного списка.
Глава 11
Признаки
Признаковое пространство здесь само диктует выбор архитектуры. Почему бустинг проигрывает именно тут, как устроен эмбеддинг-слой изнутри и что делают с вещественными признаками до подачи в сеть.
Глава 12
Взаимодействия признаков
История из шести шагов, где каждый следующий чинит поломку предыдущего — от кросс-признаков до DCN-v2. И главный тезис главы: MLP не выучивает произведение сам.
Глава 13
Мультизадачность и дистилляция
Целей больше одной, данные смещены позицией показа, а лучшая модель не влезает в бюджет. Три сюжета про расхождение между тем, чему модель учится, и тем, для чего её применяют.
Часть IV · Последовательности и выдача
История пользователя как вход и выдача как единое целое: что показывать вместе и что показать впервые.
Глава 14
Трансформеры над историей
Последовательность переменной длины надо свернуть в вектор. Что теряется при усреднении, зачем вниманию зависеть от кандидата и почему в проде получается два контура вместо одной модели.
Глава 15
Переранжирование
Ценность айтема зависит от того, что стоит рядом, поэтому «выбрать лучшие k» и «собрать лучший список» — разные задачи. Вторая тяжелее и решается жадно, но не наугад.
Глава 16
Exploration и бандиты
Модель учится на том, что показала предыдущая модель, и хороший непоказанный айтем так и останется неизвестным. Как разорвать круг и почему стохастичность выдачи нужна не только ради исследования.
Часть V · Инженерия
То, на чём всё предыдущее стоит: откуда берутся признаки в момент запроса и как система ведёт себя под нагрузкой.
Глава 17
Данные и логирование
Слой, который не показывают в статьях и на котором ломается больше внедрений, чем на выборе архитектуры. Почему офлайн-метрика бывает отличной, а онлайн — нет.
Глава 18
Рантайм
Где разрезать сервисы, где ставить фильтры, что кешировать и что показывать, когда половина стека недоступна. Система должна деградировать предсказуемо, а не умирать героически.
Часть VI · Проектирование
Сборка всего предыдущего в одну процедуру — ту самую, по которой отвечают на системный вопрос собеседования.
В конце каждой главы — вопросы с собеседований с развёрнутыми ответами; все они
собраны на странице повторения. Числа во врезках считает
скрипт из _tools/, и его можно запустить.
Разбор открытого кода реальной ленты
Открытый код ленты «For You» в X
X выложил исходники своей главной ленты: 2028 файлов на Rust, Python, Scala и Java. Одиннадцать глав разбирают систему по дорожке запроса: реальные веса действий из кода, вывод формул, схемы и четыре виджета на настоящих числах. Все числа сверяются с исходниками автоматически. Теория объясняет, почему так делают; здесь видно, как это выглядит, когда написано всерьёз.
Глава x00
Обзор
Что именно выложили, чем две дорожки ленты отличаются друг от друга и как устроен репозиторий на 2028 файлов.
Глава x01
Пайплайн
Путь запроса по стадиям: что происходит между нажатием на вкладку и готовым списком постов.
Глава x02
Источники
Откуда берутся кандидаты: несколько независимых источников разной природы и квоты, которыми их смешивают.
Глава x03
Retrieval
Двухбашенная модель в рабочем виде: как в коде устроены башни и чем там оказываются semantic IDs.
Глава x04
Ранжирование
Ранжирующий трансформер и приём, ради которого он так устроен: кандидаты изолированы друг от друга внутри батча.
Глава x05
Скоринг
Реальные веса действий из конфигов, поправки к ним и то, как из отдельных вероятностей собирается один скор.
Глава x06
Фильтры
Двадцать девять фильтров, их порядок — и что этот порядок говорит о стоимости каждого.
Глава x07
Видимость
Разметка контента, правила видимости и репутация автора: слой, который решает не «что выше», а «показывать ли вообще».
Глава x08
Блендинг
Как в ленту подмешивают рекламу и не-посты и какими долями это управляется.
Глава x09
Конфигурация
Параметры, вынесенные в конфиги, и что по ним видно об устройстве экспериментов.
Глава x10
Чему учит
Что этот код говорит о теории из первой части — и пять мест, где он с ней расходится.
Код X распространяется под Apache 2.0. Каждый процитированный фрагмент подписан файлом и коммитом; разбор вокруг него — наш.
Чем пользоваться по ходу
Шестнадцать типов задач с проверкой ответа и разбором: Precision, Recall, MRR, MAP, NDCG, AUC, матрица ошибок, сглаженный CTR, IPS, фильтр Блума. Статистика по типам добивает слабые места. → открыть
Все вопросы с собеседований в одном месте: карточки, отметки «знаю / повторить», фильтр по главам, случайный вопрос. → открыть
Полный список интерактивных демонстраций с описанием, что каждая показывает, — в каталоге виджетов. Поиск по всему учебнику — на Cmd/Ctrl + K.