Вероятность
Как сэмплировать
Обратная CDF, отбор с отклонением и Метрополис — три метода и три способа провалиться
Задача
Монте-Карло из предыдущих уроков предполагал, что сэмплировать из мы умеем. Обычно это не так: плотность известна с точностью до нормировки — например, , а знаменатель и есть тот интеграл, которого мы избегаем.
Значит, нужны методы, которым хватает возможности вычислять (или даже только с точностью до константы), а не сэмплировать из неё напрямую. Их три, и различаются они не столько механикой, сколько тем, что требуют и чем платят.
Виджет считает все три на одной двугорбой плотности на . Двугорбой намеренно: на унимодальной цели сломанный сэмплер выглядит убедительно.
гистограмма и цель
- принято
- 2000 / 2000
- доля принятых
- 100.0%
Обратная CDF
Если , то распределено по . Доказательство в одну строку: .
Метод точен, использует каждый сэмпл и не имеет настроек. Требование одно и оно жёсткое: нужна . Она есть у экспоненциального (), у Коши, у Лапласа — и её нет в замкнутой форме у гауссианы, и почти никогда нет в многомерном случае.
В виджете метод реализован табличным приближением: CDF считается на сетке один раз, дальше — двоичный поиск. Это тот же трюк, которым сэмплируют из категориального распределения по логитам, и в многомерном случае он не обобщается, потому что таблица растёт как .
Отбор с отклонением
Возьмём огибающую . Сэмплируем , и принимаем, если . Геометрически: бросаем точки в прямоугольник и оставляем те, что попали под кривую.
Доля принятых равна ровно , и это ахиллесова пята метода. Здесь (пик нормированной плотности — , чуть меньше), и доля принятых выходит около — виджет показывает на двух тысячах черновых сэмплов.
Два способа испортить всё:
- огибающая не доминирует. Если хоть где-то, горбы срезаются, и сэмплы приходят из неправильного распределения. Гистограмма при этом выглядит как распределение, и заметить подмену без независимой проверки нельзя;
- огибающая слишком высока. Метод остаётся корректным, но доля принятых падает, и вычисления уходят в мусор.
И основное ограничение: подобрать плотную огибающую в высокой размерности невозможно. Посчитать это можно точно. Огибаем распределением ; отношение плотностей максимально в нуле и равно , значит доля принятых равна :
Обратите внимание, что даже огибающая, шире цели всего на , к сотне измерений принимает один сэмпл из четырнадцати тысяч. А если промахнуться с масштабом вдвое — один из . Метод не то чтобы медленный: он не работает.
Метрополис
Отказываемся и от CDF, и от огибающей. Идём случайным блужданием: из текущей точки предлагаем симметрично, считаем
и с вероятностью переходим, иначе остаёмся на месте и записываем текущую точку снова.
Ключевое свойство — в дроби. Нормировка сокращается, поэтому Метрополис работает с ненормированной плотностью, и именно это делает его пригодным для байесовского вывода.
За это платят двумя вещами.
Сэмплы коррелированы. Отклонённый шаг дублирует предыдущую точку, а принятый уходит недалеко. Эффективное число независимых сэмплов много меньше их количества — та же величина , что была в уроке про importance sampling, только причина другая.
Есть настройка, и она нетривиальна. Подвигайте размер шага и смотрите не на долю принятых, а на гистограмму:
| шаг | доля принятых | расстояние до цели () |
|---|---|---|
Прочитайте первую строку внимательно: доля принятых — и худшая из всех гистограмма. Маленький шаг почти всегда принимается, потому что плотность в соседней точке почти такая же, но за две тысячи итераций цепь не успевает обойти носитель. Это и есть главное недоразумение вокруг MCMC: высокая доля принятых — симптом проблемы, а не признак здоровья.
Для сравнения, точный метод обратной CDF на тех же двух тысячах сэмплов даёт расстояние — это шум гистограммы, ниже которого не опустится никто. При шаге и двадцати тысячах сэмплов Метрополис доходит до , то есть цепь действительно сходится — просто ей нужно больше итераций, чем независимому сэмплеру.
Что выбрать
| нужна CDF | нужна огибающая | работает с ненормированной | размерность | |
|---|---|---|---|---|
| обратная CDF | да | — | нет | 1D практически |
| с отклонением | нет | да | да, если известна | низкая |
| Метрополис | нет | нет | да | высокая |
Практика такая: обратной CDF сэмплируют из стандартных одномерных распределений и из категориального; отбор с отклонением используют внутри специализированных генераторов (в том числе гауссова — алгоритм зиккурата); всё остальное в байесовском выводе делает MCMC.
Современные варианты убирают именно случайность блуждания. HMC и NUTS ведут цепь по градиенту , двигаясь вдоль плотности, а не наугад, и в высокой размерности выигрывают на порядки. Заметьте, что им нужен — та же score-функция, на которой стоит вся ветка про диффузионные модели. Ланжевеновская динамика, которую мы там встретим, — это буквально шаг градиентного подъёма по плюс гауссов шум, то есть Метрополис, которому подсказали направление.
Источники
- MacKay — Information Theory, Inference, and Learning Algorithms, гл. 29 — Rejection sampling, MCMC, Метрополис
- Betancourt — A Conceptual Introduction to Hamiltonian Monte Carlo — Почему MCMC работает и когда перестаёт
Проверки
0 из 2Три метода и их цена
Отметьте все верные утверждения о методах сэмплирования.
Шаг Метрополиса руками
Реализуйте цепь Метрополиса на дискретном пространстве состояний, без генератора случайных чисел: и предложения, и равномерные числа даны заранее.
metropolis_chain(unnormalised, start, proposals, uniforms)— верните[counts, accepted, rate]:unnormalised[k]— вес состояния , ненормированный;- на шаге из текущего состояния предлагается
proposals[i]; - вероятность принятия ;
- предложение принимается, если
uniforms[i] < alpha, и тогда состояние меняется, аacceptedувеличивается на единицу; - после каждого шага — принят он или нет — увеличьте
counts[state]для текущего состояния; rate=accepted / len(proposals).
Порядок последних двух пунктов и есть суть задачи: отклонённый шаг всё равно записывает точку, поэтому
sum(counts)всегда равна числу шагов, а не числу принятых.Загрузка редактора…
Ctrl/⌘ + Enter