1. SGD
1.1 batch-GD
每次更新使用全部的樣本,注意會對所有的樣本取均值,這樣每次更新的速度慢。計算量大。
1.2 SGD
每次隨機取一個樣本。這樣更新速度更快。SGD算法在於每次只去擬合一個訓練樣本,這使得在梯度下降過程中不需去用所有訓練樣本來更新Theta。BGD每次迭代都會朝着最優解逼近,而SGD由於噪音比BGD多,多以SGD並不是每次迭代都朝着最優解逼近,但大體方向是朝着最優解,SGD大約要遍歷1-10次數據次來獲取最優解。
但是 SGD 因爲更新比較頻繁,會造成 cost function 有嚴重的震盪。
1.3. MBGD(Mini-batch Gradient Descent)
MBGD有時候甚至比SGD更高效。MBGD不像BGD每次用m(所有訓練樣本數)個examples去訓練,也不像SGD每次用一個example。MBGD使用中間值b個examples
經典的b取值大約在2-100。例如 b=10,m=1000。
2. Momentum
SGD存在的一個主要問題是:在溝壑處無法正常收斂的問題。如果初始化不好不幸陷入溝壑區,則會出現下面左圖的震盪問題:即在一個方向上梯度很大,且正負交替出現。而momentum會加上前面的一次迭代更新時的梯度。讓與上一次同方向的值更大,反方向的更小,如下面右圖所示。momentum公式爲:
- 下降初期時,使用上一次參數更新,下降方向一致,乘上較大的$mu$能夠進行很好的加速。
- 下降中後期時,在局部最小值來回震盪的時候,,使得更新幅度增大,跳出陷阱。
- 在梯度改變方向的時候,能夠減少更新 總而言之,momentum項能夠在相關方向加速SGD,抑制振盪,從而加快收斂。
正確的方向上讓他更快,錯誤的方向上讓他更慢。如果上次的momentum(v)與這次的負梯度方向是相同的,那這次下降的幅度就會加大,從而加速收斂。
momentum的更新方式爲:
momentum設置太小動量效果不明顯,設置太大容器使得本來收斂很好的地方震動太大,特別是訓練的後期,一般取0.9。
3. NAG(Nesterov accelerated gradient)
動量法每下降一步都是由前面下降方向的一個累積和當前點的梯度方向組合而成。於是一位大神(Nesterov)就開始思考,既然每一步都要將兩個梯度方向(歷史梯度、當前梯度)做一個合併再下降,那爲什麼不先按照歷史梯度往前走那麼一小步,按照前面一小步位置的“超前梯度”來做梯度合併呢?如此一來,小球就可以先不管三七二十一先往前走一步,在靠前一點的位置看到梯度,然後按照那個位置再來修正這一步的梯度方向。如此一來,有了超前的眼光,小球就會更加”聰明“, 這種方法被命名爲Nesterov accelerated gradient 簡稱 NAG。
NAG的更新方式爲:
與momentum不同的是,NAG是先往前走一步,談談路,用超前的梯度來進行修正。
更新公式爲:
實驗證明,比momentum更快。
4. AdaGrad
SGD+Momentum的問題是:
- 設置初始的學習率比較難
- 所有的參數都使用相同的學習率
Adam採用累加前面梯度的平方和的方式。能夠對每個參數自適應不同的學習速率。因此對於稀疏特徵,學習率會大一點。對非稀疏特徵,學習率會小一點。因此次方法適合處理稀疏特徵。公式爲:
其中 同樣是當前的梯度,連加和開根號都是元素級別的運算。 是初始學習率,由於之後會自動調整學習率,所以初始值就不像之前的算法那樣重要了。而是一個比較小的數,用來保證分母非0。
其含義是,對於每個參數,隨着其更新的總距離增多,其學習速率也隨之變慢。
從1到t進行一個遞推形成一個約束項,保證分母非0。
爲前面的參數的梯度平方和。特點爲:
- 前期梯度較小的時候,疊加的梯度平方和也比較小,能夠加快梯度。
- 後期梯度疊加項比較大uo,梯度也會變小,能夠以小步幅更新。
- 對於不同的變量可以用不同的學習率。
- 適合處理稀疏的數據。
缺點:
- 依賴一個全局學習率
- 中後期,梯度的平方和累加會越來越大,會使得,使得後期訓練很慢,甚至接近0。
5. AdaDelta
Adadelta是對於Adagrad的擴展。最初方案依然是對學習率進行自適應約束,但是進行了計算上的簡化。 Adagrad會累加之前所有的梯度平方,而Adadelta只累加固定大小的項(Adagrad需要存儲),並且也不直接存儲這些項,僅僅是近似計算對應的平均值。即:
KaTeX parse error: No such environment: align at position 8:
\begin{̲a̲l̲i̲g̲n̲}̲
E[g^2]_t&=\gam…
因爲AdaDelta需要計算,需要存儲前面個狀態,比較麻煩。因此AdaDelta採用了類似momtemum的平均話方法,如果,則相當於前面的均方根RMS。其中Inception-V3的初始化建議爲1。
此處AdaDelta還是依賴於全局學習率,因此作者做了一定的處理來近似:
經過二階海森矩陣近似之後,得到
這樣的話,AdaDelta已經不依賴於全局學習率了。
- 訓練初中期,加速效果不錯,很快
- 訓練後期,反覆在局部最小值附近抖動
6. RMSProp
RMSProp是AdaDelta的一種擴展。當的時候就變成了RMSProp。但是RMSProp仍然依賴於全局學習率。效果介於AdaGrad和AdaDelta之間。
7. Adam
Adam(Adaptive Moment Estimation)本質上是帶有動量項的RMSprop,它利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。Adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定範圍,使得參數比較平穩。公式如下:
KaTeX parse error: No such environment: align at position 8:
\begin{̲a̲l̲i̲g̲n̲}̲
g_t&=\Delta_\t…
然後對和進行無偏估計。因爲和初始化都是0,我們希望能夠快點從0中調出來。因爲如果比較大的話,原來的可能會調不出來。因此進行無偏估計後能夠放大。和兩個超參數一般設置爲0.9和0.999。:
接下來更新參數,初始的學習率(默認0.001)乘以梯度均值與梯度方差的平方根之比。由表達式可以看出,對更新的步長計算,能夠從梯度均值及梯度平方兩個角度進行自適應地調節,而不是直接由當前梯度決定。
直接對梯度的矩進行估計對內存沒有額外的要求,而且可以根據梯度進行動態調整。而且後面的一項比值可以對學習率形成一個動態約束,因爲它是有範圍的。
目前來講,效果最好的是Adam。但是經典的論文搞上去的方式都是先用Adam,然後再用SGD+momentum死磕上去。
Adam看作是Momentum+RMSProp的結合體。
形成一個動態約束,因爲它是有範圍的。
目前來講,效果最好的是Adam。但是經典的論文搞上去的方式都是先用Adam,然後再用SGD+momentum死磕上去。
Adam看作是Momentum+RMSProp的結合體。