梯度类算法原理:最速下降法、牛顿法和拟牛顿法

算法结构

梯度类算法有很多,本文主要学习最常见的3个算法:最速下降法、牛顿法和拟牛顿法。算法名称虽多,但是他们的算法结构都是一样的,可以描述为

(1)选定初始点 x 0 \pmb {x}_0 x0

(2)迭代公式为 x k + 1 = x k + α k d k \pmb{x}_{k+1}=\pmb{x}_k+\alpha_k\pmb{d}_k xk+1=xk+αkdk,其中 α k \alpha_k αk d k \pmb{d}_k dk分别为第 k k k次的迭代步长和迭代方向。

人们常说,选择大于努力。对优化算法来说,也是类似的:如果 d k \pmb{d}_k dk设计的不好,可能无论 α k \alpha_k αk怎么努力,都得不到最优解。所以,我们应该重点关注 d k \pmb{d}_k dk的构造方法。

最速下降法

最朴素的想法,就是如果针对任意初始点,都能直接算出让函数下降最快的方向,就好了。下面我们看看怎么能够做到。

假设 x k = [ x k 1 , x k 2 , . . , x k n ] \pmb{x}_k=[x_{k1},x_{k2},..,x_{kn}] xk=[xk1,xk2,..,xkn],给定方向 s \pmb{s} s上的一个增量为
Δ s = [ Δ x 1 , Δ x 2 , . . . , Δ x n ] \Delta \pmb{s}=[\Delta x_1, \Delta x_2, ..., \Delta x_n] Δs=[Δx1,Δx2,...,Δxn]
定义在点 x k \pmb{x}_k xk处沿方向 s \pmb{s} s的变化率为
∂ f ( x ) ∂ s ∣ x k = lim ⁡ Δ s → 0 f ( x k + Δ s ) − f ( x k ) ∥ Δ s ∥ \frac{\partial f(\pmb{x})}{\partial \pmb{s}} \vert _{\pmb{x}_k}= \lim\limits_{\Delta \pmb{s}\to0}\frac{f(\pmb{x}_k+\Delta \pmb{s})-f(\pmb{x}_k)}{\Vert \Delta \pmb{s} \Vert} sf(x)xk=Δs0lim∥Δsf(xk+Δs)f(xk)
Δ s \Delta \pmb{s} Δs足够小时,上式右侧的分子变为全微分形式
f ( x k + Δ s ) − f ( x k ) = ∂ f ∂ x k 1 ∣ x k Δ x 1 + ∂ f ∂ x k 2 ∣ x k Δ x 2 + ⋅ ⋅ ⋅ + ∂ f ∂ x k n ∣ x k Δ x n f(\pmb{x}_k+\Delta \pmb{s})-f(\pmb{x}_k)=\frac{\partial f}{\partial x_{k1}}\vert _{\pmb{x}_k}\Delta x_{1}+\frac{\partial f}{\partial x_{k2}}\vert _{\pmb{x}_k}\Delta x_2+···+\frac{\partial f}{\partial x_{kn}}\vert _{\pmb{x}_k}\Delta x_n f(xk+Δs)f(xk)=xk1fxkΔx1+xk2fxkΔx2+⋅⋅⋅+xknfxkΔxn
将上式带入上上式
∂ f ( x ) ∂ s ∣ x k = lim ⁡ Δ s → 0 ( ∂ f ∂ x k 1 ∣ x k Δ x 1 Δ s + ∂ f ∂ x k 2 ∣ x k Δ x 2 Δ s + ⋅ ⋅ ⋅ + ∂ f ∂ x k n ∣ x k Δ x n Δ s ) = ∂ f ∂ x 1 ∣ x k cos ⁡ α 1 + ∂ f ∂ x 2 ∣ x k cos ⁡ α 2 + ⋅ ⋅ ⋅ + ∂ f ∂ x n ∣ x k cos ⁡ α n = [ ∇ f ( x k ) ] T e \frac{\partial f(\pmb{x})}{\partial \pmb{s}} \vert _{\pmb{x}_k} = \lim\limits_{\Delta \pmb{s}\to0}( \frac{\partial f}{\partial x_{k1}}\vert _{\pmb{x}_k}\frac{\Delta x_1}{\Delta \pmb{s}}+\frac{\partial f}{\partial x_{k2}}\vert _{\pmb{x}_k}\frac{\Delta x_2}{\Delta \pmb{s}}+···+\frac{\partial f}{\partial x_{kn}}\vert _{\pmb{x}_k}\frac{\Delta x_n}{\Delta \pmb{s}}) \\ = \frac{\partial f}{\partial x_1}\vert _{\pmb{x}_k}\cos{\alpha}_1+\frac{\partial f}{\partial x_2}\vert _{\pmb{x}_k}\cos{\alpha}_2+···+\frac{\partial f}{\partial x_n}\vert _{\pmb{x}_k}\cos{\alpha}_n \\ = [\nabla f(\pmb{x}_k)]^T \pmb{e} sf(x)xk=Δs0lim(xk1fxkΔsΔx1+xk2fxkΔsΔx2+⋅⋅⋅+xknfxkΔsΔxn)=x1fxkcosα1+x2fxkcosα2+⋅⋅⋅+xnfxkcosαn=[f(xk)]Te
此处, cos ⁡ α i = lim ⁡ Δ s → 0 Δ x i Δ s ( i = 1 , 2 , ⋅ ⋅ ⋅ , n ) \cos{\alpha}_i=\lim\limits_{\Delta \pmb{s}\to0}\frac{\Delta x_i}{\Delta \pmb{s}}(i=1,2,···,n) cosαi=Δs0limΔsΔxi(i=1,2,⋅⋅⋅,n),表示方向 s \pmb{s} s与坐标轴 x i 夹 \pmb{x}_i夹 xi角的余弦值。 [ ∇ f ( x k ) ] [\nabla f(\pmb{x}_k)] [f(xk)]是函数 f f f x k \pmb{x}_k xk处的梯度向量,表达式为
[ ∇ f ( x k ) ] T = [ ∂ f ∂ x k 1 ∣ x k , ∂ f ∂ x k 2 ∣ x k , ⋅ ⋅ ⋅ , ∂ f ∂ x k n ∣ x k ] [\nabla f(\pmb{x}_k)]^T=[\frac{\partial f}{\partial x_{k1}}\vert _{\pmb{x}_k},\frac{\partial f}{\partial x_{k2}}\vert _{\pmb{x}_k},···,\frac{\partial f}{\partial x_{kn}}\vert _{\pmb{x}_k}] [f(xk)]T=[xk1fxk,xk2fxk,⋅⋅⋅,xknfxk]
e = [ cos ⁡ α 1 , cos ⁡ α 2 , ⋅ ⋅ ⋅ , cos ⁡ α n ] \pmb{e}=[\cos{\alpha _1},\cos{\alpha _2},···,\cos{\alpha _n}] e=[cosα1,cosα2,⋅⋅⋅,cosαn],且 ∥ e ∥ = 1 \Vert \pmb{e} \Vert=1 e=1,所以 e \pmb{e} e s \pmb{s} s方向上的单位向量。

