數學分析|最優化——梯度下降法、牛頓法、擬牛頓法等

1.最優化問題分類

按照約束條件分,可以分爲:無約束優化問題、有不等式優化問題、有不等式優化問題。

按照是否線性,可以分爲線性優化問題(目標函數和約束均線性)、非線性優化問題(目標函數和約束中任意部分非線性)。

按是否凸,可以分爲凸優化問題、非凸優化問題。

對於有約束優化問題,常見的做法是轉換到無約束問題上:對於只有等式約束的問題,通過拉格朗日乘子轉換;對於有不等式約束的問題,通過KKT條件進行轉換。

對於凸優化問題來說,只有一個全局最優點,沒有局部最優點;對於非凸問題來說,有多個局部最優點。

對於最優化問題的求解,可以分爲兩大類算法:

  1. 基於梯度的精確搜索算法
  2. 基於經驗的啓發式算法(或者叫智能算法)

前者包含梯度下降法、牛頓法、擬牛頓法等;後者包含爬山法、遺傳算法、模擬退火算法、粒子羣算法、蟻羣算法等。

以下內容主要介紹前者。

2.梯度下降法

2.1.梯度下降法

基於梯度的迭代算法思路是:再當前迭代位置上,找到一個使目標函數值變小的方向,並且在這個方向上移動一定距離,找到下一個迭代位置。梯度下降法的做法最爲簡單,直接以梯度方向的方向爲下降方向,人工設定步長,完成迭代。公式如下:

2.2.梯度下降法爲什麼work

前面說過,基於梯度的迭代算法的思路是找到一個使目標函數值減小的方向,在這個方向上移動。那麼梯度的負方向爲什麼可以滿足這個條件呢?

考慮當前迭代位置xkxk,下一個迭代位置爲xk+αdxk+αd。其中αα爲搜索步長,dd爲搜索方向向量,其長度爲單位向量。由泰勒公式可知:

可知,當dd與∇wf(xk)∇wf(xk)反向時,f(xk+αd)f(xk+αd)能取得極小值。 

2.3.次梯度下降法

梯度下降法的計算中使用了梯度,也就是潛在要求目標函數在迭代位置可導。

但是實際上目標函數不一定滿足此要求,比如目標函數爲分段函數,或者maxmax函數。此時需要使用次梯度下降法。

具體內容參考:http://www.hanlongfei.com/convex/2015/10/02/cmu-10725-subgradidient/

3.深度學習中的梯度下降法變體

3.1.梯度下降法的缺點

總地來說,梯度下降算法有如下缺點:

  1. 局部位置的梯度方向可能並不是全局最速下降方向,這樣就會導致收斂緩慢
  2. 迭代步長不好設置,大步長可能導致震盪,小步長可能導致收斂緩慢;步長是全局的,對於所有維度一致,但是不同維度的數據分佈不一致,不應該有同等的下降速度
  3. 對於非凸問題,梯度下降可能進入局部最優無法跳出

3.2.深度學習中的優化算法總覽

對於以上問題,一系列梯度下降算法的變體被提出以解決問題。大致可以分爲兩個方向:

  1. 優化下降方向,包括Momentum算法、NAG算法等;
  2. 優化每個維度上下降的步長,包括AdaGrad算法、RMSProp算法、AdaDelta算法等。

目前最常用的算法,是結合以上兩者優點的Adam算法和Nadam算法。如下圖所示(這裏的公式和以上公式和上面公式符號不一致,因爲以下公式是從別的地方拷貝的,公式輸入太累了,偷懶一下):

3.3.Momentum算法

Momentum算法的出發點是:如果梯度比較扭曲(前一個梯度和後一個梯度差別較大),那麼梯度下降就會走折線,來回震盪。如果在梯度下降過程可以加入慣性,利用之前的動量繼續往山下滾,這樣就可以減少震盪。這裏的慣性,就是加權後的歷史梯度值,這裏用VtVt表示。其更新公式如下:

Momentum算法可以理解爲用來解決梯度下降算法的第1個缺點。 

3.4.NAG算法

對於梯度下降的第3個問題,迭代陷入局部的問題。NAG(Nesterov accelerated gradient)算法可能有助於緩解。NAG在Momentum的基礎上,在計算當前梯度的時候,不是站在當前位置上看,而是繼續向前跑了當前動量那麼長的距離。這樣跑的遠也就看得遠。其更新公式如下:

