常用的優化方法總結

很多問題最終都歸結爲求一個算式的最小值問題,比如某個問題用MAP(最大後驗概率),ML(最大似然估計)等等方式來建立數學模型,最終就歸結爲在L1或L2範數下的最小值問題,這在很多文獻中都經常碰到。而解決的方法,也不外乎幾種:牛頓法、最速下降法、共軛梯度法、高斯牛頓法等等。名字都很相似,文獻中也經常不描述具體的求解過程,往往讓人一頭霧水。今天我們就來梳理一下這些方法。

1、牛頓法

牛頓法最初是用來求解一個方程的根: f(x)=0

Ganzhi001.jpg

如上圖所示,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的迭代方法並不常見,常見的迭代方式是取一個小步長γ

\mathbf{x}_{n+1} = \mathbf{x}_n - \gamma[H f(\mathbf{x}_n)]^{-1} \nabla f(\mathbf{x}_n).


wiki上有張圖,用來說明二維情況下牛頓法的效果。圖中紅線是牛頓法的迭代過程,綠線是梯度下降法的迭代過程。

一般認爲牛頓方法因爲用到了曲率信息(curvature,也就是二階導數),因此收斂速度比梯度下降法快得多。


(圖片來源: http://en.wikipedia.org/wiki/Newton%27s_method_in_optimization)

但在高維時,直接計算Hessian矩陣非常複雜,而且Hessian矩陣求逆也往往帶來不穩定性,導致結果不收斂。爲此有很多準牛頓法(quasi-Newton),用近似的方法來構造Hessian矩陣。而爲解決Hessian矩陣的不可逆性,也出現了很多算法,比如可以仿照Levenberg-Marquardt方法(著名的LM方法),在Hessian矩陣上再加一個加權的單位矩陣\mu \mathbf I,用來保證收斂過程的穩定性。權值μ是每步可調整的,當μ很大時,算法更加接近梯度下降法;當μ很小時,算法更加接近牛頓法。


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矩陣

同樣是採用迭代的方法,高斯牛頓法旨在尋求以下非線性最小二乘問題的最優解

S(\boldsymbol \beta)= \sum_{i=1}^m r_i(\boldsymbol \beta)^2.

其中β是一個n維向量。m≥n以保證β取值維一。

高斯牛頓方法的迭代過程爲

\boldsymbol \beta^{(s+1)} = \boldsymbol \beta^{(s)} - \left(\mathbf{J_r}^\mathsf{T} \mathbf{J_r} \right)^{-1} \mathbf{ J_r} ^\mathsf{T} \mathbf{r}(\boldsymbol \beta^{(s)})

其中T代表矩陣轉置。Jr表示Jacobian矩陣

(\mathbf{J_r})_{ij} = \frac{\partial r_i (\boldsymbol \beta^{(s)})}{\partial \beta_j},


進一步地,如果m=n,則迭代過程中的矩陣求逆可以展開,從而迭代過程簡化爲

\boldsymbol \beta^{(s+1)} = \boldsymbol \beta^{(s)} - \left( \mathbf{J_r} \right)^{-1} \mathbf{r}(\boldsymbol \beta^{(s)})


對於數據擬合問題,問題表述爲對模型y = f(xβ) ,求解參數β,使得實測點(xi,yi)帶入上述模型擬合時殘差最小,即

r_i(\boldsymbol \beta)= y_i - f(x_i, \boldsymbol \beta).

注意上式中f(x)前面有負號,所以求解參數β的迭代過程化爲

\boldsymbol \beta^{(s+1)} = \boldsymbol \beta^{(s)} + \left(\mathbf{J_f}^\mathsf{T} \mathbf{J_f} \right)^{-1} \mathbf{ J_f} ^\mathsf{T}\mathbf{r}(\boldsymbol \beta^{(s)}).

同樣地,高斯牛頓方法有時也會不穩定,不能保證收斂。這時無所不在的LM方法又出現了,假設迭代過程爲

\boldsymbol{\beta}^{(s+1)} = \boldsymbol\beta^{(s)}+\Delta;\quad \Delta = -\left( \mathbf{J_r}^\mathsf{T}\mathbf{J_r} \right)^{-1} \mathbf{J_r}^\mathsf{T}\mathbf{r}.

J‘J求逆不是不穩定嗎,那我在求解的時候對它進行一點修改,求解Δ相當於解下列方程

\left(\mathbf{J^TJ+\lambda D}\right)\Delta=-\mathbf{J}^T \mathbf{r}

其中D是一個正的對角陣。當D爲單位矩陣,而λ又很大時,迭代過程基本就沿着梯度下降的方向進行了。通過調整λ和D(比如通過line search),可以在收斂速度和穩定性之間找到一個平衡。


3、梯度下降法(Gradient descent)

梯度下降法大家是最熟悉的了,有時也叫最速下降法,迭代過程爲

\mathbf{x}_{n+1}=\mathbf{x}_n-\gamma_n \nabla F(\mathbf{x}_n),\ n \ge 0.

就是說每次我都沿着最陡的方向向下走,那我每次都能下降最多,最終到達谷底(最小值點)也就越快

直觀上,梯度下降應該下降最快纔對啊,但其實不然,wiki上有幾個例子,我只挑其中一個,其他的可以自己去看(http://zh.wikipedia.org/wiki/%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E6%B3%95)

這個例子是求以下二維函數的最大值

F(x,y)=\sin\left(\frac{1}{2} x^2 - \frac{1}{4} y^2 + 3 \right) \cos(2 x+1-e^y)

把梯度下降的過程畫在函數的等高線上,如下圖。

The gradient descent algorithm in action. (1: contour)

可以看到梯度下降法每兩次搜索過程之間是幾乎垂直的,這裏解釋一下。

我們平時用梯度下降法,往往爲追求簡單,步長都取一個固定值,這樣慢慢去逼近最小值。這樣,步長的取值其實是有點帶有經驗性,如果步長取得太小,收斂就很慢。步長取得太大,又容易導致振盪,在極值點附近徘徊,不收斂。正確的做法是每次步長的選擇都利用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方法就是作爲一種高斯牛頓法的變體來用得。也只用於非線性最小二乘問題。即使下式取最小值。

S(\boldsymbol \beta) = \sum_{i=1}^m [y_i - f(x_i, \ \boldsymbol \beta) ]^2

按照高斯牛頓法,上述最小二乘問題的求解是一個迭代過程

\mathbf{(J^{T}J)\boldsymbol \delta  = J^{T} [y - f(\boldsymbol \beta)]} \!

而LM方法爲保證收斂性,在收斂速度方面做了一些退讓,在Jacobi矩陣的基礎上加上一個"阻尼"因子,爲此LM方法又被稱作阻尼最小二乘法

\mathbf{(J^{T}J + \lambda I)\boldsymbol \delta  = J^{T} [y - f(\boldsymbol \beta)]}\!

以上迭代過程的中止條件爲

1、當殘差y-f(β)的變化小於給定值時

2、當參數的變化δ小於給定值時

3、達到了迭代步數的上限值

在迭代過程中可以不斷調整λ,以優化收斂效果。

實際上以上迭代過程只是Levenberg的方法,Levenberg提出的這個方法有個缺陷,就是λ的取值很難確定,當λ取得太大時,算法基本上就是梯度下降法,收斂太慢。爲此Marquardt提出把單位矩陣I換成Jacobi矩陣的對角元素,即迭代過程化爲以下過程

\mathbf{(J^T J + \lambda\, diag(J^T J))\boldsymbol \delta  = J^T [y - f(\boldsymbol \beta)]}\!

嚴格地說,這纔是Levenberg-Marquardt方法。

發佈了27 篇原創文章 · 獲贊 14 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章