一、算法簡述
- Momentum(動量法):模擬物理動量的概念,積累之前的動量來替代真正的梯度
- Adagrad(Adaptive Gradient):每個參數反比於歷史梯度平方總和的平方根
- RMSprop(Root Mean Squared propagation):AdaGrad的升級(將梯度積累替換爲Running Average)
- Adam(Adaptive Moment Estimation):Momentum+ RMSProp + Bias Correction(偏差修正)
- 好了,說了一大堆,我們來看看這幾個算法之間的關係(發展歷史)
二、梯度下降的三種常用方式(不作爲重點)
(備註:如果熟悉可跳過)
1. Batch Gradient Descent
- 定義:BGD其實就是標準的梯度下降,沒有任何優化(naked guy)
- 優點:可保證每一次更新權重(weights)都能降低損失函數,並且可充分利用向量運算的優點
- 缺點:當我們有一個非常龐大的數據集時,運算會非常緩慢;不支持在線學習(Online Learning)
- 適用場景:在實際運用中已經不常用了,目前應用的都是基於龐大數據集的情況。(優勝劣汰)
2. Stochastic Gradient Descent
- 定義:隨機梯度下降算法,每次訓練迭代利用單個樣本。
- 優點:訓練速度非常快,可能整個數據集還沒遍歷完算法就已經收斂了。
- 缺點:收斂性能不太好。從迭代次數上看,SGD下降的迭代次數很多,在解空間搜索比較盲目,這使得它每次更新並不是朝着最優化方向進行,這是由於每個樣本中存在的差異性以及各種問題所導致的;容易陷入鞍點(關於鞍點問題,在這裏不討論)。
- 適用場景:在線學習及其他,在實際中很常用。
3. Mini-batch Gradient Descent
- 定義:小批量梯度下降,這個算法介於上面兩者中間,需要事先定義mini-batch size,算法性能很好
- 特點:一方面減少了梯度下降的盲目性,另一方面減少了BGD中存在的計算量大的問題。
4. 三種方式的直觀對比
備註:由於論文中經常用SGD,下面就用SGD形式做討論
三、算法解讀(重點來了)
(1).Momentum算法(指數加權平均思想)
- 修改含義:將藍色替換爲紅色下劃線。
1. 特點
- 總是比BGD運行的效率好
2. 優化原理
(下面是SGD的迭代過程,紅色點是最優點)
- Momentum是通過減少搖擺方向的梯度來優化梯度下降的。
- 在上圖中我們考慮兩個方向上的優化:W,b。其中W待變橫軸方向的梯度,b代表縱軸方向的梯度。我們想要的結果是縱向減少擺幅,橫向加快移動。那我們就來看看Momentum是如何實現的。
- Momentum利用指數加權平均的思想:在當前迭代過程中充分考慮了之前的梯度,然後加權平均。這樣做的好處是:通過平均當前和過去的梯度,減緩了縱軸(搖擺方向)的搖擺幅度,而在橫軸方向,所有的梯度都指向了最優化方向,所以橫軸的梯度值依然會很大(算法的倒數第三行解釋了這一概念,對應的思想恰恰就是指數加權平均)。
- Momentum中含有兩個超參數(Hyper-parameter):學習率epsilon、動量參數 α。(論文中指出α=0.9是一個很好的魯棒數,epsilon=0.001是個建議值)
- 最後直觀理解一下Momentum “動量” 的含義,這有助於梯度下降跳出鞍點(Saddle point)
- 想象一下,一個小車從高坡上衝下來,他不會停在最低點,因爲他還有一個動量,還會向前衝,甚至可以衝過一些小的山丘,如果面對的是較大的坡,他可能爬不上去,最終又會倒車回來,摺疊幾次,停在谷底。
- 如果使用的是梯度下降,則會停在鞍點。
(2)Adagrad算法
1. 特點:
- AdaGrad算法獨立地適應所有模型參數的學習率,縮放每個參數反比於其所有梯度歷史平方值總和的平方根,學習率單調遞減,訓練後期學習率非常小。因此該算法適合稀疏梯度的學習。
- 從公式(倒數第三行)可以看出,Adagrad算法中有自適應調整梯度的意味(adaptive gradient)
2. 優化原理
- 如果目標函數有關自變量中某個元素的偏導數g一直都較大,那麼該元素的學習率epsilon 將下降較快(在最後更新參數向量時除以一個很大的數字,所以會降低這個維度方向上的訓練進度,這個方向的梯度可能是震盪的,希望震盪小一點);
- 反之,某個元素的偏導數一直較小,則該元素的學習率下降較慢(更新參數向量時除以一個很小的數字,從而加速了在小梯度維度上的學習速度)
3. 存在的問題
- 由於全局學習速率epsilon除以的是累加梯度的平方,到後面累加的比較大時,會導致每次的學習率逐漸減小,導致梯度更新緩慢,最終可能會導致訓練中後期就停止迭代了。
- 不適用於非凸函數,當到達一個局部極值點時,會困在這裏,使得訓練過程無法再進行下去
(3) RMSprop(Root Mean Squared prop)
1. 算法特點
- RMSProp 算法是針對 Adagrad 算法的缺陷進行修改,改變梯度積累爲指數加權移動平均
- Adagrad 算法旨在應用於凸問題時快速收斂
- RMSProp 算法使用指數衰減平均以丟棄遙遠過去的歷史
- RMSProp算法的學習率是自適應的
2.優化原理
還拿下面這個圖來直觀的理解一下(當然參數空間可能是很高維度的空間)
- 由圖可知道,W方向的梯度值是很小的,而b方向的梯度值很大。我們希望加快W方向,而減緩b方向的迭代。
- 當W梯度值很小時,通過算法,可知 :當前學習率=全局學習率 / r,此時當前學習率會增加,也即當前的step增加;同理,當b方向的梯度值很大時,步長會減小,從而降低搖擺幅度。
3. 存在的問題
- 沒有什麼太大的問題,該算法只是在一定程度上表現得很好。如果非要說問題,那麼我就說對梯度下降算法提升得程度還不夠高!
(4) Adam算法(重頭戲)
1. 算法特點
- 該算法結合了Momentum(First-order moment)和RMSProp(Second-order moment)兩者得優點
- 動量直接併入了梯度一階矩(指數加權)的估計,將動量加入RMSProp最直觀的的方法是將動量應用於縮放後的梯度。
- Adam 算法通常被認爲對超參數的選擇相當魯棒,儘管學習率有時需要從建議的默認修改
- Adam算法是需要修正偏差的,偏差是由於初始化問題導致的,具體的公式由來是可以證明的,在這裏不在多說,具體參考《ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION》
- 計算效率很高,使用的內存相對較小
2. 優化原理
- 結合Momentum和RMSProp即可
3. 存在的問題
- Adam算法是2015年ICLR會議上提出來的,要說問題,沒啥問題我覺得,最近好像是清華大學一個本科生提出了一種算法,效率比Adam高,還有的論文也多多少少指出了Adam算法確實存在一些缺陷,等以後有機會再深入。
4. Adamax(Adam算法的一個擴展)
- 主要原理就是將Adam中梯度的二範數一般化爲p範數,這裏p要趨近於無窮
- 沒有偏差修正
- 學習率α的範圍很好確定
- 具體數學證明參考原著
5. 一個注意要點
- 關於stepsize的選擇範圍要慎重,Adam算法原著中有相關解釋,看一參考,這裏不再敘述,下面把原著中這一部分貼出來供大家參考。
四、總結
- Adam大法好啊,深度學習中很常用的算法,得get!
五、參考文獻
[1]參考文獻1
[2]參考文獻2
[3]ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION,Diederik P . Kingma,Jimmy Lei Ba,2015-ICLR.