← к модулям

Онлайн-оценка: A/B и off-policy (Фаза 14)

Весь учебник упирался в потолок офлайн-метрик — здесь живёт финальный судья. A/B: рандомизация, шум против истины, цена маленьких эффектов, дисциплина остановки, interleaving. Off-policy: оценить новую политику по чужим логам — DM / IPS / SNIPS / DR против точной истины, и что именно ломается, когда нет exploration и propensities.

⚠ Секции 1–5 — синтетический симулятор с известной истиной: у каждого пользователя есть сегмент вкуса, и p(клик | показан айтем) задана точно. Это осознанно: только так видно, какой оценщик сходится к истине, а какой врёт. Числа иллюстрируют механику методов, а не какой-либо реальный продукт. Секция 6 — наоборот, живой замер на реальных моделях этого сервиса.

1 · A/B-эксперимент: шумная оценка против точной истины

Контроль — «глобальный топ всем», тритмент — персонализация по сегменту вкуса. Симулятор знает истинный эффект, поэтому видно то, что в реальном A/B скрыто: насколько измеренный uplift пляшет вокруг истины и когда z-тесту хватает выборки.

загрузка A/A-симуляции…

3 · Сколько пользователей нужно: MDE-таблица

Обратная сторона шума из §1: чем меньше эффект, который хочется поймать (MDE — minimal detectable effect), тем квадратично больше выборка. Это главный планировочный расчёт до запуска теста (α=0.05, мощность 80%).

4 · Interleaving: чувствительная альтернатива для ранжирований

Team-draft: обе политики по очереди «драфтят» айтемы в одну выдачу, клики атрибутируются команде-владельцу, по каждому пользователю определяется победитель. Каждый пользователь видит обе системы сразу — поэтому обычно хватает заметно меньшей выборки, чем A/B.

5 · Off-policy: оценить новую политику по чужим логам

Логи пишет ε-greedy «глобальный топ» (propensities известны по построению — мы сами контролируем рандомизацию). Вопрос: чему равна ценность персональной политики, не запуская её? Четыре оценщика против точной истины, 30 повторов → среднее ± разброс.

6 · accuracy ≠ бизнес-метрика: на наших реальных моделях

Финальный аргумент — не из симулятора, а из этого сервиса: все 7 моделей учебника, офлайн-accuracy рядом с прокси того, что видит бизнес. Лучшее значение каждой колонки подсвечено — и лидеры не совпадают.

Теория простым языком

Офлайн-метрики отвечают «похожа ли модель на прошлое», и весь учебник мы честно упирались в их потолок. Финальный судья — онлайн: рандомизированный эксперимент. А когда эксперимент дорог или невозможен — off-policy оценка по логам, у которой есть жёсткие предусловия.

Зачем A/B и off-policy, если есть офлайн-метрики
БылоМодели сравнивались офлайн: NDCG/Recall на исторических данных (B2, /metrics).
ПроблемаОфлайн-лог написан СТАРОЙ политикой: позиции, exposure и петля обратной связи смещают любой пересчёт; прирост NDCG регулярно не конвертируется в прирост продукта.
ИдеяРандомизация: случайное разбиение пользователей делает группы сравнимыми по построению — различие исходов атрибутируется политике. Если запускать нельзя — переписать ожидание через importance weights по известным propensities (IPS/DR).
Стало лучшеПричинная оценка эффекта с честной ценой: дисперсия, длительность, MDE; off-policy даёт оценку ДО запуска — когда есть exploration и залогированные propensities.
Осталось слабымA/B дорог, медлен, ловит краткосрочные метрики (novelty-эффект, сетевые утечки между ветками); IPS требует support и страдает дисперсией; DR состоятелен при support и хотя бы одной верной спецификации (reward-модель или propensities), но finite-sample поведение зависит от обеих, а без support не спасает.
ДальшеBandits / RL (Фаза 12) — когда исследование и эксплуатация сливаются в одну систему.

A/B: почему рандомизация, и что мешает

Сравнивать «до/после» или «кто сам включил фичу» нельзя — эти группы различаются не только политикой (сезонность, self-selection). Случайное назначение веток разрывает все такие связи: единственное систематическое различие между A и B — сама политика. Дальше остаётся статистика: эффект против шума (§1 лаборатории), план выборки под MDE (§3), и дисциплина остановки (§2 — подглядывание). Практика зрелых платформ: north-star + guardrails (E2), недельные циклы (сезонность дней), учёт novelty-эффекта (первые дни любая новизна кликается лучше), и снижение дисперсии типа CUPED (ковариата = поведение пользователя до эксперимента).

Peeking (подглядывание)p-value — случайный процесс: при истинном нуле он «ныряет» под 0.05 просто от шума. Останавливать тест при первом прокрасе = многократное тестирование без поправки; в §2 это триплирует ложные запуски. Либо фиксируй длительность заранее, либо используй sequential-дизайн (alpha spending, mSPRT) — «смотреть каждый день» можно, «останавливаться когда захотелось» — нет.

Off-policy: оценить политику, не запуская её

Ценность политики — ожидание награды при её действиях. Логи писала другая политика π0\pi_0, но если она рандомизировала и мы знаем вероятности её действий (propensities), ожидание можно переписать:

Формулы: IPS, SNIPS, DM, DR

