为何Gen.jl的@gen模型中使用观测值列表能提升MH收敛效果?
问题:单观测vs多观测下Gen中MH采样的收敛差异
在Gen框架中,我们对比了两个高度模型的Metropolis-Hastings(MH)采样结果,发现收敛效果差异显著:
单观测模型
@gen function height_model() mu = @trace(normal(178, 20), :mu) sigma = @trace(uniform(0, 50), :sigma) @trace(normal(mu, sigma), :h) end
该模型仅生成一个观测值:h,MH采样的后验结果完全偏离真实观测值。
多观测模型
@gen function height_model(n) mu = @trace(normal(178, 20), :mu) sigma = @trace(uniform(0, 50), :sigma) for i=1:n @trace(normal(mu, sigma), "h-$i") end end
该模型生成n个观测值,MH采样的后验结果更贴近真实观测值。
共用推理程序
两个模型使用完全相同的MH推理代码:
function do_mcmc_inference(model, args, xs, iters) observations = choicemap() for (i, x) in enumerate(xs) observations["h-$i"] = x end # 生成受约束的初始轨迹 (trace, _) = generate(model, args, observations) # 迭代MH采样 for i=1:iters (trace, _) = metropolis_hastings(trace, Gen.select(:mu)) (trace, _) = metropolis_hastings(trace, Gen.select(:sigma)) end # 提取最终的mu和sigma choices = get_choices(trace) return (choices[:mu], choices[:sigma]) end
请问为何会出现这种后验收敛效果的差异?
原因分析
观测信息量的约束强度差异:单观测提供的信息极其有限,无法有效缩小
mu和sigma的后验取值范围。单个观测值可以由大量不同的mu、sigma组合生成,MH采样在这种模糊的后验空间中容易随机游走,难以收敛到真实参数。而多观测通过多个数据点的联合约束,大幅压缩了参数的合理取值区间,后验分布更尖锐,采样更容易锁定高概率区域。MH采样的接受率反馈效率:单观测场景下,对
mu或sigma的提议更新,其生成观测值的概率变化不显著,导致接受率要么过高(随机游走)要么过低(难以探索),无法有效引导采样向真实值靠近。多观测时,参数的微小变动会导致多个观测值的联合似然出现明显变化,MH的接受率能准确反馈参数是否更优,采样的方向性更强,收敛速度和准确性自然提升。初始轨迹的修正难度:单观测下,若初始轨迹的参数偏离真实值,有限的观测信息无法快速引导采样修正;多观测的初始轨迹即使有偏差,多个数据点的联合似然会快速将采样拉向高概率参数区域,减少了随机游走的可能性。
内容的提问来源于stack exchange,提问作者Hewarathna Ashen Iranga
相关产品推荐
相关产品推荐