x k \pmb{x_k} xk处,由于梯度向量是固定的,而 e \pmb{e} e的模值为1,所以变化率的值仅随梯度向量和 e \pmb{e} e之间的相对空间关系变化。当两者为同一方向时,变化率为最大正值;当两者为相反方向时,变化率为最小负值。

在最速下降法中,就设定
d k = − [ ∇ f ( x k ) ] \pmb{d}_k=-[\nabla f(\pmb{x}_k)] dk=[f(xk)]

牛顿法

看起来,最速下降法已经非常优秀了,毕竟都已经沿着让函数下降最快的方向了,还能更好的设计方案嘛?

答案是有的。单从下一步来看,负梯度方向确实是最好的;但是如果看两步呢?两次负梯度方向的矢量和能否通过一次计算得到?甚至是,出现比两次负梯度方向矢量和更优的方向?

下面看一下牛顿法是如何解决以上问题的。

要看两步,就需要用到 x \pmb{x} x的二次项。针对任意函数 f ( x ) f(\pmb{x}) f(x),使用泰勒公式展开,并保留二次项

f ( x ) = f ( x k ) + [ ∇ f ( x k ) ] T [ x − x k ] + 1 2 [ x − x k ] T H ( x k ) [ x − x k ] f(\pmb{x})=f(\pmb{x_k})+[\nabla f(\pmb{x}_k)]^T[\pmb{x}-\pmb{x_k}]+\frac{1}{2}[\pmb{x}-\pmb{x_k}]^T\pmb{H}(\pmb{x}_k)[\pmb{x}-\pmb{x_k}] f(x)=f(xk)+[f(xk)]T[xxk]+21[xxk]TH(xk)[xxk]

其中, H ( x k ) \pmb{H}(\pmb{x}_k) H(xk)为海森矩阵。

