幾種常用的優化方法
Steepest gradient 方法得到的是區域性最優解,如果目標函式是一個凸優化問題,那麼區域性最優解就是全域性最優解,理想的優化效果如下圖,值得注意一點的是,每一次迭代的移動方向都與出發點的等高線垂直:
粗略來講,在二次函式中,橢球面的形狀受 hesse 矩陣的條件數影響,長軸與短軸對應矩陣的最小特徵值和最大特徵值的方向,其大小與特徵值的平方根成反比,最大特徵值與最小特徵值相差越大,橢球面越扁,那麼優化路徑需要走很大的彎路,計算效率很低。
2)
Newton’s method
在最速下降法中,我們看到,該方法主要利用的是目標函式的區域性性質,具有一定的“盲目性”。牛頓法則是利用區域性的一階和二階偏導資訊,推測整個目標函式的形狀,進而可以求得出近似函式的全域性最小值,然後將當前的最小值設定近似函式的最小值。相比最速下降法,牛頓法帶有一定對全域性的預測性,收斂性質也更優良。牛頓法的主要推導過程如下:
第一步,利用 Taylor 級數求得原目標函式的二階近似:
與 1) 中優化問題相同,牛頓法的程式碼如下:
Newton.py
上面例子中由於目標函式是二次凸函式,Taylor 展開等於原函式,所以能一次就求出最優解。
牛頓法主要存在的問題是:
- Hesse 矩陣不可逆時無法計算
- 矩陣的逆計算複雜為 n 的立方,當問題規模比較大時,計算量很大,解決的辦法是採用擬牛頓法如 BFGS, L-BFGS, DFP, Broyden’s Algorithm 進行近似。
- 如果初始值離區域性極小值太遠,Taylor 展開並不能對原函式進行良好的近似
3) Levenberg–Marquardt Algorithm
Levenberg–Marquardt algorithm 能結合以上兩種優化方法的優點,並對兩者的不足做出改進。與 line search 的方法不同,LMA 屬於一種“信賴域法”(trust region),牛頓法實際上也可以看做一種信賴域法,即利用區域性資訊對函式進行建模近似,求取區域性最小值。所謂的信賴域法,就是從初始點開始,先假設一個可以信賴的最大位移 s(牛頓法裡面 s 為無窮大),然後在以當前點為中心,以 s 為半徑的區域內,通過尋找目標函式的一個近似函式(二次的)的最優點,來求解得到真正的位移。在得到了位移之後,再計算目標函式值,如果其使目標函式值的下降滿足了一定條件,那麼就說明這個位移是可靠的,則繼續按此規則迭代計算下去;如果其不能使目標函式值的下降滿足一定的條件,則應減小信賴域的範圍,再重新求解。
LMA 最早提出是用來解決最小二乘法曲線擬合的優化問題的,對於隨機初始化的已知引數 beta, 求得的目標值為:
演算法過程如下:
- 給定一個初識值 x0
- 當並且沒有到達最大迭代次數時
- 重複執行:
- 算出移動向量
- 計算更新值:
- 計算目標函式真實減少量與預測減少量的比率
- if,接受更新值
- else if,說明近似效果很好,接受更新值,擴大可信域(即減小阻尼係數)
- else: 目標函式在變大,拒絕更新值,減小可信域(即增加阻尼係數)
- 直到達到最大迭代次數
維基百科在介紹 Gradient descent 時用包含了細長峽谷的 Rosenbrock function
LevenbergMarquardt.py
大概 5 次迭代就可以得到最優解 (1, 1).
Levenberg–Marquardt algorithm 對區域性極小值很敏感,維基百科舉了一個二乘法曲線擬合的例子,當使用不同的初始值時,得到的結果差距很大,我這裡也有 python 程式碼,就不細說了。
4) Conjugate Gradients
共軛梯度法也是優化模型經常經常要用到的一個方法,背後的數學公式和原理稍微複雜一些,光這一個優化方法就可以寫一篇很長的博文了,所以這裡並不打算詳細講解每一步的推導過程,只簡單寫一下演算法的實現過程。與最速梯度下降的不同,共軛梯度的優點主要體現在選擇搜尋方向上。在瞭解共軛梯度法之前,我們首先簡單瞭解一下共軛方向:
在優化過程中,如果我們確定了移動方向(GD:垂直於等值線,CG:共軛方向),然後在該方向上搜索極小值點(恰好與該處的等值線相切),然後移動到最小值點,重複以上過程,那麼 Gradient Descent 和 Conjugate gradient descent 的優化過程可以用下圖的綠線與紅線表示:
- 給定一個出發點 x0 和一個停止引數 e, 第一次移動方向為最速下降方向:
- while:
- 用 Newton-Raphson 迭代計算移動距離,以便在該搜尋方向移動到極小,公式就不寫了,具體思路就是利用一階梯度的資訊向極小值點跳躍搜尋
- 移動當前的優化解 x:
- 用 Gram-Schmidt 方法構造下一個共軛方向,即, 按照的確定公式又可以分為 FR 方法和 PR 和 HS 等。
在很多的資料中,介紹共軛梯度法都舉了一個求線性方程組 Ax = b 近似解的例子,實際上就相當於這裡所說的
還是用最開始的目標函式 來編寫共軛梯度法的優化程式碼: