第一篇是這個:
https://zhuanlan.zhihu.com/p/32230623
在上面一篇文章已經講了:
https://www.cnblogs.com/charlesblc/p/15908598.html
接下來是這篇文章:
https://zhuanlan.zhihu.com/p/32262540
《Adam那么棒,為什么還對SGD念念不忘 (2)—— Adam的兩宗罪》
Adam罪狀一:可能不收斂
Adam罪狀二:可能錯過全局最優解
他們提出了一個用來改進Adam的方法:前期用Adam,享受Adam快速收斂的優勢;后期切換到SGD,慢慢尋找最優解。
第三篇是這個:
https://zhuanlan.zhihu.com/p/32338983
《Adam那么棒,為什么還對SGD念念不忘 (3)—— 優化算法的選擇與使用策略》
不同優化算法的核心差異:下降方向
從第一篇的框架中我們看到,不同優化算法最核心的區別,就是第三步所執行的下降方向:
這個式子中,前半部分是實際的學習率(也即下降步長),后半部分是實際的下降方向。SGD算法的下降方向就是該位置的梯度方向的反方向,帶一階動量的SGD的下降方向則是該位置的一階動量方向。自適應學習率類優化算法為每個參數設定了不同的學習率,在不同維度上設定不同步長,因此其下降方向是縮放過(scaled)的一階動量方向。
主流的觀點認為:Adam等自適應學習率算法對於稀疏數據具有優勢,且收斂速度很快;但精調參數的SGD(+Momentum)往往能夠取得更好的最終結果。
優化算法的常用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等指標的變化情況。對訓練數據的監控是要保證模型進行了充分的訓練——下降方向正確,且學習率足夠高;對驗證數據的監控是為了避免出現過擬合。
- 制定一個合適的學習率衰減策略。可以使用定期衰減策略,比如每過多少個epoch就衰減一次;或者利用精度或者AUC等性能指標來監控,當測試集上的指標不變或者下跌時,就降低學習率。
initialization, activation, normalization 等等無不是四兩撥千斤。