梯度下降算法及其改進方法詳解

梯度下降算法及其改進方法詳解

本文中例子來源於:
https://zhuanlan.zhihu.com/p/21486826
https://zhuanlan.zhihu.com/p/22810533

1. 前提

1.1 成本函數

設計完神經網絡結構之後,接下來就要設計神經網絡的學習算法。假設向量X 爲神經網絡的輸入向量,向量Y 爲神經網絡的輸出向量,向量A 爲實際輸出。我們算法的目的是使實際輸出儘可能等於期望輸出。爲了量化算法的好壞,我們定義一個損耗函數(cost function):

C(w,b)12ni=1nYiAi2(1)

上式中,w,b 分別爲網絡中權值和偏置的集合,即w=w1,w2,b=b1,b2,n 是輸入訓練樣本的總數。 Yi 表示在第i 個樣本輸入下的期望輸出,Ai 表示在第i 個樣本下的實際輸出。 爲範數運算。
公式(1)實際上是計算的期望輸出與實際輸出差值的平均值,因此(1)也被稱爲均方誤差(MSE, mean squard error)。當我們的算法足夠好時,期望輸出與實際輸出應近似相等,此時公式(1)均方誤差C0 。換句話說,我們的算法的目的變爲找到一組權值和偏置的集合使得均方誤差取得最小值。

1.2 爲什麼要用均方誤差?

我們最終的目的是神經網絡輸出的準確率,爲什麼不直接讓正確率最大化而是找一個替代方法?這是因爲神經網絡的正確率不是關於權值和偏置的光滑函數。更進一步來說,權值和偏置的微小變化不一定能引起正確率的變化,所以我們就不能通過正確率來不斷修改權值和偏置來提升性能。爲什麼我們選擇均方誤差作爲成本函數而不用其他?當然有其他成本函數我們在後面介紹,但要指出的是,公式(1)很好用。

2. 梯度下降算法

上面已經說了,我們的目的是求成本函數的最小值。數學上常用的方法是通過求導計算目標函數的最小值(如拉格朗日乘數法)。這在目標函數變量不太多時非常有效,但在變量很多時就有些力不從心了。比如,一個大型神經網絡,權值和偏置的數目往往以億萬計,如果用上述方法會變得異常麻煩(此時拉格朗日乘數法要解一個億萬個函數組成的方程組)。對此,我們提出了梯度下降算法(GD, gradient descent)來解決這個問題。

2.1 批梯度下降算法(BGD)

我們把成本函數C 想象成一個山谷表面,其梯度的負方向就是下降速度最快的方向,假設我們有一個小球,那麼小球只要沿着這個方向就可以最快到達谷底,即最快取得最小值(有可能停在局部極小值處,我們要避免這種情況)。梯度的定義爲:

C(Cw1,Cw2,Cb1,Cb2,)(2)

假設球在w1 方向上移動的距離爲Δw1 ,在w2 方向上移動的距離爲Δw2 , 。由全微分可得,求在曲面上移動距離爲:
ΔC=Cw1Δw1+Cw2Δw2++Cb1+Δw1(3)

接下來要找到一種方式,保證ΔC 是負的,只有這樣,球纔是往下走的。由公式(2)和公式(3)我們可以得出:
ΔC=CΔV(4)

其中ΔV=(Δw1,Δb1,)T ,從公式(4)我們可以看出應如何選擇ΔV 才能保證ΔC 爲負數,假設我們的選擇如下
ΔV=η(C)T(5)

其中η 是一個取值0~1 的正數,稱爲學習率。此時公式(4)變爲:
ΔC=ηC(C)T=ηC2(6)

因爲C20 ,所以ΔC0
由公式(5)我們可以得到權值和偏置的更新公式V=Vη(C)T ,具體來說就是:
wkbk==wkηCwkblηCbl(7)

上述算法稱爲批梯度下降算法(BGD, batch gradient descent) ,由公式(1)和公式(5)我們可以看出,爲了計算出C 需要計算所有樣本的誤差,換句話,爲了得到一次更新值需要把所有樣本都輸入計算一遍。
下面是批梯度下降算法的流程圖:

