Отладка программ MCMC общеизвестно сложна. Трудность возникает из-за нескольких проблем, некоторые из которых:
(а) Циклическая природа алгоритма
Мы итеративно рисуем параметры, зависящие от всех остальных параметров. Таким образом, если реализация не работает должным образом, трудно выделить ошибку, поскольку проблема может быть где-то в итеративном сэмплере.
(б) Правильный ответ не обязательно известен.
У нас нет никакого способа сказать, достигли ли мы конвергенции. В некоторой степени это можно смягчить, протестировав код на смоделированных данных.
В свете вышеупомянутых проблем мне было интересно, есть ли стандартная методика, которая может использоваться для отладки программ MCMC.
редактировать
Я хотел поделиться подходом, который я использую для отладки своих программ. Я, конечно, делаю все то, что упомянул PeterR. Помимо этого, я выполняю следующие тесты, используя смоделированные данные:
Запустите все параметры из истинных значений и посмотрите, не расходится ли сэмплер слишком далеко от истинных значений.
У меня есть флаги для каждого параметра в моем итеративном сэмплере, который определяет, рисую ли я этот параметр в итерационном сэмплере. Например, если для флага 'gen_param1' установлено значение true, то я рисую 'param1' из его полного условия в итеративном сэмплере. Если для этого параметра установлено значение false, для параметра 'param1' устанавливается его истинное значение.
Как только я заканчиваю писать сэмплер, я тестирую программу по следующему рецепту:
- Установите флаг генерации для одного параметра на true, а для всех остальных - на false и оцените сходимость относительно истинного значения.
- Установите флаг генерации для другого параметра в сочетании с первым и снова оцените сходимость.
Вышеуказанные шаги были невероятно полезны для меня.