优化器(AdaGrad,AdaDelta,RmsProp,Adam,Nadam,Nesterovs,Sgd,momentum)
以下來自:
https://my.oschina.net/u/2935389/blog/2967242
https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw
另外的一篇關于優化器的文章是(pytorch的十個優化器):
https://blog.csdn.net/tototuzuoquan/article/details/113779970
1.5.1.1.AdaGrad(自適應學習率算法)
1.5.1.2.AdaDelta
1.5.1.3.RmsProp
1.5.1.4.Adam
1.5.1.5.AdaMax
1.5.1.6.Nadam
1.5.1.7.AMSGrad
1.5.1.8.Nesterovs(動量的隨機梯度下降法)
1.5.1.9.Sgd
1.5.1.10.momentum
1.5.1.11.經驗之談
1.5.1.12.引用
1.5.1.優化器
以下來自:
https://my.oschina.net/u/2935389/blog/2967242
https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw
1.5.1.1.AdaGrad(自適應學習率算法)
Adagrad其實是對學習率進行了一個約束。即:
再如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw中所述
在之前的算法當中,目標函數自變量的每一個元素在相同時刻都使用同一個學習率來自我迭代,但是這顯然是一個不合理的假設,因為有的方向可能快有的可能就比較慢,我們應該個性化差異化的對待每一個變量。AdaGrad算法對每個參數都有一個縮放因子,這個縮放因子反比與歷史上的梯度平方值總和的平方根。如果一個變量的損失梯度較大,那么它的下降速度也比較大,如果較小,下降速度也相應減小。具體算法如下:
AdaGrad算法有一個缺點,由于它的速率是一直下降的(分母的值一直在增加),前期下降快,后期下降慢,如果前期就沒有找到一個比較好的解,那么他在后期速度非常慢,可能很難找到一個比較好的解。
1.5.1.2.AdaDelta
Adadelta是對Adagrad的擴展,最初方案依然是對學習率進行自適應約束,但是進行了計算上的簡化。 Adagrad會累加之前所有的梯度平方,而Adadelta只累加固定大小的項,并且也不直接存儲這些項,僅僅是近似計算對應的平均值。即:
在此處Adadelta其實還是依賴于全局學習率的,但是作者做了一定處理,經過近似牛頓迭代法之后:
其中,E代表求期望。
此時,可以看出Adadelta已經不用依賴于全局學習率了。
特點:
?訓練初中期,加速效果不錯,很快。
?訓練后期,反復在局部最小值附近抖動。
再如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw所述:
該算法不需要設定學習率了,因為它已經不會影響到更新了,這也是該算法的一大優點。該算法在訓練前中期速度都比較快,但是在后期會在局部最小值附近波動。
這個算法的基本思想是希望通過一階的優化算法去近似二階的優化算法。在1988年LeCun等人曾經提出一種用矩陣對角線元素來近似逆矩陣。如果學過數值分析的同學應該知道,牛頓法用Hessian矩陣替代人工設置的學習率,在梯度下降的時候,可以完美的找出下降方向,不會陷入局部最小值當中,是理想的方法,但是Hessian矩陣的逆在數據很大的情況下根本沒辦法求。
LeCun等人在2012年又提出了一個更為精確的近似:
這里的E[g_t-w:t]指的是從當前t開始的前w個梯度狀態的期望值,E[g_t^2-w:t]指的是從當前t開始的前w個梯度狀態的平方的期望值。這里如果求期望的話,非常的麻煩,所以采取了移動平均法來計算。這里作者在論文中也給出了近似的證明:
這里是當f為指數型函數,最后一個近似成立。
對于牛頓法:
由上式可得:
其中:
這里可以用局部的加權指數平滑來替代,即:
這里的RMS表示均方:
可以得到:
1.5.1.3.RmsProp
特點:
?其實RMSprop依然依賴于全局學習率。
?RMSprop算是Adagrad的一種發展,和Adadelta的變體,效果趨于二者之間。
?適合處理非平穩目標——對于RNN效果很好。
再如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw中所說:
RMSProp算法是hinton對AdaGrad算法改進,這個算法據說只是hinton在課堂上面提出來的,沒有發表相關論文。這個改動其實也很簡單,將梯度累計改為移動加權平均,所以也沒有什么神奇之處,思路還是比較簡單。
當然這里也可以結合Nesterov動量得到結合Nesterov動量的RMSProp算法,具體如下:
1.5.1.4.Adam
Adam(Adaptive Moment Estimation)本質上是帶有動量項的RMSprop,它利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。Adam的優點主要在于經過偏置校正后,每一次迭代學習率都有個確定范圍,使得參數比較平穩。公式如下:
特點:
?結合了Adagrad善于處理稀疏梯度和RMSprop善于處理非平穩目標的優點。
?對內存需求較小
?為不同的參數計算不同的自適應學習率。
?也適用于大多數非凸優化–適用于大數據集和高維空間。
正如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw所示:
Adam是一個組合了動量法和RMSProp的優化算法,在該算法當中,動量被直接并入了梯度的一階矩(指數加權)的估計,動量將用于縮放后的梯度,其次Adam包含了偏置修正,修正了從零點初始化的一階矩和二階矩的估計。第一個超參數ρ_1負責更新動量項,第二個超參數ρ_2負責更新RMSProp。
1.5.1.5.AdaMax
Adamax是Adam的一種變體,此方法對學習率的上限提供了一個更簡單的范圍。公式上的變化如下:
可以看出,Adamax學習率的邊界范圍更簡單。
1.5.1.6.Nadam
Nadam類似于帶有Nesterov動量項的Adam。公式如下:
可以看出,Nadam對學習率有了更強的約束,同時對梯度的更新也有更直接的影響。一般而言,在想使用帶動量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果。
1.5.1.7.AMSGrad
這是ICML2018年提出來的一個Adam的變體,這篇paper在盲評當中獲得極高的分數,最近好像被接受為最佳論文。這篇論文提出了一個通用的邊學習率算法框AdaGrad, RMSProp ,Adadelta,Adam等都可以看作是該框架的一種特例。通用的框架如下:
選擇兩個不同的函數,可以得到不一樣的方法,從AdaGrad是兩個函數可以看做分別是:
對于Adam而言,函數的選擇是基于指數平滑法的:
對應的更新:
作者在論文中證明了Adam在應對一個簡單的一維凸函數的優化問題時,都不能得到一個比較好的結果。作者去分析了,發現主要原因在于:
因為這一個是有可能為負的,當其為負的時候,就違背了Adam論文中的Γ_(t+1)半正定假設,因此作者主要就是去改進它,令其始終半正定。假設,因此作者主要就是去改進它,令其始終半正定。作者就想,那么v_(t+1)始終取上一個時刻的和當前估計的最大值就好了這樣就可以了。
對于不帶修正的AMSGRAD算法可以簡單的寫成如下:
1.5.1.8.Nesterovs(動量的隨機梯度下降法)
這個是受到Nesterov動量的影響,Sutskever等人于2013年提出來的,具體算法過程如下:
這里就是在標準動量的基礎之上,先更新一個臨時的位置,然后計算該位置上的梯度,再用標準動量法進行估計,也就是在標準的動量法當中加入了一個校正因子。不過這種方法在凸的批量下降中能夠加快收斂速度,但是在隨機梯度當中效果并不明顯。
1.5.1.9.Sgd
此處的SGD指mini-batch gradient descent,關于batch gradient descent, stochastic gradient descent, 以及mini-batch gradient descent的具體區別就不細說了。現在的SGD一般都指mini-batch gradient descent。
SGD就是每一次迭代計算mini-batch的梯度,然后對參數進行更新,是最常見的優化方法了。即:
缺點:
?選擇合適的learning rate比較困難 - 對所有的參數更新使用同樣的learning rate。對于稀疏數據或者特征,有時我們可能想更新快一些對于不經常出現的特征,對于常出現的特征更新慢一些,這時候SGD就不太能滿足要求了。
?SGD容易收斂到局部最優,并且在某些情況下可能被困在鞍點【原來寫的是“容易困于鞍點”,經查閱論文發現,其實在合適的初始化和step size的情況下,鞍點的影響并沒這么大。感謝@冰橙的指正】
再如https://mp.weixin.qq.com/s/NmSVXezxsQOZzK8pne3pCw中介紹:
SGD:
首先介紹隨機梯度下降法(SGD),隨機梯度下降法是梯度下降法的一個特例,梯度下降法是沿著整個樣本的梯度下降,但是由于在深度學習中整個樣本太大了,比如ImageNet中有上百萬張圖片,這樣計算效率太低。對于批量大小和對梯度估計的準確性的影響,有這樣一個規律,批量中的數目越大,對于整個梯度估計得越準確,但是并不是呈線性上升的。小批量雖然比較慢,但是能夠提供正則化的效果。
學習率通常設定為前期較快,后期較慢,為了達到這個效果,也有一些設定學習率的方法,比如:每隔一定步數,設定一個衰減,指數衰減,或者每步衰減為原來的幾分之一等。
帶有動量的SGD
在介紹帶動量的SGD之前,首先介紹一下加權指數平滑,這個東西非常簡單,但是在后續很多優化算法里面基本都會用到它。雖然隨機梯度下降法很有效,但是為了加速它逃離鞍點,可以利用歷史信息,其實也就是指數加權平均法。只是加權平均法就是如何結合歷史信息和當前信息來優化。指數加權平均法具體公式如下:
如果把這個進行拆開,就會發現它本質是一個加權的平方和,比如這里如果t=5,β=0.1:
這里需要注意的是當第一個數的時候沒有歷史信息,所以需要引入偏差修正,也就是除以1-β^t ,隨著t的增大,該項會趨于1,所以到了后期基本不會有什么影響。
對于動量的隨機梯度下降法,其實就是帶有指數加權平均的隨機梯度下降法。
1.5.1.10.momentum
momentum是模擬物理里動量的概念,積累之前的動量來替代真正的梯度。公式如下:
1.5.1.11.經驗之談
?對于稀疏數據,盡量使用學習率可自適應的優化方法,不用手動調節,而且最好采用默認值
?SGD通常訓練時間更長,但是在好的初始化和學習率調度方案的情況下,結果更可靠
?如果在意更快的收斂,并且需要訓練較深較復雜的網絡時,推薦使用學習率自適應的優化方法。
?Adadelta,RMSprop,Adam是比較相近的算法,在相似的情況下表現差不多。
?在想使用帶動量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果
損失平面等高線
在鞍點處的比較
1.5.1.12.引用
[1] Adagrad (http://link.zhihu.com/?target=http%3A//www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf)
[2] RMSprop [Lecture 6e] (http://link.zhihu.com/?target=http%3A//www.cs.toronto.edu/%7Etijmen/csc321/lecture_notes.shtml)
[3] Adadelta (http://link.zhihu.com/?target=http%3A//arxiv.org/abs/1212.5701)
[4] Adam (http://link.zhihu.com/?target=http%3A//arxiv.org/abs/1412.6980v8)
[5] Nadam (http://link.zhihu.com/?target=http%3A//cs229.stanford.edu/proj2015/054_report.pdf)
[6] On the importance of initialization and momentum in deep learning (http://link.zhihu.com/?target=http%3A//www.cs.toronto.edu/%7Efritz/absps/momentum.pdf)
[7] Keras中文文檔 (http://link.zhihu.com/?target=http%3A//keras-cn.readthedocs.io/en/latest/)
[8] Alec Radford(圖) (http://link.zhihu.com/?target=https%3A//twitter.com/alecrad)
[9] An overview of gradient descent optimization algorithms (http://link.zhihu.com/?target=http%3A//sebastianruder.com/optimizing-gradient-descent/)
[10] Gradient Descent Only Converges to Minimizers (http://link.zhihu.com/?target=http%3A//www.jmlr.org/proceedings/papers/v49/lee16.pdf)
[11] Deep Learning:Nature (http://link.zhihu.com/?target=http%3A//www.nature.com/nature/journal/v521/n7553/abs/nature14539.html)
總結
以上是生活随笔為你收集整理的优化器(AdaGrad,AdaDelta,RmsProp,Adam,Nadam,Nesterovs,Sgd,momentum)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支票二十日前面加零吗
- 下一篇: 79式70毫米微型反坦克火箭