Created with Raphaël 2.1.0開始初始化權值、偏置、學習率輸入一個樣本,計算輸出A計算誤差Y-A所有樣本都已經輸入完? 用更新公式更新權值和偏置結束 yesno

2.2 隨機梯度下降算法(SGD)

當樣本很多時,梯度下降算法每更新一次都要輸入所有樣本,因此非常耗時。因此就有了隨機梯度下降算法(SGD, stochastic gradient descent),其基本思想是:隨機選擇一個樣本作爲輸入然後更新一次權值和偏置。此時公式(1)變爲:

C(w,b)=YA22(8)

更新公式爲:
wkbk==wkηCwkblηCbl(9)

流程圖爲:

Created with Raphaël 2.1.0開始初始化權值、偏置、學習率輸入一個樣本,計算輸出A計算誤差均方誤差用更新公式更新權值和偏置所有樣本都已經輸入完? 結束 輸入下一樣本yesno

實際上隨機梯度下降算法計算的並不是真正的梯度,真正的梯度應該像批梯度計算那樣需要所有樣本才能計算。隨機梯度只是用一個樣本進行對真正的梯度進行了一次預估,因此可能會有偏差。即隨機梯度下降算法不一定保證每次前進方向都是正確的,所以會帶來波動。

2.3 微批量梯度下降算法(MGD)

隨機梯度下降算法雖然更新速度變快,但每次更新方向不一定正確,所以有可能“繞遠路”。因此又提出了微批量梯度下降算法(MGD, mini-batch gradient descent)。其核心思想是:每次選擇若干樣本估計梯度,比如每學習100個樣本更新一次梯度和權值。
首先,從所有樣本中隨機選出m 個樣本。我們把這m 個樣本編號爲X1,X2,,Xi,,Xm , 並稱他們爲微批量(mini-batch)。此時,均方誤差變爲:

C(w,b)=12mi=1mYiAi2=1mi=1mCXi(10)

其中CXi=YiAi22 ,由梯度可得下式:
C=1mi=1mCXi(11)

因此,公式(11)就用m 個樣本數據估計出整體的梯度,當m 越大估計越準確。此時更新公式爲:
wkbk==wkηCwk=wkηmi=1mCXiwkblηCbl=blηmi=1mCXibl(12)

其流程圖爲:

Created with Raphaël 2.1.0開始初始化權值、偏置、學習率輸入一個樣本,計算輸出A計算誤差均方誤差所有m個樣本都已經訓練完? 用更新公式更新權值和偏置所有n個樣本都訓練完?結束 選取另外m個樣本輸入下一樣本yesnoyesno

2.4 三種梯度下降算法比較

批梯度和隨機梯度相比較而言,批梯度由於使用了所有樣本數據,因此每一次都會朝着正確的方向前進,最後能保證收斂於極值點(凸函數收斂於極值點,非凸函數可能會收斂於局部極值點)。而隨機梯度只用了一個樣本數據進行估計真正的梯度,因此每次前進的方向不一定都是正確的,訓練過程中會出現波動。這些波動使得會導致出現“繞遠路”現象,即迭代次數變多,甚至收斂速度變慢。不過從另一個方面來看,隨機梯度下降所帶來的波動有個好處就是,對於類似盆地區域(即很多局部極小值點)那麼這個波動的特點可能會使得優化的方向從當前的局部極小值點跳到另一個更好的局部極小值點,這樣便可能對於非凸函數,最終收斂於一個較好的局部極值點,甚至全局極值點。另外,由於隨機梯度的期望是梯度本身,即隨機梯度以概率收斂於梯度,所以在訓練樣本足夠多的情況下隨機梯度和梯度有相似的結果。
微批量梯度下降算法與另外兩種比較m=n 時即爲批梯度下降算法,m=1 時即爲隨機梯度下降算法,因次微批量梯度下降算法具有其他兩種算法的特性。當m 值選擇合適時,有超越另外兩種算法的性能,而且微批量算法容易實現並行運算,因此應用最廣。現在,有些文獻中對微批量梯度下降算法和隨機梯度下降算法不進行區分,隨機梯度下降算法就是指微批量梯度下降算法(我們上文中所介紹的隨機梯度下降算法醫應用較少)。

3. 梯度下降算法的改進

梯度下降算法有很多改進算法,比如一階方法主要有:動量法、Nesterov accelerated gradient 、Adagrad、Adadelta與RMSprop,二階方法有:牛頓法、擬牛頓法等。因爲有些改進方法僅僅是某些情況下才有較好的效果,而有的方法較爲複雜,增加了計算量。因而它們大部分應用並不廣泛。這裏我們僅僅介紹一種簡單而且應用最廣泛的一種改進方法——動量法(momentum)

3.1 動量法(Momentmu)

動量法是一種非常簡單的改進方法,已經成功應用數十年。動量法的核心思想是:在梯度方向一致的地方加速,在梯度方向不斷改變的地方減速。其更新公式爲:

ΔVt=ρΔVt1η[C(Vt1)]T(13)

其中ρ 是一個取值0~1的常數,稱爲動量因子,常取0.9。它的大小決定這動量項作用的強弱,當ρ=0 時沒有影響,當ρ=1 時影響最強,平滑效果明顯。這種方法對於像一些又長有窄的山谷一樣的複雜的成本函數面時更爲有效。儘管沿着山谷方向的梯度要比橫跨山谷方向的梯度要小的多,但因爲沿着山谷方向的梯度方向是一致的,因此動量項能加快其學習速度。而橫跨山谷的方向梯度的方向不斷變化,因此動量項能減小其更新量,減慢學習速度,這有效減小了在橫跨山谷方向上的來回震盪。具體而言,動量項發揮作用主要表現在以下幾個方面:

* 在下降初期,使用前一次的大比重下降方向,加速。
* 在越過函數谷面時,異常的學習率,會使得兩次更新方向基本相反,在原地“震盪” 此時,動量因子使得更新幅度減小,協助越過函數谷面。
* 在下降中後期,函數面局部最小值所在的吸引盆數量較多,一旦陷進吸引盆地當中,梯度趨於零,會導致止步不前,學習無法進行。如果有動量項的話,動量因子使得更新幅度增大,協助躍出吸引盆。
爲了更詳細理解動量法的作用,下面我們舉一個例子。假設被優化函數即成本函數C=x2+50y2 ,其函數等高線爲(圖中藍點表示最優值):

成本函數的等高線圖

我們現在用隨機梯度下降算法用較小步長迭代50次看看:
這裏寫圖片描述

可以看到整體是向着最優點前進,但到後面卻有些乏力。接下來增大步長看看:
這裏寫圖片描述

可以看出有很嚴重的震盪現象,繼續增大步長:
這裏寫圖片描述

可以明顯看出,再面對山谷這種函數表面時,隨機梯度下降算法會在橫跨山谷的方向上來回震盪。接下來,我們有加入動量項的改進方法試試:
這裏寫圖片描述

我們發現,加入動量項在迭代50次以後,已經基本來到了最優點附近,比原來方法要好不少。

3.2 涅斯捷羅夫梯度加速法(NAG)

由公式(13)我們可以看出,動量法更新其實包括兩部分:一部分是上一時刻的更新值ρΔVt1 ,這一部分是上一次就已經算出來了,是已知的;另一部分是基於當前位置計算出來的梯度η(C)T涅斯捷羅夫梯度加速法(NAG, Nesterov accelerated gradient) 則指出:既然我已經知道本次更新一定會走ρΔVt1 的量,我爲什麼不先走上ρΔVt1 ,然後再根據那裏的梯度前進一下,豈不美哉?於是就有了以下更新公式:

ΔVt=ρΔVt1η[C(Vt1ρΔVt1)]T(14)

上式與動量法公式(13)相比,唯一的區別就是梯度的計算不是在位置Vt1 處,而是多走了一步,計算(Vt1ρΔVt1) 位置處的梯度。
我們用NAG方法迭代50次之後得到下圖:

這裏寫圖片描述

可以看出,NAG方法不僅接近了最優點,而且更有效的減少了震盪。

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