牛頓方法是現在用的比較廣泛的最優化演算法之一,其特點是收斂速度較快,上一節的梯度下降和隨機梯度下降都是一階收斂,而牛頓方法是二階收斂。
回憶高等數學裡面介紹的二階泰勒展開有q(
x)=f
(x0)
+∇f(
x0)(
x−x0
)+(x
−x0)
22!∇
2f(x
0) 而
q(x)
取到極值的條件,也就是最優化條件是∇q
(x)=
0 ,可得∇f
(xk)
+∇2f
(xk)
(x−x
k)=0
xk+1=xk
−(∇2
f(xk
))−1
∇f(x
k) x
k+1=
xk−h
−1kg
k 其中h
k=∇2
f(xk
),gk
=∇f(
xk) ,可以看到牛頓方法在迭代中不但使用了梯度,而且使用了二階的hessian矩陣。假設f
(x) 是二階可導,強凸,並且hessian的有界,並且在最優解附近的lipschitz continuous常數是m,另外∥∥
∇2f(
x)−1
∥∥≤n
,最優解為x∗
則 由於∇
f(xt
)−∇f
(x∗)
=∫10
∇2f(
xt+t
(x∗−
xt))
(xt−
x∗)d
x 而x
t+1−
x∗=x
t−x∗
−∇2f
(xt)
(xt−
x∗)=
∇2f(
xt)−
1[∇2
f(xt
)(xt
−x∗)
−(∇f
(xt)
−∇f(
x∗))
] 使用上面兩式還有lipschitz continuous可得 ∥∥
∇f(x
t)−∇
f(x∗
)−∇2
f(xt
)(xt
−x∗)
∥∥=∥
∥∥∫1
0[∇2
f(xt
+t(x
∗−xt
))−∇
2f(x
t)](
xt−x
∗)dx
∥∥∥
=∫10
∥∥∇2
f(xt
+t(x
∗−xt
))−∇
2f(x
t)∥∥
∥∥xt
−x∗∥
∥dx≤
∥∥xt
−x∗∥
∥∫10
mtdx
=m2∥
∥xt−
x∗∥∥
2 因此可得 ∥∥
xt+1
−x∗∥
∥≤mn
2∥∥x
t−x∗
∥∥2
牛頓方法中需要每一步去求解hessian矩陣的逆矩陣是乙個計算複雜度較高的操作,所以就出現了擬牛頓方法。擬牛頓方法就是通過近似的方法來求解hessian矩陣或其逆矩陣。具體的由於當x=
xk+1
時 ∇f
(xk+
1)−∇
f(xk
)=hk
(xk+
1−xk
) 其中h
k=∇2
f(x)
k ,記yk
=gk+
1−gk
,sk=
xk+1
−xk 得:yk
=hks
k 或h
−1ky
k=sk
以上稱為擬牛頓條件 如果h
k 是正定的話,可以保證牛頓方法的搜尋方向pk
是下降方向,因為hessian矩陣正定的話,由更新迭代的公式可以知道h−
1kgk
的方向和梯度gk
的方向一致(當目標函式為凸時),並且x=
xk−λ
h−1k
gk代入泰勒展開公式中得f(
x)=f
(xk)
−λgt
kh−1
kgk
當λ為充分小時,可以保證目標函式遞減。
擬牛頓方法用gk
作為h−1
k 的近似,要求矩陣gk
滿足同樣的條件,第一,gk
是正定的,第二,滿足擬牛頓條件。並且每次迭代中選擇更新矩陣gk
+1如下gk+
1=gk
+δgk
bfgs的方法是通過bk
去逼近hessian矩陣hk
相應的擬牛頓條件為bk
+1sk
=yk
並且通過上面的hessian矩陣更新公式bk
+1=b
k+pk
+qk
bk+1
sk=b
ksk+
pksk
+qks
k 且p
k qk
滿足如下條件:pk
sk=y
k qk
sk=−
bksk
找出適合條件的pk
和qk ,得到bfgs演算法矩陣bk
+1的迭代公式:bk
+1=b
k+yk
ytky
tksk
−bks
kstk
bkst
kbks
k 可以證明初始矩陣b0
為正定的時候,bk
也是正定矩陣。
擬牛頓方法中減少求逆的時間複雜度,但是又面臨另外的乙個問題,就是當原問題是乙個高維問題時,hessian矩陣的儲存成了乙個大的問題,因此有了l-bfgs演算法,l-bfgs演算法的思想是通過最近的m次sk
和yk 來近似計算下降方向,並且不用去儲存整個hessian矩陣。具體的推導不介紹了,演算法偽**如下:
最優化 牛頓優化演算法
本人總結的常用優化演算法pdf版本,主要講解原理 主要包括梯度下降,共軛梯度法 牛頓法,擬牛頓法 信賴域方法,罰函式法。coding utf 8 author uniquez file 牛頓法,基於dfp的擬牛頓法 date 2017 06 24 remark 原方程為 x1 2 2 x2 2 im...
最優化 數值優化演算法
核心思路 對梯度方向做一些修正,使得每次迭代尋找最優點都在可行域的內部進行。我們從可行域內部的某個點開始搜尋,一開始沿著梯度方向進行迭代搜尋,一旦碰到邊界 說明下一步可能會離開可行域 就要扭轉方向,使得搜尋過程始終在可行域的內部進行。當點落在可行域外部時,該怎樣選擇搜尋方向,衍生出了下列的演算法。1...
Dogleg「狗腿」最優化演算法
近期剛學習了dogleg狗腿最優化演算法,老師給出了乙個大體的框架並給出了乙個練習,讓我們用程式去實現它,鑑於本人剛剛開始接觸最優化,對matlab語言的使用也很生疏,在網上查閱了大量的資料,乙個通宵把演算法寫出來,並在matlab中得到了驗證。老師給出的練習為 主程式 demo dogleg pr...