上式的一阶导数为
∇ f ( x ) = [ ∇ f ( x k ) ] + H ( x k ) [ x − x k ] \nabla f(\pmb{x})=[\nabla f(\pmb{x}_k)]+\pmb{H}(\pmb{x}_k)[\pmb{x}-\pmb{x_k}] f(x)=[f(xk)]+H(xk)[xxk]
令导数值为0,并写成迭代形式,得到
x k + 1 = x k − [ H ( x k ) ] − 1 [ ∇ f ( x k ) ] \pmb{x}_{k+1}=\pmb{x}_k-[\pmb{H}(\pmb{x}_k)]^{-1}[\nabla f(\pmb{x}_k)] xk+1=xk[H(xk)]1[f(xk)]
以上即为牛顿法。相比最速下降法,牛顿法在 [ ∇ f ( x k ) ] [\nabla f(\pmb{x}_k)] [f(xk)]的前面,多了一项 [ H ( x k ) ] − 1 [\pmb{H}(\pmb{x}_k)]^{-1} [H(xk)]1

牛顿法因为利用了泰勒展开式,所以当 x k \pmb{x}_k xk接近(局部)最优解时,收敛速度非常快。

拟牛顿法

既然牛顿法相比最速下降法,可以理解为多看了一步,那是不是照葫芦画瓢,再多看几步,然后不断更新迭代方向呢?原则上是可以的,但是牛顿法已经有自己的问题了:(1)函数 f ( x ) f(\pmb x) f(x)必须二阶可导;(2) H \pmb{H} H H − 1 \pmb{H}^{-1} H1的计算过程较为复杂。再多看几步,对函数 f ( x ) f(\pmb x) f(x)的要求只会更高,所以更靠谱的优化方案是去降低 H − 1 \pmb{H}^{-1} H1的计算复杂度。

接下来要介绍的拟牛顿法,其主要思路是通过构造复杂度低的函数来替代 H − 1 \pmb{H}^{-1} H1,从而降低复杂度。

把牛顿法推导过程中用到的一阶导数公式再抄一遍,并写成迭代形式

∇ f ( x k + 1 ) = [ ∇ f ( x k ) ] + H ( x k ) [ x k + 1 − x k ] \nabla f(\pmb{x}_{k+1})=[\nabla f(\pmb{x}_k)]+\pmb{H}(\pmb{x}_k)[\pmb{x}_{k+1}-\pmb{x_k}] f(xk+1)=[f(xk)]+H(xk)[xk+1xk]
y k = [ ∇ f ( x k + 1 ) ] − [ ∇ f ( x k ) ] \pmb{y}_k=[\nabla f(\pmb{x}_{k+1})]-[\nabla f(\pmb{x}_k)] yk=[f(xk+1)][f(xk)] s k = x k + 1 − x k \pmb{s}_k=\pmb{x}_{k+1}-\pmb{x_k} sk=xk+1xk,上式可以化简为
s k = [ H ( x k ) ] − 1 y k \pmb{s}_k=[\pmb{H}(\pmb{x}_k)]^{-1}\pmb{y}_k sk=[H(xk)]1yk

[ H ( x k ) ] − 1 = G ( x k ) [\pmb{H}(\pmb{x}_k)]^{-1}=\pmb{G}(\pmb{x}_k) [H(xk)]1=G(xk),并构造迭代公式
G k + 1 = G k + E k \pmb{G}_{k+1}=\pmb{G}_{k}+\pmb{E}_{k} Gk+1=Gk+Ek
如果设定 G 0 \pmb{G}_0 G0为单位阵,只需要确定 E k \pmb{E}_{k} Ek,便可以替代海森矩阵了。

