梯度優化講解

預防過擬合常用的方法有L1、L2正則化,Dropout 正則化、Data Augmentation、Early Stopping 等。

本文將重點介紹如何使用梯度優化來使神經網絡訓練更快更有效率。

mini-Batch 梯度下降

神經網絡反向傳播的過程需要使用梯度下降算法來優化網絡參數,迭代更新。梯度下降算法做法是每次訓練都使用全部 m 個訓練樣本(稱爲 Batch)。該做法的缺點是當m很大的時候,例如百萬數量級訓練時會影響運算速度,增加模型的訓練時間。

爲了解決這一問題,我們可將m個樣本均勻分割成若干個子集,每個子集包含較少的樣本數量。一般子集包含的樣本數量爲 64、128、256 等,較常使用 2 的冪數。這是因爲計算機存儲數據一般是 2 的冪,這樣設置可以提高運算速度。然後,對每個子集依次進行訓練。所有的子集都訓練完成之後,可以說一次訓練就完成了,我們稱之爲一次 epoch。這就是Mini-Batch 梯度下降算法。

例如總的訓練樣本數量m=320000,拆分成T=5000個子集,每個Mini-Batch包含樣本的個數是64。

常說的迭代訓練N次,是指包含N次epoch。每次epoch又進行T次Mini-Batch梯度下降。也就是說每次epoch都會把所有m個訓練樣本訓練完畢,之後再進入第二次epoch。對於Mini-Batch梯度下降來說,每次epoch時最好隨機打亂所有訓練樣本,再重新隨機均勻分成T個Mini-Batch。這樣更有利於神經網絡進行準確的訓練。

Batch梯度下降損失函數的下降過程是比較平滑的,但是Mini-Batch梯度下降損失函數略有震盪,但也是整體下降的。這是因爲,Mini-Batch梯度下降每次更新都使用不同的Mini-Batch,模型有可能出現不同的表現。

說個極端的情況,當T=m,即每個Mini-Batch包含的樣本數爲1的時候,就成爲了隨機梯度下降算法(StachasticGradientDescent,SGD)。根據T的取值不同,就形成了Batch梯度下降、Mini-Batch梯度下降、隨機梯度下降三種不同的算法。

Batch梯度下降的優化路徑,Batch梯度下降會比較平穩地接近全局最小值,但因爲使用了所有m個樣本,每次前進的速度有些慢、時間也有些長。

Mini-Batch梯度下降的優化路徑,Mini-Batch梯度下降每次前進速度較快,且振盪較小,基本能接近全局

最優值。

隨機梯度下降的優化路徑。隨機梯度下降每次前進速度很快,但是路線曲折,有較大的振盪,最終會在最小值附近來回波動,難以真正達到全局最優值。

實際應用時,如果樣本數量不是太大,例如m<2000,則三種梯度下降算法差別不大,可以直接使用Batch梯度下降。若樣本數量很大時,則一般使用Mini-Batch梯度下降。每個Batch的Size可根據實際情況而定,一般不要太大也不要太小。

 

動量梯度下降(MomentumGD)

動量梯度下降算法是在每次訓練時,對梯度進行指數加權平均處理,然後用得到的梯度值更新權重W和常數項b。它的速度要比傳統的梯度下降算法快。

該算法的關鍵是對梯度進行了指數加權,權重W和常數項b的指數加權平均表達式如下:

 

 

滑動平均能讓每次更新不會有太大的振盪。而且β越接近1,滑動平均的效果越明顯,振盪越小。也就是說,當前的速度是漸變的,而不是瞬變的,這保證了梯度下降的平穩性和準確性,減少振盪,較快地達到最小值處。

下面來比較一下傳統梯度下降與動量梯度下降算法的實際訓練效果。

傳統的梯度下降,傳統的梯度下降優化路徑是比較曲折的,振盪較大,尤其在W、b之間數值範圍差別較大的情況下。每一點處的梯度只與當前方向有關,產生類似折線的效果,前進緩慢,達到全局最優解的耗時更多。

動量梯度下降算法,動量梯度下降算法對梯度進行指數加權平均,這樣使當前梯度不僅與當前方向有關,還與之前的方向有關,這樣的處理使梯度前進方向更加平滑,減少振盪,能夠更快地到達最小值處。而

用Python實現動量梯度下降算法,代碼示例如下:

dW=compute_gradient(W)

Vdw=beta*Vdw+dW

Vdb=beta*Vdb+db

W-=alpha*Vdw

b-=alpha*Vdb

NesterovMomentum

NesterovMomentum是MomentumGD的變種,與MomentumGD唯一區別就是,計算梯度的不同。NesterovMomentum先用當前的更新一遍參數,再用更新的臨時參數計算新的梯度,相當於添加了矯正因子的MomentumGD。NesterovMomentum可以防止優化算法走得太快錯過極小值,使其對變動的反應更靈敏。

NesterovMomentum除了速度較快之外,振盪也更小一些。

NesterovMomentum相應的Python示例代碼如下:

dW=compute_gradient(W)

db=compute_gradient(b)

Vdw=beta*Vdw-alpha*dW

