深層神經網絡的參數學習主要通過梯度下降法來尋找一組可以最小化結構風險的參數。在具體實現中,梯度下降法可以分為:批量梯度下降、隨機梯度下降和小批量梯度下降三種形式。
而對於這三種梯度下降的方法,又可以從調整學習率、調整負梯度兩個方向來進行改進,比如RMSprop,Momentum和Adam。
這里介紹比較常用的小批量梯度下降,以及自適應調整學習率和梯度方向優化的兩種算法。
一、小批量梯度下降(MBGD)
批量梯度下降(Batch Gradient Descent,BGD)是每次都用訓練數據集中所有的樣本去計算梯度,而隨機梯度下降(Stochastic Gradient Descent,SGD)則每次都用一個樣本去計算梯度,而小批量梯度下降(Mini Batch Gradient Descent,MBGD)則介於二者之間,是深度學習中通常采用的做法。
批量梯度下降的缺點是,在訓練深層神經網絡時,訓練數據集的規模一般比較大,如果每次迭代都計算整個訓練集上的梯度,這需要消耗非常大的計算資源。此外,大規模訓練集中的數據通常比較冗余,也沒有必要使用整個訓練集計算梯度。
隨機梯度下降的缺點是,噪音比較多,更新過於頻繁,會造成損失函數的嚴重震盪;而且並不是每次迭代都向着整體最優方向邁進,雖然訓練速度快,但是准確性下降,並不是全局最優。
那么小批量梯度下降的做法是,令f(x, θ)表示一個深層神經網絡,θ為網絡參數,在使用小批量梯度下降進行優化時,每次選取K個訓練樣本{(x1, y1), (x2, y2), ..., (xK, yK)}。則第t次迭代時損失函數關於參數θ的偏導數為:

其中L(•)是可微分的損失函數,K稱為批量大小(batch size)。則按照如下公式來更新梯度:

為了更有效地訓練深層神經網絡,在標准的小批量梯度下降方法的基礎上,可以從以下兩個方面進行改進:學習率衰減和梯度方向優化。這兩種改進優化方法也同樣可以用於批量梯度下降算法和隨機梯度下降算法上。
但是小批量梯度下降也有兩個比較突出的問題:
1、 對所有的參數更新使用同樣的學習率
對於稀疏數據或者特征,有時我們可能想對出現頻率低的特征更新快一些,對於常出現的特征更新慢一些。
2、不能保證很好的收斂性
學習率如果選擇太大,收斂速度會很慢,而如果太大,損失函數會在極小值處震盪或偏離。對於非凸函數,還可能陷入局部極小值或者鞍點處。
二、學習率衰減
從梯度下降算法的經驗上看,學習率在一開始要保持比較大些來保證收斂速度,在收斂到最小點附近要小點以避免來回震盪。因此,比較直接的學習率調整可以通過學習率衰減的方式來實現。
而學習率衰減又分為:
(1)固定衰減率的調整學習率方法:逆時衰減、指數衰減、自然指數衰減。
(2)自適應地調整學習率的方法:AdaGrad、RMSprop,AdaDelta。
1、固定衰減率的學習率調整方法
假設初始化學習率為α0,在第t次迭代時的學習率為αt,固定衰減率的方法設置為按迭代次數衰減。
比如逆時衰減:

指數衰減:
![]()
自然指數衰減:
![]()
其中β為衰減率,一般取值為0.96。
2、自適應調整學習率的方法
在標准的梯度下降方法中,每個參數在每次迭代時都使用相同的學習率。而自適應調整學習率的方法是根據不同參數的收斂情況分別設置學習率,因為每個參數的的維度上收斂速度都不相同。
(1)AdaGrad算法
AdaGrad(Adaptive Gradient)算法是借鑒L2正則化的思想,每次迭代時自適應地調整每個參數的學習率。在第t次迭代時,先計算每個參數梯度平方的累計值:

gΤ表示第Τ次迭代時的梯度,梯度平方是按元素進行乘積。AdaGrad算法的參數更新值為:
![]()
其中α為初始的學習率,ε是為保持數值穩定而設置的非常小的常數。在AdaGrad算法中,如果某個參數的偏導數累計非常大,其學習率相對比較小;相反則比較大;但整體上隨着迭代次數增加,學習率逐漸縮小。
(2)RMSprop算法
RMSprop(Root Mean Square prop )算法可以在某些情況下避免AdaGrad算法中學習率不斷單調下降以至於過早衰減的缺點。
RMSprop算法首先計算每次迭代梯度gt平方的指數衰減移動平均:

其中β為衰減率,一般取值為0.9。RMSprop算法的參數更新差值為:
![]()
RMSprop算法和AdaGrad算法的區別在於Gt的計算由累積的方式變成了指數衰減移動平均。在迭代中,每個參數的學習率不是呈衰減趨勢,而是可以變小也可以變大。
(3)AdaDelta算法
AdaDelta算法也是AdaGrad算法的一個改進。和RMSprop算法類似,AdaDelta算法通過梯度平方的指數衰減移動平均來調整學習率,而它的創新在於引入了每次參數更新之差Δθ的平方的指數衰減權移動平均。
在第t次迭代時,首先計算一個參數更新差Δθt的指數衰減權移動平均:
![]()
則AdaDelta算法的參數更新差為:

