1. 程式人生 > >Newton法(牛頓法 Newton Method)

Newton法(牛頓法 Newton Method)

平時經常看到牛頓法怎樣怎樣,一直不得要領,今天下午查了一下維基百科,寫寫我的認識,很多地方是直觀理解,並沒有嚴謹的證明。在我看來,牛頓法至少有兩個應用方向,1、求方程的根,2、最優化。牛頓法涉及到方程求導,下面的討論均是在連續可微的前提下討論。

1、求解方程。

並不是所有的方程都有求根公式,或者求根公式很複雜,導致求解困難。利用牛頓法,可以迭代求解。

原理是利用泰勒公式,在x0處展開,且展開到一階,即f(x) = f(x0)+(x-x0)f'(x0)

求解方程f(x)=0,即f(x0)+(x-x0)*f'(x0)=0,求解x = x1=x0-f(x0)/f'(x0),因為這是利用泰勒公式的一階展開,f(x) = f(x0)+(x-x0)f'(x0)處並不是完全相等,而是近似相等,這裡求得的x1並不能讓f(x)=0,只能說f(x1)的值比f(x0)更接近f(x)=0,於是乎,迭代求解的想法就很自然了,可以進而推出x(n+1)=x(n)-f(x(n))/f'(x(n)),通過迭代,這個式子必然在f(x*)=0的時候收斂。整個過程如下圖:

2、牛頓法用於最優化

在最優化的問題中,線性最優化至少可以使用單純行法求解,但對於非線性優化問題,牛頓法提供了一種求解的辦法。假設任務是優化一個目標函式f,求函式f的極大極小問題,可以轉化為求解函式f的導數f'=0的問題,這樣求可以把優化問題看成方程求解問題(f'=0)。剩下的問題就和第一部分提到的牛頓法求解很相似了。

這次為了求解f'=0的根,把f(x)的泰勒展開,展開到2階形式:

這個式子是成立的,當且僅當 Δx 無線趨近於0。此時上式等價與:

求解:

得出迭代公式:

一般認為牛頓法可以利用到曲線本身的資訊,比梯度下降法更容易收斂(迭代更少次數),如下圖是一個最小化一個目標方程的例子,紅色曲線是利用牛頓法迭代求解,綠色曲線是利用梯度下降法求解。

在上面討論的是2維情況,高維情況的牛頓迭代公式是:

其中H是hessian矩陣,定義為:

高維情況依然可以用牛頓迭代求解,但是問題是Hessian矩陣引入的複雜性,使得牛頓迭代求解的難度大大增加,但是已經有了解決這個問題的辦法就是Quasi-Newton methond,不再直接計算hessian矩陣,而是每一步的時候使用梯度向量更新hessian矩陣的近似。

   1、牛頓法應用範圍

牛頓法主要有兩個應用方向:1、目標函式最優化求解。例:已知 f(x)的表達形式,g(x)=\min\left\|{f(x)}\right\|,求 ming(x),及g(x)取最小值時的 x ?,即

                                                          由於||f(x)||通常為誤差的二範數,此時這個模型也稱為最小二乘模型,即\min\{{f^2}(x)\}

                                                      2、方程的求解(根)。例:求方程的解:g(x) = 0,求 x ?

                    這兩個應用方面都主要是針對g(x)為非線性函式的情況。2中,如果g(x)為線性情況下的求解通常使用最小二乘法求解。

                         牛頓法的核心思想是對函式進行泰勒展開。

           2、牛頓法用於方程求解

                    對f(x)進行一階泰勒公式展開:

                                              g(x){\approx}g({x_k})+g'({x_k})(x-{x_k})   (1)

                    此時,將非線性方程 g(x) = 0 近似為線性方程:

                                              g({x_k})+g'({x_k})(x-{x_k})=0   (2)

                    若 f’(x) != 0,則下一次迭代解為:

                                              {x_{k+1}}={x_k}-\frac{1}{{g'({x_k})}}g({x_k})      (3)

                    牛頓迭代示意圖(因此Newton迭代法也稱為切線法):

                                          1

          3、牛頓法用於函式最優化求解

                     對f(x)進行二階泰勒公式展開:

                                            g(x){\approx}g({x_k})+g'({x_k})(x-{x_k})+\frac{1}{2}g''({x_k}){(x-{x_k})^2}    (4)

                     此時,將非線性優化問題 min f(x) 近似為為二次函式的最優化求解問題:

                                            \min\{g({x_k})+g'({x_k})(x-{x_k})+\frac{1}{2}g''({x_k}){(x-{x_k})^2}\}    (5)

                     對於(5)式的求解,即二次函式(拋物線函式)求最小值,對(5)式中的函式求導:

                                            g'({x_k})+g''({x_k})(x-{x_k})=0    (6)

                                            \Rightarrow{x_{k+1}}={x_k}-\frac{1}{{g''({x_k})}}g'({x_k})   (7)

                     從本質上來講,最優化求解問題的迭代形式都是: {x_{k+1}}={x_k}-kg'({x_k})

                     其中k為係數,g'({x_k})為函式的梯度(即函式值上升的方向),那麼-g'({x_k})為下降的方向,

                     最優化問題的標準形式是:求目標函式最小值,只要每次迭代沿著下降的方向迭代那麼將逐漸達到最優,

                     而牛頓將每次迭代的步長定為:1/g''({x_k})

            4、補充

a、嚴格來講,在“3、牛頓法用於函式最優化求解”中對函式二階泰勒公式展開求最優值的方法稱為:Newton法

                         而在“2、牛頓法用於方程求解”中對函式一階泰勒展開求零點的方法稱為:Guass-Newton(高斯牛頓)法

                     b、在上面的陳述中,如果x是一個向量,那麼公式中:

                         g'({x_k})(x-{x_k})應該寫成:g'{({x_k})^T}(x-{x_k})g'({x_k})為Jacobi(雅克比)矩陣。

                         g''({x_k})(x-{x_k})應該寫成:{(x-{x_k})^T}g''({x_k})(x-{x_k})g''(x-{x_k})為Hessian(海森)矩陣。

                     c、牛頓法的優點是收斂速度快,缺點是在用牛頓法進行最優化求解的時候需要求解Hessian矩陣。

                         因此,如果在目標函式的梯度和Hessian矩陣比較好求的時候應使用Newton法。

                         牛頓法在進行程式設計實現的時候有可能會失敗,具體原因及解決方法見《最優化方法》-張薇 東北大學出版社 第155頁。

           5、Newton法與Guass-Newton法之間的聯絡

對於優化問題 \min\left\|{f(x)}\right\|,即\min\{{f^2}(x)\},當理論最優值為0時候,這個優化問題就變為了函式求解問題:

                                                              \min\{{f^2}(x)\}{\Rightarrow}{f^2}(x)=0{\Rightarrow}f(x)=0

結論:當最優化問題的理論最小值為0時,Newton法求解就可變為Guass-Newton法求解。

                     另外:對f(x)進行二階泰勒展開:

                                                             f(x)=f({x_k})+J{x_k}+0.5{x_k^'}H{x_k}

f(x)乘以f(x)的轉置並忽略二次以上的項:

                                   {f^T}(x)f(x)=\{{f^T}({x_k})+{(J{x_k})^T}+{(0.5{x_k^'}H{x_k})^T}\}

                                                      *\{f({x_k})+J{x_k}+0.5{x_k^'}H{x_k}\}

                                                    {\rm{=}}{f^T}({x_k})f({x_k})+2f({x_k})J{x_k}+x_k^T{J^T}J{x_k}+f({x_k})x_k^TH{x_k}

                                                    ={f^T}({x_k})f({x_k})+2f({x_k})J{x_k}+x_k^T({J^T}J+f({x_k})H){x_k}

                     因此,當{x_k}在最優解附近時,即滿足f({x_k})=0,此時可認為:H={J^T}J

            6、擴充套件閱讀

    a、修正牛頓(Newton)法

                    b、共軛方向法與共軛梯度法

                    c、擬牛頓法(避免求解Hessian矩陣):DFP演算法、BFGS演算法