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

机器算法验证 马尔可夫链蒙特卡罗
2022-03-05 02:10:33

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

(a) 算法的循环性质

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

(b) 不一定知道正确答案。

我们无法判断我们是否已经实现了收敛。在某种程度上,这可以通过在模拟数据上测试代码来缓解。

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

编辑

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

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

  2. 我的迭代采样器中的每个参数都有标志,用于确定我是否在迭代采样器中绘制该参数。例如,如果标志“gen_param1”设置为 true,那么我会在迭代采样器中从其完整条件中绘制“param1”。如果设置为 false,则 'param1' 设置为其真值。

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

  • 将一个参数的生成标志设置为真,将其他所有参数设置为假,并根据真值评估收敛性。
  • 结合第一个参数设置另一个参数的生成标志并再次评估收敛性。

上述步骤对我非常有帮助。

3个回答

标准编程实践:

  • 调试时使用固定的随机源(即相同的种子)运行模拟,以便任何更改都是由于代码更改而不是不同的随机数引起的。
  • 在已知答案的模型(或多个模型)上尝试您的代码。
  • 养成良好的编程习惯,从而减少引入的错误。
  • 认真思考你得到的答案,是否有意义,等等。

祝你好运,还有很多咖啡!

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

他让我参加 NLP 训练营是为了自娱自乐。总的来说,我是那种靠单元测试和调试器生死攸关的程序员。作为 Symbolics 的一名年轻人,我被这句格言打动了,“编程就是在调试一个空的编辑器缓冲区。” (有点像训练感知器模型。)

所以,我问他,'你如何测试和调试这些东西。他的回答是:“你第一次就做对了。你仔细考虑(在他的情况下,通常是在纸上),并且非常仔细地编码。因为当你做错时,孤立问题的机会是很苗条。”

PeterR 回答中的好提示;对于实际调试,我没有任何进一步的提示,但我发现了一个非常有用的过程来测试您的代码是否可能有错误。在这篇论文中有描述:

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

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