(原+譯)常見的梯度下降算法


轉載請注明出處:

http://www.cnblogs.com/darkknightzh/p/5785137.html

翻譯網址:

http://sebastianruder.com/optimizing-gradient-descent/index.html#fn:2

參考網址:

http://blog.csdn.net/luo123n/article/details/48239963

對於凸優化問題,需要計算損失函數$L(\theta )$的極小值(最小值)。由於梯度是函數上升最快的方向,因而梯度下降算法在更新參數$\theta $的梯度時,均是減去參數的梯度。下面的$\eta $為學習率。

下面的均為一階的梯度下降算法,二階的由於要計算Hessian矩陣,計算量較大,因而原網址未介紹。

1. 批量梯度下降算法(batch gradient descent,BGD

BGD在整個訓練集上面計算損失函數關於參數$\theta $的梯度:

$\theta =\theta -\eta \centerdot {{\nabla }_{\theta }}J(\theta )$

由於每次更新$\theta $時均需要在整個訓練集上面計算梯度,因而BGD算法比較慢,且BGD算法無法處理數據太多而無法一次性存儲在內存中的情況。另外,BGD算法無法在線更新模型。

目前深度學習庫能自動且有效的計算梯度,因而如果自己手動推導梯度,最好進行梯度檢查。參見http://cs231n.github.io/neural-networks-3/

對於凸優化問題,BGD會收斂到全局最小值;對於非凸優化問題,BGD會收斂到局部最小值。

2. 隨機梯度下降算法(stochastic gradient descent,SGD

SGD每次選擇一個訓練樣本對$({{x}^{(i)}},{{y}^{(i)}})$來更新參數$\theta $:

$\theta =\theta -\eta \centerdot {{\nabla }_{\theta }}J(\theta ;{{x}^{(i)}},{{y}^{(i)}})$

由於SGD每次只通過一個訓練樣本對來更新參數,因而比BGD快很多,也可以用於在線學習。但是SGD更新參數時很容易出現波動,因而方差很高。但是這種波動也能讓SGD跳出當前的局部極小值,調到另一個更好的極小值處。當逐漸降低學習率時,SGD和BGD一樣,對於非凸問題,會收斂到局部極小值;對於凸問題會收斂到全局極小值。

注意,在使用SGD時,需要對樣本進行隨機化處理。

3. 小批量梯度下降算法(mini-batch gradient descent,MBGD

MBGD結合了BGD和SGD的優點,每次使用部分訓練樣本更新$\theta $(感覺上很多論文的SGD實際上指的是MBGD)。如訓練集共N個樣本,每次使用n個樣本,則batch總數為N/n(假設其為整數)。第i次更新時,使用一個batch中的n個樣本(上面的公式為參考網址中的,感覺不正確,下面的為自己改的):

$\theta =\theta -\eta \centerdot {{\nabla }_{\theta }}J(\theta ;{{x}^{(i:i+n)}},{{y}^{(i:i+n)}})$

$\theta =\theta -\eta \centerdot {{\nabla }_{\theta }}J(\theta ;{{x}^{((n-1)\times i+1:n\times i)}},{{y}^{((n-1)\times i+1:n\times i)}})$

當訓練數據集比較大時,利用整個訓練數據來計算梯度對硬件要求比較大,如內存,CPU等,使用MBGD可以降低對硬件的要去。另外,MBGD可以降低參數$\theta $的方差,從而更快的收斂。可以使用深度學習庫中高度優化的矩陣運算來更有效地計算mini-batch的梯度。實際使用中mini-batch的大小為50到250之間,但是可以根據需要進行調整。

 

上面的這三種固定學習率的梯度下降算法有其弊端:學習率太低時收斂太慢,學習率太高又可能到時損失函數在極小值處波動甚至是發散。

另一方面,SGD不易處理鞍點處的梯度。由於鞍點周圍的誤差相同,梯度在所有方向都接近於0,導致SGD很難脫離鞍點。

4. 動量(momentum

由於SGD(指上面的三種方法)的參數更新完全依賴於當前的batch,容易出現震盪現象,動量通過將當前時刻的梯度與前一時刻的梯度按照一定的比例進行加權,使得當前的更新方向包括當前梯度的方向與之前時刻梯度的方向,來增加更新的穩定性,同時抑制SGD的震盪現象。

${{v}_{t}}=\gamma {{v}_{t-1}}+\eta \centerdot {{\nabla }_{\theta }}J(\theta )$

$\theta =\theta -{{v}_{t}}$

動量的系數$\gamma $表示保留原來方向的程度,通常設置為0.9左右。

當梯度指向收斂方向時,動量加快更新速度;當梯度改變方向時,動量降低更新速度。從而在保證收斂更快的同時,減弱震盪現象(暫時沒想明白,不知道公式是否正確)。

動量的論文:Qian, N. (1999). On the momentum term in gradient descent learning algorithms. Neural Networks : The Official Journal of the International Neural Network Society, 12(1), 145–151. http://doi.org/10.1016/S0893-6080(98)00116-6

5. Nesterov accelerated gradient(NAG

相比於momentum,NAG更智能,其包含一個將要去哪里的指示,因而在曲面上升時,能夠降低更新速度。

使用momentum時,通過動量部分$\gamma {{v}_{t-1}}$來更新參數$\theta $,從而$\theta -\gamma {{v}_{t-1}}$給出了參數下一個近似位置。因而通過下一個近似位置來進行更新:

${{v}_{t}}=\gamma {{v}_{t-1}}+\eta \centerdot {{\nabla }_{\theta }}J(\theta -\gamma {{v}_{t-1}})$

$\theta =\theta -{{v}_{t}}$

動量的系數$\gamma $通常設置為0.9左右。動量的方法首先計算當前梯度(下圖中短的藍色向量),之后通過之前梯度及當前梯度進行參數更新(長的藍色向量)。NAG則通過之前梯度及當前梯度進行參數更新(棕色向量),並計算此時梯度(紅色向量),並使用此時的梯度修正最終的更新方向(綠色向量)。NAG可以避免更新過猛,在RNNs中可以明顯的提升性能。

NAG的論文:Nesterov, Y. (1983). A method for unconstrained convex minimization problem with the rate of convergence o(1/k2). Doklady ANSSSR (translated as Soviet.Math.Docl.), vol. 269, pp. 543– 547.

6. Adagrad

上面的方法在參數更新過程中,使用了固定的學習率。Adagrad自適應地為各個參數分配不同的學習率:對於不常見的參數可以進行大幅度的調整,對於常見參數則進行小幅度的微調(此處用“不常見”和“常見”不太好)。因而適用於處理稀疏數據。對於當前需要更新的參數${{\theta }_{i}}$在某時刻t:

${{\theta }_{t+1,i}}={{\theta }_{t,i}}-\frac{\eta }{\sqrt{{{G}_{t,ii}}+\varepsilon }}\centerdot {{g}_{t,i}}$

${{G}_{t}}\in {{R}^{d\times d}}$為一個對角矩陣,對角線上的值為$\theta $的梯度到當前時刻的平方和。$\varepsilon $通常為1e-8,為了保證分母非0。如果不使用開方的話,該算法性能會差很多。

Adagrad算法參數更新的矩陣形式如下:

${{\theta }_{t+1}}={{\theta }_{t}}-\frac{\eta }{\sqrt{{{G}_{t}}+\varepsilon }}\odot {{g}_{t}}$

$\odot $為矩陣對應元素相乘。該算法優點是自適應的調整學習率。一般初始學習率設置為0.01。

Adagrad的論文:Duchi, J., Hazan, E., & Singer, Y. (2011). Adaptive Subgradient Methods for Online Learning and Stochastic Optimization. Journal of Machine Learning Research, 12, 2121–2159. Retrieved from http://jmlr.org/papers/v12/duchi11a.html 

該算法的缺點是,分母中需要計算每個參數梯度的累計平方和,由於每次均累加一個正數,訓練階段累積和會持續增加,導致訓練后期的學習率非常小,以至更新時不能從當前的梯度獲取任何有用信息(另外,更新參數時,左右兩邊的單位不統一)。下面的算法可以解決這個問題。

7. Adadelta

Adadelta對Adagrad進行了改進,不是不限次數的累加梯度,而是將之前梯度累加的次數限定為離當前時刻最近的w次。該算法並未存儲之前w個時刻的梯度的平方,而是通過之前時刻梯度平方的平均來計算。當前梯度的平方和為上一次梯度的平方和與當前梯度平方的加權之和(不太懂為何這樣可以)。

$E{{\left[ {{g}^{2}} \right]}_{t}}=\gamma E{{\left[ {{g}^{2}} \right]}_{t-1}}+(1-\gamma )g_{t}^{2}$

$\gamma $和動量項類似,為衰減系數,也設置為0.9左右。通過這個衰減系數,我們令每一個時刻的${{g}_{t}}$隨着時間按照ρ指數衰減,這樣就相當於我們僅使用離當前時刻比較近的${{g}_{t}}$信息,從而使得很長時間之后,參數仍然可以得到更新(參考網址2)。此時更新公式如下:

$\Delta {{\theta }_{t}}=-\frac{\eta }{\sqrt{E{{\left[ {{g}^{2}} \right]}_{t}}+\varepsilon }}{{g}_{t}}$

由於分母是均方根誤差(RMS error),因而可以寫為下式:

$\Delta {{\theta }_{t}}=-\frac{\eta }{RMS{{\left[ g \right]}_{t}}}$    感覺該公式有問題

將上面公式改成關於${{\theta }_{t}}$的:

$E{{\left[ \Delta {{\theta }^{2}} \right]}_{t}}=\gamma E{{\left[ \Delta {{\theta }^{2}} \right]}_{t-1}}+(1-\gamma )\Delta \theta _{t}^{2}$

$RMS{{\left[ \Delta \theta  \right]}_{t}}=\sqrt{E{{\left[ \Delta {{\theta }^{2}} \right]}_{t}}+\varepsilon }$

由於$RMS{{\left[ \Delta \theta  \right]}_{t}}$未知,使用之前時刻的RMS值代替。最終的Adadelta更新公式為:

$\Delta {{\theta }_{t}}=-\frac{RMS{{\left[ \Delta \theta  \right]}_{t-1}}}{RMS{{\left[ g \right]}_{t}}}{{g}_{t}}$

${{\theta }_{t+1}}={{\theta }_{t}}+\Delta {{\theta }_{t}}$

使用Adadelta,由於隨着參數更新,學習率的影響慢慢消失,因而都不需要設置默認的學習率。

Adadelta的論文:Zeiler, M. D. (2012). ADADELTA: An Adaptive Learning Rate Method. Retrieved from http://arxiv.org/abs/1212.5701

8. RMSprop

RMSprop未發表,但是也是自適應學習率的算法,由Geoff Hinton提出(http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf)。該算法實際上和Adadelta類似:

$E{{\left[ {{g}^{2}} \right]}_{t}}=0.9E{{\left[ {{g}^{2}} \right]}_{t-1}}+0.1g_{t}^{2}$

${{\theta }_{t+1}}={{\theta }_{t}}-\frac{\eta }{\sqrt{E{{\left[ {{g}^{2}} \right]}_{t}}+\varepsilon }}{{g}_{t}}$

默認的學習率是$\eta $=0.001。

9. Adaptive Moment Estimation(Adam

Adam也可以自適應的計算各參數的學習率。Adam不僅計算指數衰減梯度平方的二階矩的估計${{v}_{t}}$,如Adadelta與RMSprop,其還計算指數衰減梯度的一階矩的估計${{m}_{t}}$,類似於動量。

${{m}_{t}}={{\beta }_{1}}{{m}_{t-1}}+(1-{{\beta }_{1}}){{g}_{t}}$

${{v}_{t}}={{\beta }_{2}}{{v}_{t-1}}+(1-{{\beta }_{2}})g_{t}^{2}$

其中${{m}_{t}}$為一階矩的估計(均值),初始化為0向量;${{v}_{t}}$為二階矩的估計(方差),初始化為0向量。Adam的作者發現當衰減率(decay rate)很小時(${{\beta }_{1}}$和${{\beta }_{2}}$接近於1),${{m}_{t}}$和${{v}_{t}}$最終都趨於0。因而Adam算法最終對一階矩和二階矩進行校正(${{\beta }_{1}}$和${{\beta }_{2}}$的上標t代表t次方):

${{\hat{m}}_{t}}=\frac{{{m}_{t}}}{1-\beta _{1}^{t}}$

${{\hat{v}}_{t}}=\frac{{{v}_{t}}}{1-\beta _{2}^{t}}$

最終Adam的更新規則為:

${{\theta }_{t+1}}={{\theta }_{t}}-\frac{\eta }{\sqrt{{{{\hat{v}}}_{t}}}+\varepsilon }{{\hat{m}}_{t}}$

默認情況下,${{\beta }_{1}}=0.9$,${{\beta }_{2}}=0.99$,$\varepsilon ={{10}^{-8}}$,$\eta =0.001$。

Adam的論文:Kingma, D. P., & Ba, J. L. (2015). Adam: a Method for Stochastic Optimization. International Conference on Learning Representations, 1–13.

 

10. 算法的選擇

如果數據比較稀疏,最好使用自適應學習率的算法。如果不清楚具體使用哪個的話,使用Adam就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM