SGLD 随机梯度朗之万动力学 模拟器 返回
贝叶斯深度学习·MCMC

SGLD 随机梯度朗之万动力学 模拟器

在SGD上添加布朗噪声即可采样贝叶斯事后分布的SGLD(Welling & Teh 2011),通过6个滑块调整步长、批大小、噪声强度、数据规模。确率偏差与朗之万噪声的权衡、有效样本数ESS、混合时间、Gelman-Rubin R̂实时更新,直观学习贝叶斯深度学习采样器设计。

参数设置
步长 η
η越大混合时间↓、偏差↑的权衡
迭代次数
采样器总步数,直接影响有效样本数与覆盖率
小批大小 B
越小梯度噪声↑→偏差↑,计算代价↓
全数据数 N
SGLD偏差与N/B成正比
噪声强度 √(2/N·η) 倍数
温度参数式控制布朗噪声振幅
梯度方差 σ²_g
小批梯度的方差,偏差的主要因子
计算结果
确率偏差
朗之万噪声
有效样本数ESS
混合时间 (iters)
事后分布覆盖率 (%)
R̂ 收敛指标
2D损失曲面与SGD/SGLD游走

红点为SGD(直向最大似然解),蓝点为SGLD(布朗噪声探索事后分布轮廓)。薄圈为事后分布p(θ|D)的等高线。改变η和噪声强度观察轨迹变化。

SGD vs SGLD 损失轨迹
事后分布覆盖率 vs 迭代次数
理论·主要公式

$$\theta_{t+1} = \theta_t - \frac{\eta_t}{2}\sum_{i\in B_t} \nabla L_i(\theta_t) + \sqrt{\eta_t}\,\xi_t,\quad \xi_t \sim \mathcal{N}(0,I)$$

SGLD更新规则(Welling & Teh 2011)。η_t为步长,B_t为小批,ξ_t为布朗噪声。η→0极限下进行精确事后分布采样;有限η时近似伴随偏差。

$$\mathrm{Bias} \;\propto\; \eta\,\sigma_g^2\,\frac{N}{B}, \qquad \mathrm{Var} \;\propto\; \eta, \qquad \tau_{\mathrm{mix}} \approx \frac{1}{\eta}$$

确率偏差与η和梯度方差σ²_g成正比,混合时间τ_mix为η的倒数。布朗噪声以√(2η)尺度占主导,KSD(核Stein差异)也有η相关的上界(Chen-Ding-Carin 2015)。

随机梯度朗之万动力学(SGLD) — 贝叶斯深度学习

🙋
最近论文中经常看到"SGLD",这就是SGD的一个变体吗?朗之万是人名?
🎓
与其说变体不如说是"双胞胎"。公式几乎一样,只是在SGD更新θ ← θ − η·∇L后加一行高斯噪声√(2η)·ξ。这一行代码改变了性质:从"寻找最大似然解的优化算法"变成了"从事后分布p(θ|D)采样的MCMC"。Welling-Teh(2011)的论文只有8页,却成了贝叶斯深度学习的实际起点。朗之万的名字来自于针对概率分布的布朗运动连续版本——朗之万扩散方程。
🙋
我发现增大左边"步长η"后,上面的R̂变得很大。默认值4.49也已经是收敛失败的判定,根本没法好好采样…
🎓
这正是SGLD最大的"脾气"。确率偏差与η·σ²_g·N/B成正比,所以N=10000、B=32时N/B=312倍放大,η=0.001时偏差就变成0.156。而布朗噪声只有√(2η)=0.045,偏差比噪声大3.5倍。这样就不是"采样"而是"有偏的SGD"了。尝试"N改到100"、"B改到256"或"η改到0.0001"中的任一种,R̂就会跌到1.2以下。
🙋
把η改到0.0001后R̂确实降到1.36了。可现在混合时间变成10000 iter,5000 iter完全不够…要设成完美参数太难了。
🎓
这就是SGLD偏差-方差权衡的本质。减小η可以降低偏差,但混合时间τ_mix=1/η会拉长,样本间相关性提高,有效样本数ESS增长缓慢。实践中用η_t = a/(b+t)^γ随时间衰减,γ∈(0.5,1]有理论收敛保证。初期用大η广泛探索,后期用小η精确捕捉分布。Pereyra-Vono等人有详细的选择研究。
🙋
2D损失曲面画布上蓝色的SGLD游走在飘动,红色的SGD贴在中心最大似然点上。这是什么图?
🎓
这是"事后分布景观"的示意图。中心深色是最频值(MAP),薄圆圈是事后分布p(θ|D)的等高线。SGD像滑向谷底的"点推估",沿最短路径下降。SGLD借布朗噪声不停留在谷底,游走整个概率高的区域。收集许多样本再平均就能得出"预测的不确定性"。比如医疗诊断AI说"90%概率阳性,95%信赖区间…"就是贝叶斯深度学习的妙处。
🙋
明白了,点推估没法说"我没把握"。实现会很复杂吗?PyTorch能用吗?
🎓
超简单。PyTorch里用完torch.optim.SGD后加一行 for p in model.parameters(): p.data += torch.randn_like(p) * math.sqrt(2*lr) 就变成SGLD。Edward2、Pyro、TensorFlow Probability都有内置类。深层模型收敛慢,现在多用pSGLD(带预处理,Li 2016)或SGHMC(有动量,Chen 2014)。Mandt-Hoffman的研究表明SGD自身也可看作"有定常分布的采样器",SGLD是其扩展。一行代码改变"世界观",这就是SGLD的魅力。

常见问题

SGD使用θ_{t+1} = θ_t − η·∇L向最大似然解下降,而SGLD在相同的更新式中加入sqrt(2η)·ξ_t(ξ_t是标准高斯随机数),这个布朗噪声使得迭代解成为朗之万扩散方程的离散化,当η→0时极限与贝叶斯事后分布p(θ|D)的采样等价。仅改一行代码就能从"优化算法"变为"采样算法",这是SGLD的魅力所在,广泛应用于深层模型的不确定性量化和强化学习的探索。
SGLD存在偏差与方差的权衡。增大η可以跨越更远的距离使混合时间1/η缩短,但确率偏差(≈η·grad_var·N/B/2)会增加导致偏离事后分布。减小η可以降低偏差,但有效样本数ESS增长缓慢。Welling-Teh原论文推荐使用η_t = a/(b+t)^γ(γ∈(0.5,1])进行衰减。实践中从1e-4~1e-3开始,寻找满足R̂ < 1.2和事后覆盖率> 80%的最大η是标准做法。
R̂是多链"链间方差/链内方差"平方根近似值,接近定常分布时R̂趋于1。R̂ > 1.1~1.2表示链尚未充分探索事后分布全体,事后推估偏差。Gelman等(2013)的Bayesian Data Analysis要求R̂ < 1.1,但SGLD这类有限η采样器由于偏差影响会显示较高的R̂值,本工具取相对宽松的R̂ < 1.2为OK线。实际项目应用多链、多初值确认是原则。
SGHMC(Chen等2014)在哈密尔顿动力学上加摩擦,便于借助惯性逃离局部最优。pSGLD(Li等2016)用RMSprop风格的预处理矩阵实现参数曲率自适应,加速深层网的收敛。SVGD(Liu & Wang 2016)通过核方法同时更新多个粒子,是确定性变分推论,样本效率高于SGLD但计算代价增加。深层贝叶斯学习通常先用SGLD/pSGLD建立基线,再按需扩展至SGHMC或Stein类方法。

现实应用

医疗诊断AI的不确定性量化:放射科的CT图像分类或病理图像分割需要返回"90%概率阳性,95%置信区间80~97%"这样预测自信度。Kendall-Gal(2017)用SGLD/MC-Dropout从事后分布中分离aleatory/epistemic不确定性,将低信度病例标记给医生的"自诊断AI"。FDA批准的医疗AI已开始标配这类不确定性提示。

