牛頓法法主要是為了解決非線性優化問題,其收斂速度比梯度下降速度更快。其需要解決的問題可以描述為:對於目標函數f(x),在無約束條件的情況下求它的最小值。
其中x=(x1,x2,..,xn)是n維空間的向量。我們在下面需要用到的泰勒公式先在這寫出來。
牛頓法的主要思想是:在現有的極小值估計值的附近對f(x)做二階泰勒展開,進而找到極小點的下一個估計值,反復迭代直到函數的一階導數小於某個接近0的閥值。
為了便於理解,我們通常先從簡單的開始進行分析,於是我們就先從x的維度n=1時開始進行討論。
1)n=1時。
設x=xt時,函數f(x)取得最小值,我們的目標就是希望能求得xt,現在我們設xk作為xt的估計值。首先我們在x=xk處進行泰勒二階展開,得:
然后對f(x)求導,得:
令:,即:
所以有:
若從初始值x=x0開始進行迭代,將得到x的一個序列:x0,x1,…xk。在一定條件下,此序列可以收斂到f(x)的極小值點。
2)n>1時。
此時,可以將x寫成:x=(x1,x2,…,xn)。同樣,我們先對x進行泰勒展開:
然后對f(x)求導,此處的求導比n=1的情形要復雜一點,由於f(x)中的x是一個向量,f(x)對x求導意味着對x向量中的每個值求偏導。即,f(x)對x的一階導數為一個向量,對x的二階導數為一個n*n的矩陣。
求導后得:
(式1.1)
為了方便表達,我們令:
此時的gk為一個向量,Hk為一個矩陣。
我們令(式1.1)中的f(x)導數為0,得:
即:
所以:
得到x的迭代值為:
牛頓法算法流程:
1)初始化x0,設置終止閥值a,令k=0.
2)計算f(x)在x=xk的梯度向量gk和海塞矩陣Hk-1的逆矩陣,其計算公式為:
3)判斷||gk||<a,則停止計算,得到x=xk即為所求。
4)更新x:,轉移至第2)步。
算法分析:
1)前提:
要使用該算法要滿足兩個條件:一是函數f(x)一階,二階可偏導;二是海塞矩陣要求正定。若要使得最終結果能收斂到最小值,則f(x)需要為凸函數。
當f(x)滿足:時,海塞矩陣為對稱矩陣,對所有特征值大於0的對稱矩陣稱為正定矩陣。正定矩陣一定是非奇異矩陣。
附:若A為奇異矩陣,則有:|A|=0.
2)優點:
它比傳統的梯度下降算法收斂速度明顯要快,另外,當f(x)是二次函數時,僅需一次迭代就能直接收斂到最小值。因為f(x)為二次函數時,在進行泰勒展開式,並沒有高階導數的損失,而在后面的每次計算都是等號運算,因而最后得到結果就是函數f(x)最小值對應的x。而對於非二次函數,若函數的二次形態較強,或迭代點已進入極小點的領域內,則其收斂速度也會很快。
3)缺點:
A)計算復雜度問題。
在上面的這個算法中存在一個問題,即海塞矩陣的計算問題,此問題需要對f(x)求二階偏導數,計算開銷很大;另一方面,海塞矩陣的大小是n的平方,當n增大時,存儲和計算的量是平方的速度增加。
針對計算復雜度問題,於是有了擬牛頓法。
B)收斂性問題。
對於非二次函數,也可能會出現f(xk+1)>f(xk)的情況,這時,牛頓法不能收斂,從而導致計算失敗。對於這種情況,可以使用阻尼牛頓法來解決。
阻尼牛頓法最核心的一點在於可以修改每次迭代的步長,通過沿着牛頓法確定的方向一維搜索最優的步長,最終選擇使得函數值最小的步長。
關於步長的搜索,主要有精確搜索和非精確搜索,上面的方法是一種精確地搜索方法,在實際中還有Wolfe型搜索,Armijo搜索以及滿足Goldstein條件的非精度搜索。具體的搜索方法大家可自行研究。
參考文獻:
[1] peghoty, http://blog.csdn.net/itplus/article/details/21896453
[2]李航,統計學習方法。