自然梯度法,即Natural Gradient,是一种优化算法,其他常见的优化算法比如一维搜索、牛顿法、最速下降法、共轭梯度法等。个人认为自然梯度的思想非常类似于最速下降法
,只不过一个是寻找最优的标量 α ∈ R \alpha\in\mathbb{R} α∈R,而NG是在一定约束下寻找最优的搜索方向 s ∗ = α d s^*=\alpha d s∗=αd(严格来说搜索方向应该不包括学习率,但是为了便于说明,接下来的搜索方向都暗指包括学习率)。
另外NG算法还被广泛用于强化学习中,比如NPG、TRPO以及PPO算法都涉及到了自然梯度法思想的影响,因此对于强化学习领域的研究者来说,NG还是有必要了解的。
参考列表:
①费舍尔信息矩阵及自然梯度法或英文原版
②TRPO与NPG
③TRPO共轭梯度优化
自然梯度法是梯度下降法的一个分支,因此参数的更新遵从:
θ ( k + 1 ) ← θ ( k ) − α ( k ) ⋅ g ( k ) \theta^{(k+1)}\gets\theta^{(k)}-\alpha^{(k)}\cdot g^{(k)} θ(k+1)←θ(k)−α(k)⋅g(k)其中 g g g为梯度,作为一个优化算法,这里设目标函数为 f ( θ ) f(\theta) f(θ),则目标函数为:
θ ∗ = arg min θ f ( θ ) \theta^* = \argmin_\theta f(\theta) θ∗=θargminf(θ)那么由于在机器学习中,我们很难直接求得解析解,故一般都是通过迭代的方式去求得数值解,因此梯度下降法里面最重要的自然就是学习率以及搜索方向了,不同的梯度下降法也就是搜索方向或者学习率的选择不同。那么在Natural Gradient中的选择是这样的:
s ∗ = arg min d f ( θ k + s ( k ) ) s . t . D K L ( θ k , θ ( k + 1 ) ) ≤ ϵ s^* = \argmin_d f(\theta^{k}+s^{(k)})\\ s.t. \,\,D_{KL}(\theta^{k},\theta^{(k+1)})\leq \epsilon s∗=dargminf(θk+s(k))s.t.DKL(θk,θ(k+1))≤ϵ其表达的意思是:参数搜索范围在参数空间受限的情况下,找到最小化目标函数 f f f的搜索方向 s ∗ s^* s∗,这就是自然梯度法。在NG里约束参数搜索范围采用了 K L − d i v e r g e n c e KL-divergence KL−divergence法。
在推导出自然梯度发最优搜索方向 d ∗ d^* d∗的过程中,还需要了解一些必备知识点,比如①费雪信息矩阵FIM的定义②FIM与黑塞矩阵的关系③FIM与KL散度的关系等等。
什么是费雪信息矩阵(Fisher Information Matrix)?
定义某个分布关于模型 θ \theta θ的分布为 p ( x ∣ θ ) p(x|\theta) p(x∣θ)。
记得分函数 s p ( θ ) = ∇ θ log p ( x ∣ θ ) , s p ∈ R d s_p(\theta)=\nabla_\theta\log p(x|\theta),s_p\in\mathbb{R}^d sp(θ)=∇θlogp(x∣θ),sp∈Rd,关于得分函数,在 K S D KSD KSD中也出现过,只不过在 K S D KSD KSD中是 E p [ A p f ( x ) ] = 0 \mathbb{E}_p[\mathcal{A}_pf(x)]=0 Ep[Apf(x)]=0,而在这里我们有 E p [ s p ( θ ) ] = 0 \mathbb{E}_p[s_p(\theta)]=0 Ep[sp(θ)]=0,证明如下:然后给出协方差的定义: c o v ( X , Y ) = E [ ( X − E X ) ⋅ ( Y − E Y ) ] cov(X,Y)=\mathbb{E}[(X-\mathbb{E}X)\cdot(Y-\mathbb{E}Y)] cov(X,Y)=E[(X−EX)⋅(Y−EY)],因此得分函数的协方差表示为:
c o v ( s p , s p ) = E [ ( s p − 0 ) ⋅ ( s p − 0 ) T ] cov(s_p,s_p)=\mathbb{E}[(s_p-0)\cdot(s_p-0)^T] cov(sp,sp)=E[(sp−0)⋅(sp−0)T]我们可以将其看成一种信息,因此可以说得分函数的协方差就是费雪信息。又因为费雪信息是以矩阵 R d × d \mathbb{R}^{d\times d} Rd×d形式存在的,因此将得分函数展开: F = E p [ ∇ θ log p ( x ∣ θ ) ⋅ ∇ θ T log p ( x ∣ θ ) ] F=\mathbb{E}_p[\nabla_\theta\log p(x|\theta)\cdot\nabla^T_\theta\log p(x|\theta)] F=Ep[∇θlogp(x∣θ)⋅∇θTlogp(x∣θ)]
Note:
经验费雪信息矩阵
: F ≈ F ^ = 1 N ∑ i = 1 N ∇ θ log p ( x ∣ θ ) ⋅ ∇ θ T log p ( x ∣ θ ) F\approx \hat{F}=\frac{1}{N}\sum_{i=1}^N\nabla_\theta\log p(x|\theta)\cdot\nabla^T_\theta\log p(x|\theta) F≈F^=N1i=1∑N∇θlogp(x∣θ)⋅∇θTlogp(x∣θ)这一节讨论FIM与黑塞矩阵 H H H之间的关系。
记 H log p ( x ∣ θ ) = ∂ 2 log p ( x ∣ θ ) ∂ θ 2 H_{\log p(x|\theta)}=\frac{\partial^2{\log p(x|\theta)}}{\partial{\theta^2}} Hlogp(x∣θ)=∂θ2∂2logp(x∣θ),则:
H log p ( x ∣ θ ) = J ( ∇ θ log p ( x ∣ θ ) ) = J ( ∇ θ p ( x ∣ θ ) p ( x ∣ θ ) ) H_{\log p(x|\theta)}=J(\nabla_\theta\log p(x|\theta))=J(\frac{\nabla_\theta p(x|\theta)}{p(x|\theta)}) Hlogp(x∣θ)=J(∇θlogp(x∣θ))=J(p(x∣θ)∇θp(x∣θ))Note:
对上式求期望可得:
E x ∼ p [ H log p ( x ∣ θ ) ] = − F \mathbb{E}_{x\sim p}[H_{\log p(x|\theta)}]=-F Ex∼p[Hlogp(x∣θ)]=−F证明如下:
记住这个结论:
F = − E p [ H log p ( x ∣ θ ) ] F=-\mathbb{E}_p[H_{\log p(x|\theta)}] F=−Ep[Hlogp(x∣θ)],意思就是说得分函数的一阶导数期望取反就是费雪信息矩阵 F F F,接下来会用到。
做强化学习的,对于KL散度应该不陌生了,之前在高斯平滑 Q Q Q函数、TRPO、PPO这些论文中都出现过,这里还是啰嗦的给出其公式:
D K L ( p ( x ) ∣ ∣ q ( x ) ) = ∫ p ( x ) ⋅ log p ( x ) q ( x ) d x = E p [ log p ( x ) q ( x ) ] = E p [ log p ( x ) ] − E p [ log q ( x ) ] D_{KL}(p(x)||q(x))=\int p(x)\cdot\log\frac{p(x)}{q(x)}\mathrm{d}x=\mathbb{E}_p[\log\frac{p(x)}{q(x)}]\\ =\mathbb{E}_p[\log p(x)]-\mathbb{E}_p[\log q(x)] DKL(p(x)∣∣q(x))=∫p(x)⋅logq(x)p(x)dx=Ep[logq(x)p(x)]=Ep[logp(x)]−Ep[logq(x)]Note:
记 θ \theta θ为旧参数 θ o l d \theta_{old} θold, θ ′ = θ + s \theta'=\theta+s θ′=θ+s为新参数 θ n e w \theta_{new} θnew,那么相对熵运用到NG算法中就是:
D K L ( p ( x ∣ θ ) ∣ ∣ p ( x ∣ θ ′ ) ) = E p ( x ∣ θ ) [ log p ( x ∣ θ ) ] − E p ( x ∣ θ ) [ log p ( x ∣ θ ′ ) ] D_{KL}(p(x|\theta)||p(x|\theta'))=\mathbb{E}_{p(x|\theta)}[\log p(x|\theta)]-\mathbb{E}_{p(x|\theta)}[\log p(x|\theta')] DKL(p(x∣θ)∣∣p(x∣θ′))=Ep(x∣θ)[logp(x∣θ)]−Ep(x∣θ)[logp(x∣θ′)]
接下来我们试着求取 K L KL KL散度的一阶导数和二阶导数。
一阶导数和二阶导数所求如下:
也就是说 K L KL KL散度在 θ ′ = θ \theta'=\theta θ′=θ处的Hessian矩阵就是费雪信息矩阵 F F F。
接下来就开始推导出自然梯度法所优化出的搜索方向 s ∗ s^* s∗了。
我们把目标函数和约束重新列一下:
min θ f ( θ ′ ) s . t . k l ( θ ′ ) ≤ ϵ \min_\theta f(\theta')\\ s.t.\,\,kl(\theta')\leq\epsilon θminf(θ′)s.t.kl(θ′)≤ϵ
接下来我们对目标函数和约束用泰勒公式在 θ ′ = θ \theta'=\theta θ′=θ处展开
对于目标函数:
f ( θ ′ ) ≈ f ( θ ) + g T ⋅ ( θ ′ − θ ) + 高 阶 项 f(\theta')\approx f(\theta)+g^T\cdot(\theta'-\theta)+高阶项 f(θ′)≈f(θ)+gT⋅(θ′−θ)+高阶项Note:
对于约束项:
k l ( θ ∣ ∣ θ ′ ) ≈ k l ( θ ∣ ∣ θ ) + ∇ θ ′ T k l ( θ ∣ ∣ θ ′ ) ∣ θ ′ = θ ( θ ′ − θ ) + 1 2 ( θ ′ − θ ) T ∇ θ ′ 2 k l ( θ ∣ ∣ θ ′ ) ∣ θ ′ = θ ( θ ′ − θ ) + 高 阶 项 kl(\theta||\theta')\approx kl(\theta||\theta)+\nabla^T_{\theta'}kl(\theta||\theta')|_{\theta'=\theta}(\theta'-\theta)+\frac{1}{2}(\theta'-\theta)^T\nabla_{\theta'}^2kl(\theta||\theta')|_{\theta'=\theta}(\theta'-\theta)+高阶项 kl(θ∣∣θ′)≈kl(θ∣∣θ)+∇θ′Tkl(θ∣∣θ′)∣θ′=θ(θ′−θ)+21(θ′−θ)T∇θ′2kl(θ∣∣θ′)∣θ′=θ(θ′−θ)+高阶项Note:
然后我们将近似后的约束问题通过拉格朗日乘子法转为无约束问题:
m i n i m i z e L ( θ ′ , λ ) = f ( θ ) + g T ⋅ s + λ ( 1 2 s T F s − ϵ ) minimize\,\,L(\theta',\lambda)=f(\theta)+g^T\cdot s+\lambda(\frac{1}{2}s^TFs-\epsilon) minimizeL(θ′,λ)=f(θ)+gT⋅s+λ(21sTFs−ϵ)整理加入 K K T KKT KKT条件:
m i n i m i z e L ( θ ′ , λ ) = λ 2 s T F s + g T ⋅ s + f ( θ ) − λ ϵ K K T : { 1 2 s T F s ≤ ϵ λ = 0 λ ( 1 2 s T F s − ϵ ) = 0 minimize\,\,L(\theta',\lambda) = \frac{\lambda}{2}s^TFs+g^T\cdot s+f(\theta)-\lambda\epsilon\\ KKT:\begin{cases} \frac{1}{2}s^TFs\leq\epsilon\\ \lambda=0\\ \lambda(\frac{1}{2}s^TFs-\epsilon)=0 \end{cases} minimizeL(θ′,λ)=2λsTFs+gT⋅s+f(θ)−λϵKKT:⎩⎪⎨⎪⎧21sTFs≤ϵλ=0λ(21sTFs−ϵ)=0显然我们现在的目的在于优化出最好的 s ∗ s^* s∗使得拉格朗日函数 L L L达到最小值:因此我们求 ∂ L ∂ s = 0 \frac{\partial{L}}{\partial{s}}=0 ∂s∂L=0。
易得:
λ F s + g = 0 ⇔ s ∗ = − 1 λ F − 1 g \lambda Fs+g=0\\ \Leftrightarrow s^*=-\frac{1}{\lambda}F^{-1}g λFs+g=0⇔s∗=−λ1F−1gNote:
至此我们总算可以得出NG最重要的更新公式了:
θ ( k + 1 ) ← θ k − 2 ϵ g T F g ⋅ F − 1 g \theta^{(k+1)}\gets\theta^{k}-\sqrt{\frac{2\epsilon}{g^TFg}}\cdot F^{-1}g θ(k+1)←θk−gTFg2ϵ⋅F−1g
这里给出了NG算法应用于强化学习中形成的Natural Policy Gradient算法,可以看到它最下面的更新公式,就是我们上述推导出来的。
NPG伪代码:
这一份是TRPO的伪代码,可以说TRPO进一步优化了NPG算法,关键在于TRPO可以推出这么一个式子:
θ − θ o l d = s = 1 λ F − 1 g \theta-\theta_{old}=s=\frac{1}{\lambda}F^{-1}g θ−θold=s=λ1F−1g而TRPO采用共轭梯度优化算法可以通过迭代求出共轭搜索方向 d d d,乘上学习率就可以求得 s s s,因此可以用 d d d来近似NPG算法中的搜索方向 F − 1 g F^{-1}g F−1g,即 d ≈ F − 1 g d\approx F^{-1}g d≈F−1g。这样最大的好处就是不用计算费雪信息矩阵,因为FIM的计算量是非常大的。
TRPO伪代码:
自然梯度下降法
的伪代码: