Существует ли стандартная методика отладки программ MCMC?

11

Отладка программ MCMC общеизвестно сложна. Трудность возникает из-за нескольких проблем, некоторые из которых:

(а) Циклическая природа алгоритма

Мы итеративно рисуем параметры, зависящие от всех остальных параметров. Таким образом, если реализация не работает должным образом, трудно выделить ошибку, поскольку проблема может быть где-то в итеративном сэмплере.

(б) Правильный ответ не обязательно известен.

У нас нет никакого способа сказать, достигли ли мы конвергенции. В некоторой степени это можно смягчить, протестировав код на смоделированных данных.

В свете вышеупомянутых проблем мне было интересно, есть ли стандартная методика, которая может использоваться для отладки программ MCMC.

редактировать

Я хотел поделиться подходом, который я использую для отладки своих программ. Я, конечно, делаю все то, что упомянул PeterR. Помимо этого, я выполняю следующие тесты, используя смоделированные данные:

  1. Запустите все параметры из истинных значений и посмотрите, не расходится ли сэмплер слишком далеко от истинных значений.

  2. У меня есть флаги для каждого параметра в моем итеративном сэмплере, который определяет, рисую ли я этот параметр в итерационном сэмплере. Например, если для флага 'gen_param1' установлено значение true, то я рисую 'param1' из его полного условия в итеративном сэмплере. Если для этого параметра установлено значение false, для параметра 'param1' устанавливается его истинное значение.

Как только я заканчиваю писать сэмплер, я тестирую программу по следующему рецепту:

  • Установите флаг генерации для одного параметра на true, а для всех остальных - на false и оцените сходимость относительно истинного значения.
  • Установите флаг генерации для другого параметра в сочетании с первым и снова оцените сходимость.

Вышеуказанные шаги были невероятно полезны для меня.

Къетил б Халворсен
источник

Ответы:

10

Стандартная практика программирования:

  • при отладке запустите симуляцию с фиксированными источниками случайности (то есть с тем же начальным числом), чтобы любые изменения были связаны с изменениями кода, а не с разными случайными числами.
  • Попробуйте свой код на модели (или нескольких моделях), где ответ известен.
  • принять хорошие привычки программирования, чтобы вы вносили меньше ошибок.
  • очень усердно и долго размышляйте над полученными ответами, имеют ли они смысл и т. д.

Я желаю вам удачи и много кофе!

PeterR
источник
3

У меня есть удручающий и не очень специфический анекдот, которым я могу поделиться здесь. Я провел некоторое время в качестве сотрудника статистического исследователя МП. Если вы хотите увидеть действительно большую, сложную модель, не смотрите дальше.

Он проводил меня через загрузочный лагерь НЛП для собственного удовольствия. Я вообще программист, который живет и умирает от юнит-теста и отладчика. Будучи молодым человеком в Symbolics, я был поражен афоризмом «программирование отлаживает пустой буфер редактора». (Вроде как обучение модели персептрона.)

Итак, я спросил его: «Как вы тестируете и отлаживаете все это?» Он ответил: «Вы понимаете это правильно с первого раза. Вы продумываете это (в его случае, часто на бумаге) очень тщательно, и вы кодируете это очень тщательно. Потому что, когда вы ошибаетесь, шансы изолировать проблему очень тонкий."

bmargulies
источник
Я слышал этот анекдот раньше (может быть, также от вас?). Мне это показалось очень удачным, и с тех пор, как я впервые услышал об этом, он неоднократно сбывался (т.е. с трудом изолировал проблему).
redmoskito
3

Хорошие советы в ответе PeterR; У меня нет никаких дополнительных советов по фактической отладке, но я нашел очень полезную процедуру для тестирования, если ваш код может иметь ошибку. Это описано в этой статье:

http://pubs.amstat.org/doi/abs/10.1198/016214504000001132

По сути, идея состоит в том, чтобы иметь две симуляции: одна - ваш MCMC для определения (предположительно) параметров вашей модели. Второй симулятор просто выбирает параметры из предыдущих. Они генерируют данные из параметров обоих симуляторов и рассчитывают статистику испытаний, сравнивая совместное распределение параметров и данных. Если код MCMC правильно выбирает параметры из апостериорного значения, то статистика теста будет иметь распределение N (0,1). Код для расчета статистики теста доступен.

FrankD
источник
Соответствующий подход можно найти в Cook et al. (2006; stat.columbia.edu/~gelman/research/published/… ). Я использовал подход Кука и соавторов в двух случаях и был впечатлен результатами. Я не использовал подход Geweke, но, по словам Кука и др., «Подход Geweke обладает тем преимуществом, что необходимо выполнить только одну репликацию ... Недостатком является то, что он требует изменения программного обеспечения для тестирования». Они также говорят, что подход Geweke требует априоров с конечной дисперсией, в то время как их нет.
Jmtroos