天天看點

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

本系列文章允許轉載,轉載請保留全文!

1. 用牛頓法解方程

牛頓法是一種求解方程的疊代算法,也可以用于方程組的求解。其思想是利用方程(尤其是非線性方程)的線性部分,對原方程進行近似。不失一般性,考慮方程f(x)=0。對f(x)在x=t處進行泰勒展開,可得f(x)=f(t)+f'(t)(x-t)+...

取線性部分代替f(x),帶入方程f(x)=0,可得f(t)+f'(t)(x-t)=0 ,進而解出x=t-f(t)/f'(t)。将方程的解寫為疊代形式,可以得到牛頓法的疊代公式:

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

[例]使用牛頓法解方程x3+x=2

第一步:求f(x)及f'(x),即f(x)=x3+x-2, f'(x)=3x2+1

第二步:選擇疊代初始值。初始值一般應選在解的附近,以防算法不收斂。這裡選擇x(0)=2

第三步:根據疊代公式和初始值疊代求解。疊代過程如下:

k

x(k)

f(x(k))

2.00

8.00

1

1.38

2.04

2

1.08

0.35

3

1.00

0.02

4

1.00

0.00

結論:經過4次疊代後,函數取值變為0,即原方程的根已找到。

牛頓法的收斂條件及收斂速度的分析略去。在機器學習的應用中,可以采用嘗試不同初始值的方法減少不收斂現象的發生;若牛頓法收斂,一般可以達到二階收斂的收斂速度,與梯度下降法相比,疊代次數明顯減少。

2. 用牛頓法解方程組

在本系列上一篇文章中,我們使用梯度下降法求解損失函數J的極小值;而從上面的描述來看,牛頓疊代隻是用來求解方程的根,這與多元函數的極小值又有什麼聯系呢?其實,要求多元函數的極小值,隻需令多元函數對每一個自變量的偏導數為0,并解出此時每一個自變量的取值即可。于是,多元函數極小值問題,被轉化為多元非線性方程組求解問題。

首先考慮多元函數的泰勒展開。不失一般性,以f1(x1,x2,...,xn)為例,在點(t1,t2,...,tn)的泰勒展開式如下:

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

取線性部分代替f1(x),并令其為0,有:

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

将其整理為向量形式,并分離出自變量,可以得到:( 為了簡便,以下使用f1代替f1(t1,t2,...,tn))

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

假定方程組由一系列方程{f1=0, f2=0, ..., fn=0}組成,可以将上式整理為矩陣形式:

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

上式中的n*n矩陣為雅可比矩陣(Jacobian Matrix),簡記為J(F)。同時,将自變量(x1,...,xn)記為X,将(t1,...,tn)記為T,将(f1,...,fn)記為F,則有:

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

化簡後可得:

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

将方程組的解寫為疊代形式,即可得到适用于方程組求解的牛頓法疊代公式:

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

至此可以發現,雖然牛頓法的疊代次數比梯度下降法小得多,但是在每一次疊代過程中,都需要重新計算J(F)的逆矩陣。若n為特征維數,則通常逆矩陣的計算需要Θ(n3)的時間複雜度。使用Strassen方法可以使逆矩陣計算的時間複雜度降至Θ(nlog27),也可以使用數值方法近似求解逆矩陣,但當特征維數較大時,這兩種方法仍然很慢。是以,僅在特征維數較小時,牛頓法才能夠快速收斂。特殊地,當取n=1時,上式可退化為本文第1節推導出的,用于求解單個方程的牛頓疊代公式。

3. 使用牛頓法求函數的極值

若用▽Xf(X)表示函數f(X)的梯度向量,帶入普通牛頓法疊代公式中,即可得到用于求函數極值的疊代公式:

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

考慮到:

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

疊代公式可以在形式上進一步化簡:

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

其中,H(f)表示函數f(x1,...,xn)的海森矩陣(Hessian Matrix)。

就具體問題而言,本系列上一篇文章需要求損失函數的極小值。除了之前介紹的梯度下降法之外,還可以使用本文章介紹的牛頓法。對應的疊代公式為:

python牛頓法尋找極值_Machine Learning 學習筆記 (2) —— 使用牛頓法尋找極值

4. 補充 [2015-05-07]

關于牛頓法,補充一個證明。

相信很多初學者都有這樣的疑問:為什麼牛頓法會收斂;若牛頓法收斂,為什麼能收斂到方程的一組解?

簡單起見,以牛頓法的最簡單形式x(k+1)=x(k)-f(x(k))/f'(x(k))進行讨論,同時假定x0為方程f(x)的某一單根,且f(x)在x=x0附近二階連續。不加證明的給出以下定理:(證明可參考數值分析相關教材)

局部收斂定理 設x0是方程x=g(x)的根,若g'(x)在x=x0處連續,且|g'(x0)|<1,則存在x0的某一鄰域S,使得對于任意x(0)∈S,疊代格式x(k+1)=g(x(k))收斂于x0。

在之前的假設下,對牛頓法收斂性的證明如下:

記g(x)=x-f(x)/f'(x),則有g'(x)=f(x)f''(x)/(f'(x))2,易知g'(x0)=0<1。根據局部收斂定理可知,疊代格式x(k+1)=g(x(k))收斂于x0,即x(k+1)=x(k)-f(x(k))/f'(x(k))收斂于x0。