深度學習/機器學習入門基礎數學知識整理(四):擬牛頓法、BFGS、L-BFGS、DFP、共軛梯度法

歡迎查看我的博客文章合集:我的Blog文章索引::機器學習方法系列,深度學習方法系列,三十分鐘理解系列等

擬牛頓法

擬牛頓法可以克服牛頓法計算量大的缺點,不在計算目標函數的 Hesse 矩陣,而是構造一個近似 Hesse 矩陣的對稱正定矩陣,根據近似矩陣來優化目標函數,不同的近似構造 Hesse 的方法決定了不同的擬牛頓法,構造 Hesse 矩陣是需要滿足擬牛頓條件的,擬牛頓條件是這樣求得的,首先將 f(x) 在 xk+1x_{k+1}處做二階泰勒展開(忽略高階項):

f(x)=f(xk+1)+f(xk+1)(xxk+1)+12(xxk+1)T2f(xk+1)(xxk+1)f(x) = f(x_{k+1}) + \nabla f(x_{k+1}) (x-x_{k+1})+ \frac{1}{2} (x –x_{k+1})^T\nabla^2 f(x_{k+1} )(x-x_{k+1})

注意在這個式子中,xx是變量,而xk+1x_{k+1}是一個值,對xx求導得到:
f(x)=0+f(xk+1)+Hk+1(xxk+1) \nabla f(x) = 0 + \nabla f(x_{k+1}) + H_{k+1}(x -x_{k+1})整理得到:
g=gk+1+Hk+1(xxk+1)g = g_{k+1}+ H_{k+1}(x -x_{k+1})
x=xkx=x_k ,整理可得
gk+1gk=Hk+1(xk+1xk)g_{k+1} – g_k = H_{k+1} (x_{k+1} – x_k)
這個便是擬牛頓條件了,迭代過程中對 Hk+1H_{k+1} 做出約束,根據約束構造一個近似矩陣 Bk+1B_{k+1} ,來模擬 Hesse 矩陣就可以了,爲了簡便起見,引入記號 sks_kyky_k ,令sk=xk+1xk,yk=gk+1gks_k = x_{k+1} –x_k , y_k = g_{k+1} –g _k
yk=Bk+1sky_k = B_{k+1} \cdot s_k
因爲牛頓法中的迭代方向爲H1g-H^{-1} \cdot g,所以令 Dk+1=Hk+11D_{k+1} = H_{k+1}^{-1},擬牛頓條件還可以寫作:
sk=Dk+1yks_k = D_{k+1} \cdot y_k

擬牛頓法本身是一類算法,下面介紹一下BFGS,算是比較著名的方法了:

BFGS算法(Broyden–Fletcher–Goldfarb–Shanno)[3]

BFGS 是一種擬牛頓方法,通過迭代構建近似 Hesse 矩陣,省去了求解 Hesse 的複雜的步驟,而且 BFGS 構造出來的近似 Hesse 矩陣一定是正定的,這完全克服了牛頓法的缺陷,雖然搜索方向不一定最優,但始終朝着最優的方向前進的。首先初始化 Hesse 矩陣 B0=IB_0=I ,接下來每次迭代對矩陣 BkB_k 進行更新即可:
Bk+1=Bk+ΔBk, k=1,2,B_{k+1} = B_k+ \Delta B_k , \ k = 1,2,…

迭代構建近似矩陣的關鍵是矩陣 ΔBk 的構造了,將其寫作:
ΔBk=αuuT+βvvT\Delta B_k = \alpha uu^T + \beta vv^T
這裏的向量 u 和 v 是待定的,知道了這兩個向量,就可以構造構造 ΔBk 了,且這樣構造出的矩陣是對稱的,根據擬牛頓條件:

yk=Bk+1sk=(Bk+ΔBk)sk=(Bk+αuuT+βvvT)sk=Bksk+(αuTsk)u+(βvTsk)v\begin{aligned} y_k &= B_{k+1} s_k \\ &= (B_k + \Delta B_k)s_k \\ &= (B_k + \alpha uu^T + \beta vv^T)s_k \\ &= B_k s_k + (\alpha u^Ts_k) \cdot u+ (\beta v^Ts_k) \cdot v \end{aligned}
這裏 αuTskαu^Ts_kβvTskβv^Tsk 均爲實數,代表了 在 u 與 v 方向的拉伸程度,爲了計算簡單,做如下賦值運算:
αuTsk=1, βvTsk=1\alpha u^Ts_k = 1 , \ \beta v^Ts_k = –1
代入上式便可得:
uv=ykBksku - v = y_k – B_ks_k
這就得到得到了 u 與 v 的一個近似:
u=yk, v=Bksku = y_k , \ v = B_k s_k
繼而求 α 與 β 的值
α=1yTsk,β=1(Bksk)Tsk=1skTBksk\alpha = \frac{1}{y^Ts_k}, \beta= -\frac{1}{(B_ks_k)^Ts_k} = -\frac{1}{s_k^TB_ks_k}

α 、 β 、 u 與 v都求得後,便得到了 ΔBk 的更新公式:
ΔBk=ykykTykTskBkskskTBkskTBksk\Delta B_k = \frac{y_ky_k^T}{y_k^Ts_k} – \frac{B_ks_ks_k^TB_k}{s_k^TB_ks_k}

因此BkB_k的迭代公式是:
Bk+1=Bk+ykykTykTskBkskskTBkskTBkskB_{k+1} = B_k +\frac{y_ky_k^T}{y_k^Ts_k} – \frac{B_ks_ks_k^TB_k}{s_k^TB_ks_k}

由與牛頓法的方向是 Hk1gk–H^{−1}_kg_k 的,所以最好可以直接計算出 Bk1B^{−1}_k ,這樣就不用再進行求逆運算了,直接根據Sherman-Morrison 公式:可得關於矩陣B 的逆的更新方式:

Bk+11=Bk1+(1skTyk+ykTBk1yk(skTyk)2)skskT1skTyk(Bk1ykskT+skykTBk1)B^{-1}_{k+1} = B^{-1}_k + \left (\frac{1}{s_k^Ty_k}+\frac{y_k^TB_k^{-1}y_k}{(s_k^Ty_k)^2} \right )s_ks_k^T - \frac{1}{s_k^Ty_k} \left (B_k^{-1}y_ks_k^T + s_ky_k^TB^{-1}_k \right)

Bk1B^{−1}_k 這裏用 DkD_k 來表示,給出最終的 BFGS 算法[3]:
這裏寫圖片描述

停止條件爲人爲設定,可設定爲兩次迭代目標函數差的閾值或者梯度差的閾值,或者梯度本身(的模)小於閾值。


其中,步驟2.2搜索步長的方法採用[7]:
這裏寫圖片描述

比較好理解,就是在搜索方向p上,找到步長α\alpha滿足Armijo條件,初始步長α0=1\alpha_0=1是一種常用的設定。


DFP算法

DFP算法也是類似的思想,可以參考[4],寫的很詳細,我這裏簡單貼一個圖以備查閱:

這裏寫圖片描述

稍微看下步3,選用的方法就是上面介紹過的Backtracking line search算法,只是選用的符號不一樣而已,內容是一樣的。非負整數m就是代表了迭代次數。

L-BFGS [3]

工業中實用的擬牛頓法的便是 L-BFGS (Limited-memory BFGS)了,對於近似 Hesse 矩陣 DkD_k
Dk+1=Dk+(1skTyk+ykTDkyk(skTyk)2)skskT1skTyk(DkykskT+skykTDk)D_{k+1} = D_k + \left (\frac{1}{s_k^Ty_k}+\frac{y_k^T D_ky_k}{(s_k^Ty_k)^2} \right )s_ks_k^T - \frac{1}{s_k^Ty_k}(D_ky_ks_k^T + s_ky_k^T D_k )

而是存儲向量序 sks_k,yky_k,而且向量序列也不是都存,而是存最近的 m 次的, m 爲人工指定,計算 DkD_k 時,只用最新的 m 個向量模擬計算即可。在第 k 次迭代,算法求得了 xkx_k ,並且保存的曲率信息爲 (si,yi)k1km(si,yi)_{k−1}^{k−m}。爲了得到 HkH_k,算法每次迭代均需選擇一個初始的矩陣 H0KH_0^K,這是不同於 BFGS 算法的一個地方,接下來只用最近的 m 個向量對該初始矩陣進行修正,實踐中 H0KH_0^K 的設定通常如下:
Hk0=rkIrk=sk1Tyk1yk1Tyk1\begin{aligned} H_k^0 &=r_kI \\ r_k &=\frac{s{k-1}^Ty_{k-1}}{y_{k-1}^Ty_{k-1}} \end{aligned}

其中 rkr_k 表示比例係數,它利用最近一次的曲率信息來估計真實海森矩陣的大小,這就使得當前步的搜索方向較爲理想,而不至於跑得“太偏”,這樣就省去了步長搜索的步驟,節省了時間。在L-BFGS算法中,通過保存最近 m 次的曲率信息來更新近似矩陣的這種方法在實踐中是很有效的,雖然 L-BFGS 算法是線性收斂,但是每次迭代的開銷非常小,因此 L-BFGS 算法執行速度還是很快的,而且由於每一步迭代都能保證近似矩陣的正定,因此算法的魯棒性還是很強的。

總結下 BFGS 與 L-BFGS 的: BFGS算法在運行的時候,每一步迭代都需要保存一個 n×n 的矩陣,現在很多機器學習問題都是高維的,當 n 很大的時候,這個矩陣佔用的內存是非常驚人的,並且所需的計算量也是很大的,這使得傳統的 BFGS 算法變得非常不適用。而 L-BFGS 則是很對這個問題的改進版,從上面所說可知,BFGS 算法是通過曲率信息$ (s_k,y_k)$ 來修正 HkH_k 從而得到 Hk+1H_{k+1} ,L-BFGS 算法的主要思路是:算法僅僅保存最近 m 次迭代的曲率信息來計算Hk+1H_{k+1} 。這樣,我們所需的存儲空間就從 n×n 變成了 2m×n 而通常情況下 m << n。

其他擬牛頓算法[6]

這裏寫圖片描述

共軛梯度法

共軛梯度法是介於梯度下降法和牛頓法,擬牛頓法之間的算法[6]。

待補充…

參考資料

[1]https://blog.csdn.net/batuwuhanpei/article/details/51979831
[2]https://blog.csdn.net/u011722133/article/details/53518134
[3]無約束優化方法(梯度法-牛頓法-BFGS- L-BFGS)
[4]優化算法——擬牛頓法之DFP算法
[5]牛頓法與擬牛頓法
[6]牛頓法,擬牛頓法, 共軛梯度法
[7]【原創】回溯線搜索 Backtracking line search
[8]【原創】牛頓法和擬牛頓法 – BFGS, L-BFGS, OWL-QN
[9]無約束最優化方法——牛頓法、擬牛頓法、BFGS、LBFGS
[10] 無約束最優化的常用方法
[11]機器學習與運籌優化(三)從牛頓法到L-BFGS
[12]ECE236C - Optimization Methods for Large-Scale Systems (Spring 2019),UCLA的優化課程,課件很好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章