牛頓法
考慮如下無約束極小化問題:
$$\min_{x} f(x)$$
其中$x\in R^N$,並且假設$f(x)$為凸函數,二階可微。當前點記為$x_k$,最優點記為$x^*$。
梯度下降法用的是一階偏導,牛頓法用二階偏導。以標量為例,在當前點進行泰勒二階展開:
$$\varphi(x)=f(x_k)+f'(x_k)(x-x_k)+\frac{1}{2}f''(x_k)(x-x_k)^2$$
極小值點滿足$\varphi'(x)=0$,求得:
$$x_{k+1}=x_k-\frac{f'(x_k)}{f''(x_k)}$$
右半部第二部分的分式指明下一步的迭代方向。
若擴展到多維,上式變為
$$x_{k+1}=x_k-H^{-1}\cdot g_k$$
其中$g_k=\nabla f(x_k)$為梯度向量,$H_k=\nabla^2f(x_k)$為海森矩陣。
牛頓法是具有二次收斂性的算法,收斂速度比較快。但是其步長固定,因此不能保證穩定的下降。
阻尼牛頓法在牛頓方向上附加了步長因子,每次調整時會在搜索空間,在該方向找到最優步長,然后調整。
擬牛頓法
由於牛頓法的要求比較嚴格,計算比較復雜,衍生出擬牛頓法。
擬牛頓法對$H_k$或$H_k^{-1}$取近似值,可減少計算量。記$B\approx H$,$D\approx H^{-1}$,$y_k=g_{k+1}-g_k$,$s_k=x_{k+1}-x_k$。、
根據擬牛頓條件,可得近似公式:
$$B_{k+1}=\frac{y_k}{s_k}$$
或
$$D_{k+1}=\frac{s_k}{y_k}$$
是不是跟二階導數的定義很相似?$k$階導數定義為自變量增加1之后,$k-1$階導數增加的值,然后求極限而已。
下面是幾個擬牛頓法。
DFP算法
DFP算法采用的是$D$,但並不直接計算$D$,而是計算每一步$D$的增量$\Delta D$來間接的求出$D$。這也是很多優化算法的做法,因為一般上一步的中間結果對下一步的計算仍有價值,若直接拋棄重新計算耗時耗力耗內存,重新發明了輪子。
$$D_{k+1}=D_k+\Delta D_k$$
$D_0$通常取單位矩陣$I$,關鍵導出每一步的$\Delta D_{k}$。
通過一系列艱苦而又卓絕的推導計算假設取便,最終的導出結果為:
$$\Delta D_k=\frac{s_k s_k^T}{s_k^T y_k}-\frac{D_k y_k y_k^TD_k}{y_k^T D_k y_k}$$
一般來說,在進行中間增量計算時,都要經過這一步艱苦而又卓絕的推導計算。
BFGS算法
BFGS算法與DFP算法類似,只是采用的$B$來近似$H$。最終的公式為:
$$\Delta B_k=\frac{y_k y_k^T}{y_k^T x_k}-\frac{B_k s_k s_k^T B_k}{s_k^T B_k s_k}$$
跟DFP相比,只是$D \leftrightarrow B$,$s \leftrightarrow y$互調。
L-BFGS算法
L-BFGS算法對BFGS算法進行改進,不再存儲矩陣$D_k$,因為$D_k$有時候比較大,計算機的肚子盛不下。但是我們用到$D_k$的時候怎么辦呢?答案是根據公式求出來。
從上面的算法推導可知,$D_k$只跟$D_0$和序列$\{s_k\}$和$\{y_k\}$有關。即我們知道了后者,即可以求得前者。進一步近似,我們只需要序列$\{s_k\}$和$\{y_k\}$的最近$m$個值即可。這樣說來,我們的計算機內存中只需要存儲這兩個序列即可,瞬間卸掉了很多東西,正是春風得意馬蹄輕。當然,這樣cpu的計算量也會相應的增加,這是可以接受的,馬,也是可以接受的。
最終的遞推關系為
$$D_{k+1}=V^T_kD_kV_k+\rho_k s_ks^T_k$$
其中
$$\rho_k=\frac{1}{y^T_ks_k},V_k=I-\rho_ky_ks^T_k$$
參考文獻:http://blog.csdn.net/itplus/article/details/21897715