Вероятность

Как сэмплировать

Обратная CDF, отбор с отклонением и Метрополис — три метода и три способа провалиться

Шаг 50 из 117 · ~34 мин

Задача

Монте-Карло из предыдущих уроков предполагал, что сэмплировать из pp мы умеем. Обычно это не так: плотность известна с точностью до нормировки — например, p(θD)p(Dθ)p(θ)p(\theta \mid \mathcal{D}) \propto p(\mathcal{D} \mid \theta)p(\theta), а знаменатель и есть тот интеграл, которого мы избегаем.

Значит, нужны методы, которым хватает возможности вычислять pp (или даже только pp с точностью до константы), а не сэмплировать из неё напрямую. Их три, и различаются они не столько механикой, сколько тем, что требуют и чем платят.

Виджет считает все три на одной двугорбой плотности на [0,1][0,1]. Двугорбой намеренно: на унимодальной цели сломанный сэмплер выглядит убедительно.

гистограмма и цель

сэмплов 2000
принято
2000 / 2000
доля принятых
100.0%
Каждый черновой сэмпл идёт в дело: доля принятых равна 100% по построению. Цена — нужна CDF, которую можно обратить.

Обратная CDF

Если UUniform(0,1)U \sim \text{Uniform}(0,1), то F1(U)F^{-1}(U) распределено по FF. Доказательство в одну строку: P(F1(U)x)=P(UF(x))=F(x)P(F^{-1}(U) \le x) = P(U \le F(x)) = F(x).

x=F1(u),uUniform(0,1)x = \htmlData{k=inv}{F^{-1}}\big(\htmlData{k=u}{u}\big), \qquad u \sim \text{Uniform}(0,1)

Метод точен, использует каждый сэмпл и не имеет настроек. Требование одно и оно жёсткое: нужна F1F^{-1}. Она есть у экспоненциального (ln(1u)/λ-\ln(1-u)/\lambda), у Коши, у Лапласа — и её нет в замкнутой форме у гауссианы, и почти никогда нет в многомерном случае.

В виджете метод реализован табличным приближением: CDF считается на сетке один раз, дальше — двоичный поиск. Это тот же трюк, которым сэмплируют из категориального распределения по логитам, и в многомерном случае он не обобщается, потому что таблица растёт как mdm^d.

Отбор с отклонением

Возьмём огибающую Mq(x)p(x)M q(x) \ge p(x). Сэмплируем xqx \sim q, uUniform(0,Mq(x))u \sim \text{Uniform}(0, Mq(x)) и принимаем, если up(x)u \le p(x). Геометрически: бросаем точки в прямоугольник и оставляем те, что попали под кривую.

Доля принятых равна ровно 1/M1/M, и это ахиллесова пята метода. Здесь M=2.9M = 2.9 (пик нормированной плотности — 2.80392.8039, чуть меньше), и доля принятых выходит около 34%34\% — виджет показывает 33.1%33.1\% на двух тысячах черновых сэмплов.

Два способа испортить всё:

  • огибающая не доминирует. Если Mq(x)<p(x)M q(x) < p(x) хоть где-то, горбы срезаются, и сэмплы приходят из неправильного распределения. Гистограмма при этом выглядит как распределение, и заметить подмену без независимой проверки нельзя;
  • огибающая слишком высока. Метод остаётся корректным, но доля принятых падает, и вычисления уходят в мусор.

И основное ограничение: подобрать плотную огибающую в высокой размерности невозможно. Посчитать это можно точно. Огибаем N(0,Id)\mathcal{N}(0, I_d) распределением N(0,σ2Id)\mathcal{N}(0, \sigma^2 I_d); отношение плотностей максимально в нуле и равно M=σdM = \sigma^d, значит доля принятых равна σd\sigma^{-d}:

σ\sigmad=1d = 1d=10d = 10d=50d = 50d=100d = 100
1.11.10.910.910.390.398.51038.5 \cdot 10^{-3}7.31057.3 \cdot 10^{-5}
1.51.50.670.671.71021.7 \cdot 10^{-2}1.61091.6 \cdot 10^{-9}2.510182.5 \cdot 10^{-18}
2.02.00.500.509.81049.8 \cdot 10^{-4}8.910168.9 \cdot 10^{-16}7.910317.9 \cdot 10^{-31}

