1. 程式人生 > >理解迭代法和優化基礎

理解迭代法和優化基礎

轉自http://blog.csdn.net/xietingcandice/article/details/44623069

個人理解因為其實無論什麼機器學習演算法,最終都要求助於計算機解決,它又表現為在特定函式空間按某優化目標去搜索一個解出來衡量指標就有誤差最小還是效能指標最大吧?那你怎麼求它的最小還是最大呢?求導,有拉格朗日?是沒錯,但他們能使用的本質條件是什麼?是這些誤差函式或者效能函式有解析式的時候。但是世界很多訊號都是非平穩的,或者很難知道其統計特性的,這時候就沒法得到其準確的解析式了,那這時候怎麼找最大或者最小值啊。迭代?什麼是迭代?

這裡就這涉及到找最大值和最小值,梯度就是類似於在等高線的位置的垂直方向是上升或者下降最塊的方向,沿著這個方向最快達到最大最小值,每一次走的距離就是步長,這裡就是

梯度上升和梯度下降的演算法。一般最小化損失函式利用梯度下降,最大化似然概率利用梯度上升,上升的方法可以類似概率論統計理論。但是如果處理非線性的複雜問題,梯度上升,下降可以帶來以下幾種情況:

靠近極值點的時候迭代次數變慢

出現Z字形變化

  如果你在山腳,看到了山頂,你就不管三七二十一了,直接就往山頂那個方向不要命的衝,直到到達山頂。這個

就是牛頓迭代法

總結來說就是:

要求一個f(x) = 0,首先確定一個初始的解x0,然後獲得一個迭代方程,通過Xn-1推匯出Xn,然後當這兩個值得誤差小於一定得資料的時候就可以判斷為收斂

在確定收斂方程的時候,有兩種思路:一個是利用一階泰勒展開,一個是幾何上的求切線的方法

 如下圖,已知(x0,y0) ,我們通過對f(x0)做切線,得到切線與x軸的交點(x1,0),然後根據(x1,f(x1))繼續遞推得到(x2,f(x2)):

                                      

 那麼對已知的(x0,y0),我們可以得到斜率:f'(x0)和點(x0,y0),那麼我們可以得到直線:y-f(x0)=f'(x0)(x-x0)。再令y=0,我們可以得到:f(x)=x0-f(x0)/f'(x0)。其實我們已經得到了與泰勒級數展開相同的迭代公式。

對初值clip_image002[6]的選取要求較高。一般的,Newton迭代法只有區域性收斂性,當初值clip_image002[7]在收斂區間裡時,收斂速度很快(平方收斂)。但初值clip_image002[8]離方程根x*較遠時,不能保證Newton迭代法收斂。


這裡為了使Xn能夠更快進入收斂區間有牛頓下山法

clip_image008[8] clip_image010[4]稱為下山因子

具體做法如下:

1. 選取初值clip_image002[17] 
2. 取下山因子clip_image012[4](可修改) 
3. 計算clip_image008[9] 
4. 計算clip_image014[4]並比較clip_image016[4]clip_image018的大小: 
clip_image020,則 
         1) 當clip_image022時,取clip_image024,結束; 
         2) 當clip_image026時,將clip_image028作為新的clip_image006[10]值繼續計算; 
clip_image030,則取clip_image032,返回3。

下面結合介紹牛頓法用於最優化的問題:

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

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

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

求解:

得出迭代公式:

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

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

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

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

如果你在山腳開始,每爬一小段,然後下一步的方向你就隨便蒙,聽天由命,因為你相信,上帝會把你帶到山頂的(上帝就是那個操縱概率的手),這個就是隨機搜尋演算法

       好了,當你歷經千辛萬苦爬上一個山頂的時候,發現還有更高的山頂,但沒辦法啊,如果想到那個更高的山頂,你就得先下坡,再爬上那個山頂。這時候,有些人就滿足了,看到了他想看到的美景,樂於他的區域性最大值,不想折騰了。但有些人就不滿足,你渴望那種“山頂絕頂我為峰,一覽眾山小”的心境,所以你就縱身一跳,滾到了山腳,如果你好運,那你就滾到了那個最高山頂的山腳,這時候,你再往上爬,就可以到達最高峰了。這個就是避免陷於區域性最大值,尋找全域性最大值的演算法,叫模擬退火或者衝量等等。

爬山法是完完全全的貪心法,每次都鼠目寸光的選擇一個當前最優解,因此只能搜尋到區域性的最優值。模擬退火其實也是一種貪心演算法,但是它的搜尋過程引入了隨機因素。模擬退火演算法以一定的概率來接受一個比當前解要差的解,因此有可能會跳出這個區域性的最優解,達到全域性的最優解。以圖1為例,模擬退火演算法在搜尋到區域性最優解A後,會以一定的概率接受到E的移動。也許經過幾次這樣的不是區域性最優的移動後會到達D點,於是就跳出了局部最大值A。

