深度學習中的梯度下降優化算法筆記

梯度下降方法是目前最流行的神經網絡優化方法,並且現在主流的深度學習框架(tensorflow,caffe,keras,MXNET等)都包含了若干種梯度下降迭代優化器。我們在搭建網絡的時候,基本都是拿它們封裝好的函數直接用。實際上這些算法在不同情況可能有很大的性能差異,弄清楚它們的原理差異,有助於我們分析。

參考文章:梯度下降優化方法總結

 

梯度下降(gradient descent,GD)是最基礎的概念,它有三個很近似的名詞:

批量梯度下降(Batch gradient descent)

每次使用整個訓練集計算目標函數的梯度,

因爲每更新一次參數就需要計算整個數據集,所以批量梯度下降算法十分緩慢而且難以存放在內存中計算,且無法在線更新。

隨機梯度下降(stochastic gradient descent, SGD)

一次只使用一個樣本計算目標函數的梯度,

因爲每次只計算一個樣本,所以SGD計算非常快且適合線上更新模型。SGD頻繁地參數更新可以使算法跳出局部最優點,更可能尋找到接近全局最優的解,但也因頻繁地更新參數使得目標函數抖動非常厲害。

小批量梯度下降(mini-batch gradient descent)

結合了BGD和SGD的優點,一次以小批量的訓練數據計算目標函數的梯度,

n爲每批訓練集的數量。

優點:1. 相比較SGD增加了每次更新使用的訓練數據量,使得目標函數收斂得更加平穩。2. 可以使用矩陣操作對每批數據進行計算,提升了計算效率。

這三種的區別僅是每次計算使用的樣本數量不同,沒有對步長η或梯度變化量▽J作改進。

---------------------------------------------------------------------------------------------------------------------------

然後是一些梯度下降優化算法:

Momentum方法

目標函數一般在不同維度上的梯度相差很大,就如下圖的等高線在y方向上很密集(梯度變化大)所以震盪頻繁,而x方向緩慢移動。

因爲y方向在搖擺時梯度方向相反,前後兩次相加就可以一定程度抵消,x方向梯度變化是累加的,效果就是接近最優點的速度加快。

這個方法計算當前步的下降距離時納入了前一步的下降距離vt-1(有關前一步的梯度方向),就是衝量項(γvt-1),而步長η沒有變化。

---------------------------------------------------------------------------------------------------------------------------

然後下面是一些改變了步長的梯度下降優化算法:

Adagrad方法

 

對稀疏特徵採用高的更新速率,而對其他特徵採用相對較低的更新速率。與前面使用相同的學習速率η更新所有的參數不同,Adagrad對每個參數使用不同的步長進行更新。

用gt,i來表示參數θi在第t次更新時的梯度,

而Adagrad的更新表達式可以寫爲,

其中,表示矩陣和向量的乘積,Gt中的第i行第i列數表示θi的從過去到現在的梯度平方和。

這個方法利用參數的稀疏性來調整學習率,缺點是Gt累加了歷史的梯度平方,學習率就會變得越來越小,最後無法再學習到新的信息。

AdaDelta方法

主要解決了Adagrad算法中學習率衰減過快的問題,它不再累加參數所有的歷史梯度平方和,轉而設定一個窗口w,只求前w個歷史梯度平方的平均數(γ加權平均),

AdaDelta的更新表達式可以寫爲,

 

Rprop方法(Resilient Propagation)

設定權重變化的加減速因子d,比較本次梯度變化和上次梯度變化的符號來改變參數變化的加權,

如果兩次梯度符號相反,則抑制參數變化 (η-<1)

如果兩次梯度符號相同,則增強參數變化 (η+>1)

RMSprop方法(Root Mean Square Propagation)

類似於一種特殊的簡化的Adadelta形式,

Adam方法(Adaptive Moment Estimation)

它也是一種自適應學習率方法,與Adadelta和RMSprop類似,它將每個參數的歷史梯度平方均值存於vt中,不同的是,Adam還使用了類似衝量的衰減項mt,

Adam的更新表達式可以寫爲,

參考文章裏說建議β1設0.9,β2設0.999。

 

 

發佈了71 篇原創文章 · 獲贊 98 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章