Тренажёр: посчитай метрику
Шестнадцать типов задач, проверка ответа с разбором, статистика по типам с добиванием слабых мест и режим сессии из 10 задач.
Каталог
26 интерактивных виджетов. Каждый отвечает на конкретный вопрос с собеседования — не «покажи красиво», а «покрути и увидь, почему это так». Все числа в подписях получены прогоном самих виджетов, а формулы сверены с независимой реализацией.
То, что просят посчитать и объяснить почти на каждом собеседовании.
Шестнадцать типов задач, проверка ответа с разбором, статистика по типам с добиванием слабых мест и режим сессии из 10 задач.
Переставьте позитивы: Precision и Recall не шелохнутся, а RR, AP и NDCG вырастут. Это вся разница между метриками покрытия и метриками порядка.
Порог не влияет на AUC вообще, дисбаланс почти не влияет — а вот AP от него обваливается с 0.89 до 0.34.
Любое монотонное преобразование скора оставляет AUC ровно тем же и при этом ломает калибровку. Там, где прогноз умножается на деньги, AUC недостаточно.
Новичков половина по головам и три процента по запросам. Деградацию на них видно только при усреднении по пользователям.
IPS несмещён, но при слабом перекрытии политик ESS падает с 400 до 25 и оценка становится бесполезной. У клиппинга есть оптимум по RMSE.
MDE падает как корень из n: вдвое меньший эффект стоит вчетверо больше данных. Ежедневное подглядывание превращает 5% ложных срабатываний в 22%.
Кандидатогенераторы сравнивают не при равном K, а при равном бюджете латентности — иначе сравниваются разные инженерные решения.
С косинусом логиты зажаты в [-1;1], и без температуры софтмакс почти равномерный, а градиенты слабые.
Настоящее обучение двух моделей на одном потоке батчей: без коррекции скор сходится к log p − log Q и топит популярное, с коррекцией — к log p.
У ε-greedy regret линейный из-за фиксированной доли случайного трафика, у UCB и Thompson — сублинейный.
Как устроены сами системы: от длинного хвоста до semantic IDs.
При α = 1.5 топ-4% каталога собирают 93% просмотров. При слабом перекосе рекомендации не нужны, при сильном — вырождаются в популярное.
Сквозная полнота — произведение полнот стадий. Что потеряно на кандидатогенерации, не вернёт ни один ранкер.
RMSE на отложенном имеет минимум ровно на истинном ранге. Холодный пользователь получает нулевые факторы и предсказание, равное средней оценке.
Спор «дот или косинус» — это спор о том, нужна ли норма вектора. На нормированных векторах все три меры дают один порядок.
Две непересекающиеся группы и двумерные эмбеддинги. С негативами из показов группы накладываются и половина топ-5 по каталогу — чужая; с негативами из каталога — ноль. Внутри своей группы «показная» модель даже лучше, а по каталогу теряет ровно половину HitRate.
Recall растёт с 0.10 до 1.00 при efSearch от 1 до 20, а число посещённых узлов — с 25 до 68. Приближённость это настраиваемый параметр, а не сбой.
Первые проценты разнообразия стоят 7% релевантности, последние — 21%. Вкладка DPP показывает то же через определитель ядра: объём набора 1.99e-2 против 4.15e-4 у жадного топа.
Каталог из 40 айтемов, в котором спрятан новый айтем с лучшим CTR. Жадная сортировка не находит его никогда; сортировка по μ + α·σ находит и даёт +9% к выдаче, а слишком большая α снова всё портит. Видно и преждевременный отказ от айтема у детерминированного UCB.
Источник негативов задаёт неявный приор модели: in-batch даёт перекос к популярному 1.75×, чистые харды тащат ложные негативы.
Опасна не любая коллизия, а коллизия двух частых значений. Несколько хеш-функций делают вероятность полной неразличимости произведением.
Сырой признак даёт только прямую, one-hot — ступеньки, PLE — непрерывную кусочно-линейную функцию без потери разрешения внутри бина.
Ошибки односторонние: сказал «не видел» — точно не видел. Кривая по k U-образная, оптимум при заполнении ровно половины бит.
Без интегральной части регулятор промахивается мимо цели на 17.7 п.п. — при нулевой ошибке он не даёт воздействия и жить без промаха не может.
Веса зависят от кандидата, поэтому единственное релевантное событие истории получает вес 0.835 вместо равномерных 0.083.
Каждый уровень кодирует остаток предыдущего, близкие айтемы делят префикс, а новинка получает ID сразу по контентному вектору.