Adam那么棒,为什么还对SGD念念不忘 (3)—— 优化算法的选择与使用策略
在前面兩篇文章中,我們用一個框架梳理了各大優化算法,并且指出了以Adam為代表的自適應學習率優化算法可能存在的問題。那么,在實踐中我們應該如何選擇呢?
?
本文介紹Adam+SGD的組合策略,以及一些比較有用的tricks.
?
回顧前文:
Adam那么棒,為什么還對SGD念念不忘 (1)
Adam那么棒,為什么還對SGD念念不忘 (2)
?
不同優化算法的核心差異:下降方向
?
從第一篇的框架中我們看到,不同優化算法最核心的區別,就是第三步所執行的下降方向:
這個式子中,前半部分是實際的學習率(也即下降步長),后半部分是實際的下降方向。SGD算法的下降方向就是該位置的梯度方向的反方向,帶一階動量的SGD的下降方向則是該位置的一階動量方向。自適應學習率類優化算法為每個參數設定了不同的學習率,在不同維度上設定不同步長,因此其下降方向是縮放過(scaled)的一階動量方向。
?
?
由于下降方向的不同,可能導致不同算法到達完全不同的局部最優點。An empirical analysis of the optimization of deep network loss surfaces?這篇論文中做了一個有趣的實驗,他們把目標函數值和相應的參數形成的超平面映射到一個三維空間,這樣我們可以直觀地看到各個算法是如何尋找超平面上的最低點的。
上圖是論文的實驗結果,橫縱坐標表示降維后的特征空間,區域顏色則表示目標函數值的變化,紅色是高原,藍色是洼地。他們做的是配對兒實驗,讓兩個算法從同一個初始化位置開始出發,然后對比優化的結果??梢钥吹?#xff0c;幾乎任何兩個算法都走到了不同的洼地,他們中間往往隔了一個很高的高原。這就說明,不同算法在高原的時候,選擇了不同的下降方向。
?
?
Adam+SGD 組合策略
?
正是在每一個十字路口的選擇,決定了你的歸宿。如果上天能夠給我一個再來一次的機會,我會對那個女孩子說:SGD!
?
不同優化算法的優劣依然是未有定論的爭議話題。據我在paper和各類社區看到的反饋,主流的觀點認為:Adam等自適應學習率算法對于稀疏數據具有優勢,且收斂速度很快;但精調參數的SGD(+Momentum)往往能夠取得更好的最終結果。
?
那么我們就會想到,可不可以把這兩者結合起來,先用Adam快速下降,再用SGD調優,一舉兩得?思路簡單,但里面有兩個技術問題:
?
- 什么時候切換優化算法?——如果切換太晚,Adam可能已經跑到自己的盆地里去了,SGD再怎么好也跑不出來了。
- 切換算法以后用什么樣的學習率?——Adam用的是自適應學習率,依賴的是二階動量的累積,SGD接著訓練的話,用什么樣的學習率?
?
上一篇中提到的論文?Improving Generalization Performance by Switching from Adam to SGD?提出了解決這兩個問題的思路。
?
首先來看第二個問題,切換之后用什么樣的學習率。Adam的下降方向是
而SGD的下降方向是
.
?必定可以分解為??所在方向及其正交方向上的兩個方向之和,那么其在??方向上的投影就意味著SGD在Adam算法決定的下降方向上前進的距離,而在??的正交方向上的投影是 SGD 在自己選擇的修正方向上前進的距離。
?
圖片來自原文,這里p為Adam下降方向,g為梯度方向,r為SGD的學習率。
如果SGD要走完Adam未走完的路,那就首先要接過Adam的大旗——沿著??方向走一步,而后在沿著其正交方向走相應的一步。
?
這樣我們就知道該如何確定SGD的步長(學習率)了——SGD在Adam下降方向上的正交投影,應該正好等于Adam的下降方向(含步長)。也即:
解這個方程,我們就可以得到接續進行SGD的學習率:
為了減少噪聲影響,作者使用移動平均值來修正對學習率的估計:
這里直接復用了Adam的??參數。
?
然后來看第一個問題,何時進行算法的切換。
作者的回答也很簡單,那就是當 SGD的相應學習率的移動平均值基本不變的時候,即:
?. 每次迭代玩都計算一下SGD接班人的相應學習率,如果發現基本穩定了,那就SGD以??為學習率接班前進。
?
優化算法的常用tricks
?
最后,分享一些在優化算法的選擇和使用方面的一些tricks。
?
- 首先,各大算法孰優孰劣并無定論。如果是剛入門,優先考慮SGD+Nesterov Momentum或者Adam.(Standford 231n?:?The two recommended updates to use are either SGD+Nesterov Momentum or Adam)
- 選擇你熟悉的算法——這樣你可以更加熟練地利用你的經驗進行調參。
- 充分了解你的數據——如果模型是非常稀疏的,那么優先考慮自適應學習率的算法。
- 根據你的需求來選擇——在模型設計實驗過程中,要快速驗證新模型的效果,可以先用Adam進行快速實驗優化;在模型上線或者結果發布前,可以用精調的SGD進行模型的極致優化。
- 先用小數據集進行實驗。有論文研究指出,隨機梯度下降算法的收斂速度和數據集的大小的關系不大。(The mathematics of stochastic gradient descent are amazingly independent of the training set size. In particular, the asymptotic SGD convergence rates are independent from the sample size. [2])因此可以先用一個具有代表性的小數據集進行實驗,測試一下最好的優化算法,并通過參數搜索來尋找最優的訓練參數。
- 考慮不同算法的組合。先用Adam進行快速下降,而后再換到SGD進行充分的調優。切換策略可以參考本文介紹的方法。
- 數據集一定要充分的打散(shuffle)。這樣在使用自適應學習率算法的時候,可以避免某些特征集中出現,而導致的有時學習過度、有時學習不足,使得下降方向出現偏差的問題。
- 訓練過程中持續監控訓練數據和驗證數據上的目標函數值以及精度或者AUC等指標的變化情況。對訓練數據的監控是要保證模型進行了充分的訓練——下降方向正確,且學習率足夠高;對驗證數據的監控是為了避免出現過擬合。
- 制定一個合適的學習率衰減策略??梢允褂枚ㄆ谒p策略,比如每過多少個epoch就衰減一次;或者利用精度或者AUC等性能指標來監控,當測試集上的指標不變或者下跌時,就降低學習率。
?
這里只列舉出一些在優化算法方面的trick,如有遺漏,歡迎各位知友在評論中補充,我將持續更新此文。提前致謝!
?
神經網絡模型的設計和訓練要復雜得多,initialization, activation, normalization 等等無不是四兩撥千斤,這些方面的技巧我再慢慢寫,歡迎關注我的知乎專欄和微信公眾號(Julius-AI),一起交流學習。
?
參考文獻:
[1]?CS231n Convolutional Neural Networks for Visual Recognition
[2]?Stochastic Gradient Descent Tricks.
[3]?Efficient BackProp
?
本系列目錄:
Adam那么棒,為什么還對SGD念念不忘 (1) —— 一個框架看懂優化算法
Adam那么棒,為什么還對SGD念念不忘 (2)—— Adam的兩宗罪
Adam那么棒,為什么還對SGD念念不忘 (3)—— 優化算法的選擇與使用策略
總結
以上是生活随笔為你收集整理的Adam那么棒,为什么还对SGD念念不忘 (3)—— 优化算法的选择与使用策略的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个框架看懂优化算法之异同 SGD/Ad
- 下一篇: 【转载】 Python动态生成变量