Отладка программ MCMC общеизвестно сложна. Трудность возникает из-за нескольких проблем, некоторые из которых:
(а) Циклическая природа алгоритма
Мы итеративно рисуем параметры, зависящие от всех остальных параметров. Таким образом, если реализация не работает должным образом, трудно выделить ошибку, поскольку проблема может быть где-то в итеративном сэмплере.
(б) Правильный ответ не обязательно известен.
У нас нет никакого способа сказать, достигли ли мы конвергенции. В некоторой степени это можно смягчить, протестировав код на смоделированных данных.
В свете вышеупомянутых проблем мне было интересно, есть ли стандартная методика, которая может использоваться для отладки программ MCMC.
редактировать
Я хотел поделиться подходом, который я использую для отладки своих программ. Я, конечно, делаю все то, что упомянул PeterR. Помимо этого, я выполняю следующие тесты, используя смоделированные данные:
Запустите все параметры из истинных значений и посмотрите, не расходится ли сэмплер слишком далеко от истинных значений.
У меня есть флаги для каждого параметра в моем итеративном сэмплере, который определяет, рисую ли я этот параметр в итерационном сэмплере. Например, если для флага 'gen_param1' установлено значение true, то я рисую 'param1' из его полного условия в итеративном сэмплере. Если для этого параметра установлено значение false, для параметра 'param1' устанавливается его истинное значение.
Как только я заканчиваю писать сэмплер, я тестирую программу по следующему рецепту:
- Установите флаг генерации для одного параметра на true, а для всех остальных - на false и оцените сходимость относительно истинного значения.
- Установите флаг генерации для другого параметра в сочетании с первым и снова оцените сходимость.
Вышеуказанные шаги были невероятно полезны для меня.
Хорошие советы в ответе PeterR; У меня нет никаких дополнительных советов по фактической отладке, но я нашел очень полезную процедуру для тестирования, если ваш код может иметь ошибку. Это описано в этой статье:
http://pubs.amstat.org/doi/abs/10.1198/016214504000001132
По сути, идея состоит в том, чтобы иметь две симуляции: одна - ваш MCMC для определения (предположительно) параметров вашей модели. Второй симулятор просто выбирает параметры из предыдущих. Они генерируют данные из параметров обоих симуляторов и рассчитывают статистику испытаний, сравнивая совместное распределение параметров и данных. Если код MCMC правильно выбирает параметры из апостериорного значения, то статистика теста будет иметь распределение N (0,1). Код для расчета статистики теста доступен.
источник