V^IPS(π)=1ni=1nπ(aixi)π0(aixi)ri\hat V_{\mathrm{IPS}}(\pi) = \frac{1}{n}\sum_{i=1}^{n} \frac{\pi(a_i \mid x_i)}{\pi_0(a_i \mid x_i)}\, r_iНесмещённо, пока π0(ax)>0\pi_0(a\mid x) > 0 везде, где π(ax)>0\pi(a\mid x) > 0 (support). Дисперсия взрывается, когда target выбирает то, что логирующая политика показывала редко — веса wi=π/π0w_i = \pi/\pi_0 становятся огромными.

V^SNIPS(π)=iwiriiwi,V^DM(π)=1niEaπr^(xi,a)\hat V_{\mathrm{SNIPS}}(\pi) = \frac{\sum_i w_i r_i}{\sum_i w_i}, \qquad \hat V_{\mathrm{DM}}(\pi) = \frac{1}{n}\sum_i \mathbb{E}_{a\sim\pi}\,\hat r(x_i, a)SNIPS нормирует веса — меньше дисперсия, лёгкое смещение. DM подменяет награду моделью r^\hat r — стабильно, но наследует все её ошибки.

V^DR(π)=V^DM(π)+1niwi(rir^(xi,ai))\hat V_{\mathrm{DR}}(\pi) = \hat V_{\mathrm{DM}}(\pi) + \frac{1}{n}\sum_i w_i\,\bigl(r_i - \hat r(x_i, a_i)\bigr)Doubly Robust комбинирует reward-модель и IPS-поправку: при наличии support он состоятелен, если корректно специфицирована хотя бы одна из двух частей — модель наград или propensities. На практике finite-sample поведение зависит от обеих, а без support DR не спасает (в §5 при ε=0 он оседает рядом с DM). Дисперсия ниже IPS, потому что веса умножаются на остатки, а не на сырые награды. Важно: r^\hat r обучают кросс-фиттингом или на отдельных данных — насыщенная модель, обученная на том же логе, зануляет поправку и DR вырождается в DM.

Предусловия — не мелкий шрифт, а суть (мы упирались в них весь учебник: D2a, B7, E3): propensities должны быть залогированы в момент решения, и в системе должно быть randomized exploration, иначе у новой политики нет support и никакой оценщик не спасёт — §5 лаборатории показывает это ползунком ε→0. К произвольным историческим логам IPS «просто применить» нельзя.

Bandit ≠ slate: границы этого симулятораВсё выше — single-action contextual bandit: одно действие, одна награда. Реальный рекомендер показывает top-K слейт, и off-policy оценка резко усложняется: propensities нужны на уровне слейта/позиций, position bias входит в модель клика, айтемы внутри выдачи зависят друг от друга, а дисперсия растёт с размером слейта (отсюда специальные методы — slate-IPS с линейной декомпозицией, pseudo-inverse estimator). Механика та же, цена — выше.
Clipping / capping весовwimin(wi,M)w_i \leftarrow \min(w_i, M) — стандартное лекарство от дисперсии IPS: хвост весов срезается, оценка стабилизируется, но становится смещённой. Часто клиппинг недооценивает вклад действий, редких для логирующей политики, — но направление смещения в общем случае зависит от rewards и target-политики (в нашем §5 награды неотрицательны, поэтому там оно строго вниз). Выбор M — торговля bias/variance, в §5 она видна руками.

Как это соотносится с остальным учебником

Петля замкнулась: B1 объяснял, что писать в лог (позиции, propensities, ветку эксперимента — колонки experiment_id и model_version в его схеме); B2 и /metrics — потолок офлайна; E2 требовал у каждого дизайна онлайн-стадию; E3 честно её пропустил (нет трафика). Этот модуль — та самая онлайн-стадия: симулятор вместо трафика, зато с точной истиной и контролируемыми propensities — единственный честный способ практиковать механику без продакшена. А §6 замыкает аргумент на реальных моделях сервиса: лидер по NDCG не лидирует ни по одному бизнес-прокси — офлайн-метрики не складываются в одну цифру, и именно поэтому финальное слово за экспериментом.

⚠️ Что может пойти не так

  • Останавливать A/B при первом p<0.05 — подглядывание умножает ложные прокрасы (§2); длительность фиксируется до запуска либо используется sequential-дизайн.
  • «Не значимо» читать как «эффекта нет» — при малой выборке тест просто слеп (§1); смотри CI и мощность, а не только p-value.
  • Запускать тест без расчёта MDE — если детектируемый эффект больше реалистичного, тест не мог ничего найти ещё до старта (§3).
  • Считать interleaving заменой A/B — он даёт предпочтение по кликам, но не uplift north-star, guardrails и долгосрочные эффекты (§4).
  • Применять IPS к логам без propensities и exploration — оценка молча смещена; SNIPS при нарушенном support выглядит стабильнее лишь потому, что нормализуется на покрытой части логов — это covered-slice estimate, а не ценность полной политики (§5, ε=0).
  • Верить DM без проверки reward-модели — он стабилен и уверенно врёт ровно там, где модель слепа (§5: сегментов не видит → персонализацию не ценит).
  • Забыть про novelty-эффект и сетевые утечки между ветками (шеринг, инвентарь маркетплейса) — рандомизация по пользователям не изолирует всё.

🧠 Проверь себя: Логи писала детерминированная политика (ε=0). Что честно сказать про IPS-оценку новой политики?

Где это в дорожной карте

Это Фаза 14 — онлайн-оценка, замыкающая senior-ядро (production evaluation + debugging). Дальше по интересу: bandits/RL (Фаза 12) — exploration как часть самой политики, sequential (Фаза 9), multi-task (Фаза 11).