模擬退火演算法描述:

         若J( Y(i+1) )>= J( Y(i) )  (即移動後得到更優解),則總是接受該移動

         若J( Y(i+1) )< J( Y(i) )  (即移動後的解比當前解要差),則以一定的概率接受移動,而且這個概率隨著時間推移逐漸降低(逐漸降低才能趨向穩定)

  這裡的“一定的概率”的計算參考了金屬冶煉的退火過程,這也是模擬退火演算法名稱的由來。

  根據熱力學的原理,在溫度為T時,出現能量差為dE的降溫的概率為P(dE),表示為:

    P(dE) = exp( dE/(kT) )

  其中k是一個常數,exp表示自然指數,且dE<0。這條公式說白了就是:溫度越高,出現一次能量差為dE的降溫的概率就越大;溫度越低,則出現降溫的概率就越小。又由於dE總是小於0(否則就不叫退火了),因此dE/kT < 0 ,所以P(dE)的函式取值範圍是(0,1) 。

  隨著溫度T的降低,P(dE)會逐漸降低。

  我們將一次向較差解的移動看做一次溫度跳變過程,我們以概率P(dE)來接受這樣的移動。

  關於爬山演算法與模擬退火,有一個有趣的比喻:

  爬山演算法:兔子朝著比現在高的地方跳去。它找到了不遠處的最高山峰。但是這座山不一定是珠穆朗瑪峰。這就是爬山演算法,它不能保證區域性最優值就是全域性最優值。

  模擬退火:兔子喝醉了。它隨機地跳了很長時間。這期間,它可能走向高處,也可能踏入平地。但是,它漸漸清醒了並朝最高方向跳去。這就是模擬退火。

模擬退火演算法是一種隨機演算法,並不一定能找到全域性的最優解,可以比較快的找到問題的近似最優解。 如果引數設定得當,模擬退火演算法搜尋效率比窮舉法要高。
總結出尋找最優值的三個主要因素是:

1 迭代方向

2 迭代步長

3 區域性最大或者是全域性最大,其中的轉化代價有多大

下面補充講解一些基礎知識:

小總結就是:

  1.  凸函式:

              凸函式有很多優良的特性,而且在求解極大值極小值時,十分有用。先看一下凸函式的定義:凸函式:在函式的區間I上,若對任意x1和x2,任意0<t<1,都有

                                    

             或者對任意x1,x2都有:

                                  

             凸函式有很多優良的:

                        1. 凸函式任何極小值也是最小值。

                        2. 一元二階的函式在區間上是凸的,當且僅當它的二階倒數是非負的;如果一個函式的二階導數是正數,那麼函式也就是嚴格凸的。反過來不成立。多元二次可微的連續函式在凸集上是可微的,當且僅當它的hessian矩陣在凸集內部是半正定的(這裡還不是很理解,還需要繼續加強)。

                        3.   對於凸函式f,水平子集{x| f(x) <=a}和{x|f(x)<=a}是凸集。然而,水平子集是凸集的函式不一定是凸函式;這樣的函式被稱為擬凸函式。

                        4.  凸函式的求和、最大也是凸函式;如果g(x)是遞增的,那麼g(f(x))仍然是凸函式。

    2.  hessian矩陣:

              hessian(海瑟矩陣)就是所謂的二階偏倒矩陣。對於一個臨界點有一階偏導等於零,然而憑藉一階偏導數無法確定這個點是鞍點、區域性極大點還是區域性極小點。而hessian矩陣可以回答這個問題。

                             

             若x0是f(x)的極值點,如果存在,則進一步設在一個鄰域內所有二階導數連續,H為在點x0的海瑟矩陣。而且

x0是f(x)的極小值點時H>=0,即H的特徵根均為非負

x0是f(x)的極大值點,H<=0, 即H的特徵根均為非負

H>0,即H為正定矩陣,x0是f(x)的極小值點

H<0,即H為負定矩陣,x0是f(x)的極大值點;

H的特徵值有正有負,x0不是f(x)的極值點。

    3.  正定矩陣:

             設M是n階方陣,如果對任何非零變數z,都有z'Mz>0,其中z'表示z的轉置,就稱M正定矩陣。

             判定定理1:矩陣A的特徵值全為正。

             判定定理2:A的各階主子式為正。

             判定定理3:A合同於單位陣。

    4.  泰勒展開:

             泰勒公式可以用若干項加一起來表示一個函式。對於正整數n,若函式f(x)在閉區間[a,b]上n階可導,切在(a,b)上面n+1階可導數。任取a<=x<=b,則有:

             

            拉格朗日餘數:

            

            請注意:泰勒展開在很多地方都有重要的應用,例如開方的計算。這裡新增上牛頓迭代和泰勒級數展開求解根號的計算過程。另外我一直以為泰勒級數和牛頓迭代有一定關係,後來發現好像沒有,不過可以把牛頓迭代看做僅取泰勒級數的一階展開。

            1). 使用泰勒級數求解根號2。此時我們可以得到f(x)=x^2-2;

                        取泰勒級數前兩項,我們可以得到: f(x)=f(a) + f'(a)(x-a),令f(x)=0我們可以得到:

                         x=a-f(a)/f'(a); 其實我們可以把x看做是f(x)=0的解,使用這個式子多次迭代就可以得到根號的值。使用x(n+1)替換x,x(n)替換a,我們就可以得到:x(n+1)=x(n)-f(x(n))/f'(x(n))=x(n)-(x(n)^2-2)/2*x(n).

            2). 牛頓迭代法:

     5.  拉格朗日乘子:

             拉格朗日乘子,就是求函式f(x1,x2,....)在g(x1,x2,....)=0的約束條件下的極值的方法。主要思想是通過引入一個新的引數λ,將約束條件和原函式聯絡到一起,從而求出原函式極值的各個變數的解。假設需要求極值的目標函式f(x,y),約束條件為φ(x,y)=M,然後我們得到新的函式: F(x,y,λ)=f(x,y)+λg(x,y),將新函式分別對x,y, λ求解即可得到原函式的極值。