本系列文章允許轉載,轉載請保留全文!
【請先閱讀】【說明&總目錄】http://www.cnblogs.com/tbcaaa8/p/4415055.html
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)。將方程的解寫為迭代形式,可以得到牛頓法的迭代公式:
[例]使用牛頓法解方程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)) |
0 | 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)的泰勒展開式如下:
取線性部分代替f1(x),並令其為0,有:
將其整理為向量形式,並分離出自變量,可以得到:( 為了簡便,以下使用f1代替f1(t1,t2,...,tn) )
假定方程組由一系列方程{f1=0, f2=0, ..., fn=0}組成,可以將上式整理為矩陣形式:
上式中的n*n矩陣為雅可比矩陣(Jacobian Matrix),簡記為J(F)。同時,將自變量(x1,...,xn)記為X,將(t1,...,tn)記為T,將(f1,...,fn)記為F,則有:
化簡后可得:
將方程組的解寫為迭代形式,即可得到適用於方程組求解的牛頓法迭代公式:
至此可以發現,雖然牛頓法的迭代次數比梯度下降法小得多,但是在每一次迭代過程中,都需要重新計算J(F)的逆矩陣。若n為特征維數,則通常逆矩陣的計算需要Θ(n3)的時間復雜度。使用Strassen方法可以使逆矩陣計算的時間復雜度降至Θ(nlog27),也可以使用數值方法近似求解逆矩陣,但當特征維數較大時,這兩種方法仍然很慢。因此,僅在特征維數較小時,牛頓法才能夠快速收斂。特殊地,當取n=1時,上式可退化為本文第1節推導出的,用於求解單個方程的牛頓迭代公式。
3. 使用牛頓法求函數的極值
若用▽Xf(X)表示函數f(X)的梯度向量,帶入普通牛頓法迭代公式中,即可得到用於求函數極值的迭代公式:
考慮到:
迭代公式可以在形式上進一步化簡:
其中,H(f)表示函數f(x1,...,xn)的海森矩陣(Hessian Matrix)。
就具體問題而言,本系列上一篇文章需要求損失函數的極小值。除了之前介紹的梯度下降法之外,還可以使用本文章介紹的牛頓法。對應的迭代公式為:
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。