牛頓法是求解最優化,理論上最好最精確的方法,公式爲:xk+1=xk−f′(xk)f″(xk) ,原理是求解導數爲0的情況。如果xk 是一個高維數據,且函數f(x) 非常複雜,那麼求解1/f″(x) 就是很麻煩的過程。擬牛頓法的思路是,在牛頓法的基礎上,對1/f″(x) 做個近似估計就行了,不需要精確計算。這樣雖然結果會有些差異,但是速度上來了。
擬牛頓法 基於原函數f(xk+1) 關於f(xk) 的二階泰勒展開。設
f(xk)=f(xk+1)+f′(xk+1)(xk−xk+1)+12(xk−xk+1)Tf″(xk+1)(xk−xk+1)+o(xk+1)
令
f″(xk+1)=Bk+1 ,去掉餘項
o(xk+1) ,對
xk 求導有
f′(xk)=f′(xk+1)+Bk+1(xk−xk+1) ,解出
Bk+1=f′(xk)−f′(xk+1)xk−xk+1=f′(xk+1)−f′(xk)xk+1−xkxk+2=xk+1−λf′(xk+1)/Bk+1
由於包含要求解的
xk+1 ,我們只能試着取一個值,隨機取值風險很大,上述方程只能作爲擬牛頓方程成立的一個必要條件。。
BFGS算法是一種迭代擬牛頓法,在滿足上述必要條件的情況,保證了計算過程中的穩定,具體證明太難了。設
Bk+1=Bk+δB 。數學家用了一個很技巧性很偶然的方法,令
δB=αuuT+βvvT ,則
Bk+1=Bk+αuuT+βvvTBk+1(xk+1−xk)=f′(xk+1)−f′(xk)=Bk(xk+1−xk)+[αuT(xk+1−xk)]u+[βvT(xk+1−xk)]v
令
αuT(xk+1−xk)=1 ,
βvT(xk+1−xk)=−1 ,
u=f′(xk+1)−f′(xk) ,
v=Bk(xk+1−xk) ,剛好恆等式成立。於是有
α=1[f′(xk+1)−f′(xk)]T(xk+1−xk)β=−1[Bk(xk+1−xk)]T(xk+1−xk)=−1(xk+1−xk)TBk(xk+1−xk)
其中
Bk=BTk ,原理是我們近似認爲B是二階導,當原函數是一元函數時,B是常量,轉置就是本身;當原函數是多元函數時,B近似海森矩陣,表示爲
⎡⎣⎢⎢⎢⎢⎢⎢∂2f∂x21∂2f∂x2∂x1...∂2f∂x1∂x2∂2f∂x22............⎤⎦⎥⎥⎥⎥⎥⎥
顯然B可以認爲是一個對稱矩陣。
獲得上述式子後,令
sk=xk+1−xk,yk=f′(xk+1)−f′(xk 我們寫得
Bk+1=Bk+sksTkyTksk−BksksTkBksTkBKsk
值得注意的是,
Bk+1 的表達式還是包含未知的
xk+1 。定義步長參數
λk ,遍歷計算
f(xk+λkdk),dk=−f′(xk)/Bk ,取其中函數值最小時的
λk ,即求解
λk=argminf(xk+λdk) ,近似得到
sk=λk(−f′(xk)/Bk) ,然後代入
Bk+1 表達式即可。當然
λk 還有一些設置方法。我們用上述方法預先取的值,一般都受到BFGS本身的約束而不會太離譜。
BFGS方法步驟如下:
1、給定初值x0 ,收斂閾值η ,初始二階導B0=I ,k=0
2、計算得到dk=f′(xk)/Bk ,一般Bk 是可以求逆的
3、解λk=argminf(xk+λdk) ,得到xk+1=xk−λkdk
4、如果|f′(xk+1)|<η ,終止運行
5、計算yk=f′(xk+1−f′(xk)),sk=−λkdk ,代入Bk+1 求解方程,求取Bk+1
6、k=k+1,從步驟1開始。