是否有调试MCMC程序的标准技术?


11

调试MCMC程序非常困难。出现此困难的原因是几个问题,其中一些是:

(a)算法的循环性质

我们迭代绘制以所有其他参数为条件的参数。因此,如果实现不能正常工作,则很难隔离错误,因为问题可能存在于迭代采样器中的任何地方。

(b)正确答案不一定是已知的。

我们无法告诉我们是否已经实现融合。在某种程度上,可以通过在模拟数据上测试代码来缓解这种情况。

鉴于上述问题,我想知道是否存在可用于调试MCMC程序的标准技术。

编辑

我想分享我用来调试自己的程序的方法。我当然会做PeterR提到的所有事情。除此之外,我还使用模拟数据执行以下测试:

  1. 从真实值开始所有参数,并查看采样器是否偏离真实值太远。

  2. 我在迭代采样器中具有每个参数的标志,这些标志确定我是否在迭代采样器中绘制该参数。例如,如果将标志“ gen_param1”设置为true,则在迭代采样器中从其完整条件中提取“ param1”。如果将其设置为false,则将'param1'设置为其真实值。

完成采样器的编写后,我将使用以下配方测试程序:

  • 将一个参数的generate标志设置为true,将其他所有参数设置为false,并评估关于真实值的收敛性。
  • 结合第一个参数设置另一个参数的generate标志,然后再次评估收敛性。

以上步骤对我非常有用。

Answers:


10

标准编程实践:

  • 调试时,使用固定的随机源(即相同的种子)运行模拟,以便任何更改均归因于代码更改,而不是不同的随机数。
  • 在已知答案的模型上尝试代码。
  • 养成良好的编程习惯,以减少错误。
  • 认真思考您所做的答案,不管它们是否有意义,等等。

祝您好运,多喝咖啡!


3

我要在这里分享一个令人沮丧且不太具体的轶事。我花了一段时间作为统计MT研究人员的同事。如果您想看到一个非常大,复杂的模型,那就别无所求。

他为了娱乐而把我带到了NLP训练营。通常,我是那种靠单元测试和调试器生存和死亡的程序员。作为Symbolics的一个年轻人,我对格言感到震惊,“编程就是调试一个空的编辑器缓冲区”。(排序类似于训练感知器模型。)

因此,我问他:“您如何测试和调试这些东西。” 他的回答是:“您第一次就把它弄对了。您非常仔细地考虑(在他的情况下,通常是在纸上),并且对它进行了仔细的编码。因为一旦发现错误,就可以找出问题所在。非常苗条。”


我以前听说过这个轶事(也许您也听过吗?)。它对我来说很重要,自从第一次听到它以来,它在很多场合都成为现实(即,解决问题的难度)。
redmoskito 2012年

3

PeterR回答中的好技巧;对于实际的调试,我没有任何其他提示,但是我发现了一个非常有用的过程,可以测试您的代码是否可能存在错误。本文对此进行了描述:

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

本质上,该想法是进行两个模拟:一个是您的MCMC,用于推断(大概)模型的参数。第二个模拟器只是简单地从前一个采样。它们从两个模拟器的参数生成数据,并比较参数和数据的联合分布来计算测试统计量。如果MCMC代码正确地从后验中采样参数,则测试统计量将具有N(0,1)的分布。提供了用于计算测试统计量的代码。


一个相关的方法可以在Cook等人的文章中找到。(2006;stat.columbia.edu/~gelman/research/published/…)。我已经两次使用Cook等人的方法,结果给我留下了深刻的印象。我没有使用过Geweke的方法,但是根据Cook等人的说法,“ Geweke的方法的优点是只需要执行一次复制...一个缺点是它需要更改要测试的软件。” 他们还说,Geweke的方法要求先验具有有限方差,而他们不需要。
jmtroos 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.