Обратите внимание, что даже огибающая, шире цели всего на 10%10\%, к сотне измерений принимает один сэмпл из четырнадцати тысяч. А если промахнуться с масштабом вдвое — один из 103010^{30}. Метод не то чтобы медленный: он не работает.

Метрополис

Отказываемся и от CDF, и от огибающей. Идём случайным блужданием: из текущей точки предлагаем xx' симметрично, считаем

α=min ⁣(1, p(x)p(x))\alpha = \min\!\left(1, \ \frac{p(x')}{p(x)}\right)

и с вероятностью α\alpha переходим, иначе остаёмся на месте и записываем текущую точку снова.

Ключевое свойство — в дроби. Нормировка pp сокращается, поэтому Метрополис работает с ненормированной плотностью, и именно это делает его пригодным для байесовского вывода.

За это платят двумя вещами.

Сэмплы коррелированы. Отклонённый шаг дублирует предыдущую точку, а принятый уходит недалеко. Эффективное число независимых сэмплов много меньше их количества — та же величина neffn_{\text{eff}}, что была в уроке про importance sampling, только причина другая.

Есть настройка, и она нетривиальна. Подвигайте размер шага и смотрите не на долю принятых, а на гистограмму:

шагдоля принятыхрасстояние до цели (n=2000n = 2000)
0.020.0295%95\%0.350.35
0.050.0588%88\%0.370.37
0.100.1081%81\%0.0860.086
0.400.4050%50\%0.0800.080
1.501.5049%49\%0.0650.065

Прочитайте первую строку внимательно: доля принятых 95%95\% — и худшая из всех гистограмма. Маленький шаг почти всегда принимается, потому что плотность в соседней точке почти такая же, но за две тысячи итераций цепь не успевает обойти носитель. Это и есть главное недоразумение вокруг MCMC: высокая доля принятых — симптом проблемы, а не признак здоровья.

Для сравнения, точный метод обратной CDF на тех же двух тысячах сэмплов даёт расстояние 0.0530.053 — это шум гистограммы, ниже которого не опустится никто. При шаге 0.40.4 и двадцати тысячах сэмплов Метрополис доходит до 0.0210.021, то есть цепь действительно сходится — просто ей нужно больше итераций, чем независимому сэмплеру.

Что выбрать

нужна CDFнужна огибающаяработает с ненормированной ppразмерность
обратная CDFданет1D практически
с отклонениемнетдада, если известнанизкая
Метрополиснетнетдавысокая

Практика такая: обратной CDF сэмплируют из стандартных одномерных распределений и из категориального; отбор с отклонением используют внутри специализированных генераторов (в том числе гауссова — алгоритм зиккурата); всё остальное в байесовском выводе делает MCMC.

Современные варианты убирают именно случайность блуждания. HMC и NUTS ведут цепь по градиенту logp\nabla \log p, двигаясь вдоль плотности, а не наугад, и в высокой размерности выигрывают на порядки. Заметьте, что им нужен logp\nabla \log p — та же score-функция, на которой стоит вся ветка про диффузионные модели. Ланжевеновская динамика, которую мы там встретим, — это буквально шаг градиентного подъёма по logp\log p плюс гауссов шум, то есть Метрополис, которому подсказали направление.

Источники

Проверки

0 из 2
  1. Три метода и их цена

    Отметьте все верные утверждения о методах сэмплирования.

  2. Шаг Метрополиса руками

    Реализуйте цепь Метрополиса на дискретном пространстве состояний, без генератора случайных чисел: и предложения, и равномерные числа даны заранее.

    metropolis_chain(unnormalised, start, proposals, uniforms) — верните [counts, accepted, rate]:

    • unnormalised[k] — вес состояния kk, ненормированный;
    • на шаге ii из текущего состояния предлагается proposals[i];
    • вероятность принятия α=min ⁣(1,w[candidate]w[state])\alpha = \min\!\left(1, \dfrac{w[\text{candidate}]}{w[\text{state}]}\right);
    • предложение принимается, если uniforms[i] < alpha, и тогда состояние меняется, а accepted увеличивается на единицу;
    • после каждого шага — принят он или нет — увеличьте counts[state] для текущего состояния;
    • rate = accepted / len(proposals).

    Порядок последних двух пунктов и есть суть задачи: отклонённый шаг всё равно записывает точку, поэтому sum(counts) всегда равна числу шагов, а не числу принятых.

    функция metropolis_chain

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

    Ctrl/⌘ + Enter