從SGD(SGD指mini-batch gradient descent)和Adam兩個方面提及。html
更詳細的能夠看:深度學習最全優化方法總結比較(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam)(醍醐灌頂!)算法
SGD就是每一次迭代計算mini-batch的梯度,而後對參數進行更新,是最多見的優化方法了。即:session
其中,是學習率,是梯度 SGD徹底依賴於當前batch的梯度,因此可理解爲容許當前batch的梯度多大程度影響參數更新。框架
缺點:(正由於有這些缺點才讓這麼多大神發展出了後續的各類算法)學習
- 選擇合適的learning rate比較困難 - 對全部的參數更新使用一樣的learning rate。對於稀疏數據或者特徵,有時咱們可能想更新快一些對於不常常出現的特徵,對於常出現的特徵更新慢一些,這時候SGD就不太能知足要求了
- SGD容易收斂到局部最優,而且在某些狀況下可能被困在鞍點【原來寫的是「容易困於鞍點」,經查閱論文發現,其實在合適的初始化和step size的狀況下,鞍點的影響並沒這麼大。感謝@冰橙的指正】
- 參數取值震盪嚴重。(我本身添加的)
Adam(Adaptive Moment Estimation)本質上是帶有動量項的RMSprop,它利用梯度的一階矩估計和二階矩估計動態調整每一個參數的學習率。Adam的優勢主要在於通過偏置校訂後,每一次迭代學習率都有個肯定範圍,使得參數比較平穩。公式以下:大數據
特色:優化
- 結合了Adagrad善於處理稀疏梯度和RMSprop善於處理非平穩目標的優勢
- 對內存需求較小
- 爲不一樣的參數計算不一樣的自適應學習率
- 也適用於大多非凸優化 - 適用於大數據集和高維空間
優化算法的通常框架:spa
後續複習的時候,存在了一個疑問,上述方法說對解決稀疏數據十分有效,那麼哪裏體現出了對稀疏數據有效呢?.net
參數更新越頻繁,二階動量越大,學習率就越小。htm
這篇也不錯,以後複習看: