很多問題最終都歸結爲求一個算式的最小值問題,比如某個問題用MAP(最大後驗概率),ML(最大似然估計)等等方式來建立數學模型,最終就歸結爲在L1或L2範數下的最小值問題,這在很多文獻中都經常碰到。而解決的方法,也不外乎幾種:牛頓法、最速下降法、共軛梯度法、高斯牛頓法等等。名字都很相似,文獻中也經常不描述具體的求解過程,往往讓人一頭霧水。今天我們就來梳理一下這些方法。
1、牛頓法
牛頓法最初是用來求解一個方程的根: f(x)=0
如上圖所示,f(x)首先可以在x0點展開成一個線性函數f(x)≈f(x0)+f'(x0)*(x-x0)
求解上述線性方程的根,得到 x1=x0-f(x0)/f'(x0),從圖示可以看出這個x1比x0更加逼近原方程的根
用此方法,不斷地迭代x(n+1)=xn-f(xn)/f'(xn),就能無限趨近於原方程的根。
在最優化方法中,我們是想求一個算式f(x)的最優值,由微積分的知識我們知道,在f(x)的極值處,f'(x)=0
爲此就可以用牛頓法來求解上述方程的根了,迭代過程爲
上面推導的是一維的情況,比較直觀,對於二維以上的情況,f'(x)演變成一個梯度向量▽f,f''(x)則演變成了一個矩陣,叫Hessian矩陣,估計大家不會陌生
此時牛頓法演變成
其中Hessian矩陣Hf(x)爲
以上步長爲1的迭代方法並不常見,常見的迭代方式是取一個小步長γ
wiki上有張圖,用來說明二維情況下牛頓法的效果。圖中紅線是牛頓法的迭代過程,綠線是梯度下降法的迭代過程。
一般認爲牛頓方法因爲用到了曲率信息(curvature,也就是二階導數),因此收斂速度比梯度下降法快得多。
(圖片來源: http://en.wikipedia.org/wiki/Newton%27s_method_in_optimization)
但在高維時,直接計算Hessian矩陣非常複雜,而且Hessian矩陣求逆也往往帶來不穩定性,導致結果不收斂。爲此有很多準牛頓法(quasi-Newton),用近似的方法來構造Hessian矩陣。而爲解決Hessian矩陣的不可逆性,也出現了很多算法,比如可以仿照Levenberg-Marquardt方法(著名的LM方法),在Hessian矩陣上再加一個加權的單位矩陣,用來保證收斂過程的穩定性。權值μ是每步可調整的,當μ很大時,算法更加接近梯度下降法;當μ很小時,算法更加接近牛頓法。
2、高斯牛頓法(Gauss-Newton Method)
(參考:http://en.wikipedia.org/wiki/Gauss%E2%80%93Newton_algorithm)
首先要明確高斯牛頓法的適用場合:它只能用於非線性最小二乘問題(can only be used to minimize a sum of squared function values)
它是在牛頓方法的基礎上改進過來的,它的優點是不需要求解二階的Hessian矩陣
同樣是採用迭代的方法,高斯牛頓法旨在尋求以下非線性最小二乘問題的最優解
其中β是一個n維向量。m≥n以保證β取值維一。
高斯牛頓方法的迭代過程爲
其中T代表矩陣轉置。Jr表示Jacobian矩陣
進一步地,如果m=n,則迭代過程中的矩陣求逆可以展開,從而迭代過程簡化爲
對於數據擬合問題,問題表述爲對模型y = f(x, β) ,求解參數β,使得實測點(xi,yi)帶入上述模型擬合時殘差最小,即
注意上式中f(x)前面有負號,所以求解參數β的迭代過程化爲
同樣地,高斯牛頓方法有時也會不穩定,不能保證收斂。這時無所不在的LM方法又出現了,假設迭代過程爲
J‘J求逆不是不穩定嗎,那我在求解的時候對它進行一點修改,求解Δ相當於解下列方程
其中D是一個正的對角陣。當D爲單位矩陣,而λ又很大時,迭代過程基本就沿着梯度下降的方向進行了。通過調整λ和D(比如通過line search),可以在收斂速度和穩定性之間找到一個平衡。
3、梯度下降法(Gradient descent)
梯度下降法大家是最熟悉的了,有時也叫最速下降法,迭代過程爲
就是說每次我都沿着最陡的方向向下走,那我每次都能下降最多,最終到達谷底(最小值點)也就越快
直觀上,梯度下降應該下降最快纔對啊,但其實不然,wiki上有幾個例子,我只挑其中一個,其他的可以自己去看(http://zh.wikipedia.org/wiki/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95)
這個例子是求以下二維函數的最大值
把梯度下降的過程畫在函數的等高線上,如下圖。
可以看到梯度下降法每兩次搜索過程之間是幾乎垂直的,這裏解釋一下。
我們平時用梯度下降法,往往爲追求簡單,步長都取一個固定值,這樣慢慢去逼近最小值。這樣,步長的取值其實是有點帶有經驗性,如果步長取得太小,收斂就很慢。步長取得太大,又容易導致振盪,在極值點附近徘徊,不收斂。正確的做法是每次步長的選擇都利用line search等方法沿着一個方向搜索,取這個方向的極值,然後確定的步長。而如果採用這種方法,對於某些函數,就會出現這種之字形的下降,導致收斂變得很慢。
由此我們可以看出梯度下降法的缺點:
1、下降過程可能會是之字形
2、直線搜索可能會出現問題
3、靠近極小值時收斂變慢
關於梯度下降和牛頓法的直觀理解,可以參考知乎上的一觀點
http://www.zhihu.com/question/19723347
爲便於直觀理解,在二維情況下來描述。牛頓法實際上相當於用二次曲面來擬合當前的局部曲面,而梯度下降法是用平面來擬合當前的局部曲面。而對於複雜的曲面,二次擬合往往比一次擬合要好。從另一個角度,梯度下降法只用到了一階導數信息,相當於往當前坡度最大的方向走一步;而牛頓法不但用到了一階導數,還用到了二階導數信息,因此比梯度下降法看得更遠,不僅會考慮坡度是否夠大,還會考慮你走了一步之後,坡度是否會變得更大,因此能更快收斂。牛頓法的缺點是初值離目標太遠時容易導致不收斂。
4、共軛梯度法
(參考了http://jacoxu.com/?p=242)
首先解釋一個名詞,共軛一般意味着正交。因此共軛梯度法我們從直觀上簡單理解,就是搜索方向互相正交的方法。
參考的這篇文章,寫得非常直觀易懂,我自知不可能寫得更好了,由於原文裏有很多公式沒法拷過來,因此用圖片將原文照搬過來
(以下圖片截自http://jacoxu.com/?p=242,版權屬於原作者)
5、LM方法(http://en.wikipedia.org/wiki/Levenberg%E2%80%93Marquardt_algorithm)
LM方法時Levenberg-Marquardt方法的簡稱,前面我們在講高斯牛頓法的時候提了一下。其實LM方法就是作爲一種高斯牛頓法的變體來用得。也只用於非線性最小二乘問題。即使下式取最小值。
按照高斯牛頓法,上述最小二乘問題的求解是一個迭代過程
而LM方法爲保證收斂性,在收斂速度方面做了一些退讓,在Jacobi矩陣的基礎上加上一個"阻尼"因子,爲此LM方法又被稱作阻尼最小二乘法
以上迭代過程的中止條件爲
1、當殘差y-f(β)的變化小於給定值時
2、當參數的變化δ小於給定值時
3、達到了迭代步數的上限值
在迭代過程中可以不斷調整λ,以優化收斂效果。
實際上以上迭代過程只是Levenberg的方法,Levenberg提出的這個方法有個缺陷,就是λ的取值很難確定,當λ取得太大時,算法基本上就是梯度下降法,收斂太慢。爲此Marquardt提出把單位矩陣I換成Jacobi矩陣的對角元素,即迭代過程化爲以下過程
嚴格地說,這纔是Levenberg-Marquardt方法。