3.5.AdaGrad算法

對於梯度下降的第2個問題,一種可行的思路是:經常更新的參數,我們已經積累了大量關於它的知識,不希望被單個樣本影響太大,希望學習速率慢一些;對於偶爾更新的參數,我們瞭解的信息太少,希望能從每個偶然出現的樣本身上多學一些,即學習速率大一些。這也就是AdaGrad算法的思路。其更新公式如下:

這裏可以看出Gt是遞增的,而且可能是比較快的遞增,然後就會導致後續的步長很小趨向於0,最後thetatheta就不會更新了。 

3.6.RMSProp算法

基於以上問題,RMSProp算法被提出來:通過折扣係數,降低歷史更新帶來的影響,從而解決後續步長趨向於0的問題。其更新公式是:

3.7.AdaDelta算法

類似於RMSProp的AdaDelta算法更新公式如下:

3.8.Adam算法

在出現了以上算法以後,結合以上算法優點的算法就自然地被提了出來。Adam算法結合了Momentum和RMSProp算法,其更新公式如下:

類似地,還有結合了NAG和RMSProp的優點的Nadam。 

3.9.優化算法的再說明

貼一個以上算法(缺Adam)的一個實驗效果圖:

目前來看,Adam儼然是最優的梯度下降算法了,但是據很多大神說,對於Adam的批評也很多。觀其原因,大概是因爲對於具體數據集,細緻調參的梯度下降算法,其結果可能優於Adam。

3.牛頓法

梯度下降法只使用了一階梯度信息,導致其下降方向可能並非全局最優。牛頓法利用二階梯度信息,得到一個收斂更快的方向方法。根據泰勒展開有:

其中,gk表示f(xk)在當前位置的一階導;H表示海森矩陣。以上公式省略了高階無窮小項。對以上公式,左右求導,並令兩邊等於0(在導數爲0處取最小值),可以得到:

 

4.擬牛頓法

在牛頓法中,需要計算海森矩陣的逆矩陣H−1,這裏有兩個問題:

  1. 逆矩陣計算量太大,o(n3),其中nn爲維度;
  2. 逆矩陣可能非正定,這樣更新方向可能並不會讓目標函數值變小。

爲了解決以上問題,出現了擬牛頓法。擬牛頓法的思路是,用一個滿足更新條件的正定矩陣,去替換逆矩陣,從而減少計算量,並保證更新正常。這裏的更新條件是:

4.1.DFP算法

DFP中,考慮Gk作爲(1)中Hk−1的近似,把Gk+1拆解成:

 

4.2.BFGS算法

BFGS中,考慮Bk作爲(2)中Hk的近似,同樣地把Bk+1拆解成:

5.共軛梯度法

共軛梯度法是介於最速下降法與牛頓法之間的一個方法。它僅需利用一階導數信息,既克服了最速下降法收斂慢的缺點,又避免了牛頓法需要存儲和計算Hesse矩陣並求逆的缺點。共軛梯度法優點是所需存儲量小,具有步收斂性,穩定性高,而且不需要任何外來參數。具體的實現步驟請參加wiki百科共軛梯度法。下圖爲共軛梯度法和梯度下降法搜索最優解的路徑對比示意圖:

6.信賴域算法

這個算法在強化學習中被用到了,也就是所謂的TRPO算法。

其思想是在每次迭代中給出一個信賴域,這個信賴域一般是當前迭代點的一個小鄰域。

然後,在這個鄰域內求解一個子問題,得到試探步長,接着用某一評價函數來決定是否接受該試探步以及確定下一次迭代的信賴域。新的信賴域的大小取決於試探步的好壞。如果試探步較好,在下一步信賴域擴大或者保持不變,否則減小信賴域。

7.啓發式算法

啓發式方法指人在解決問題時所採取的一種根據經驗規則進行發現的方法。

其特點是在解決問題時,利用過去的經驗,選擇已經行之有效的方法,而不是系統地、以確定的步驟去尋求答案。

啓發式優化算法包括爬山法、模擬退火方法、遺傳算法、蟻羣算法以及粒子羣算法等。

8.參考博客

https://www.cnblogs.com/ai1024/p/7679161.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章