E k = α μ k μ k T + β ν k ν k T \pmb{E}_{k}=\alpha \pmb{\mu}_k \pmb{\mu}_k^T+\beta \pmb{\nu}_k \pmb{\nu}_k^T Ek=αμkμkT+βνkνkT,其中 μ k \pmb{\mu}_k μk ν k \pmb{\nu}_k νk均为 n × 1 n\times1 n×1向量(构造成两项的原因会在后面描述)。
s k = ( G k + α μ k μ k T + β ν k ν k T ) y k \pmb{s}_k=(\pmb{G}_{k}+\alpha \pmb{\mu}_k \pmb{\mu}_k^T+\beta \pmb{\nu}_k \pmb{\nu}_k^T)\pmb{y}_k sk=(Gk+αμkμkT+βνkνkT)yk
上式做一下变换
α ( μ k T y k ) μ k + β ( ν k T y k ) ν k = s k − G k y k \alpha (\pmb{\mu}_k^T \pmb{y}_k)\pmb{\mu}_k+\beta (\pmb{\nu}_k^T \pmb{y}_k)\pmb{\nu}_k = \pmb{s}_k-\pmb{G}_{k}\pmb{y}_k α(μkTyk)μk+β(νkTyk)νk=skGkyk
其中, μ k T y k \pmb{\mu}_k^T \pmb{y}_k μkTyk ν k T y k \pmb{\nu}_k^T \pmb{y}_k νkTyk为实数, s k − G k \pmb{s}_k-\pmb{G}_{k} skGk n × 1 n\times1 n×1向量, α \alpha α β \beta β可以任意选取,我们取特殊的一组: μ k = r G k y k \pmb{\mu}_k=r\pmb{G}_{k}\pmb{y}_k μk=rGkyk ν k = θ s k \pmb{\nu}_k=\theta\pmb{s}_k νk=θsk,此时 E k \pmb{E}_k Ek变为
E k = α r 2 G k y k y k T G k T + β θ 2 s k s k T \pmb{E}_{k}=\alpha r^2\pmb{G}_{k}\pmb{y}_k\pmb{y}_k^T\pmb{G}_{k}^T+\beta \theta^2\pmb{s}_k\pmb{s}_k^T Ek=αr2GkykykTGkT+βθ2skskT

μ k \pmb{\mu}_k μk ν k \pmb{\nu}_k νk带入上上式
α r 2 ( y k T G k T y k ) G k y k + β θ 2 ( s k T y k ) s k = s k − G k y k \alpha r^2(\pmb{y}_k^T\pmb{G}_{k}^T \pmb{y}_k)\pmb{G}_{k}\pmb{y}_k+\beta \theta^2(\pmb{s}_k^T \pmb{y}_k)\pmb{s}_k = \pmb{s}_k-\pmb{G}_{k}\pmb{y}_k αr2(ykTGkTyk)Gkyk+βθ2(skTyk)sk=skGkyk
化简一下
[ α r 2 ( y k T G k T y k ) G k + 1 ] G k y k + [ β θ 2 s k T y k − 1 ] s k = 0 [\alpha r^2(\pmb{y}_k^T\pmb{G}_{k}^T \pmb{y}_k)\pmb{G}_{k}+1]\pmb{G}_{k}\pmb{y}_k+[\beta \theta^2\pmb{s}_k^T \pmb{y}_k-1]\pmb{s}_k=0 [αr2(ykTGkTyk)Gk+1]Gkyk+[βθ2skTyk1]sk=0
由于 G k y k \pmb{G}_{k}\pmb{y}_k Gkyk s k \pmb{s}_k sk是任意的,所以需要 α r 2 ( y k T G k T y k ) G k + 1 = 0 \alpha r^2(\pmb{y}_k^T\pmb{G}_{k}^T \pmb{y}_k)\pmb{G}_{k}+1=0 αr2(ykTGkTyk)Gk+1=0 β θ 2 s k T y k − 1 = 0 \beta \theta^2\pmb{s}_k^T \pmb{y}_k-1=0 βθ2skTyk1=0,得到
α r 2 = − 1 y k T G k T y k , β θ 2 = 1 s k T y k \alpha r^2=-\frac{1}{\pmb{y}_k^T\pmb{G}_{k}^T \pmb{y}_k},\beta \theta^2=\frac{1}{\pmb{s}_k^T \pmb{y}_k} αr2=ykTGkTyk1,βθ2=skTyk1
从上上式可以看出,如果 E k \pmb{E}_k Ek在构造时只有一项,是无法保证恒等式的。

所以,最终的拟牛顿法迭代公式为
G k + 1 = G k − G k y k y k T G k T y k T G k T y k + s k s k T s k T y k \pmb{G}_{k+1}=\pmb{G}_{k}-\frac{\pmb{G}_{k}\pmb{y}_k\pmb{y}_k^T\pmb{G}_{k}^T}{\pmb{y}_k^T\pmb{G}_{k}^T \pmb{y}_k}+\frac{\pmb{s}_k\pmb{s}_k^T}{\pmb{s}_k^T \pmb{y}_k} Gk+1=GkykTGkTykGkykykTGkT+skTykskskT
相比 H − 1 \pmb{H}^{-1} H1,上式的计算不仅复杂度低,而且不需要 f ( x ) f(\pmb x) f(x)为二阶可导。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值