强化学习的探索策略:贝叶斯DQN或PSRL(后验采样强化学习)每回合从Q函数事后中采样一次,"乐观地"选择行动。SGLD是其事后采样的实现基础,在Atari基准和自动驾驶仿真中用更少试验步数达到最优策略,Osband-Russo等的研究证明了这一点。

贝叶斯优化与材料、新药探索:分子量子计算(DFT)或材料合成每样本花数小时到数周。用SGLD对代理模型(高斯过程/贝叶斯NN)事后采样,通过Expected Improvement或Thompson采样选下一个实验的"主动学习"成标配。Hernández-Lobato等研究表明医药先导化合物发现用传统方法1/10的实验次数即可达成。

对抗攻击防御:对抗样本(人眼看不出但使AI误分类的微小噪声)对点推估模型难防,但用SGLD得事后采样多个模型再平均的贝叶斯集成可大幅降低攻击成功率。Gal-Smith(2018)和Carmon等研究把贝叶斯深度学习确立为adversarial robustness的基准之一。

常见误区与注意事项

最大陷阱是"SGLD是MCMC所以burn-in和收敛诊断跟MH-MCMC一样就行"的错觉。SGLD用有限步长时"目标分布"有偏离,无Metropolis-Hastings接受-拒绝校正,偏差原理上无法消除。除非η→0或用Vollmer-Zygalakis提出的MALA校正版SGLD,否则得到的样本不是精确的事后分布。Welling-Teh的"η_t→0渐近精确性"只是理论保证,有限步实现中通常就边带偏差边使用。

其次,"事后覆盖率超过90%就信得过了"是误解。本工具的覆盖率是基于迭代次数对数的经验性指标,有未探索的模态时容易高估。深层网损失曲面多模态,SGLD常只能巡游近邻模式。要解决必须从多初值并行跑链、对多变量计算R̂做"完全合并"检验,或用副本交换(平行回火)上升温度链交换。模式坍塌是贝叶斯深度学习最严峻的未解问题之一。

最后,"批大小越大偏差越小就全是好处"是陷阱。数学上B↑时偏差≈η·σ²_g·N/B↓,但每步计算代价与B成正比,ESS/秒在B=N(全批)处饱和。B过小(如B=1)梯度噪声爆炸导致偏差反而主导。Welling-Teh建议"B尽可能大但受显存限制,η随B线性缩小"。pSGLD这类带预处理方法能扩大B的最优范围。实际项目中对η和B同步网格搜索是铁则。

使用指南

  1. 设置步长(初始值0.01)和批大小(初始值32),输入数据集大小(如10000)
  2. 指定迭代次数(如5000)并点击开始按钮,SGLD算法执行随机梯度朗之万动力学事后分布采样
  3. 实时监控有效样本数ESS、混合时间、Gelman-Rubin R̂、确率偏差、朗之万噪声,当R̂ < 1.1时判定收敛

具体计算示例

对逻辑回归模型(维度d=20)执行SGLD,步长α=0.001、批大小m=64、数据集N=5000、迭代次数10000、朗之万噪声温度β^(-1)=0.1的条件下,得确率偏差0.0045、有效样本数ESS约2800(有效率56%)、混合时间约1200迭代、R̂=1.08。降低步长至α=0.0005时R̂改善至1.04。

实务注意事项

  1. 高维贝叶斯推估(d>50)中步长过大时朗之万噪声占主导,事后平均估计量出现0.015以上偏差,推荐m≤N/20
  2. 混合时间随数据规模N增加时若按O(N)恶化而非O(log N),应用学习率衰减α_t = α_0 / t^(2/3)可改善
  3. 多链并行运行(4~8条)可提升R̂计算精度,单链情况下ESS<1000时R̂估计可信度下降