Pymc3采样慢解决方法和原因

解决方法:

1. 一般情况:先验设定存在问题(不合适),建议按照同一问题背景下,用别人找到的推荐先验设置。或者查阅相关论文,使得变量先验符合模型背景。

2. 在使用别人的推荐先验还是存在极慢的采样,可以检查数据集,数据的分布情况是否和参考教程一致,比如别人是正态,你的是双峰或者偏正态,可以先进行转化调整。

3. 更换初始方法,例如find_MAP。

4. 上述方法只能解决很慢的情况下,一两天都不能采样出结果。【我的数据量15k,18个参数,chain=2,跑了6h,供参考】如果还有什么好的解决方法可以留言,一起学习。

原因:

转载自PyMC3 slows rapidly with increasing numbers of parameters - #2 by aseyboldt - Questions - PyMC Discourse

机翻如下:

NUTS 采样的速度取决于参数的数量,而更多地取决于后验的形状。如果后验在没有相关性的情况下相当接近正态,那么 10000 个参数不是问题。但是如果你的后验有某些特征,事情会很快变得更加困难。比较 NUTS 和 Metropolis 之间的采样速度通常是毫无意义的,Metropolis 只是没有注意到它的样本很糟糕,并且很乐意为您提供大量无用的样本。
使采样变得困难的事情,没有特定的顺序:

  • 不同变量的后验方差非常不同。大多数时候我们使用 advi 来解决这个问题(我们只使用结果来重新调整变量),但在某些情况下,advi 给出了愚蠢的答案,然后坚果就会陷入困境。您可以手动调用pm.fit以查看您得到的结果以及它们是否与跟踪有些匹配。(如果你觉得很冒险,你也可以使用 progess 分支中的工作https://github.com/pymc-devs/pymc3/pull/2327 35,在 advi 之后适应缩放。更新这不再是正在进行的工作,因为 3.2 这是默认值)
  • 相关变量。在低维度中,这通常不是那么糟糕,但它仍然会减慢采样速度。在这种情况下,您可以尝试找到一个参数化,使得后验中的相关性更小,或者如果 n 很小,您可以使用全秩 advi 进行初始化( 的init参数pm.sample'nuts'还设置了一个完整的质量矩阵来摆脱的相关性)
  • “漏斗”。这经常发生在分层模型中的尺度参数上。给定小尺度参数值的其他变量的后验可能与给定大尺度参数的其他变量的后验非常不同。在这种情况下,缩放自适应不起作用,因为后验的不同区域需要不同的自适应值。通常重新参数化可以再次帮助这些。通常,您最终会在“居中”和“非居中”参数化之间切换。参见例如https://twiecki.github.io/blog/2017/02/08/bayesian-hierchical-non-central/ 106
  • 尾巴很长。有时,在这些情况下,它可以帮助设置更多信息的先验。
  • 无法识别的参数(或几乎无法识别的参数)。那么你需要一个更好的模型。
  • 多模态。如果幸运的话,这只会减慢采样器的速度。在大多数情况下,采样器最终会接近一种模式,您可能永远不会发现(总是运行多个链!!)
  • 型号规格错误。这可能是最常见的问题。如果 logp 是错误的,那么坚果经常会卡住。这是民间定理的一个特例:http : //andrewgelman.com/2008/05/13/the_folk_theore/

小故事:您的模型可能有问题。尝试从轨迹中绘制变量,并查看不同变量之间的散点图。

另一个讨论与解释:

NUTS is slow · Issue #1126 · pymc-devs/pymc · GitHub

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值