其中Gt的計算方法和RMSprop算法一樣,ΔX2t-1是參數更新差Δθt的指數衰減權移動平均。
AdaDelta算法將RMSprop算法中的初始學習率α改為了動態計算的
,在一定程度上平抑了學習率的波動。
三、梯度方向優化
除了調整學習率之外,還可以通過使用最近幾輪迭代的平均梯度來替代當前時刻的梯度,來作為當前參數更新的方向。在小批量梯度下降中,如果每次選取樣本的數量比較小,那么損失會呈現震盪下降的形態。有效緩解梯度下降中震盪的方式是通過用梯度的移動平均來代替每次的實際梯度,並提高優化速度,這就是動量法。
1、動量法
在物理中,一個物體的動量是指這個物體在它運動方向上保持運動的趨勢,是物體的質量和速度的乘積。動量法(Momentum Method)是用之前積累動量來代替真正的梯度,每次迭代的梯度可以看做是加速度。
動量法在第 t次迭代時,計算負梯度的加權移動平均作為參數的更新方向:
![]()
其中ρ為動量因子,通常設為0.9,α是學習率。
這樣,每個參數的實際更新差值取決於最近一段時間內梯度的加權平均值。當某個參數在最近一段時間內的梯度方向不一致時,其真實的參數更新幅度變小;相反,當在最近一段時間內的梯度方向都一致時,其真實的參數更新幅度變大,起到加速作用。一般而言,在迭代初期,梯度方法都比較一致,動量法會起到加速作用,可以更快地到達最優點。在迭代后期,梯度方法會不一致,在收斂值附近震盪,動量法會起到減速作用,增加穩定性 。
2、Nesterov加速梯度
Nesterov加速梯度(Nesterov Accelerated Gradient,NAG),是一種對動量法的改進。在動量法中,實際的參數更新方向Δθt為上一步的參數更新方向Δθt-1和當前的梯度-gt的疊加。而NAG的改進在於,把當前的梯度-gt(θt-1),修正為損失函數在(θt-1+ρΔθt-1)上的負梯度:-gt(θt-1+ρΔθt-1)。
則參數更新的方向為:
![]()
3、Adam算法
Adam算法(Adaptive Moment Estimation,自適應動量估計)可以看作是動量法和 RMSprop 的結合,不但使用動量作為參數更新方向,而且可以自適應地調整學習率。
Adam 算法一方面計算梯度平方 gt2的指數加權平均(和 RMSprop 類似),用於自適應地調整學習率,另一方面計算梯度gt的指數加權平均(與動量法類似),作為參數調整方向。
其中β1 和β2 分別為兩個移動平均的衰減率,通常取值為β1 = 0.9, β2 = 0.99 。
Mt可以看作是梯度的均值(一階矩), Gt可以看作是梯度的未減去均值的方差,假設M0= 0, G0= 0,那么在迭代初期Mt和Gt 的值會比真實的均值和方差要小。特別是當β1 和β2 都接近於1時,偏差會很大。因此,需要對偏差進行修正。

Adam算法的參數更新值為:

其中學習率α通常設為0.001,並且也可以按照迭代次數t進行衰減,比如:

4、梯度截斷法
在深層神經網絡中,除了梯度消失外,梯度爆炸是影響學習效率的主要因素。在基於梯度下降的優化過程中,如果梯度突然增大,用非常大的梯度進行參數更新,反而會導致其遠離最優點。
為了避免這種情況,當梯度大於一定閾值時,就對梯度進行截斷,稱為梯度截斷(gradient clipping)。
梯度截斷具體的做法就是,把梯度的模限定在一個區間內,當梯度的模小於或者大於這個區間時就進行截斷。一般截斷的方式有兩種:
(1)按值截斷
在第t次迭代時,梯度為gt,給定一個區間[a,b],如果一個參數的梯度小於a時,就將其設為a;如果大於b時,就將其設為b。
![]()
(2)按模截斷
按模截斷是將梯度的模截斷到一個給定的截斷閾值b。

截斷閾值 b 是一個超參數,也可以根據一段時間內的平均梯度來自動調整 。
四、如何選擇合適的優化算法
如果數據是稀疏的,在意更快的收斂,並且需要訓練較深較復雜的網絡時,推薦使用學習率自適應的優化方法,即 AdaDrad, AdaDelta, RMSprop, Adam。
RMSprop, AdaDelta, Adam 在很多情況下的效果是相似的,Adam 就是在 RMSprop 的基礎上加了動量法,隨着梯度變得稀疏,Adam 比 RMSprop 效果會好。
整體來講,Adam 是最好的選擇。
五、總結
優化方法大體上可以分為兩類:一是調整學習率,使得優化更穩定;二是調整梯度方向,優化訓練速度。常見的優化算法整理如下:

參考資料:
1、邱錫鵬:《神經網絡與深度學習》
2、https://www.cnblogs.com/guoyaohua/p/8542554.html
