蒙特卡洛的平行梅森捻线机

计算科学 并行计算 蒙特卡洛 随机数生成
2021-12-07 05:23:44

最近,我看到一条评论声称几乎所有使用蒙特卡罗方法的研究人员都做错了。它继续详细说明,仅仅为 PRNG 的不同实例(例如 Mersenne Twister)选择不同的种子并不足以确保无偏见的结果,因为可能会发生不良碰撞关于 Mersenne Twister的维基百科文章似乎证实了这一点:

仅在种子值(而不是其他参数)上不同的多个 Mersenne Twister 实例通常不适用于需要独立随机数生成器的 Monte-Carlo 模拟,尽管存在选择多组参数值的方法。

我不得不承认,我有罪。但是到目前为止我看到的所有其他并行蒙特卡罗库的实现也是如此,特别是ALPS

维基百科文章还引用了两篇提供补救措施的论文:

这两种方法都由 Mersenne Twister 算法的原作者 Matsumoto 和 Nishimura 共同完成。

恐怕我对数论或代数不是很了解,也没有完全掌握上述方案或 Mersenne Twister 背后的数学。我的问题主要是实用性的:

  • 如果在实践中几乎没有人关心它(至少在我的社区中),那么在不采用这种方案时,我真的需要担心在我的模拟中引入偏差吗?
  • 如果我要实施其中一项对策,我是否可以假设 Jump-Ahead 更适合,因为它基于可靠的理论并且是更现代的方法?
3个回答

就像你说的,使用 Mersenne Twister 进行并行计算几乎总是不正确,因为正确的方法很难实现。

到目前为止,最简单和最好的答案是完全放弃 Mersenne Twister,并使用像PCG 系列这样的东西,它提供了开箱即用的多个流。

众所周知,Mersenne Twister未能通过多项统计测试,同时也比 PCG 和 XorShift+ 系列等较新的 RNG 慢。

Mersenne Twister 在今天如此广泛使用的原因主要是因为之前的 RNG 在性能和质量上都差得多。它还帮助原作者开源了一个高性能的实现。

如果你想使用 MT,你可以使用SFMT作为你的 PRNG 和SFMT 跳转来生成多个流。

您可以简单地用一个种子初始化 MT,然后通过例如11060,21060,31060…生成多个流的步骤。跳转有点昂贵,但您只需要在初始化 PRNG 时执行一次。

真的只有你能回答关于模拟偏差的问题,以及它在你的应用程序中是否可以接受。我使用的标准程序:

使用大量模拟将伪随机序列设置为基准(标准蒙特卡洛)(在风险管理中经常使用 10,000,在其他领域可能使用 100,000 到 1M)。

对数据子集的相同输入数据运行 RNG(我们使用 1 年,但这通常是多余的)。

使用描述您实际用于得出结论/决策的数据特征的统计数据来比较结果。我们使用百分位数 (1,5,25,50,75,95,99)、绝对误差、误差的标准差。所有这些都与您的基准有关。

现在您有了分析结果,您可以根据自己的判断来判断 RNG 偏差是否可以接受。