Vdb=beta*Vdb-alpha*db

W+=Vdw

b+=Vdb

AdaGrad

對每一個參數W和b的訓練都使用了相同的學習因子α,AdaGrad能夠在訓練中自動的對α進行調整,對於出現頻率較低參數採用較大的更新;相反,對於出現頻率較高的參數採用較小的更新。因此,AdaGrad非常適合處理稀疏數據。

AdaGrad的做法是對從開始到當前迭代訓練的所有參數進行平方和累計,設當前迭代次數爲t,則梯度的平方和爲:

 

這樣使用參數更新公式:

 

其中,ε是常數,一般取1e-7,主要作用是防止分母爲零。

AdaGrad的Python示例代碼爲:

dW=compute_gradient(W)

db=compute_gradient(b)

dW_squared+=dW*dW

db_squared+=db*db

W-=alpha*dW/(np.sqrt(dW_squared)+1e-7)

b-=alpha*db/(np.sqrt(db_squared)+1e-7)

 

RMSprop

RMSprop是GeoffHinton提出的一種自適應學習率方法。AdaGrad會累加之前所有的梯度平方,而RMSprop僅僅是計算對應的平均值,因此可緩解AdaGrad算法學習率下降較快的問題。每次迭代訓練過程中,其權重W和常數項b的更新表達式爲:

 

下面簡單解釋一下RMSprop算法的原理,令水平方向爲W的方向,垂直方向爲b的方向。水平方向振盪較小,而垂直方向振盪較大,則意識db要比dW大。在W和b的更新公式裏,由於分母的存在,會消除彼此的這種差異性,從而減小振盪,實現快速梯度下降算法。總得來說,就是如果哪個方向振盪大,就減小該方向的更新速度。

RMSprop相應的Python示例代碼爲:

dW=compute_gradient(W)

db=compute_gradient(b)

Sdw=beta*Sdw+(1-beta)*dW*dW

Sdb=beta*Sdb+(1-beta)*db*db

W-=alpha*dW/(np.sqrt(Sdw)+1e-7)

b-=alpha*db/(np.sqrt(Sdb)+1e-7)

 

Adam

Adam(AdaptiveMomentEstimation)是另一種自適應學習率的方法。它利用梯度的一階矩估計和二階矩估計動態調整每個參數的學習率。Adam的優點主要在於經過偏置校正後,每一次迭代學習率都有個確定範圍,使得參數比較平穩。相應的公式如下:

 

 

其中,t是當前迭代次數。Adam算法包含了幾個超參數,分別是:α、β1、β2,ε。通常α設置爲0.9,β1通常設置爲0.999,β2通常設置爲1e-7。一般只需要對β1和β2進行調試

實際應用中,Adam算法結合了動量梯度下降和RMSprop各自的優點,使得神經網絡訓練速度大大提高。

Adam相應的Python示例代碼爲:

dW=compute_gradient(W)

db=compute_gradient(b)

Vdw=beta1*Vdw+(1-beat1)*dW

Vdb=beta1*Vdb+(1-beta1)*db

Sdw=beta2*Sdw+(1-beta2)*dW*dW

Sdb=beta2*Sdb+(1-beta2)*db*db

Vdw_corrected=Vdw/(1-beta1**t)

Vdb_corrected=Vdb/(1-1-beta1**t)

Sdw_corrected=Sdw/(1-1-beta2**t)

Sdb_corrected=Sdb/(1-1-beta2**t)

W-=alpha*Vdw_corrected/np.sqrt(Sdw_corrected+1e-7)

b-=alpha*Vdb_corrected/np.sqrt(Sdb_corrected+1e-7)

 

降低學習因子

學習因子α決定了梯度下降每次更新參數的尺度大小,俗稱步進長度。學習因子過大或過小,都會嚴重影響神經網絡的訓練效果。

那麼,如何選擇合適的學習因子呢?在神經網絡整個訓練過程中,使用固定大小的學習因子往往效果不好,一般的原則是隨着迭代次數增加,學習因子應該逐漸減小。這種方法被稱爲LearningRateDecay。

下面討論一下使用LearningRateDecay的原因。如下圖所示,使用恆定的學習因子由於每次訓練相同,在接近最優值處的振盪也大,在最優值附近較大範圍內振盪,與最優值距離比較遠。使用不斷減小的隨着訓練次數增加,逐漸減小,步進長度減小,使得能夠在最優值處較小範圍內微弱振盪,不斷逼近最優值。

LearningRateDecay有兩種常用形式,第一種是ExponentialDecay,相應的表達式如下所示:

 

其中,k爲可調參數,t爲當前迭代次數。學習因子α呈指數衰減。

第二種是1/t Decay,相應的表達式如下所示:

 

其中,k爲可調參數,t爲當前迭代次數。

總結

本文主要介紹了神經網絡中幾種常見的梯度下降優化算法,包括Mini-Batch、Momentum、NesterovMomentum、AdaGrad、RMSprop、Adam、LearningRateDecay,並對各自特點進行了說明和對比。實際應用中應該根據具體情況選擇合適的優化算法。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章