Вероятность

Монте-Карло

Интеграл как ожидание, несмещённость против дисперсии, и почему importance sampling не хитрость

Шаг 48 из 117 · ~32 мин

Интеграл — это ожидание

Метод Монте-Карло целиком стоит на одном переписывании: любой интеграл можно прочитать как ожидание, а ожидание — оценить средним.

f(x)p(x)dx=Ep[f(X)]1ni=1nf(xi),xip\htmlData{k=integral}{\int f(x)\,p(x)\,dx} = \htmlData{k=expect}{\mathbb{E}_{p}[f(X)]} \approx \htmlData{k=average}{\frac{1}{n}\sum_{i=1}^{n} f(x_i)}, \quad x_i \sim p

Смысл этого хода в том, что не зависит от размерности. Сетка из mm точек по каждой из dd осей требует mdm^d вычислений и умирает уже при d=10d = 10; Монте-Карло нужно столько точек, сколько нужно для требуемой точности, и число осей в эту оценку не входит. Именно поэтому в машинном обучении почти всякое ожидание считается сэмплированием, а не квадратурой.

Два свойства оценки

Несмещённость. E[1nif(xi)]=E[f(X)]\mathbb{E}\left[\frac{1}{n}\sum_i f(x_i)\right] = \mathbb{E}[f(X)] по линейности ожидания — при любом nn, даже при n=1n = 1. Оценка по одному сэмплу уже несмещена. Это то, на чём стоит SGD: один минибатч даёт несмещённую оценку градиента.

Дисперсия. Var(1nif(xi))=Var(f(X))n\operatorname{Var}\left(\frac{1}{n}\sum_i f(x_i)\right) = \frac{\operatorname{Var}(f(X))}{n} для независимых сэмплов. Отсюда стандартная ошибка 1n\propto \frac{1}{\sqrt{n}}: чтобы получить лишний десятичный знак, нужно в сто раз больше сэмплов. Скорость 1/n1/\sqrt{n} — не недостаток реализации, а свойство метода, и обойти её можно только уменьшив числитель.

Здесь и появляется урок предыдущего шага в новом виде. Несмещённость у нас есть бесплатно; вся работа — в дисперсии.

Когда несмещённость бесполезна

Возьмём задачу, где это видно без всякой философии: оценить P(X>t)P(X > t) для XN(0,1)X \sim \mathcal{N}(0,1). Оценка — доля сэмплов, попавших в хвост, и она безупречно несмещена.

При t=3t = 3 в хвост попадает один сэмпл из 741741. Взяв 500500 сэмплов, вы с вероятностью 51%\approx 51\% не поймаете ни одного и получите ответ ровно нуль. Оценка при этом сообщит нулевую стандартную ошибку — то есть «0±00 \pm 0», ответ, ошибочный на 100%100\% и не подающий никаких признаков беды.

Виджет открыт как раз в этой конфигурации: t=3t = 3, 500500 сэмплов.

истина: 1.350e-3 наивная MC
порог t 3
сэмплов n 500
попаданий в хвост
0 / 500
наивная MC · оценка
0.000e+0
наивная MC · ст. ошибка
0.00e+0
Ни один сэмпл не попал в хвост. Оценка равна нулю, её стандартная ошибка тоже равна нулю — и оба числа бесполезны. Несмещённая оценка не обязана быть осмысленной на конкретной выборке.

Importance sampling

Идея: сэмплировать из другого распределения qq, которое чаще заглядывает туда, где ff не равно нулю, и исправить перекос весами.

Ep[f(X)]=f(x)p(x)q(x)q(x)dx=Eq ⁣[f(X)p(X)q(X)]\mathbb{E}_p[f(X)] = \int f(x)\frac{p(x)}{q(x)}q(x)\,dx = \mathbb{E}_q\!\left[f(X)\frac{p(X)}{q(X)}\right]

Всё преобразование — умножить и поделить на qq. Отношение w(x)=p(x)q(x)w(x) = \frac{p(x)}{q(x)} называется , или отношением правдоподобий, и оно ровно то, что удерживает оценку несмещённой при сэмплировании из неправильного распределения.

Включите тумблер в виджете. При t=3t = 3 с предложением N(3,1)\mathcal{N}(3, 1) оценка попадает в 1.241031.24 \cdot 10^{-3} против истины 1.351031.35 \cdot 10^{-3}, и её стандартная ошибка — 1.01041.0 \cdot 10^{-4}, тогда как у наивной оценки её просто нет.

