優化演算法總結

weixin_34337265發表於2018-12-20

簡介

本文介紹一下機器學習和深度學習中常用的優化演算法和優化器以及一些其他我知道的優化演算法,部分演算法我也沒有搞懂,就先記錄下來以後慢慢研究吧.*_*.

1.梯度下降演算法(Gradient Descent)

梯度下降法可以參考我另一篇文章機器學習-線性迴歸裡的講解,這裡就不在重複敘述.這裡需要強調一下,深度學習裡常用的SGD,翻譯過來是隨機梯度下降,但是實質是mini-batch梯度下降(mini-batch-gd),或者說是兩者的結合更準確一些.

SGD的優點是,演算法簡單,計算量小,在函式為凸函式時可以找到全域性最優解.所以是最常用的優化演算法.缺點是如果函式不是凸函式的話,很容易進入到區域性最優解而無法跳出來.同時SGD在選擇學習率上也是比較困難的.

2.牛頓法

牛頓法和擬牛頓法都是求解無約束最優化問題的常用方法,其中牛頓法是迭代演算法,每一步需要求解目標函式的海森矩陣的逆矩陣,計算比較複雜.

牛頓法在求解方程根的思想:在二維情況下,迭代的尋找某一點x,尋找方法是隨機一個初始點x_0,目標函式在該點x_0的切線與x座標軸的交點就是下一個x點,也就是x_1.不斷迭代尋找x.其中切線的斜率為目標函式在點x_0的導數(梯度),切必過點(x_0,f(x_0)).所以迭代的方程式如圖1,為了求該方程的極值點,還需要令其導數等於0,也就是又求了一次導數,所以需要用到f(x)的二階導數.

3395407-af42ff348fcfb6c9.png
圖1

在最優化的問題中,牛頓法提供了一種求解的辦法. 假設任務是優化一個目標函式f, 求函式ff的極大極小問題, 可以轉化為求解函式f導數等於0的問題, 這樣求可以把優化問題看成方程求解問題(f的導數等於0). 剩下的問題就和牛頓法求解方程根的思想很相似了.

目標函式的泰勒展開式:

3395407-722cce7c189f9cbe.png
圖2

化簡後:

3395407-05ff9371b7d9cba4.png
圖3

這樣就得到了與圖1相似的公式,這裡是二維的,在多維空間上,求二階導數就是求海森矩陣,因為是分母,所以還需要求海森矩陣的逆矩陣.

牛頓法和SGD的區別:

牛頓法是二階求導,SGD是一階求導,所以牛頓法要收斂的更快一些.SGD只考慮當前情況下梯度下降最快的方向,而牛頓法不僅考慮當前梯度下降最快,還有考慮下一步下降最快的方向.

牛頓法的優點是二階求導下降速度快,但是因為是迭代演算法,每一步都需要求解海森矩陣的逆矩陣,所以計算複雜.

3.擬牛頓法(沒搞懂,待定)

考慮到牛頓法計算海森矩陣比較麻煩,所以它使用正定矩陣來代替海森矩陣的逆矩陣,從而簡化了計算過程.

常用的擬牛頓法有DFP演算法和BFGS演算法.

4.共軛梯度法(Conjugate Gradient)

共軛梯度法是介於最速下降法與牛頓法之間的一個方法,它僅需利用一階導數資訊,但克服了最速下降法收斂慢的缺點,又避免了牛頓法計算海森矩陣並求逆的缺點.共軛梯度法不僅是解決大型線性方程組最有用的方法之一,也是解大型非線性最優化最有效的演算法之一.

5.拉格朗日法

參考SVM裡的講解機器學習-SVM

6.動量優化法(Momentum)

動量優化法主要是在SGD的基礎上,加入了歷史的梯度更新資訊或者說是加入了速度更新.SGD雖然是很流行的優化演算法,但是其學習過程很慢,因為總是以同樣的步長沿著梯度下降的方向.所以動量是為了加速學習的方法.

3395407-9c4eaec9b8c5fd1b.png
圖4

其中第一行的減號部分是計算當前的梯度,第一行是根據梯度更新速度v,而α是新引進的引數,在實踐中,α的一般取值為 0.5,0.9 和 0.99.和學習率一樣,α 也會隨著時間不斷調整.一般初始值是一個較小的值,隨後會慢慢變大.

7.Nesterov加速梯度(NAG, Nesterov accelerated gradient)

NAG是在動量優化演算法的基礎上又進行了改進.根據下圖可以看出,Nesterov 動量和標準動量之間的區別體現在梯度計算上, Nesterov 動量中,梯度計算在施加當前速度之後.因此,Nesterov 動量可以解釋為往標準動量方法中新增了一個校正因子

3395407-8708613c19caac0a.png
圖5

8.AdaGrad演算法

AdaGrad演算法,自適應優化演算法的一種,獨立地適應所有模型引數的學習率,縮放每個引數反比於其所有梯度歷史平均值總和的平方根.具有代價函式最大梯度的引數相應地有個快速下降的學習率,而具有小梯度的引數在學習率上有相對較小的下降.通俗一點的講,就是根據實際情況更改學習率,比如模型快要收斂的時候,學習率步長就會小一點,防止跳出最優解.

3395407-ac3587be0cde7588.png
圖6

其中g是梯度,第一行的分母是計算累計梯度的平方根,是為了防止分母為0加上的極小常數項,α是學習率.

Adagrad的主要優點是不需要人為的調節學習率,它可以自動調節.但是依然需要設定一個初始的全域性學習率.缺點是隨著迭代次數增多,學習率會越來越小,最終會趨近於0.

9.RMSProp演算法

RMSProp修改 AdaGrad 以在非凸設定下效果更好,改變梯度積累為指數加權的移動平均.AdaGrad旨在應用於凸問題時快速收斂.

10.AdaDelta演算法

11.Adam演算法

Adam是Momentum和RMSprop的結合體,也就是帶動量的自適應優化演算法.

12.Nadam演算法

13.模擬退火演算法

14.蟻群演算法

15.遺傳演算法

總結:

動量是為了加快學習速度,而自適應是為了加快收斂速度,注意學習速度快不一定收斂速度就快,比如步長大學習速度快,但是很容易跳出極值點,在極值點附近波動,很難達到收斂.

未完待定....

參考:

《統計學習方法》  李航    著

《深度學習》  花書

相關文章