机器学习算法中经常碰到非线性优化问题,如 Sparse Filtering 算法,其主要工作在于求解一个非线性极小化问题。在具体实现中,大多调用的是成熟的软件包做支撑,其中最常用的一个算法是 L-BFGS。为了解这个算法的数学机理,这几天做了一些调研,现把学习过程中理解的一些东西整理出来。
拟牛顿法(Quasi-Newton Methods)是求解非线性优化问题最有效的方法之一,在20世纪50年代由美国Argonne国家实验室的物理学家W. C. Davidon提出。Davidon设计的这种算法在当时看来是非线性优化领域最具有创造性的发明之一。不就R. Fletcher和M. J. D. Powell证实了这种新的算法远比其他方法快速和可靠,使得非线性优化这门学科在一夜之间突飞猛进。在之后的20年里,拟牛顿方法得到了蓬勃发展,出现了大量的变形公式以及数以百计的相关论文。
DFP方法、BFGS方法以及L-BFGS算法都是重要的拟牛顿法。本文将对这些方法进行简要介绍,当然,在介绍拟牛顿法之前,我们先看看什么是牛顿法,以及拟牛顿法和牛顿法之间有什么关系,为此,考虑如下无约束的极小化问题:
m
i
n
x
f
(
x
)
(0.1)
min_x f(x) \tag{0.1}
minxf(x)(0.1)
其中
x
=
(
x
1
,
x
2
,
.
.
.
,
x
N
)
T
∈
R
N
\mathbf{x}=(x_1,x_2,...,x_N)^T\in\mathbb{R}^N
x=(x1,x2,...,xN)T∈RN.由于本文不准备对收敛性进行讨论,因此不妨对目标函数
f
:
R
N
→
R
\mathcal{f}:\mathbb{R}^N\rightarrow\mathbb{R}
f:RN→R作一个比较苛刻的假设,这里我们假定
f
\mathcal{f}
f是凸函数,且两阶连续可微。此外,记绩效问题(0.1)的解为
x
∗
x^*
x∗
牛顿法
原始牛顿法
为简单起见,先考虑
N
=
1
N=1
N=1的简单情形,此时目标函数
f
(
x
)
变
为
f(\mathbf{x})变为
f(x)变为
f
(
x
)
f(x)
f(x)。牛顿法的基本思想是:在现有极小点估计值的附近对
f
(
x
)
f(x)
f(x)做二阶泰勒展开,进而找到极小点的下一个估计值。设
x
k
x_k
xk为当前的极小点估计值,则
φ
(
x
)
≈
f
(
x
k
)
+
f
′
(
x
k
)
(
x
−
x
k
)
+
1
2
f
′
′
(
x
k
)
(
x
−
x
k
)
2
(1.2)
\varphi(x)\approx f(x_k)+f'(x_k)(x-x_k)+\frac{1}{2}f''(x_k)(x-x_k)^2\tag{1.2}
φ(x)≈f(xk)+f′(xk)(x−xk)+21f′′(xk)(x−xk)2(1.2)
表示
f
(
x
)
f(x)
f(x)在
x
k
x_k
xk附近的二阶泰勒展开式(略去了关于
x
−
x
k
x-x_k
x−xk的高阶项). 由于求得是最值,由极值必要条件可知,
φ
(
x
)
\varphi(x)
φ(x)应该满足:
φ
′
(
x
)
=
0
(1.3)
\varphi'(x)=0\tag{1.3}
φ′(x)=0(1.3)
即
f
′
(
x
k
)
+
f
′
′
(
x
k
)
(
x
−
x
k
)
=
0
(1.4)
f'(x_k)+f''(x_k)(x-x_k)=0\tag{1.4}
f′(xk)+f′′(xk)(x−xk)=0(1.4)
从而求得
x
=
x
k
−
f
′
(
x
k
)
f
′
′
(
x
k
)
(1.5)
x=x_k-\frac{f'(x_k)}{f''(x_k)}\tag{1.5}
x=xk−f′′(xk)f′(xk)(1.5)
于是,若给定初始值
x
0
x_0
x0,则可以构造如下的迭代格式:
x
k
+
1
=
x
k
−
f
′
(
x
k
)
f
′
′
(
x
k
)
,
k
=
0
,
1
,
.
.
.
(1.6)
x_{k+1}=x_k-\frac{f'(x_k)}{f''(x_k)}, k=0,1,...\tag{1.6}
xk+1=xk−f′′(xk)f′(xk),k=0,1,...(1.6)
产生序列
x
k
{x_k}
xk来逼近
f
(
x
)
f(x)
f(x)的极小点。在一定条件下,
x
k
{x_k}
xk可以收敛到
f
(
x
)
f(x)
f(x)的极小点。
对于
N
>
1
N>1
N>1的情形,二阶泰勒展开式(1.2)可以做推广,此时
φ
(
x
)
≈
f
(
x
k
)
+
∇
f
(
x
k
)
(
x
−
x
k
)
+
1
2
(
x
−
x
k
)
T
∇
2
f
(
x
k
)
(
x
−
x
k
)
(1.7)
\varphi(\mathbf{x})\approx f(\mathbf{x}_k)+\nabla f(\mathbf{x}_k)(\mathbf{x}-\mathbf{x}_k)+\frac{1}{2}(\mathbf{x}-\mathbf{x}_k)^T\nabla^2f(\mathbf{x}_k)(\mathbf{x}-\mathbf{x}_k)\tag{1.7}
φ(x)≈f(xk)+∇f(xk)(x−xk)+21(x−xk)T∇2f(xk)(x−xk)(1.7)
其中
∇
f
\nabla f
∇f为
f
f
f的梯度向量,
∇
2
f
\nabla^2f
∇2f为
f
f
f的海森矩阵(Hessian Matrix),其定义分别为:
∇
f
=
[
∂
f
∂
x
1
∂
f
∂
x
2
.
.
.
∂
f
∂
x
N
]
,
∇
2
f
=
[
∂
2
f
∂
x
1
2
∂
2
f
∂
x
1
x
2
.
.
.
∂
2
f
∂
x
1
x
N
∂
2
f
∂
x
2
x
1
∂
2
f
∂
x
2
2
.
.
.
∂
2
f
∂
x
2
x
N
.
.
.
.
.
.
.
.
.
.
.
.
∂
2
f
∂
x
N
x
1
∂
2
f
∂
x
N
x
2
.
.
.
∂
2
f
∂
x
N
2
]
N
×
N
(1.8)
\nabla f=\begin{bmatrix} \frac{\partial f}{\partial x_1} \\ \frac{\partial f}{\partial x_2} \\ ...\\ \frac{\partial f}{\partial x_N} \end{bmatrix},\nabla^2 f=\begin{bmatrix} \frac{\partial^2 f}{\partial x_1^2} & \frac{\partial^2 f}{\partial x_1x_2} & ... & \frac{\partial^2 f}{\partial x_1x_N}\\ \frac{\partial^2 f}{\partial x_2x_1} & \frac{\partial^2 f}{\partial x_2^2} & ... & \frac{\partial^2 f}{\partial x_2x_N}\\ ...&...&...&...\\ \frac{\partial^2 f}{\partial x_Nx_1} & \frac{\partial^2 f}{\partial x_Nx_2} & ... & \frac{\partial^2 f}{\partial x_N^2}\\ \end{bmatrix}_{N\times N}\tag{1.8}
∇f=⎣⎢⎢⎢⎡∂x1∂f∂x2∂f...∂xN∂f⎦⎥⎥⎥⎤,∇2f=⎣⎢⎢⎢⎢⎡∂x12∂2f∂x2x1∂2f...∂xNx1∂2f∂x1x2∂2f∂x22∂2f...∂xNx2∂2f............∂x1xN∂2f∂x2xN∂2f...∂xN2∂2f⎦⎥⎥⎥⎥⎤N×N(1.8)
注意,
∇
f
\nabla f
∇f和
∇
2
f
\nabla^2f
∇2f中的元素均为关于
x
\mathbf{x}
x的函数,以下分别将其记为
g
\mathbf{g}
g和
H
H
H。特别的,若
f
f
f的混合偏导数可以交换次序(即对任意
i
,
j
i,j
i,j,成立
∂
2
f
∂
x
i
∂
x
j
=
∂
2
f
∂
x
j
∂
x
i
\frac{\partial^2f}{\partial x_i\partial x_j}=\frac{\partial^2f}{\partial x_j\partial x_i}
∂xi∂xj∂2f=∂xj∂xi∂2f),则海森矩阵
H
H
H为对称矩阵,而
∇
f
(
x
k
)
\nabla f(\mathbf{x}_k)
∇f(xk)和
∇
2
f
(
x
k
)
\nabla^2f(\mathbf{x}_k)
∇2f(xk)则表示将
x
\mathbf{x}
x取为
x
k
\mathbf{x}_k
xk后得到的实值向量和矩阵,以下分别将其记为
g
k
\mathbf{g}_k
gk和
H
k
H_k
Hk(这里字母
g
\mathbf{g}
g表示gradient,
H
H
H表示Hessian)
同样的,由于是求极小点,极值必要条件要求它为
φ
(
x
)
\varphi(x)
φ(x)的驻点,即
∇
φ
(
x
)
=
0
(1.9)
\nabla \varphi(x)=0\tag{1.9}
∇φ(x)=0(1.9)
亦即(通过在(1.7)两边作用一个梯度算子)
g
k
+
H
k
⋅
(
x
−
x
k
)
=
0
(1.10)
\mathbf{g}_k+H_k \cdot (\mathbf{x}-\mathbf{x}_k)=0\tag{1.10}
gk+Hk⋅(x−xk)=0(1.10)
进一步,若矩阵
H
k
H_k
Hk非奇异,则可解得
x
=
x
k
−
H
k
−
1
⋅
g
k
(1.11)
\mathbf{x} =\mathbf{x}_k-H_k^{-1}\cdot \mathbf{g}_k\tag{1.11}
x=xk−Hk−1⋅gk(1.11)
于是,若给定初始值
x
0
\mathbf{x}_0
x0,则同样可以构造出迭代格式
x
k
+
1
=
x
k
−
H
k
−
1
⋅
g
k
,
k
=
0
,
1
,
.
.
.
(1.12)
\mathbf{x}_{k+1} =\mathbf{x}_k-H_k^{-1}\cdot \mathbf{g}_k,k=0,1,...\tag{1.12}
xk+1=xk−Hk−1⋅gk,k=0,1,...(1.12)
这就是原始的牛顿迭代法,其迭代格式中的搜索方向
d
k
=
H
k
−
1
⋅
g
k
\mathbf{d}_k=H_k^{-1}\cdot \mathbf{g}_k
dk=Hk−1⋅gk称为牛顿方向。下面给出一个牛顿法的完整算法描述:
算法 1.1 (牛顿法)
1、给定初始值 x 0 \mathbf{x}_0 x0和精度阈值 ϵ \epsilon ϵ,并令 k : = 0 k:=0 k:=0
2、计算 g k \mathbf{g}_k gk和 H k H_k Hk
3、若 ∣ ∣ g k ∣ ∣ < ϵ ||\mathbf{g}_k||<\epsilon ∣∣gk∣∣<ϵ,则停止迭代;否则确定搜索方向 d k = − H k − 1 ⋅ g k \mathbf{d}_k=-H_k^{-1}\cdot \mathbf{g}_k dk=−Hk−1⋅gk
4、计算新的迭代点 x k + 1 : = x k + d k \mathbf{x}_{k+1}:=\mathbf{x}_k+\mathbf{d}_k xk+1:=xk+dk
5、令 k : = k + 1 k:=k+1 k:=k+1,转至第2步
当目标函数是二次函数时,由于二次泰勒展开函数与原目标函数不是近似而是完全相同的二次式,海森矩阵退化成一个常数矩阵,从任一初始点出发,利用(1.12)只需要一步迭代即可到达 f ( x ) f(\mathbf{x}) f(x)的极小点 x ∗ x^* x∗,因此牛顿法是一种具有二次收敛性的算法,对于非二次函数,若函数的二次性态较强,或迭代点已进入极小点的领域,其收敛速度也是很快的,这是牛顿法的主要优点。
但是牛顿法由于迭代公式中没有步长因子,而是定步长迭代,对于非二次性目标函数有时会使得函数值上升,即出现 f ( x k + 1 ) > f ( x k ) f(\mathbf{x}_{k+1})>f(\mathbf{x}_{k}) f(xk+1)>f(xk)的情况,这表明原始牛顿法不能保证函数值稳定的下降,在严重的情况下甚至可能造成迭代点列 { x k } \{\mathbf{x}_k\} {xk}的发散而导致计算失败。
阻尼牛顿法
为了消除牛顿法中的弊病,人们提出了“阻尼牛顿法”。阻尼牛顿法每次迭代的方向任然是
d
k
\mathbf{d}_k
dk,但每次迭代需沿着此方向作一维搜索(line search),寻求最优的步长因子
λ
k
\lambda_k
λk,即
λ
k
=
a
r
g
m
i
n
λ
∈
R
f
(
x
k
+
λ
d
k
)
(1.13)
\lambda_k=arg min_{\lambda\in\mathbb{R}}f(\mathbf{x}_k+\lambda\mathbf{d}_k)\tag{1.13}
λk=argminλ∈Rf(xk+λdk)(1.13)
下面给出一个阻尼牛顿法的完整算法描述。
算法 1.2 (阻尼牛顿法)
1、给定初始值 x 0 \mathbf{x}_0 x0和精度阈值 ϵ \epsilon ϵ,并令 k : = 0 k:=0 k:=0
2、计算 g k \mathbf{g}_k gk和 H k H_k Hk
3、若 ∣ ∣ g k ∣ ∣ < ϵ ||\mathbf{g}_k||<\epsilon ∣∣gk∣∣<ϵ,则停止迭代;否则确定搜索方向 d k = − H k − 1 ⋅ g k \mathbf{d}_k=-H_k^{-1}\cdot \mathbf{g}_k dk=−Hk−1⋅gk
4、利用(1.13)得到步长 λ k \lambda_k λk,计算新的迭代点 x k + 1 : = x k + λ k d k \mathbf{x}_{k+1}:=\mathbf{x}_k+\lambda_k\mathbf{d}_k xk+1:=xk+λkdk
5、令 k : = k + 1 k:=k+1 k:=k+1,转至第2步
注1.1 算法1.3的步3中设计到 H k − 1 H_k^{-1} Hk−1的计算,实际应用中,通常并不直接对 H k H_k Hk进行求逆,而是将其转化为求解线性代数方程组 H k d k = − g k H_k\mathbf{d}_k=- \mathbf{g}_k Hkdk=−gk,此时可根据系数矩阵 H k − 1 H_k^{-1} Hk−1的性态来选择适合的迭代法,如预条件共轭梯度法(PCG)、代数多重网格法(AMG)等。
注1.2 有些文献资料里将算法1.2步3中的搜索方向写成 d k = H k − 1 ⋅ g k \mathbf{d}_k=H_k^{-1}\cdot \mathbf{g}_k dk=Hk−1⋅gk,这里是没问题的,原因是在4中有一个求步长的过程,将搜索方向写成了 d k = H k − 1 ⋅ g k \mathbf{d}_k=H_k^{-1}\cdot \mathbf{g}_k dk=Hk−1⋅gk,无非是求得的最佳步长和原来求得的最佳步长相差一个符号罢了。
至此已完成了牛顿法的算法介绍,接下来对其做个小结:
牛顿法是梯度(下降)法的进一步发展,梯度法利用目标函数的一阶偏导数信息,以负梯度方向作为搜索方向,只考虑目标函数在迭代点的局部性质;而牛顿法不仅使用目标函数的一阶偏导数,还进一步利用目标函数的二阶偏导数,这样就考虑了梯度变化的趋势,因而能更全面的确定合适的搜索方向以加快收敛,它具有二阶收敛性。但牛顿法主要存在以下两个缺点:
- 对目标函数有严格的要求。函数必须具有连续的一、二阶偏导数,海森矩阵必须正定。
- 计算相当复杂,除需计算梯度而外,还需计算二阶偏导矩阵和它的逆矩阵。计算量、存储量均很大,且均已维数 N N N的平方比增加,当N很大时这个问题更加突出。
拟牛顿法
如上节所说,牛顿法虽然收敛速度很快,但是计算过程中需要计算目标函数的二阶偏导数,计算复杂度较大。而且有时目标函数的海森矩阵无法保持正定,从而使得牛顿法失效。为了克服这两个问题,人们提出了拟牛顿法。这个方法的基本思想是:不用二阶偏导数而构造出可以近似还森矩阵(或海森矩阵的逆)的正定对称阵,在“拟牛顿”的条件下优化目标函数。不同的构造方法就产生了不同的拟牛顿法。
也有人把“拟牛顿法”翻译成“准牛顿法”。
在介绍具体的拟牛顿法之前,我们先推导一个拟牛顿条件,或者叫做拟牛顿方程,还有的叫做割线条件,因为对海森矩阵(或海森矩阵的逆)做近似总不能随便近似吧,我们也需要理论指导,而拟牛顿条件则是用来提供理论指导的,它指出了用来近似的矩阵应该满足的条件。
为明确起见,下文中用 B B B表示对海森矩阵 H H H本身的近似,而用 D D D表示对还森矩阵的逆 H − 1 H^{-1} H−1的近似,即 B ≈ H , D ≈ H − 1 B\approx H,D\approx H^{-1} B≈H,D≈H−1
拟牛顿条件
设经过
k
+
1
k+1
k+1次迭代后得到
x
k
+
1
\mathbf{x}_{k+1}
xk+1,此时将目标函数
f
(
x
)
f(\mathbf{x})
f(x)在
x
k
+
1
\mathbf{x}_{k+1}
xk+1附近作泰勒展开,取二阶近似,得到
f
(
x
)
≈
f
(
x
k
+
1
)
+
∇
f
(
x
k
+
1
)
(
x
−
x
k
+
1
)
f(\mathbf{x})\approx f(\mathbf{x}_{k+1}) +\nabla f(\mathbf{x}_{k+1})(\mathbf{x}-\mathbf{x}_{k+1})
f(x)≈f(xk+1)+∇f(xk+1)(x−xk+1)
+ 1 2 ( x − x k + 1 ) T ∇ 2 f ( x k + 1 ) ( x − x k + 1 ) (2.14) +\frac{1}{2}(\mathbf{x}-\mathbf{x}_{k+1})^T\nabla^2f(\mathbf{x}_{k+1})(\mathbf{x}-\mathbf{x}_{k+1})\tag{2.14} +21(x−xk+1)T∇2f(xk+1)(x−xk+1)(2.14)
在(2.14)两边同时作用一个梯度算子
∇
\nabla
∇,可得
∇
f
(
x
)
≈
∇
f
(
x
k
+
1
)
+
H
k
+
1
⋅
(
x
−
x
k
+
1
)
(2.15)
\nabla f(\mathbf{x})\approx \nabla f(\mathbf{x}_{k+1})+H_{k+1}\cdot(\mathbf{x}-\mathbf{x}_{k+1})\tag{2.15}
∇f(x)≈∇f(xk+1)+Hk+1⋅(x−xk+1)(2.15)
在(2.15)中取
x
=
x
k
\mathbf{x}=\mathbf{x}_k
x=xk,并整理,可得
g
k
+
1
−
g
k
≈
H
k
+
1
⋅
(
x
k
+
1
−
x
k
)
(2.16)
\mathbf{g}_{k+1}-\mathbf{g}_k\approx H_{k+1}\cdot(\mathbf{x}_{k+1}-\mathbf{x}_k)\tag{2.16}
gk+1−gk≈Hk+1⋅(xk+1−xk)(2.16)
若引入记号
s
k
=
x
k
+
1
−
x
k
,
y
k
=
g
k
+
1
−
g
k
(2.17)
\mathbf{s}_k=\mathbf{x}_{k+1}-\mathbf{x}_k,\mathbf{y}_k=\mathbf{g}_{k+1}-\mathbf{g}_k\tag{2.17}
sk=xk+1−xk,yk=gk+1−gk(2.17)
则(2.16)可紧凑地写成
y
k
≈
H
k
+
1
⋅
s
k
(2.18)
\mathbf{y}_k \approx H_{k+1}\cdot\mathbf{s}_k\tag{2.18}
yk≈Hk+1⋅sk(2.18)
或者
s
k
≈
H
k
+
1
−
1
⋅
y
k
(2.19)
\mathbf{s}_k \approx H_{k+1}^{-1}\cdot\mathbf{y}_k\tag{2.19}
sk≈Hk+1−1⋅yk(2.19)
这就是所谓的拟牛顿条件,它对迭代过程中的海森矩阵
H
k
+
1
H_{k+1}
Hk+1作约束,因此。对
H
k
+
1
H_{k+1}
Hk+1做近似的
B
k
+
1
B_{k+1}
Bk+1,以及对
H
k
+
1
−
1
H_{k+1}^{-1}
Hk+1−1做近似的
D
k
+
1
D_{k+1}
Dk+1可将
y
k
≈
B
k
+
1
⋅
s
k
(2.20)
\mathbf{y}_k \approx B_{k+1}\cdot\mathbf{s}_k\tag{2.20}
yk≈Bk+1⋅sk(2.20)
或者
s
k
≈
D
k
+
1
⋅
y
k
(2.21)
\mathbf{s}_k \approx D_{k+1}\cdot\mathbf{y}_k\tag{2.21}
sk≈Dk+1⋅yk(2.21)
作为指导。
接下来,我们依次介绍几种常见的拟牛顿法。
DFP算法
DFP算法是以William C. Davidon、Roger Fletcher、Micha J. D. Powell三个人的名字的首字母命名的,它由Davidon于1959年首先提出,后经Fletcher和Powell加以发展和完善,是最早的拟牛顿法。该算法的核心是:通过迭代的方法,对
H
k
+
1
−
1
H_{k+1}^{-1}
Hk+1−1做近似,迭代格式为
D
k
+
1
=
D
k
+
Δ
D
k
,
k
=
0
,
1
,
2
,
.
.
.
(2.22)
D_{k+1}=D_k+\Delta D_k,k=0,1,2,...\tag{2.22}
Dk+1=Dk+ΔDk,k=0,1,2,...(2.22)
其中的
D
0
D_0
D0通常取单位矩阵
I
I
I,因此,关键是每一步的校正矩阵
Δ
D
k
\Delta D_k
ΔDk如何构造。
注意,迭代格式(2.22)将嵌套在算法1.2中,因此,我们猜想 Δ D k \Delta D_k ΔDk可能与 s k , y k \mathbf{s}_k,\mathbf{y}_k sk,yk和 D k D_k Dk发生关联。这里,我们采用“待定法”,即首先将 Δ D k \Delta D_k ΔDk待定成某种形式,然后结合拟牛顿条件(2.21)来进行推导。
那将
Δ
D
k
\Delta D_k
ΔDk待定成什么形式呢?这个说起来比较tricky,我们将其待定为
Δ
D
k
=
α
u
u
T
+
β
v
v
T
(2.23)
\Delta D_k=\alpha \mathbf{u}\mathbf{u}^T+\beta \mathbf{v}\mathbf{v}^T\tag{2.23}
ΔDk=αuuT+βvvT(2.23)
其中
α
\alpha
α和
β
\beta
β为待定系数,
u
,
v
∈
R
N
\mathbf{u},\mathbf{v}\in\mathbb{R}^N
u,v∈RN为待定向量。从形式上看,这种待定公式至少保证了矩阵
Δ
D
k
\Delta D_k
ΔDk的对称性(因为
u
u
T
\mathbf{u}\mathbf{u}^T
uuT和
v
v
T
\mathbf{v}\mathbf{v}^T
vvT均为对称矩阵)
将(2.23)带入(2.22),并结合指导条件(2.21),可得
s
k
=
D
k
y
k
+
α
u
u
T
y
k
+
β
v
v
T
y
k
(2.24)
\mathbf{s}_k=D_k\mathbf{y}_k+\alpha \mathbf{u}\mathbf{u}^T\mathbf{y}_k+\beta \mathbf{v}\mathbf{v}^T\mathbf{y}_k\tag{2.24}
sk=Dkyk+αuuTyk+βvvTyk(2.24)
从(2.24)似乎也看不出什么啊!别急,我们将其改写一下:
s
k
=
D
k
y
k
+
u
(
α
u
T
y
k
)
+
v
(
β
v
T
y
k
)
\mathbf{s}_k=D_k\mathbf{y}_k+\mathbf{u}(\alpha \mathbf{u}^T\mathbf{y}_k)+\mathbf{v}(\beta \mathbf{v}^T\mathbf{y}_k)
sk=Dkyk+u(αuTyk)+v(βvTyk)
= D k y k + ( α u T y k ) u + ( β v T y k ) v (2.25) =D_k\mathbf{y}_k+(\alpha \mathbf{u}^T\mathbf{y}_k)\mathbf{u}+(\beta \mathbf{v}^T\mathbf{y}_k)\mathbf{v}\tag{2.25} =Dkyk+(αuTyk)u+(βvTyk)v(2.25)
看到了吧?括号中的
α
u
T
y
k
\alpha \mathbf{u}^T\mathbf{y}_k
αuTyk和
β
v
T
y
k
\beta \mathbf{v}^T\mathbf{y}_k
βvTyk是两个数,既然是数,我们不妨做如下简单赋值
α
u
T
y
k
=
1
,
β
v
T
y
k
=
−
1
(2.26)
\alpha \mathbf{u}^T\mathbf{y}_k=1,\beta \mathbf{v}^T\mathbf{y}_k=-1\tag{2.26}
αuTyk=1,βvTyk=−1(2.26)
即
α
=
1
u
T
y
k
,
β
=
−
1
v
T
y
k
(2.27)
\alpha =\frac{1}{\mathbf{u}^T\mathbf{y}_k},\beta= -\frac{1}{\mathbf{v}^T\mathbf{y}_k}\tag{2.27}
α=uTyk1,β=−vTyk1(2.27)
其中向量 u , v \mathbf{u},\mathbf{v} u,v仍有待确定。
那么
u
,
v
\mathbf{u},\mathbf{v}
u,v如何确定呢?将(2.26)带入(2.25),得到
u
−
v
=
s
k
−
D
k
y
k
(2.28)
\mathbf{u}-\mathbf{v}=\mathbf{s}_k-D_k\mathbf{y}_k\tag{2.28}
u−v=sk−Dkyk(2.28)
要上式成立,不放直接取
u
=
s
k
,
v
=
D
k
y
k
(2.29)
\mathbf{u}=\mathbf{s}_k,\mathbf{v}=D_k\mathbf{y}_k\tag{2.29}
u=sk,v=Dkyk(2.29)
再将(2.29)带入(2.27),便得到
α
=
1
s
k
T
y
k
,
β
=
−
1
(
D
k
y
k
)
T
y
k
=
−
1
y
k
T
D
k
y
k
(2.30)
\alpha =\frac{1}{\mathbf{s}_k^T\mathbf{y}_k},\beta= -\frac{1}{(D_k\mathbf{y}_k)^T\mathbf{y}_k}=-\frac{1}{\mathbf{y}_k^TD_k\mathbf{y}_k}\tag{2.30}
α=skTyk1,β=−(Dkyk)Tyk1=−ykTDkyk1(2.30)
其中第二个等式用到了
D
k
D_k
Dk的对称性。
至此,我们已经将校正矩阵
Δ
D
k
\Delta D_k
ΔDk构造出来了,将(2.29)和(2.30)带入(2.23),便得
Δ
D
k
=
s
k
s
k
T
s
k
T
y
k
−
D
k
y
k
y
k
T
D
k
y
k
T
D
k
y
k
(2.31)
\Delta D_k=\frac{\mathbf{s}_k\mathbf{s}_k^T}{\mathbf{s}_k^T\mathbf{y}_k}-\frac{D_k\mathbf{y}_k\mathbf{y}_k^TD_k}{\mathbf{y}_k^TD_k\mathbf{y}_k}\tag{2.31}
ΔDk=skTykskskT−ykTDkykDkykykTDk(2.31)
综上,我们给出了DFP算法的一个完整算法描述。
算法 2.1 (DFP算法)
1、给定初始值 x 0 \mathbf{x}_0 x0和精度阈值 ϵ \epsilon ϵ,并令 D 0 = I , k : = 0 D_0=I,k:=0 D0=I,k:=0
2、确定搜索方向 d k = − D k ⋅ g k \mathbf{d}_k=-D_k\cdot\mathbf{g}_k dk=−Dk⋅gk
3、利用(1.13)得到步长 λ k \lambda_k λk,令 s k = λ k d k , x k + 1 : = x k + s k \mathbf{s}_k= \lambda_k\mathbf{d}_k,\mathbf{x}_{k+1}:=\mathbf{x}_k+\mathbf{s}_k sk=λkdk,xk+1:=xk+sk
4、若 ∣ ∣ g k + 1 ∣ ∣ < ϵ ||\mathbf{g}_{k+1}||<\epsilon ∣∣gk+1∣∣<ϵ,则算法结束;
5、计算 y k = g k + 1 − g k \mathbf{y}_k=\mathbf{g}_{k+1}-\mathbf{g}_k yk=gk+1−gk
6、计算 D k + 1 = D k + s k s k T s k T y k − D k y k y k T D k y k T D k y k D_{k+1}=D_k+\frac{\mathbf{s}_k\mathbf{s}_k^T}{\mathbf{s}_k^T\mathbf{y}_k}-\frac{D_k\mathbf{y}_k\mathbf{y}_k^TD_k}{\mathbf{y}_k^TD_k\mathbf{y}_k} Dk+1=Dk+skTykskskT−ykTDkykDkykykTDk
7、令 k : = k + 1 k:=k+1 k:=k+1,转至第2步
BFGS算法
BFGS算法是以其发明者Broyden, Fletcher, Goldfarb和Shanno四个人的名字的首字母命名的。与DFP算法相比,BFGS算法性能更加。目前它已成为求解无约束非线性优化问题最常用的方法之一。BFGS算法已有较晚上的局部收敛理论,对其全局收敛性的研究也取得了重要的成果。
BFGS算法中核心公式的推导过程和DFP完全类似,只是互换了其中 s k \mathbf{s}_k sk和 y k \mathbf{y}_k yk的位置。为了方便自己以后查阅,我打算将上一节的推导过程再重写一遍,已经领会该过程的读者不妨直接跳过以下推导,直接看结论。
需要注意的是,BFGS算法是直接逼近海森矩阵,即
B
k
≈
H
k
B_k\approx H_k
Bk≈Hk.仍采用迭代方法,设迭代格式为
B
k
+
1
=
B
k
+
Δ
B
k
,
k
=
0
,
1
,
2
,
.
.
.
(2.32)
B_{k+1}=B_k+\Delta B_k,k=0,1,2,...\tag{2.32}
Bk+1=Bk+ΔBk,k=0,1,2,...(2.32)
其中的 B 0 B_0 B0也取单位矩阵 I I I,因此,关键是每一步的校正矩阵 Δ B k \Delta B_k ΔBk如何构造。同样的,将其待定为:
Δ B k = α u u T + β v v T (2.33) \Delta B_k=\alpha \mathbf{u}\mathbf{u}^T+\beta \mathbf{v}\mathbf{v}^T\tag{2.33} ΔBk=αuuT+βvvT(2.33)
将(2.33)带入(2.32),并结合指导条件(2.20),可得
y
k
=
B
k
s
k
+
(
α
u
T
s
k
)
u
+
(
β
v
T
s
k
)
v
(2.34)
\mathbf{y}_k=B_k\mathbf{s}_k+(\alpha \mathbf{u}^T\mathbf{s}_k)\mathbf{u}+(\beta \mathbf{v}^T\mathbf{s}_k)\mathbf{v}\tag{2.34}
yk=Bksk+(αuTsk)u+(βvTsk)v(2.34)
通过令
α
u
T
s
k
=
1
,
β
v
T
s
k
=
−
1
\alpha \mathbf{u}^T\mathbf{s}_k=1,\beta \mathbf{v}^T\mathbf{s}_k=-1
αuTsk=1,βvTsk=−1,以及
u
=
y
k
,
v
=
B
k
s
k
(2.35)
\mathbf{u}=\mathbf{y}_k,\mathbf{v}=B_k\mathbf{s}_k\tag{2.35}
u=yk,v=Bksk(2.35)
可算得
α
=
1
y
k
T
s
k
,
β
=
−
1
s
k
T
B
k
s
k
(2.36)
\alpha =\frac{1}{\mathbf{y}_k^T\mathbf{s}_k},\beta= -\frac{1}{\mathbf{s}_k^TB_k\mathbf{s}_k}\tag{2.36}
α=ykTsk1,β=−skTBksk1(2.36)
综上,便得到了如下校正矩阵
B
k
≈
H
k
B_k\approx H_k
Bk≈Hk的公式
Δ
B
k
=
y
k
y
k
T
y
k
T
s
k
−
B
k
s
k
s
k
T
B
k
s
k
T
B
k
s
k
(2.31)
\Delta B_k=\frac{\mathbf{y}_k\mathbf{y}_k^T}{\mathbf{y}_k^T\mathbf{s}_k}-\frac{B_k\mathbf{s}_k\mathbf{s}_k^TB_k}{\mathbf{s}_k^TB_k\mathbf{s}_k}\tag{2.31}
ΔBk=ykTskykykT−skTBkskBkskskTBk(2.31)
好了,现在把矩阵 B k ≈ H k B_k\approx H_k Bk≈Hk和 D k ≈ H k D_k\approx H_k Dk≈Hk拿出来对比一下,是不是除了 D D D换成 B B B外,其它只是将 s k \mathbf{s}_k sk和 y k \mathbf{y}_k yk互换了一下位置呢?
最后我们给出BFGS算法的一个完整算法描述
算法 2.2 (BFGS算法(1))
1、给定初始值 x 0 \mathbf{x}_0 x0和精度阈值 ϵ \epsilon ϵ,并令 B 0 = I , k : = 0 B_0=I,k:=0 B0=I,k:=0
2、确定搜索方向 d k = − B k − 1 ⋅ g k \mathbf{d}_k=-B_k^{-1}\cdot\mathbf{g}_k dk=−Bk−1⋅gk
3、利用(1.13)得到步长 λ k \lambda_k λk,令 s k = λ k d k , x k + 1 : = x k + s k \mathbf{s}_k= \lambda_k\mathbf{d}_k,\mathbf{x}_{k+1}:=\mathbf{x}_k+\mathbf{s}_k sk=λkdk,xk+1:=xk+sk
4、若 ∣ ∣ g k + 1 ∣ ∣ < ϵ ||\mathbf{g}_{k+1}||<\epsilon ∣∣gk+1∣∣<ϵ,则算法结束;
5、计算 y k = g k + 1 − g k \mathbf{y}_k=\mathbf{g}_{k+1}-\mathbf{g}_k yk=gk+1−gk
6、计算 B k + 1 = B k + y k y k T y k T s k − B k s k s k T B k s k T B k s k B_{k+1}=B_k+\frac{\mathbf{y}_k\mathbf{y}_k^T}{\mathbf{y}_k^T\mathbf{s}_k}-\frac{B_k\mathbf{s}_k\mathbf{s}_k^TB_k}{\mathbf{s}_k^TB_k\mathbf{s}_k} Bk+1=Bk+ykTskykykT−skTBkskBkskskTBk
7、令 k : = k + 1 k:=k+1 k:=k+1,转至第2步
算法2.2中的步2通常是哦通过求解线性代数方程组
B
k
d
k
=
−
g
k
B_k\mathbf{d}_k=-\mathbf{g}_k
Bkdk=−gk来进行。然而,更一般的做法是,通过对步6中的递推关系应用Sherman-Morrion公式,直接给出
B
k
+
1
−
1
B_{k+1}^{-1}
Bk+1−1与
B
k
−
1
B_{k}^{-1}
Bk−1之间的关系式
B
k
+
1
−
1
=
(
I
−
s
k
y
k
T
y
k
T
s
k
)
B
k
−
1
(
I
−
y
k
s
k
T
y
k
T
s
k
)
+
s
k
s
k
T
y
k
T
s
k
(2.38)
B_{k+1}^{-1}=(I-\frac{\mathbf{s}_k\mathbf{y}_k^T}{\mathbf{y}_k^T\mathbf{s}_k})B_{k}^{-1}(I-\frac{\mathbf{y}_k\mathbf{s}_k^T}{\mathbf{y}_k^T\mathbf{s}_k})+\frac{\mathbf{s}_k\mathbf{s}_k^T}{\mathbf{y}_k^T\mathbf{s}_k}\tag{2.38}
Bk+1−1=(I−ykTskskykT)Bk−1(I−ykTskykskT)+ykTskskskT(2.38)
或者进一步展开写成
B
k
+
1
−
1
=
B
k
−
1
B_{k+1}^{-1}=B_k^{-1}
Bk+1−1=Bk−1
+ ( 1 s k T y k + y k T B k − 1 y k ( s k T y k ) 2 ) s k s k T − 1 s k T y k ( B k − 1 y k s k T + s k y k T B k − 1 ) (2.39) + (\frac{1}{\mathbf{s}_k^T\mathbf{y}_k}+\frac{\mathbf{y}_k^TB_k^{-1}\mathbf{y}_k}{(\mathbf{s}_k^T\mathbf{y}_k)^2})\mathbf{s}_k\mathbf{s}_k^T-\frac{1}{\mathbf{s}_k^T\mathbf{y}_k}(B_k^{-1}\mathbf{y}_k\mathbf{s}_k^T+\mathbf{s}_k\mathbf{y}_k^TB_k^{-1})\tag{2.39} +(skTyk1+(skTyk)2ykTBk−1yk)skskT−skTyk1(Bk−1ykskT+skykTBk−1)(2.39)
其中 ( 1 s k T y k + y k T B k − 1 y k ( s k T y k ) 2 ) (\frac{1}{\mathbf{s}_k^T\mathbf{y}_k}+\frac{\mathbf{y}_k^TB_k^{-1}\mathbf{y}_k}{(\mathbf{s}_k^T\mathbf{y}_k)^2}) (skTyk1+(skTyk)2ykTBk−1yk)和 1 s k T y k \frac{1}{\mathbf{s}_k^T\mathbf{y}_k} skTyk1是实数。
注2.1 关于Sherman-Morrison公式
设
A
∈
R
n
A\in\mathbb{R}^n
A∈Rn为非奇异方阵,
u
,
v
∈
R
n
\mathbf{u},\mathbf{v}\in\mathbb{R}^n
u,v∈Rn,若
1
+
v
T
A
−
1
u
≠
0
1+\mathbf{v}^TA^{-1}\mathbf{u}\neq0
1+vTA−1u=0,则有
(
A
+
u
v
T
)
−
1
=
A
−
1
−
A
−
1
u
v
T
A
−
1
1
+
v
T
A
−
1
u
(2.40)
(A+\mathbf{u}\mathbf{v}^T)^{-1}=A^{-1}-\frac{A^{-1}\mathbf{u}\mathbf{v}^TA^{-1}}{1+\mathbf{v}^TA^{-1}\mathbf{u}}\tag{2.40}
(A+uvT)−1=A−1−1+vTA−1uA−1uvTA−1(2.40)*
利用(2.38),我们很容易将算法2.2改写成2.3. 注意,为了避免出现矩阵求你符号,我们统一将 B i − 1 B_i^{-1} Bi−1换成 D i D_i Di(这样做仅仅只是符号上看起来舒服起见)。这样,整个算法中不再需要求解线性代数方程组,由矩阵-向量运算就可以完成了。
算法 2.3 (BFGS算法(2))
1、给定初始值 x 0 \mathbf{x}_0 x0和精度阈值 ϵ \epsilon ϵ,并令 D 0 = I , k : = 0 D_0=I,k:=0 D0=I,k:=0
2、确定搜索方向 d k = − D k ⋅ g k \mathbf{d}_k=-D_k\cdot\mathbf{g}_k dk=−Dk⋅gk
3、利用(1.13)得到步长 λ k \lambda_k λk,令 s k = λ k d k , x k + 1 : = x k + s k \mathbf{s}_k= \lambda_k\mathbf{d}_k,\mathbf{x}_{k+1}:=\mathbf{x}_k+\mathbf{s}_k sk=λkdk,xk+1:=xk+sk
4、若 ∣ ∣ g k + 1 ∣ ∣ < ϵ ||\mathbf{g}_{k+1}||<\epsilon ∣∣gk+1∣∣<ϵ,则算法结束;
5、计算 y k = g k + 1 − g k \mathbf{y}_k=\mathbf{g}_{k+1}-\mathbf{g}_k yk=gk+1−gk
6、计算 D k + 1 = ( I − s k y k T y k T s k ) D k ( I − y k s k T y k T s k ) + s k s k T y k T s k D_{k+1}=(I-\frac{\mathbf{s}_k\mathbf{y}_k^T}{\mathbf{y}_k^T\mathbf{s}_k})D_{k}(I-\frac{\mathbf{y}_k\mathbf{s}_k^T}{\mathbf{y}_k^T\mathbf{s}_k})+\frac{\mathbf{s}_k\mathbf{s}_k^T}{\mathbf{y}_k^T\mathbf{s}_k} Dk+1=(I−ykTskskykT)Dk(I−ykTskykskT)+ykTskskskT
7、令 k : = k + 1 k:=k+1 k:=k+1,转至第2步
至此,关于DFP算法和BFGS算法的介绍就完成了,回过头来,我们对比一下算法2.1和算法2.3,容易发现,这两个算法的唯一不同仅在于 D k + 1 D_{k+1} Dk+1的迭代公式不同罢了。
最后,再补充谈谈一维搜索(line search)的问题,在之前几个算法描述中,为简单起见,均采用(1.13)来计算步长 λ k \lambda_k λk,其实这是一种精确搜索。实际应用中,还有像Wolfe型搜索,Armijo搜索以及满足Goldstein条件的非精准搜索。这里我们以Wolfe搜索为例,简单做个介绍。
设
β
~
∈
(
0
,
1
2
)
,
β
∈
(
β
~
,
1
)
\tilde{\beta}\in(0,\frac{1}{2}),\beta\in(\tilde{\beta},1)
β~∈(0,21),β∈(β~,1),所谓的Wolfe搜索是指
λ
k
\lambda_k
λk满足如下Wolfe条件
{
f
(
x
k
+
λ
k
d
k
)
≤
f
(
x
k
)
+
β
~
λ
k
d
k
T
g
k
d
k
T
g
(
x
k
+
λ
k
d
k
)
≥
β
d
k
T
g
k
(2.41)
\left\{\begin{aligned} f(\mathbf{x}_k+\lambda_{k}\mathbf{d}_k)&\leq f(\mathbf{x}_k)+\tilde{\beta}\lambda_k\mathbf{d}_k^T\mathbf{g}_k\\ \mathbf{d}_k^T\mathbf{g}(\mathbf{x}_k+\lambda_k\mathbf{d}_k)&\geq\beta\mathbf{d}_k^T\mathbf{g}_k \end{aligned}\right.\tag{2.41}
{f(xk+λkdk)dkTg(xk+λkdk)≤f(xk)+β~λkdkTgk≥βdkTgk(2.41)
带非精确搜索的拟牛顿法的研究是从1976年Powell的工作开始的,他证明了带Wolfe搜索的BFGS算法的全局收敛性和超线性收敛性。
L-BFGS算法
在BFGS算法中,需要用到一个
N
×
N
N\times N
N×N的矩阵
D
k
D_k
Dk,当
N
N
N很大时,存储这个矩阵将变得很耗计算机资源。例如,考虑
N
N
N个10万的情形,且用double型(8字节)在存储
D
k
D_k
Dk,需要多大的内存呢?我们来计算一下
N
阶
矩
阵
的
字
节
数
1
G
B
的
字
节
数
=
1
0
5
×
1
0
5
×
8
2
10
×
2
10
×
2
10
=
74.5
(
G
B
)
(2.42)
\frac{N阶矩阵的字节数}{1GB的字节数}=\frac{10^5\times10^5\times 8}{2^{10}\times2^{10}\times2^{10}}=74.5(GB)\tag{2.42}
1GB的字节数N阶矩阵的字节数=210×210×210105×105×8=74.5(GB)(2.42)
74.5GB,很惊人是吧,这对于一般的服务器是很难承受的。当然,考虑到矩阵 D k D_k Dk的对称性,内存还可以降一半,但是,在机器学习问题中,像10万这样的规模还只能算是中小规模。那么,是否可以通过对BFGS算法进行改造,从而减少其迭代过程中所需的内存开销呢?
答案是肯定的,L-BFGS(Limited-memory BFGS或Limited-storage BFGS)算法就是这样一种算法。它对BFGS算法进行了近似,其基本思想史:不再存储完整的矩阵 D k D_k Dk,而是存储计算过程中的向量序列 { s i } , { y i } \{\mathbf{s}_i\},\{\mathbf{y}_i\} {si},{yi},需要矩阵 D k D_k Dk时,利用向量 { s i } , { y i } \{\mathbf{s}_i\},\{\mathbf{y}_i\} {si},{yi}的计算来代替。而且,向量序列 { s i } , { y i } \{\mathbf{s}_i\},\{\mathbf{y}_i\} {si},{yi}也不是所有的都存,而是固定存最新的 m m m个(参数 m m m可由用户根据自己机器的内存自行制定)。每次计算 D k D_k Dk时,只利用最新的 m m m个 { s i } \{\mathbf{s}_i\} {si}和 m m m个 { y i } \{\mathbf{y}_i\} {yi}。显然,这样一来,我们的存储量将由原来的 O ( N 2 ) O(N^2) O(N2)降到 O m N O{mN} OmN。
接下来,讨论L-BFGS算法的具体实现过程。我们的出发点是算法2.3步6的迭代式
D
k
+
1
=
(
I
−
s
k
y
k
T
y
k
T
s
k
)
D
k
(
I
−
y
k
s
k
T
y
k
T
s
k
)
+
s
k
s
k
T
y
k
T
s
k
D_{k+1}=(I-\frac{\mathbf{s}_k\mathbf{y}_k^T}{\mathbf{y}_k^T\mathbf{s}_k})D_{k}(I-\frac{\mathbf{y}_k\mathbf{s}_k^T}{\mathbf{y}_k^T\mathbf{s}_k})+\frac{\mathbf{s}_k\mathbf{s}_k^T}{\mathbf{y}_k^T\mathbf{s}_k}
Dk+1=(I−ykTskskykT)Dk(I−ykTskykskT)+ykTskskskT
若记
ρ
k
=
1
y
k
T
s
k
,
V
k
=
I
−
ρ
k
s
k
s
k
T
\rho_k=\frac{1}{\mathbf{y}_k^T\mathbf{s}_k},V_k=I-\rho_k\mathbf{s}_k\mathbf{s}_k^T
ρk=ykTsk1,Vk=I−ρkskskT,则上式可写成
D
k
+
1
=
V
k
T
D
k
V
k
+
ρ
k
s
k
s
k
T
(2.43)
D_k+1=V_k^TD_kV_k+\rho_k\mathbf{s}_k\mathbf{s}_k^T\tag{2.43}
Dk+1=VkTDkVk+ρkskskT(2.43)
若给定初始矩阵 D 0 D_0 D0(通常为正定的对角矩阵,如 D 0 = I D_0=I D0=I),则利用(2.43),依次可得
D 1 = V 0 T D 0 V 0 + ρ 0 s 0 s 0 T D 2 = V 1 T D 1 V 1 + ρ 1 s 1 s 1 T = V 1 T ( V 0 T D 0 V 0 + ρ 0 s 0 s 0 T ) V 1 + ρ 1 s 1 s 1 T = V 1 T V 0 T D 0 V 0 V 1 + V 1 T ρ 0 s 0 s 0 T V 1 + ρ 1 s 1 s 1 T D 3 = V 2 T D 2 V 2 + ρ 2 s 2 s 2 T = V 2 T ( V 1 T V 0 T D 0 V 0 V 1 + V 1 T ρ 0 s 0 s 0 T V 1 + ρ 1 s 1 s 1 T ) V 2 + ρ 2 s 2 s 2 T = V 2 T V 1 T V 0 T D 0 V 0 V 1 V 2 + V 2 T V 1 T ρ 0 s 0 s 0 T V 1 V 2 + V 2 T ρ 1 s 1 s 1 T V 2 + ρ 2 s 2 s 2 T \begin{aligned}D_1&=V_0^TD_0V_0+\rho_0\mathbf{s}_0\mathbf{s}_0^T\\ D_2&=V_1^TD_1V_1+\rho_1\mathbf{s}_1\mathbf{s}_1^T\\ &=V_1^T(V_0^TD_0V_0+\rho_0\mathbf{s}_0\mathbf{s}_0^T)V_1+\rho_1\mathbf{s}_1\mathbf{s}_1^T\\ &=V_1^TV_0^TD_0V_0V_1+V_1^T\rho_0\mathbf{s}_0\mathbf{s}_0^TV_1+\rho_1\mathbf{s}_1\mathbf{s}_1^T\\ D_3&=V_2^TD_2V_2+\rho_2\mathbf{s}_2\mathbf{s}_2^T\\ &=V_2^T(V_1^TV_0^TD_0V_0V_1+V_1^T\rho_0\mathbf{s}_0\mathbf{s}_0^TV_1+\rho_1\mathbf{s}_1\mathbf{s}_1^T)V_2+\rho_2\mathbf{s}_2\mathbf{s}_2^T\\ &=V_2^TV_1^TV_0^TD_0V_0V_1V_2+V_2^TV_1^T\rho_0\mathbf{s}_0\mathbf{s}_0^TV_1V_2+V_2^T\rho_1\mathbf{s}_1\mathbf{s}_1^TV_2+\rho_2\mathbf{s}_2\mathbf{s}_2^T \end{aligned} D1D2D3=V0TD0V0+ρ0s0s0T=V1TD1V1+ρ1s1s1T=V1T(V0TD0V0+ρ0s0s0T)V1+ρ1s1s1T=V1TV0TD0V0V1+V1Tρ0s0s0TV1+ρ1s1s1T=V2TD2V2+ρ2s2s2T=V2T(V1TV0TD0V0V1+V1Tρ0s0s0TV1+ρ1s1s1T)V2+ρ2s2s2T=V2TV1TV0TD0V0V1V2+V2TV1Tρ0s0s0TV1V2+V2Tρ1s1s1TV2+ρ2s2s2T
一般的,我们有
D
k
+
1
=
(
V
k
T
V
k
−
1
T
.
.
.
V
1
T
V
0
T
)
D
0
(
V
0
V
1
.
.
.
V
k
−
1
V
k
)
+
(
V
k
T
V
k
−
1
T
.
.
.
V
2
T
V
1
T
)
(
ρ
0
s
0
s
0
T
)
(
V
1
V
2
.
.
.
V
k
−
1
V
k
)
+
(
V
k
T
V
k
−
1
T
.
.
.
V
3
T
V
2
T
)
(
ρ
1
s
1
s
1
T
)
(
V
2
V
3
.
.
.
V
k
−
1
V
k
)
+
.
.
.
+
(
V
k
T
V
k
−
1
T
)
(
ρ
k
−
2
s
k
−
2
s
k
−
2
T
)
(
V
k
−
1
V
k
)
+
(
V
k
T
)
(
ρ
k
−
1
s
k
−
1
s
k
−
1
T
)
(
V
k
)
+
ρ
k
s
k
s
k
T
(2.44)
\begin{aligned}D_{k+1}&=(V_k^TV_{k-1}^T...V_1^TV_0^T)D_0(V_0V_1...V_{k-1}V_k)\\ &+(V_k^TV_{k-1}^T...V_2^TV_1^T)(\rho_0\mathbf{s}_0\mathbf{s}_0^T)(V_1V_2...V_{k-1}V_k)\\ &+(V_k^TV_{k-1}^T...V_3^TV_2^T)(\rho_1\mathbf{s}_1\mathbf{s}_1^T)(V_2V_3...V_{k-1}V_k)\\ &+...\\ &+(V_k^TV_{k-1}^T)(\rho_{k-2}\mathbf{s}_{k-2}\mathbf{s}_{k-2}^T)(V_{k-1}V_k)\\ &+(V_k^T)(\rho_{k-1}\mathbf{s}_{k-1}\mathbf{s}_{k-1}^T)(V_k)\\ &+\rho_{k}\mathbf{s}_{k}\mathbf{s}_{k}^T\\ \end{aligned}\tag{2.44}
Dk+1=(VkTVk−1T...V1TV0T)D0(V0V1...Vk−1Vk)+(VkTVk−1T...V2TV1T)(ρ0s0s0T)(V1V2...Vk−1Vk)+(VkTVk−1T...V3TV2T)(ρ1s1s1T)(V2V3...Vk−1Vk)+...+(VkTVk−1T)(ρk−2sk−2sk−2T)(Vk−1Vk)+(VkT)(ρk−1sk−1sk−1T)(Vk)+ρkskskT(2.44)
由上式可见,计算 D k + 1 D_{k+1} Dk+1需要用到 { s i , y i } i = 0 k \{s_i,y_i\}^k_{i=0} {si,yi}i=0k,因此,若从 s 0 , y 0 s_0,y_0 s0,y0开始连续的存储 m m m组的话,智能存储到 s m − 1 , y m − 1 s_{m-1},y_{m-1} sm−1,ym−1,亦即,只能依次计算 D 1 , D 2 , . . . , D m D_1,D_2,...,D_m D1,D2,...,Dm。那么 D m + 1 , D m + 2 D_{m+1},D_{m+2} Dm+1,Dm+2该如何计算呢?
自然的,如果一定要丢掉一些向量,那么肯定优先考虑那些最早生成的向量。具体来说,计算 D m + 1 D_{m+1} Dm+1时,我们保存 { s i , y i } i = 1 m \{s_i,y_i\}^m_{i=1} {si,yi}i=1m,丢掉了 { s 0 , y 0 } \{s_0,y_0\} {s0,y0};计算 D m + 2 D_{m+2} Dm+2时,我们保存 { s i , y i } i = 2 m + 1 \{s_i,y_i\}^{m+1}_{i=2} {si,yi}i=2m+1,丢掉了 { s 0 , y 0 } i = 0 1 \{s_0,y_0\}^1_{i=0} {s0,y0}i=01;…
但是舍弃掉一些向量后,就只能近似计算了。当 k + 1 > m k+1>m k+1>m时,仿照(2.44),可以构造近似计算公式
D k + 1 = ( V k T V k − 1 T . . . V k − m + 2 T V k − m + 1 T ) D 0 ( V k − m + 1 V k − m + 2 . . . V k − 1 V k ) + ( V k T V k − 1 T . . . V k − m + 3 T V k − m + 2 T ) ( ρ 0 s 0 s 0 T ) ( V k − m + 2 V k − m + 3 . . . V k − 1 V k ) + ( V k T V k − 1 T . . . V k − m + 4 T V k − m + 3 T ) ( ρ 1 s 1 s 1 T ) ( V k − m + 3 V k − m + 4 . . . V k − 1 V k ) + . . . + ( V k T V k − 1 T ) ( ρ k − 2 s k − 2 s k − 2 T ) ( V k − 1 V k ) + ( V k T ) ( ρ k − 1 s k − 1 s k − 1 T ) ( V k ) + ρ k s k s k T (2.45) \begin{aligned}D_{k+1}&=(V_k^TV_{k-1}^T...V_{k-m+2}^TV_{k-m+1}^T)D_0(V_{k-m+1}V_{k-m+2}...V_{k-1}V_k)\\ &+(V_k^TV_{k-1}^T...V_{k-m+3}^TV_{k-m+2}^T)(\rho_0\mathbf{s}_0\mathbf{s}_0^T)(V_{k-m+2}V_{k-m+3}...V_{k-1}V_k)\\ &+(V_k^TV_{k-1}^T...V_{k-m+4}^TV_{k-m+3}^T)(\rho_1\mathbf{s}_1\mathbf{s}_1^T)(V_{k-m+3}V_{k-m+4}...V_{k-1}V_k)\\ &+...\\ &+(V_k^TV_{k-1}^T)(\rho_{k-2}\mathbf{s}_{k-2}\mathbf{s}_{k-2}^T)(V_{k-1}V_k)\\ &+(V_k^T)(\rho_{k-1}\mathbf{s}_{k-1}\mathbf{s}_{k-1}^T)(V_k)\\ &+\rho_{k}\mathbf{s}_{k}\mathbf{s}_{k}^T\\ \end{aligned}\tag{2.45} Dk+1=(VkTVk−1T...Vk−m+2TVk−m+1T)D0(Vk−m+1Vk−m+2...Vk−1Vk)+(VkTVk−1T...Vk−m+3TVk−m+2T)(ρ0s0s0T)(Vk−m+2Vk−m+3...Vk−1Vk)+(VkTVk−1T...Vk−m+4TVk−m+3T)(ρ1s1s1T)(Vk−m+3Vk−m+4...Vk−1Vk)+...+(VkTVk−1T)(ρk−2sk−2sk−2T)(Vk−1Vk)+(VkT)(ρk−1sk−1sk−1T)(Vk)+ρkskskT(2.45)
(2.44)和(2.45)被称为Special BFGS Matrics。若引入 m ^ = m i n { k , m − 1 } \hat{m}=min\{k,m-1\} m^=min{k,m−1},则还可以将(2.44)和(2.45)合并的写成
D k + 1 = ( V k T V k − 1 T . . . V k − m ^ + 1 T V k − m ^ T ) D 0 ( V k − m ^ V k − m ^ + 1 . . . V k − 1 V k ) + ( V k T V k − 1 T . . . V k − m ^ + 2 T V k − m ^ + 1 T ) ( ρ 0 s 0 s 0 T ) ( V k − m ^ + 1 V k − m ^ + 2 . . . V k − 1 V k ) + ( V k T V k − 1 T . . . V k − m ^ + 3 T V k − m ^ + 2 T ) ( ρ 1 s 1 s 1 T ) ( V k − m ^ + 2 V k − m ^ + 3 . . . V k − 1 V k ) + . . . + ( V k T V k − 1 T ) ( ρ k − 2 s k − 2 s k − 2 T ) ( V k − 1 V k ) + ( V k T ) ( ρ k − 1 s k − 1 s k − 1 T ) ( V k ) + ρ k s k s k T (2.46) \begin{aligned}D_{k+1}&=(V_k^TV_{k-1}^T...V_{k-\hat{m}+1}^TV_{k-\hat{m}}^T)D_0(V_{k-\hat{m}}V_{k-\hat{m}+1}...V_{k-1}V_k)\\ &+(V_k^TV_{k-1}^T...V_{k-\hat{m}+2}^TV_{k-\hat{m}+1}^T)(\rho_0\mathbf{s}_0\mathbf{s}_0^T)(V_{k-\hat{m}+1}V_{k-\hat{m}+2}...V_{k-1}V_k)\\ &+(V_k^TV_{k-1}^T...V_{k-\hat{m}+3}^TV_{k-\hat{m}+2}^T)(\rho_1\mathbf{s}_1\mathbf{s}_1^T)(V_{k-\hat{m}+2}V_{k-\hat{m}+3}...V_{k-1}V_k)\\ &+...\\ &+(V_k^TV_{k-1}^T)(\rho_{k-2}\mathbf{s}_{k-2}\mathbf{s}_{k-2}^T)(V_{k-1}V_k)\\ &+(V_k^T)(\rho_{k-1}\mathbf{s}_{k-1}\mathbf{s}_{k-1}^T)(V_k)\\ &+\rho_{k}\mathbf{s}_{k}\mathbf{s}_{k}^T\\ \end{aligned}\tag{2.46} Dk+1=(VkTVk−1T...Vk−m^+1TVk−m^T)D0(Vk−m^Vk−m^+1...Vk−1Vk)+(VkTVk−1T...Vk−m^+2TVk−m^+1T)(ρ0s0s0T)(Vk−m^+1Vk−m^+2...Vk−1Vk)+(VkTVk−1T...Vk−m^+3TVk−m^+2T)(ρ1s1s1T)(Vk−m^+2Vk−m^+3...Vk−1Vk)+...+(VkTVk−1T)(ρk−2sk−2sk−2T)(Vk−1Vk)+(VkT)(ρk−1sk−1sk−1T)(Vk)+ρkskskT(2.46)
看到这里,千万不要被(2.46)冗长复杂的形式吓到,事实上,由BFGS算法流程易知, D k D_k Dk的作用仅用来计算 D k g k D_k\mathbf{g}_k Dkgk获取搜索方向,因此,若能利用表达式(2.46)设计出一种计算 D k g k D_k\mathbf{g}_k Dkgk的快速算法,则大功告成。具体算法如下:
算法 2.4 ( D k ⋅ g k D_k\cdot\mathbf{g}_k Dk⋅gk)的快速算法
Step 1 初始化
δ = { 0 , 若 k ≤ m k − m , 若 k > m ; L = { k , 若 k ≤ m m , 若 k > m ; q L = g k \delta=\left\{\begin{aligned} 0,&&若k\leq m\\ k-m,&&若k>m \end{aligned}\right.;L=\left\{\begin{aligned} k,&&若k\leq m\\ m,&&若k>m \end{aligned}\right.;\mathbf{q}_L=\mathbf{g}_k δ={0,k−m,若k≤m若k>m;L={k,m,若k≤m若k>m;qL=gk
Step 2 后向循环$
For
i
=
L
−
1
,
L
−
2
,
.
.
.
,
1
,
0
i=L-1,L-2,...,1,0
i=L−1,L−2,...,1,0 DO
{
j
=
i
+
δ
j=i+\delta
j=i+δ;
α
i
=
ρ
j
s
j
T
q
i
+
1
\alpha_i=\rho_j\mathbf{s}_j^T\mathbf{q}_{i+1}
αi=ρjsjTqi+1; //
α
i
\alpha_i
αi需要寻下来,前向循环要用!
q
i
=
q
i
+
1
−
α
i
y
j
\mathbf{q}_i=\mathbf{q}_{i+1}-\alpha_i\mathbf{y}_j
qi=qi+1−αiyj.
}
Step 3 前项循环
r
0
=
D
0
⋅
q
0
\mathbf{r}_0=D_0\cdot\mathbf{q}_0
r0=D0⋅q0;
For
i
=
0
,
1
,
.
.
.
,
L
−
2
,
L
−
1
i=0,1,...,L-2,L-1
i=0,1,...,L−2,L−1 DO
{
j
=
i
+
δ
j=i+\delta
j=i+δ;
β
i
=
ρ
j
y
j
T
r
i
\beta_i=\rho_j\mathbf{y}_j^T\mathbf{r}_{i}
βi=ρjyjTri;
r
i
+
1
=
r
i
+
(
α
i
−
β
i
)
s
j
\mathbf{r}_{i+1}=\mathbf{r}_{i}+(\alpha_i-\beta_i)\mathbf{s}_j
ri+1=ri+(αi−βi)sj;
}
最后计算出的 r L \mathbf{r}_L rL即为 H k ⋅ g k H_k\cdot\mathbf{g}_k Hk⋅gk的值
参考文献
牛顿法与拟牛顿法学习笔记(一)牛顿法
牛顿法与拟牛顿法学习笔记(二)拟牛顿条件
牛顿法与拟牛顿法学习笔记(三)DFP 算法
牛顿法与拟牛顿法学习笔记(四)BFGS 算法
牛顿法与拟牛顿法学习笔记(五)L-BFGS 算法