论文地址:点这里。作者还提供了Stein变分梯度下降法的源码。
Note:
源码不涉及深度学习,所以PyTorch用户或者TF用户都可以使用。
Stein变分梯度下降(SVGD)可以理解是一种和随机梯度下降(SGD)一样的优化算法。在强化学习算法中,Soft-Q-Learning使用了SVGD去优化,而Soft-AC选择了SGD去做优化。
本文旨在提供一种新的变分推断(VI)算法
用来做梯度下降(优化)。通过优化两个分布的KL散度,粒子
不断迭代,使之从初始的分布一步步达到目标分布。算法涉及到Stein特征
的平滑
转换以及核差异(KSD
)。
Note:
贝叶斯推断是一种模型估计的方法,核心就是那个贝叶斯公式。该公式中有一个归一化因子 p ( x ) = ∫ p ( x ) d x p(x)=\int p(x)\mathrm{d}x p(x)=∫p(x)dx,当高维问题时候,计算将变得困难。因此MCMC和VI这两种方法就应运而生,用于解决这个计算复杂度问题。
马尔科夫链蒙特卡洛(MCMC)的缺陷在于收敛慢且难收敛,优点是偏差较小,毕竟是个需要采样的方法(强化学习最初的MC方法也有这2个特点)。
变分推断(VI)是一种优化算法,用随机梯度下降最小化目标分布与估计分布之间的KL散度,其优点是优化速度快适合于大数据,缺陷是存在较大的偏差,优化结果的好坏与否取决于最先定义的数簇(如经典的平均场变分数簇)偏差大小。
最大后验概率(MAP)是一种依靠先验知识的计算后验概率的方法,这是一种MAP贝叶斯,并不是全贝叶斯。
作者提出一种新型通用的变分推断算法——Stein变分梯度下降。可以看成是一种用于贝叶斯推断的梯度下降方法。它有以下特点:
这里是对贝叶斯中的后验分布 p ( x ) = p ˉ ( x ) / Z p(x)=\bar{p}(x)/Z p(x)=pˉ(x)/Z以及KSD的介绍。KSD有个优点在于通过使用Stein得分函数 ∇ x log p ( x ) \nabla_x\log p(x) ∇xlogp(x)来避免计算归一化因子 Z Z Z。
VI做模型估计:
目标分布 p ( x ) p(x) p(x),估计分布 q ( x ) q(x) q(x),数簇 Q = { q ( x ) } \mathcal{Q}=\{q(x)\} Q={q(x)},通过优化KL散度来得到估计模型 q ∗ q^* q∗:
q ∗ = arg min q ∈ Q { K L ( q ∣ ∣ p ) = E q [ log q ( x ) ] − E q [ log p ˉ ( x ) ] + log Z } (4) q^*=\argmin_{q\in\mathcal{Q}}\{KL(q||p)=\mathbb{E}_q[\log q(x)]-\mathbb{E}_q[\log\bar{p}(x)]+\log Z\}\tag{4} q∗=q∈Qargmin{KL(q∣∣p)=Eq[logq(x)]−Eq[logpˉ(x)]+logZ}(4)
VI就是通过这种方式来免除归一化因子的计算。问题就是这个数簇 Q \mathcal{Q} Q很难去选择一个合适通用的。
作者指出,合适的 Q \mathcal{Q} Q应该具备以下原则:
在此基础上,作者引入平滑变换 T : X → X , X ⊂ R d T:\mathcal{X}\to\mathcal{X},\mathcal{X}\subset\mathbb{R}^d T:X→X,X⊂Rd,也就是说将 Q \mathcal{Q} Q看成一个一对一
平滑变换 z = T ( x ) , x ∈ X z=T(x),x\in\mathcal{X} z=T(x),x∈X得到的数簇,且 x ∼ q 0 ( x ) x\sim q_0(x) x∼q0(x)。
Note:
那么经过 T T T之后的数簇是怎么样的呢?利用坐标变换公式可得:
q [ T ] ( z ) = q ( x ) ⋅ ∣ det ( ∂ x ∂ z ) ∣ = q ( T − 1 ( z ) ) ⋅ ∣ det ( ∇ z T − 1 ( z ) ) ∣ q_{[T]}(z)=q(x)\cdot|\det(\frac{\partial x}{\partial z})|=q(T^{-1}(z))\cdot|\det(\nabla_zT^{-1}(z))| q[T](z)=q(x)⋅∣det(∂z∂x)∣=q(T−1(z))⋅∣det(∇zT−1(z))∣其中 det ( ∇ z T − 1 ( z ) ) \det(\nabla_zT^{-1}(z)) det(∇zT−1(z))是矩阵 T − 1 ( z ) T^{-1}(z) T−1(z)的雅克比行列式。
或者反过来:
q [ T − 1 ] ( x ) = q ( T ( x ) ) ⋅ ∣ det ( ∇ x T ( x ) ) ∣ q_{[T^{-1}]}(x) = q(T(x))\cdot|\det(\nabla_xT(x))| q[T−1](x)=q(T(x))⋅∣det(∇xT(x))∣作者指出平滑变化的引入使得准确性和计算可行性满足了,可是可解决性还不能满足,因此一种方法是将 T T T参数化,但参数化将面临3个问题:
参数化既然这么麻烦,作者索性放弃选用了一种不需要参数化表示 T T T的方法——一种迭代式构建增量变化的方法,在RKHS下,可表现出最快的梯度下降方向:
作者提出了转换的表达式: T ( x ) = x + ϵ ⋅ ϕ ( x ) T(x)=x+\epsilon\cdot\phi(x) T(x)=x+ϵ⋅ϕ(x)。
Note:
接下来就是本文最重要的地方之一了。
Lemma1
如果 X ∈ X , X ⊂ R X\in\mathcal{X},\mathcal{X}\subset\mathbb{R} X∈X,X⊂R, F F F是平滑变换,则:
∂ det ( F ( X ) ) ∂ F ( X ) T = det ( F ( X ) ) ⋅ F − 1 ( X ) \frac{\partial{\det(F(X))}}{\partial{F(X)}^T}=\det(F(X))\cdot F^{-1}(X) ∂F(X)T∂det(F(X))=det(F(X))⋅F−1(X)证明如下:
Note:
方阵
。Lemma2
如果 p ( x ) 、 q ( x ) p(x)、q(x) p(x)、q(x)都是光滑的函数, x ∈ X x\in\mathcal{X} x∈X, T = T ϵ ( x ) T=T_\epsilon(x) T=Tϵ(x)是个一对一的转换函数,且对 x , ϵ x,\epsilon x,ϵ都可微, s p ( x ) s_p(x) sp(x)为Stein得分函数, q [ T ] q_{[T]} q[T]是 x ∼ q x\sim q x∼q时 z = T ϵ ( x ) z=T_\epsilon(x) z=Tϵ(x)的概率密度函数,则:
∇ ϵ K L ( q [ T ] ∣ ∣ p ) = E q [ s p T ( T ( x ) ) ∇ ϵ T ( x ) + t r ( ( ∇ x T ( x ) ) − 1 ⋅ ( ∇ ϵ ∇ x T ( x ) ) ) ] \nabla_\epsilon KL(q[T]||p)=\mathbb{E}_q[s_p^T(T(x))\nabla_\epsilon T(x)+ tr((\nabla_xT(x))^{-1}\cdot(\nabla_\epsilon\nabla_xT(x)))] ∇ϵKL(q[T]∣∣p)=Eq[spT(T(x))∇ϵT(x)+tr((∇xT(x))−1⋅(∇ϵ∇xT(x)))]证明如下:
Note:
Theorem 3.1.
T ( x ) = x + ϵ ⋅ ϕ ( x ) T(x)=x+\epsilon\cdot\phi(x) T(x)=x+ϵ⋅ϕ(x),平滑变换 z = T ( x ) z=T(x) z=T(x)以及未知分布 q [ T ] ( z ) q_{[T]}(z) q[T](z),当 x ∼ p ( x ) x\sim p(x) x∼p(x)时,有
∇ ϵ K L ( q [ T ] ∣ ∣ p ) ∣ ϵ = 0 = − E x ∼ q [ t r ( A p ϕ ( x ) ) ] (5) \nabla_\epsilon KL(q_{[T]}||p)|_{\epsilon=0}=-\mathbb{E}_{x\sim q}[tr(\mathcal{A}_p\phi(x))]\tag{5} ∇ϵKL(q[T]∣∣p)∣ϵ=0=−Ex∼q[tr(Apϕ(x))](5)证明如下:
Note:
如上图所示,可以把KL散度理解为一个二元的函数 F ( x , ϵ ) F(x,\epsilon) F(x,ϵ),实际上的图应该是个立体的,有许多个小山坡,这只是简易表示。分析:式(5)左边这是一个对 ϵ \epsilon ϵ的偏导数,即只关于 ϵ \epsilon ϵ的斜率。式(5)表达的就是点P的情况,也就是说KL散度关于 ϵ \epsilon ϵ的斜率是个和变量 x x x有关的值,但可以是这条曲线上的P1、P2、P3点的斜率值,具体哪个取决于 x x x的值,但如上面所说,实际上是立体图,也就是说确定了 x x x,即确定了哪个P点之后,比如确定了P1,那么立体图上这个斜率是有无数多种的,沿着不同方向有不同的变化率,这其实就是方向导数!所以式(5)就是方向导数,一看到方向导数,就想到了梯度,它是方向导数的最大值,也是变化率最大的方向,巧的是式(5)右边就是个能进行优化求出最大值的表达式,当 ϕ ( x ) \phi(x) ϕ(x)取特定的值,右边就能达到最大。至于这个“负号”,并不碍事,我们在利用式(5)的时候,只是表示从上升最快转成下降最快而已,这样便于KL梯度下降,梯度的反方向就是下降最快的方向。
Lemma 3.2.
如果所有的方向 ϕ ( x ) \phi(x) ϕ(x)都在球内: B = { ϕ ∈ H d : ∣ ∣ ϕ ∣ ∣ H d 2 ≤ S ( q , p ) } \mathcal{B}=\{\phi\in\mathcal{H}^d:||\phi||^2_{\mathcal{H}^d}\leq\mathbb{S}(q,p)\} B={ϕ∈Hd:∣∣ϕ∣∣Hd2≤S(q,p)},则在这些方向中能最大化式(5)中那个负梯度的方向为:
ϕ ∗ ( ⋅ ) = E x ∼ q [ s p ( x ) k ( x , ⋅ ) + ∇ x k ( x , ⋅ ) ] = E x ∼ q [ A p k ( x , ⋅ ) ] (6) \phi^*(\cdot)=\mathbb{E}_{x\sim q}[s_p(x)k(x,\cdot)+\nabla_xk(x,\cdot)]=\mathbb{E}_{x\sim q}[\mathcal{A}_pk(x,\cdot)]\tag{6} ϕ∗(⋅)=Ex∼q[sp(x)k(x,⋅)+∇xk(x,⋅)]=Ex∼q[Apk(x,⋅)](6)Note:
当 ϕ \phi ϕ取最优值 ϕ ∗ \phi^* ϕ∗的时候,只要变量沿着方向 ϕ ∗ \phi^* ϕ∗移动 ϵ ⋅ S ( q , p ) \epsilon\cdot\mathbb{S(q,p)} ϵ⋅S(q,p),就可以使得KL散度以最快的速度下降(从这里也看出了 ϕ ( x ) \phi(x) ϕ(x)代表着方向)。同时,平滑转换 T = x + ϵ ⋅ ϕ ∗ ( x ) T=x+\epsilon\cdot\phi^*(x) T=x+ϵ⋅ϕ∗(x)。总的流程用一个动态过程表示为:
起始分布 q 0 q_0 q0;
第一次梯度下降: T 0 ∗ ( x ) = x + ϵ 0 ⋅ ϕ q 0 , p ∗ ( x ) ; q 1 ( x ) = q 0 [ T 0 ∗ ] ( x ) T^*_0(x)=x+\epsilon_0\cdot\phi^*_{q_0,p}(x);q_1(x)=q_{0[T_0^*]}(x) T0∗(x)=x+ϵ0⋅ϕq0,p∗(x);q1(x)=q0[T0∗](x);
第二次梯度下降: T 1 ∗ ( x ) = x + ϵ 1 ⋅ ϕ q 1 , p ∗ ( x ) ; q 2 ( x ) = q 1 [ T 1 ∗ ] ( x ) T^*_1(x)=x+\epsilon_1\cdot\phi^*_{q_1,p}(x);q_2(x)=q_{1[T_1^*]}(x) T1∗(x)=x+ϵ1⋅ϕq1,p∗(x);q2(x)=q1[T1∗](x);
… … …直至收敛
总结起来就是:
q l + 1 = q l [ T l ∗ ] , T l ∗ ( x ) = x + ϵ l ⋅ ϕ q l , p ∗ ( x ) (7) q_{l+1}=q_{l[T^*_l]},T^*_l(x)=x+\epsilon_l\cdot\phi^*_{q_l,p}(x)\tag{7} ql+1=ql[Tl∗],Tl∗(x)=x+ϵl⋅ϕql,p∗(x)(7)Note:
Functional Gradient(泛函梯度)
设 f 、 g ∈ H d \mathbf{f}、\mathbf{g}\in\mathcal{H}^d f、g∈Hd,则 F [ f ] F[f] F[f]就是泛函, ∇ f F [ f ] \nabla_\mathbf{f}F[\mathbf{f}] ∇fF[f]就是泛函梯度,其有如下结论: F [ f + ϵ g ( x ) ] = F [ f ] + ϵ < ∇ f F [ f ] , g > H d + O ( ϵ 2 ) F[\mathbf{f}+\epsilon\mathbf{g}(x)]=F[f]+\epsilon<\nabla_\mathbf{f}F[\mathbf{f}],\mathbf{g}>_{\mathcal{H}^d}+O(\epsilon^2) F[f+ϵg(x)]=F[f]+ϵ<∇fF[f],g>Hd+O(ϵ2)。
Theorem 3.3.
设 T ( x ) = x + f ( x ) , x ∈ R d , f ∈ H d T(x)=x+\mathbf{f}(x),x\in\mathbb{R}^d,\mathbf{f}\in\mathcal{H}^d T(x)=x+f(x),x∈Rd,f∈Hd,则:
∇ f K L ( q [ T ] ∣ ∣ p ) ∣ f = 0 = − ϕ q , p ∗ ( x ) \nabla_{\mathbf{f}}KL(q_{[T]}||p)|_{\mathbf{f}=0}=-\phi^*_{q,p}(x) ∇fKL(q[T]∣∣p)∣f=0=−ϕq,p∗(x)Note:
MAP
,从而陷入局部最优。提高计算效率的方法
核心思想:下采样。
下采样在信号中
是对于一个样值序列隔几个样值采样一次。对图像
来说,下采样就是对于一副图像I尺寸为 M × N M\times N M×N,对起进行s倍下采样,即得到 ( M / s ) × ( N / s ) (M/s)\times(N/s) (M/s)×(N/s)尺寸的分辨率图像。通俗来说就是采样少部分的样本来近似达到大样本的效果,并且减小计算量。
公式(8)计算的瓶颈在于 ∇ x log p ( x ) , x ∈ { x i } i = 1 n \nabla_x\log p(x),x\in\{x_i\}^n_{i=1} ∇xlogp(x),x∈{xi}i=1n。其中 p ( x ) ∝ p 0 ( x ) ∏ k = 1 N p ( D k ∣ x ) p(x)\propto p_0(x)\prod^N_{k=1}p(D_k|x) p(x)∝p0(x)∏k=1Np(Dk∣x),当数据量 N N N很大的时候,计算复杂度就会很高。作者提出用下采样 Ω ⊂ { 1 , ⋯ , N } \Omega\subset\{1,\cdots,N\} Ω⊂{1,⋯,N}来近似估计 ∇ x log p ( x ) \nabla_x\log p(x) ∇xlogp(x)。本文中的下采样是这样的:
log p ( x ) ≈ log p 0 ( x ) + N ∣ Ω ∣ ∑ k ∈ Ω log p ( D k ∣ x ) . (9) \log p(x)\approx\log p_0(x)+\frac{N}{|\Omega|}\sum_{k\in\Omega}\log p(D_k|x).\tag{9} logp(x)≈logp0(x)+∣Ω∣Nk∈Ω∑logp(Dk∣x).(9)设 ∇ x log p ( x ) \nabla_x\log p(x) ∇xlogp(x)在全粒子上的统计结果为 R R R,在下采样的表现为 G G G,它的原理就是:
N Ω = R G \frac{N}{\Omega}=\frac{R}{G} ΩN=GR用局部代替整体。
Note:
略
略
Stein变分梯度下降的优缺点:
优点:
确定性方向
,有效增加优化的速度和效率(分析见上)。不像传统的随机性方法,需要通过随机性来增加粒子多样性。缺点:
关于裸的SVGD代码地址在本文顶部
main.py如下:
A = np.array([[0.2260,0.1652],[0.1652,0.6779]])
mu = np.array([-0.6871,0.8010])
model = MVN(mu, A)
x0 = np.random.normal(0,1, [10,2]);
theta = SVGD().update(x0, model.dlnprob, n_iter=1000, stepsize=0.01)
print("ground truth: ", mu)
print("svgd: ", np.mean(theta,axis=0))
可见SVGD的有效性。