使用dynesty的act-walk采样时偶现除零错误及参数设置咨询
Bilby Dynesty act-walk 采样除零错误问题解答
问题背景
使用Bilby的Dynesty采样器,采用默认act-walk方法从约束先验中进行参数估计时,偶尔会触发除零错误导致采样终止。
采样设置
15:37 bilby INFO : Using sampler Dynesty with kwargs {'nlive': 2048, 'bound': 'live', 'sample': 'act-walk', 'periodic': None, 'reflective': None, 'update_interval': 600, 'first_update': None, 'npdim': None, 'rstate': None, 'queue_size': 72, 'pool': None, 'use_pool': None, 'live_points': None, 'logl_args': None, 'logl_kwargs': None, 'ptform_args': None, 'ptform_kwargs': None, 'gradient': None, 'grad_args': None, 'grad_kwargs': None, 'compute_jac': False, 'enlarge': None, 'bootstrap': None, 'walks': 100, 'facc': 0.2, 'slices': None, 'fmove': 0.9, 'max_move': 100, 'update_func': None, 'ncdim': None, 'blob': False, 'save_history': False, 'history_filename': None, 'maxiter': None, 'maxcall': None, 'dlogz': 0.1, 'logl_max': inf, 'n_effective': None, 'add_live': True, 'print_progress': True, 'print_func': <bound method Dynesty._print_func of <bilby.core.sampler.dynesty.Dynesty object at 0x7f0fc6a44160>>, 'save_bounds': False, 'checkpoint_file': None, 'checkpoint_every': 60, 'resume': False} 15:37 bilby INFO : Checkpoint every check_point_delta_t = 600s 15:37 bilby INFO : Using dynesty version 2.1.2 15:37 bilby INFO : Using the bilby-implemented rwalk sampling tracking the autocorrelation function and thinning by 2 with maximum length 30000 15:37 bilby INFO : Setting up multiproccesing pool with 72 processes
错误信息
Traceback (most recent call last): File "/home/hydrogen/miniconda3/envs/lisabeta-bilby/lib/python3.8/multiprocessing/pool.py", line 125, in worker result = (True, func(*args, **kwds)) File "/home/hydrogen/miniconda3/envs/lisabeta-bilby/lib/python3.8/multiprocessing/pool.py", line 48, in mapstar return list(map(*args)) File "/home/hydrogen/miniconda3/envs/lisabeta-bilby/lib/python3.8/site-packages/bilby/core/sampler/dynesty_utils.py", line 197, in __call__ self.build_cache() File "/home/hydrogen/miniconda3/envs/lisabeta-bilby/lib/python3.8/site-packages/bilby/core/sampler/dynesty_utils.py", line 326, in build_cache accept = max(accept // n_found, 1) ZeroDivisionError: integer division or modulo by zero
观察与推测
- 调整设置后发现,
maxmcmc值较小时更易触发该问题。 - 分析
ACTTrackingRWalk类源码推测:期望链长为自相关长度(act)的50倍,但当act接近maxmcmc(如act < maxmcmc < act * nact)时,while循环会被maxmcmc截断,链中点数不足一个稀疏化因子(act*nact),导致稀疏化后无有效点,触发除零错误;但过大的maxmcmc会导致多核心采样CPU效率极低。
问题解答
1. 该错误是bug还是由我的采样器设置不当导致?
这属于Bilby实现act-walk时的边界处理bug。你的分析准确:当maxmcmc落在act和act*nact之间时,截断后的链无法生成至少一个稀疏化样本,导致n_found=0触发除零错误。这种场景是代码未覆盖的边界条件,并非单纯设置不当,但你的maxmcmc设置刚好命中了这个未被处理的情况。
2. 哪些场景需要调整非默认的nact值?
nact控制稀疏化链所需的最小自相关长度倍数,默认nact=2能平衡样本独立性和计算效率,需要调大的场景包括:
- 后验参数强耦合:参数间高度相关导致自相关长度(act)显著增大,更大的nact能保证稀疏化后的样本足够独立;
- 高精度后验需求:对参数误差要求严格,或需要计算低概率尾部统计量时,增大nact可减少自相关带来的偏差;
- 样本独立性警告:如果采样过程中输出提示样本自相关过高,或有效样本量(
n_effective)远低于预期,可尝试调大nact。
3. 如何确定合适的采样器设置(如maxmcmc等)?这些设置是否需要根据后验分布的特征进行调整?
采样器设置必须结合后验分布特征调整,具体建议:
- maxmcmc设置:
- 最小设为
act * nact * 2,预留足够空间避免触发边界错误;或直接用远大于预期act的值(比如默认的30000,若你的act不会超过15000); - 若担心CPU效率,先做一轮短采样估算act值,再将maxmcmc设为
act * nact * 5,既避免错误又减少计算浪费;
- 最小设为
- 其他参数调整:
walks:后验维度高或分布复杂时,调大walks(比如从100到200)提升采样效率;facc:接受率过低(如<0.1)时,适当调大facc增强步长适应性;
- 动态调整策略:
- 先运行小规模预采样,查看Dynesty输出的act值、接受率、有效样本量等统计信息,再针对性调参;
- 启用checkpoint功能,采样中断后可从断点恢复,避免重复计算。
内容的提问来源于stack exchange,提问作者niuiniuin
相关产品推荐
相关产品推荐

