優化器總結
https://zhuanlan.zhihu.com/p/22252270
SGD優化算法
此處的SGD指mini-batch gradient descent,關於batch gradient descent, stochastic gradient descent, 以及 mini-batch gradient descent的具體區別就不細說了。現在的SGD一般都指mini-batch gradient descent。
SGD就是每一次迭代計算mini-batch的梯度,然後對參數進行更新,是最常見的優化方法了。即:
其中,是學習率,
是梯度 SGD完全依賴於當前batch的梯度,所以
可理解爲允許當前batch的梯度多大程度影響參數更新。
缺點
- 選擇合適的learning rate比較困難 - 對所有的參數更新使用同樣的learning rate。對於稀疏數據或者特徵,有時我們可能想更新快一些對於不經常出現的特徵,對於常出現的特徵更新慢一些,這時候SGD就不太能滿足要求了
- SGD容易收斂到局部最優,
Momentum
momentum是模擬物理裏動量的概念,積累之前的動量來替代真正的梯度。公式如下:
其中,是動量因子
特點:
- 下降初期時,使用上一次參數更新,下降方向一致,乘上較大的
能夠進行很好的加速
- 下降中後期時,在局部最小值來回震盪的時候,
,
使得更新幅度增大,跳出陷阱
- 在梯度改變方向的時候,
能夠減少更新 總而言之,momentum項能夠在相關方向加速SGD,抑制振盪,從而加快收斂
Adam優化算法
https://www.jianshu.com/p/aebcaf8af76e
計算t時間步的梯度:
首先,計算梯度的指數移動平均數,m0 初始化爲0。
類似於Momentum算法,綜合考慮之前時間步的梯度動量。
β1 係數爲指數衰減率,控制權重分配(動量與當前梯度),通常取接近於1的值。
默認爲0.9
下圖簡單展示出時間步1~20時,各個時間步的梯度隨着時間的累積佔比情況。
下圖簡單展示出時間步1~20時,各個時間步的梯度隨着時間的累積佔比情況。
其次,計算梯度平方的指數移動平均數,v0初始化爲0。
β2 係數爲指數衰減率,控制之前的梯度平方的影響情況。
類似於RMSProp算法,對梯度平方進行加權均值。
默認爲0.999
第三,由於m0初始化爲0,會導致mt偏向於0,尤其在訓練初期階段。
所以,此處需要對梯度均值mt進行偏差糾正,降低偏差對訓練初期的影響。
第四,與m0 類似,因爲v0初始化爲0導致訓練初始階段vt偏向0,對其進行糾正。
第五,更新參數,初始的學習率α乘以梯度均值與梯度方差的平方根之比。
其中默認學習率α=0.001
ε=10^-8,避免除數變爲0。
由表達式可以看出,對更新的步長計算,能夠從梯度均值及梯度平方兩個角度進行自適應地調節,而不是直接由當前梯度決定。
Adam代碼實現