目前我们了解到采样方法有很多种,按照从朴素到高效的演变顺序大致是
- 反函数采样
- 蒙特卡洛模拟(求统计量)
- 接受-拒绝采样
- MCMC
- HM 算法
- Gibbs 采样
接上一篇文章,Gibbs 采样能在有条件分布 p ( x d ′ ∣ x − d ) p(\mathbf{x}'_{d}|\mathbf{x}_{-d}) p(xd′∣x−d) 的情况下对高维分布进行采样,并且接受率为1,有很高的效率,但是 Gibbs 采样也不是完美的。很多时候我们如果想要采样一个 p ( x ) p(\mathbf{x}) p(x) 但是写不出条件分布或者边缘分布,怎么办呢?(比如说 x \mathbf{x} x 是一个图片, p ( x ) p(\mathbf{x}) p(x) 是一个 NN,那么这个概率显然是没法求的)
Langevin Dynamics
朗之万动力学的想法和 HM 有几分神似,先任意选择一个 x 0 \mathbf{x}_0 x0 ,然后重复:
- 求 x t \mathbf{x}_t xt 的梯度 ∇ p ( x t ) \nabla p(\mathbf{x}_t) ∇p(xt)
- 带噪声梯度上升:如果
ϵ
\epsilon
ϵ视作学习率,梯度上升的过程中加
2
ϵ
\sqrt{2\epsilon}
2ϵ 倍的正态分布噪声,更新样本
x
t
+
1
=
x
t
+
ϵ
∇
p
(
x
t
)
+
2
ϵ
z
i
,
z
i
∼
N
(
0
,
1
)
\mathbf{x}_{t+1} = \mathbf{x}_{t} +\epsilon \nabla p(\mathbf{x}_t) + \sqrt{2\epsilon}z_i, \ \ \ \ \ z_i \sim \mathcal{N}(0,1)
xt+1=xt+ϵ∇p(xt)+2ϵzi, zi∼N(0,1)
直觉
这样做的直觉是,梯度上升项会让样本集中在分布的峰上,而噪声项可以让样本在峰周围游走。
对比HM:HM算法是,如果跳跃的方向是往
p
(
x
)
p(x)
p(x) 的高概率方向跳跃的,那么就
100
%
100\%
100% 概率接受;反之,有概率接受,有概率不接受。实际上也是在促使样本往高概率峰移动,但是保留样本从峰上下来,在周边游走的可能性。
改进——MALA
如果简单地使用朗之万采样,会有问题:
- 对于梯度下降的经典峡谷地形,朗之万采样也会有同样的问题,就是一直在山谷两侧震荡,不往中间走。
- ϵ \epsilon ϵ 不好调参,低维(<=2)的时候还能从视觉上看分布的采样效果,但是高维的时候基本上只能看一些统计指标
- 当分布有孤立的“岛屿”的时候,从初始点开始可能难以跳跃到别的岛屿。
MALA (Metropolis adjusted Langevin algorithm)就不仅仅使用
∇
p
(
x
)
\nabla p(\mathbf{x})
∇p(x) 进行朗之万的梯度上升,还缝合整合了 MH 算法,用
p
(
x
)
p(\mathbf{x})
p(x) 进行采样,这样只要时间足够长总是收敛到正确的分布,无论
ϵ
\epsilon
ϵ 是大还是小
MALA 的 demo 页面
退火朗之万
还可以继续改进,给朗之万动力学的
ϵ
\epsilon
ϵ 套一个退火,在开始的时候学习率很大,来学习大致的峰的形状,然后学习率逐渐变小,来学习分布的具体细节。这样选择
ϵ
\epsilon
ϵ 的问题转化成选择退火的超参的问题,从而可以跳出孤岛,和狭窄的峡谷地形
ϵ
=
ϵ
0
(
β
+
t
)
γ
\epsilon=\epsilon_0 (\beta + t)^{\gamma}
ϵ=ϵ0(β+t)γ