数值优化-BFGS
根据前文的拟牛顿法,我们希望求得矩阵 B B B 来近似海森阵的逆,从而还原出海森阵中的曲率信息,满足
Δ x ≈ B k + 1 Δ g , M k + 1 B k + 1 = I \Delta x \approx B^{k+1}\Delta g, M^{k+1}B^{k+1}=I Δx≈Bk+1Δg,Mk+1Bk+1=I
因为满足要求的矩阵有无数多个,因此通过构建优化问题,来求得一个最优的 B B B:
min B ∥ H 1 2 ( B − B k ) H 1 2 ∥ 2 s.t. B = B T Δ x = B Δ g H = ∫ 0 1 ∇ 2 f [ ( 1 − τ ) x k + τ x k + 1 ] d τ \begin{array}{c} \min _B \left\| H^\frac{1}{2}\left(B - B^k\right)H^\frac{1}{2}\right\|^2 \\ \begin{aligned} \text { s.t. } B&=B^{\mathrm{T}} \\ \Delta x &=B \Delta g \end{aligned}\\ H=\int_0^1 \nabla^2 f\left[(1-\tau) x^k+\tau x^{k+1}\right] d \tau \end{array} minB
H21(B−Bk)H21
2 s.t. BΔx=BT=BΔgH=∫01∇2f[(1−τ)xk+τxk+1]dτ
BFGS更新
我们可通过BFGS更新公式来求得满足要求的矩阵 B B B:
B k + 1 = ( I − Δ x Δ g T Δ g T Δ x ) B k ( I − Δ g Δ x T Δ g T Δ x ) + Δ x Δ x T Δ g T Δ x B 0 = I , Δ x = x k + 1 − x k , Δ g = ∇ f ( x k + 1 ) − ∇ f ( x k ) \begin{aligned} & B^{k+1}=\left(I-\frac{\Delta x \Delta g^T}{\Delta g^T \Delta x}\right) B^k\left(I-\frac{\Delta g \Delta x^T}{\Delta g^T \Delta x}\right)+\frac{\Delta x \Delta x^T}{\Delta g^T \Delta x} \\ & B^0=I, \Delta x=x^{k+1}-x^k, \Delta g=\nabla f\left(x^{k+1}\right)-\nabla f\left(x^k\right) \end{aligned} Bk+1=(I−ΔgTΔxΔxΔgT)Bk(I−ΔgTΔxΔgΔxT)+ΔgTΔxΔxΔxTB0=I,Δx=xk+1−xk,Δg=∇f(xk+1)−∇f(xk)
这样, M = B − 1 M=B^{-1} M=B−1 即为海森阵的逆矩阵的近似,且满足:
- 无需求二阶导数
- 线性方程组有闭式解(求出 B B B 后,即可直接求出 d = − B g d=-Bg d=−Bg)
- 轻量,便于存储( O ( n 2 ) O(n^2) O(n2))
- 保证下降方向
- 包含曲率信息
为了保证下降方向, B = M − 1 B=M^{-1} B=M−1 需正定。
我们可以证明:若满足
Δ g ⊤ Δ x > 0 \Delta g^\top\Delta x > 0 Δg⊤Δx>0
则BFGS更新可以保留 B B B 的正定。
证明见文章末尾。
BFGS用于严格凸的光滑函数
对于严格凸函数,
⟨ y − x , ∇ f ( y ) − ∇ f ( x ) ⟩ > 0 ⇒ Δ g ⊤ Δ x > 0 \langle y-x,\nabla f(y)-\nabla f(x)\rangle >0\Rightarrow \Delta g^\top\Delta x > 0 ⟨y−x,∇f(y)−∇f(x)⟩>0⇒Δg⊤Δx>0
因此一定能保证 d d d 为下降方向。
用于严格凸函数的BFGS算法如下:
initialize x 0 , g 0 ← f ( x 0 ) , B 0 ← I , k ← 0 while ∥ g k ∥ > δ do d ← − B k g k t ← backtracking line serach (Armijo) x k + 1 ← x k + t d g k + 1 ← ∇ f ( x k + 1 ) B k + 1 ← BFGS ( B k , g k + 1 − g k , x k + 1 − x k ) k ← k + 1 end while return \begin{aligned} &\textbf{initialize}~~ x^{0},g^{0}\leftarrow f(x^{0}),\,B^{0}\leftarrow I,\,k\leftarrow 0\\ &\textbf{while}~~ \Vert g^{k}\Vert>\delta\quad\textbf{do}\\ &\qquad d\leftarrow -B^{k}g^{k}\\ &\qquad t\leftarrow \text{backtracking line serach (Armijo)}\\ &\qquad x^{k+1}\leftarrow x^{k}+td\\ &\qquad g^{k+1}\leftarrow \nabla f(x^{k+1})\\ &\qquad B^{k+1}\leftarrow \text{BFGS}(B^{k},g^{k+1}-g^{k},x^{k+1}-x^{k})\\ &\qquad k\leftarrow k+1\\ &\textbf{end while}\\ &\textbf{return} \end{aligned} initialize x0,g0←f(x0),B0←I,k←0while ∥gk∥>δdod←−Bkgkt←backtracking line serach (Armijo)xk+1←xk+tdgk+1←∇f(xk+1)Bk+1←BFGS(Bk,gk+1−gk,xk+1−xk)k←k+1end whilereturn
BFGS用于非凸函数
对于非凸函数,我们可以在线搜索中使用 Wolfe Condition 来保证 Δ g ⊤ Δ x > 0 \Delta g^\top\Delta x > 0 Δg⊤Δx>0,从而保证下降方向:
Wolfe → Δ g T Δ x > 0 → B is PD → d 为下降方向 \text{Wolfe}\rightarrow \Delta g^{T}\Delta x>0\rightarrow B\text{ is PD}\rightarrow d\text{ 为下降方向} Wolfe→ΔgTΔx>0→B is PD→d 为下降方向
Wolfe Condition
weak wolfe condition
给定参数 0 < c 1 < c 2 < 1 0<c_{1}<c_{2}<1 0<c1<