算法结构
梯度类算法有很多,本文主要学习最常见的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}
∂s∂f(x)∣xk=Δs→0lim∥Δs∥f(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)=∂xk1∂f∣xkΔx1+∂xk2∂f∣xkΔx2+⋅⋅⋅+∂xkn∂f∣xkΔ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}
∂s∂f(x)∣xk=Δs→0lim(∂xk1∂f∣xkΔsΔx1+∂xk2∂f∣xkΔsΔx2+⋅⋅⋅+∂xkn∂f∣xkΔsΔxn)=∂x1∂f∣xkcosα1+∂x2∂f∣xkcosα2+⋅⋅⋅+∂xn∂f∣xkcosα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=Δs→0limΔ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=[∂xk1∂f∣xk,∂xk2∂f∣xk,⋅⋅⋅,∂xkn∂f∣xk]
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[x−xk]+21[x−xk]TH(xk)[x−xk]
其中, 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)[x−xk]
令导数值为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} H−1的计算过程较为复杂。再多看几步,对函数 f ( x ) f(\pmb x) f(x)的要求只会更高,所以更靠谱的优化方案是去降低 H − 1 \pmb{H}^{-1} H−1的计算复杂度。
接下来要介绍的拟牛顿法,其主要思路是通过构造复杂度低的函数来替代 H − 1 \pmb{H}^{-1} H−1,从而降低复杂度。
把牛顿法推导过程中用到的一阶导数公式再抄一遍,并写成迭代形式
∇
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+1−xk]
令
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+1−xk,上式可以化简为
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=sk−Gkyk
其中,
μ
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}
sk−Gk为
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=sk−Gkyk
化简一下
[
α
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+[βθ2skTyk−1]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
βθ2skTyk−1=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=Gk−ykTGkTykGkykykTGkT+skTykskskT
相比
H
−
1
\pmb{H}^{-1}
H−1,上式的计算不仅复杂度低,而且不需要
f
(
x
)
f(\pmb x)
f(x)为二阶可导。