Выигрыш по дисперсии на один сэмпл, посчитанный точно:

ttP(X>t)P(X>t)выигрыш при q=N(t,1)q = \mathcal{N}(t, 1)
222.31022.3 \cdot 10^{-2}18×18\times
331.31031.3 \cdot 10^{-3}218×218\times
443.21053.2 \cdot 10^{-5}7000×7000\times

Чем реже событие, тем больше выигрыш — то есть importance sampling помогает тем сильнее, чем безнадёжнее наивный подход.

Выбор qq — это вся сложность

Метод несмещён при любом qq с достаточным носителем, но дисперсия зависит от qq резко. Подвигайте слайдер сдвига при t=3t = 3:

сдвигвыигрыш по дисперсии
001×1\times (это и есть наивная MC)
1116×16\times
2297×97\times
33218×218\times
44141×141\times
5531×31\times

Оптимум около q=N(t,1)q = \mathcal{N}(t, 1), и уход в обе стороны портит дело. Слишком маленький сдвиг возвращает исходную проблему. Слишком большой создаёт новую: qq сэмплирует далеко в хвост, где p/qp/q огромно, и оценку начинают определять несколько сэмплов с гигантскими весами.

Два правила, которые из этого следуют:

  • носитель qq должен покрывать носитель fpf \cdot p. Если q(x)=0q(x) = 0 там, где f(x)p(x)0f(x)p(x) \ne 0, оценка смещена, и никакое nn этого не исправит — вклад этой области просто не может появиться;
  • тяжёлые хвосты у qq безопаснее лёгких. Ошибка «qq уже, чем pp» даёт неограниченные веса и бесконечную дисперсию; ошибка «qq шире, чем нужно» стоит лишь части эффективности.

Практический индикатор — эффективный размер выборки

neff=(iwi)2iwi2n_{\text{eff}} = \frac{\left(\sum_i w_i\right)^2}{\sum_i w_i^2}

Если из тысячи сэмплов neffn_{\text{eff}} равно десяти, вы фактически считаете по десяти точкам, что бы ни показывала формальная стандартная ошибка. В байесовском выводе это стандартная диагностика, и смотреть на неё нужно раньше, чем на сам ответ.

Где это встретится дальше

Importance sampling — не приём для хвостовых вероятностей, а несущая конструкция:

  • off-policy RL: оценить отдачу политики π\pi по данным, собранным политикой μ\mu. Веса — π/μ\pi/\mu, и клипование этих весов есть буквально PPO;
  • ELBO: ожидание по q(z)q(z) вместо недоступного p(zx)p(z \mid x) — блок 4;
  • оценка перплексии и нормировок в моделях, где сумма по словарю неподъёмна.

Во всех трёх случаях структура одна: считать ожидание по неудобному распределению через удобное, платя весами.

Источники

Проверки

0 из 2
  1. Свойства оценки Монте-Карло

    Отметьте все верные утверждения об оценках Монте-Карло и importance sampling.

  2. Диагностика importance sampling

    Вам даны веса weights (wi=p(xi)/q(xi)w_i = p(x_i)/q(x_i)) и значения values (f(xi)f(x_i)), посчитанные на одних и тех же сэмплах из qq.

    Реализуйте importance_stats(weights, values) — верните список [estimate, variance, n_eff, efficiency]:

    • estimate = 1niwif(xi)\frac{1}{n}\sum_i w_i f(x_i) — сама оценка;
    • variance = 1ni(wif(xi)estimate)2\frac{1}{n}\sum_i \big(w_i f(x_i) - \text{estimate}\big)^2 — разброс слагаемых, делитель nn;
    • n_eff = (iwi)2iwi2\dfrac{\left(\sum_i w_i\right)^2}{\sum_i w_i^2} — эффективный размер выборки;
    • efficiency = n_eff / n.

    Проверить себя можно так: neffn_{\text{eff}} обязан лежать в (0,n](0, n] и равняться ровно nn тогда и только тогда, когда все веса одинаковы. Если у вас получилось больше nn, перепутаны числитель и знаменатель.

    функция importance_stats

    Загрузка редактора…

    Ctrl/⌘ + Enter