拟牛顿方法(Quasi-Newton Methods)是一类重要的优化算法,它们通过近似 Hessian 矩阵来避免牛顿方法中计算和存储完整 Hessian 矩阵的高昂成本,同时保持较快的收敛速度。
-
牛顿方法的优势与劣势
考虑光滑凸优化问题:
xminf(x)
其中 f 是凸函数,二次可微,且 dom(f)=Rn。
梯度下降更新:
x+=x−t∇f(x)
牛顿方法更新:
x+=x−t(∇2f(x))−1∇f(x)
比较:
- 牛顿方法具有(局部)二次收敛,而梯度下降只有线性收敛
- 但牛顿迭代的计算成本要高得多
-
牛顿方法的主要计算步骤
牛顿迭代中的两个主要步骤:
- 计算 Hessian 矩阵 ∇2f(x)
- 求解线性方程组 ∇2f(x)s=−∇f(x)
这两个步骤都可能很昂贵(特别是对于大规模问题)。
-
拟牛顿方法的基本思想
拟牛顿方法重复以下形式的更新:
x+=x+ts
其中方向 s 由线性方程组定义:
Bs=−∇f(x)
其中 B 是 ∇2f(x) 的某个近似。我们希望:
- B 易于计算
- Bs=g 易于求解
-
拟牛顿算法模板
设 x(0)∈Rn,B(0)≻0。对于 k=1,2,3,…,重复:
Step 1:求解 B(k−1)s(k−1)=−∇f(x(k−1))
Step 2:更新 x(k)=x(k−1)+tks(k−1)
Step 3:从 B(k−1) 计算 B(k)
不同的拟牛顿方法在 Step 3 的实现上不同。通常我们可以从 (B(k−1))−1 计算 (B(k))−1。
基本思想:由于 B(k−1) 已经包含关于 Hessian 的信息,使用合适的矩阵更新来形成 B(k)。
-
割线方程(Secant Equation)
对 B(k) 的合理要求(由割线法启发):
∇f(x(k))=∇f(x(k−1))+B(k)s(k−1)
等价地,可以写成:
∇f(x+)=∇f(x)+B+s
令 y=∇f(x+)−∇f(x),这变为:
B+s=y
这称为割线方程(secant equation)。
-
对近似矩阵的要求
除了割线方程,我们还希望:
- B+ 是对称的
- B+ "接近" B
- B≻0⇒B+≻0(保持正定性)
-
SR1 更新(对称秩一更新,Symmetric Rank-One)
更新形式
尝试以下形式的更新:
B+=B+auuT
割线方程 B+s=y 给出:
(auTs)u=y−Bs
这只有当 u 是 y−Bs 的倍数时才成立。令 u=y−Bs,求解得到 a=1/(y−Bs)Ts,从而得到:
B+=B+(y−Bs)Ts(y−Bs)(y−Bs)T
这称为对称秩一(SR1)更新。
逆矩阵更新
为了求解 B+s+=−∇f(x+),除了传播 B 到 B+,我们也传播逆矩阵,即 C=B−1 到 C+=(B+)−1。
使用 Sherman-Morrison 公式:
(A+uvT)−1=A−1−1+vTA−1uA−1uvTA−1
对于 SR1 更新,逆矩阵也可以轻松更新:
C+=C+(s−Cy)Ty(s−Cy)(s−Cy)T
特点:
- SR1 简单且计算成本低
- 关键缺点:它不保持正定性
-
BFGS 更新(Broyden-Fletcher-Goldfarb-Shanno)
秩二更新
现在尝试秩二更新:
B+=B+auuT+bvvT
割线方程 y=B+s 给出:
y−Bs=(auTs)u+(bvTs)v
令 u=y,v=Bs,求解 a,b 得到:
B+=B−sTBsBssTB+yTsyyT
这称为Broyden-Fletcher-Goldfarb-Shanno(BFGS)更新。
逆矩阵更新
使用 Woodbury 公式(Sherman-Morrison 的推广):
(A+UCV)−1=A−1−A−1U(C−1+VA−1U)−1VA−1
应用到我们的情况,得到逆矩阵 C 的秩二更新:
C+=(I−yTssyT)C(I−yTsysT)+yTsssT
特点:
- BFGS 保持正定性(如果 yTs>0)
- 在实践中表现优异
- 具有超线性收敛性
-
DFP 更新(Davidon-Fletcher-Powell)
DFP 更新是 BFGS 的对偶形式,更新逆 Hessian 近似 C:
C+=C−yTCyCyyTC+yTsssT
对应的 Hessian 近似更新为:
B+=B+(y−Bs)Ts(y−Bs)(y−Bs)T−sTBsBssTB
特点:
- DFP 也保持正定性
- 与 BFGS 类似,但更新公式不同
- 在实践中,BFGS 通常比 DFP 表现更好
-
Broyden 类
Broyden 类是一族拟牛顿更新,包含 BFGS 和 DFP 作为特殊情况:
B+=B−sTBsBssTB+yTsyyT+ϕ(sTBs)(sTBsBs−yTsy)(sTBsBs−yTsy)T
其中 ϕ 是参数:
- ϕ=0:BFGS 更新
- ϕ=1:DFP 更新
- 其他值:Broyden 类的其他成员
-
收敛性分析
超线性收敛
对于拟牛顿方法,在适当条件下可以证明超线性收敛。关键观察是:
当序列 {x0,x1,…,xk,…} 线性收敛到最优点 x∗ 时,当 k 很大时,∥xk+1−xk∥ 已经非常小,而 xk,xk+1 都很靠近最优点 x∗。如果 Hessian 本身是充分连续的,那么我们基本上就有:
∇2f(x∗)(∇f(xk+1)−∇f(xk))≈xk+1−xk
也就是说,每次更新 Hk 时,收集到的是准确的关于 ∇2f(x∗) 的信息。因此可以证明:
k→∞lim∥sk∥∥(∇2f(x∗)−Hk−1)sk∥=0
这一点再加上其他条件还可以推出超线性收敛。
-
性能比较
以线性规划障碍问题为例(n=100,m=500):
xmincTx−i=1∑mlog(bi−aiTx)
计算复杂度:
- 牛顿更新:O(n3)
- 拟牛顿更新:O(n2)
迭代次数:
- 拟牛顿收敛所需的迭代次数少于牛顿方法的 100 倍
- 虽然每次迭代稍慢,但总体计算时间通常更短
-
割线法的几何解释
拟牛顿方法本质上是割线法的推广。
一元情况:
在导函数上某一点做切线,这条切线的斜率就是二次导函数:
f′′(xk)=−xk+1−xkf′(xk)
化简得到牛顿法的一元形式:xk+1=xk−f′′(xk)f′(xk)。
考虑导函数之前两个点所形成的割线,得到:
Bk(xk−xk−1)=f′(xk)−f′(xk−1)
这里的 Bk 就是这条割线的斜率。
多元推广:
设 sk=xk+1−xk,yk=∇f(xk+1)−∇f(xk),式子变成:
Bksk−1=yk−1
这就是拟牛顿法的本质——割线方程。
-
有限内存 BFGS(L-BFGS)
动机
对于大规模问题,拟牛顿更新可能变得过于昂贵。基本思想是:不显式计算和存储 C,而是通过维护所有对 (y,s) 来计算 C 的隐式版本。
BFGS 更新回顾
回忆 BFGS 通过以下方式更新 C:
C+=(I−yTssyT)C(I−yTsysT)+yTsssT
观察这导致:
C+g=p+(α−β)s
其中:
α=yTssTg,q=g−αy,p=Cq,β=yTsyTp
L-BFGS 算法
我们看到 C+g 可以通过两个长度为 k 的循环计算(如果 C+ 是 k 次迭代后逆 Hessian 的近似):
- 令 q=−∇f(x(k))
- 对于 i=k−1,…,0:
(a) 计算 αi=(s(i))Tq/((y(i))Ts(i))
(b) 更新 q=q−αyi
- 令 p=C(0)q
- 对于 i=0,…,k−1:
(a) 计算 β=(y(i))Tp/((y(i))Ts(i))
(b) 更新 p=p+(αi−β)s(i)
- 返回 p
有限内存版本
有限内存 BFGS(L-BFGS)简单地将每个循环的长度限制为 m:
- 令 q=−∇f(x(k))
- 对于 i=k−1,…,k−m:
(a) 计算 αi=(s(i))Tq/((y(i))Ts(i))
(b) 更新 q=q−αyi
- 令 p=Cˉ(k−m)q
- 对于 i=k−m,…,k−1:
(a) 计算 β=(y(i))Tp/((y(i))Ts(i))
(b) 更新 p=p+(αi−β)s(i)
- 返回 p
在 Step 3 中,Cˉ(k−m) 是我们对 C(k−m) 的猜测(不存储)。一个流行的选择是 Cˉ(k−m)=I,也存在更复杂的选择。
特点:
- 存储成本:O(mn) 而不是 O(n2)
- 计算成本:O(mn) 而不是 O(n2)
- 适用于大规模问题(n 很大)
- 通常 m 取 5-20 就足够