改善深層神經網絡(吳恩達) 第二週 ———— 優化算法_01_筆記[轉載:https://redstonewill.com/1077/]

上節課我們主要介紹瞭如何建立一個實用的深度學習神經網絡。包括Train/Dev/Test sets的比例選擇,Bias和Variance的概念和區別:Bias對應欠擬合,Variance對應過擬合。接着,我們介紹了防止過擬合的兩種方法:L2 regularization和Dropout。然後,介紹瞭如何進行規範化輸入,以加快梯度下降速度和精度。然後,我們介紹了梯度消失和梯度爆炸的概念和危害,並提出瞭如何使用梯度初始化來降低這種風險。最後,我們介紹了梯度檢查,來驗證梯度下降算法是否正確。本節課,我們將繼續討論深度神經網絡中的一些優化算法,通過使用這些技巧和方法來提高神經網絡的訓練速度和精度。

1. Mini-batch gradient descent

之前我們介紹的神經網絡訓練過程是對所有m個樣本,稱爲batch,通過向量化計算方式,同時進行的。如果m很大,例如達到百萬數量級,訓練速度往往會很慢,因爲每次迭代都要對所有樣本進行進行求和運算和矩陣運算。我們將這種梯度下降算法稱爲Batch Gradient Descent。

爲了解決這一問題,我們可以把m個訓練樣本分成若干個子集,稱爲mini-batches,這樣每個子集包含的數據量就小了,例如只有1000,然後每次在單一子集上進行神經網絡訓練,速度就會大大提高。這種梯度下降算法叫做Mini-batch Gradient Descent。

假設總的訓練樣本個數m=5000000,其維度爲(nx,m)(n_x,m)(nx,m)。將其分成5000個子集,每個mini-batch含有1000個樣本。我們將每個mini-batch記爲XtX^{{t}}Xt,其維度爲(nx,1000)(n_x,1000)(nx,1000)。相應的每個mini-batch的輸出記爲YtY^{{t}}Yt,其維度爲(1,1000)(1,1000)(1,1000),且t=1,2,⋯ ,5000t=1,2,\cdots,5000t=1,2,,5000

這裏順便總結一下我們遇到的神經網絡中幾類字母的上標含義:

  • X(i)X^{(i)}X(i) :第i個樣本

  • Z[l]Z^{[l]}Z[l]:神經網絡第lll層網絡的線性輸出

  • Xt,YtX^{{t}},Y^{{t}}Xt,Yt:第t組mini-batch

Mini-batches Gradient Descent的實現過程是先將總的訓練樣本分成T個子集(mini-batches),然後對每個mini-batch進行神經網絡訓練,包括Forward Propagation,Compute Cost Function,Backward Propagation,循環至T個mini-batch都訓練完畢。

for  t=1,⋯ ,Tfor\ \ t=1,\cdots,Tfor  t=1,,T

    Forward Propagation\ \ \ \ Forward\ Propagation    Forward Propagation

    ComputeCostFunction\ \ \ \ Compute Cost Function    ComputeCostFunction

    BackwardPropagation\ \ \ \ Backward Propagation    BackwardPropagation

    W:=W−α⋅dW\ \ \ \ W:=W-\alpha\cdot dW    W:=WαdW

    b:=b−α⋅db\ \ \ \ b:=b-\alpha\cdot db    b:=bαdb

經過T次循環之後,所有m個訓練樣本都進行了梯度下降計算。這個過程,我們稱之爲經歷了一個epoch。對於Batch Gradient Descent而言,一個epoch只進行一次梯度下降算法;而Mini-Batches Gradient Descent,一個epoch會進行T次梯度下降算法。

值得一提的是,對於Mini-Batches Gradient Descent,可以進行多次epoch訓練。而且,每次epoch,最好是將總體訓練數據重新打亂、重新分成T組mini-batches,這樣有利於訓練出最佳的神經網絡模型。

2. Understanding mini-batch gradient descent

Batch gradient descent和Mini-batch gradient descent的cost曲線如下圖所示:

對於一般的神經網絡模型,使用Batch gradient descent,隨着迭代次數增加,cost是不斷減小的。然而,使用Mini-batch gradient descent,隨着在不同的mini-batch上迭代訓練,其cost不是單調下降,而是受類似noise的影響,出現振盪。但整體的趨勢是下降的,最終也能得到較低的cost值。

之所以出現細微振盪的原因是不同的mini-batch之間是有差異的。例如可能第一個子集(X1,Y1)(X^{{1}},Y^{{1}})(X1,Y1)是好的子集,而第二個子集(X2,Y2)(X^{{2}},Y^{{2}})(X2,Y2)包含了一些噪聲noise。出現細微振盪是正常的。

如何選擇每個mini-batch的大小,即包含的樣本個數呢?有兩個極端:如果mini-batch size=m,即爲Batch gradient descent,只包含一個子集爲(X1,Y1)=(X,Y)(X^{{1}},Y^{{1}})=(X,Y)(X1,Y1)=(X,Y);如果mini-batch size=1,即爲Stachastic gradient descent,每個樣本就是一個子集(X1,Y1)=(x(i),y(i))(X^{{1}},Y^{{1}})=(x^{(i)},y^{(i)})(X1,Y1)=(x(i),y(i)),共有m個子集。

我們來比較一下Batch gradient descent和Stachastic gradient descent的梯度下降曲線。如下圖所示,藍色的線代表Batch gradient descent,紫色的線代表Stachastic gradient descent。Batch gradient descent會比較平穩地接近全局最小值,但是因爲使用了所有m個樣本,每次前進的速度有些慢。Stachastic gradient descent每次前進速度很快,但是路線曲折,有較大的振盪,最終會在最小值附近來回波動,難以真正達到最小值處。而且在數值處理上就不能使用向量化的方法來提高運算速度。

實際使用中,mini-batch size不能設置得太大(Batch gradient descent),也不能設置得太小(Stachastic gradient descent)。這樣,相當於結合了Batch gradient descent和Stachastic gradient descent各自的優點,既能使用向量化優化算法,又能叫快速地找到最小值。mini-batch gradient descent的梯度下降曲線如下圖綠色所示,每次前進速度較快,且振盪較小,基本能接近全局最小值。

一般來說,如果總體樣本數量m不太大時,例如m≤2000m\leq2000m2000,建議直接使用Batch gradient descent。如果總體樣本數量m很大時,建議將樣本分成許多mini-batches。推薦常用的mini-batch size爲64,128,256,512。這些都是2的冪。之所以這樣設置的原因是計算機存儲數據一般是2的冪,這樣設置可以提高運算速度。

3. Exponentially weighted averages

該部分我們將介紹指數加權平均(Exponentially weighted averages)的概念。

舉個例子,記錄半年內倫敦市的氣溫變化,並在二維平面上繪製出來,如下圖所示:

看上去,溫度數據似乎有noise,而且抖動較大。如果我們希望看到半年內氣溫的整體變化趨勢,可以通過移動平均(moving average)的方法來對每天氣溫進行平滑處理。

例如我們可以設V0=0V_0=0V0=0,當成第0天的氣溫值。

第一天的氣溫與第0天的氣溫有關:

V1=0.9V0+0.1θ1V_1=0.9V_0+0.1\theta_1V1=0.9V0+0.1θ1

第二天的氣溫與第一天的氣溫有關:

V2=0.9V1+0.1θ2=0.9(0.9V0+0.1θ1)+0.1θ2=0.92V0+0.9⋅0.1θ1+0.1θ2V_2=0.9V_1+0.1\theta_2=0.9(0.9V_0+0.1\theta_1)+0.1\theta_2=0.9^2V_0+0.9\cdot0.1\theta_1+0.1\theta_2V2=0.9V1+0.1θ2=0.9(0.9V0+0.1θ1)+0.1θ2=0.92V0+0.90.1θ1+0.1θ2

第三天的氣溫與第二天的氣溫有關:

V3=0.9V2+0.1θ3=0.9(0.92V0+0.9⋅0.1θ1+0.1θ2)+0.1θ3=0.93V0+0.92⋅0.1θ1+0.9⋅0.1θ2+0.1θ3V_3=0.9V_2+0.1\theta_3=0.9(0.9^2V_0+0.9\cdot0.1\theta_1+0.1\theta_2)+0.1\theta_3=0.9^3V_0+0.9^2\cdot 0.1\theta_1+0.9\cdot 0.1\theta_2+0.1\theta_3V3=0.9V2+0.1θ3=0.9(0.92V0+0.90.1θ1+0.1θ2)+0.1θ3=0.93V0+0.920.1θ1+0.90.1θ2+0.1θ3

即第t天與第t-1天的氣溫迭代關係爲:

Vt=0.9Vt−1+0.1θt=0.9tV0+0.9t−1⋅0.1θ1+0.9t−2⋅0.1θ2+⋯+0.9⋅0.1θt−1+0.1θtV_t=0.9V_{t-1}+0.1\theta_t=0.9^tV_0+0.9^{t-1}\cdot0.1\theta_1+0.9^{t-2}\cdot 0.1\theta_2+\cdots+0.9\cdot0.1\theta_{t-1}+0.1\theta_tVt=0.9Vt1+0.1θt=0.9tV0+0.9t10.1θ1+0.9t20.1θ2++0.90.1θt1+0.1θt

經過移動平均處理得到的氣溫如下圖紅色曲線所示:

這種滑動平均算法稱爲指數加權平均(exponentially weighted average)。根據之前的推導公式,其一般形式爲:

Vt=βVt−1+(1−β)θtV_t=\beta V_{t-1}+(1-\beta)\theta_tVt=βVt1+(1β)θt

上面的例子中,β=0.9\beta=0.9β=0.9β\betaβ值決定了指數加權平均的天數,近似表示爲:

11−β\frac{1}{1-\beta}1β1

例如,當β=0.9\beta=0.9β=0.9,則11−β=10\frac{1}{1-\beta}=101β1=10,表示將前10天進行指數加權平均。當β=0.98\beta=0.98β=0.98,則11−β=50\frac{1}{1-\beta}=501β1=50,表示將前50天進行指數加權平均。β\betaβ值越大,則指數加權平均的天數越多,平均後的趨勢線就越平緩,但是同時也會向右平移。下圖綠色曲線和黃色曲線分別表示了β=0.98\beta=0.98β=0.98β=0.5\beta=0.5β=0.5時,指數加權平均的結果。

這裏簡單解釋一下公式11−β\frac{1}{1-\beta}1β1是怎麼來的。準確來說,指數加權平均算法跟之前所有天的數值都有關係,根據之前的推導公式就能看出。但是指數是衰減的,一般認爲衰減到1e\frac1ee1就可以忽略不計了。因此,根據之前的推導公式,我們只要證明

β11−β=1e\beta^{\frac{1}{1-\beta}}=\frac1eβ1β1=e1

就好了。

11−β=N\frac{1}{1-\beta}=N1β1=NN&gt;0N&gt;0N>0,則β=1−1N\beta=1-\frac{1}{N}β=1N11N&lt;1\frac1N&lt;1N1<1。即證明轉化爲:

(1−1N)N=1e(1-\frac1N)^N=\frac1e(1N1)N=e1

顯然,當N&gt;&gt;0N&gt;&gt;0N>>0時,上述等式是近似成立的。

至此,簡單解釋了爲什麼指數加權平均的天數的計算公式爲11−β\frac{1}{1-\beta}1β1

4. Understanding exponetially weighted averages

我們將指數加權平均公式的一般形式寫下來:

Vt=βVt−1+(1−β)θt=(1−β)θt+(1−β)⋅β⋅θt−1+(1−β)⋅β2⋅θt−2+⋯+(1−β)⋅βt−1⋅θ1+βt⋅V0V_t=\beta V_{t-1}+(1-\beta)\theta_t=(1-\beta)\theta_t+(1-\beta)\cdot\beta\cdot\theta_{t-1}+(1-\beta)\cdot \beta^2\cdot\theta_{t-2}+\cdots+(1-\beta)\cdot \beta^{t-1}\cdot \theta_1+\beta^t\cdot V_0Vt=βVt1+(1β)θt=(1β)θt+(1β)βθt1+(1β)β2θt2++(1β)βt1θ1+βtV0

觀察上面這個式子,θt,θt−1,θt−2,⋯&ThinSpace;,θ1\theta_t,\theta_{t-1},\theta_{t-2},\cdots,\theta_1θt,θt1,θt2,,θ1是原始數據值,(1−β),(1−β)β,(1−β)β2,⋯&ThinSpace;,(1−β)βt−1(1-\beta),(1-\beta)\beta,(1-\beta)\beta^2,\cdots,(1-\beta)\beta^{t-1}(1β),(1β)β,(1β)β2,,(1β)βt1是類似指數曲線,從右向左,呈指數下降的。VtV_tVt的值就是這兩個子式的點乘,將原始數據值與衰減指數點乘,相當於做了指數衰減,離得越近,影響越大,離得越遠,影響越小,衰減越厲害。

我們已經知道了指數加權平均的遞推公式。實際應用中,爲了減少內存的使用,我們可以使用這樣的語句來實現指數加權平均算法:

Vθ=0V_{\theta}=0Vθ=0

Repeat:Repeat:Repeat:

    Get next θt\ \ \ \ Get\ next\ \theta_t    Get next θt

    Vθ:=βVθ+(1−β)θt\ \ \ \ V_{\theta}:=\beta V_{\theta}+(1-\beta)\theta_t    Vθ:=βVθ+(1β)θt

5. Bias correction in exponentially weighted average

上文中提到當β=0.98\beta=0.98β=0.98時,指數加權平均結果如下圖綠色曲線所示。但是實際上,真實曲線如紫色曲線所示。

我們注意到,紫色曲線與綠色曲線的區別是,紫色曲線開始的時候相對較低一些。這是因爲開始時我們設置V0=0V_0=0V0=0,所以初始值會相對小一些,直到後面受前面的影響漸漸變小,趨於正常。

修正這種問題的方法是進行偏移校正(bias correction),即在每次計算完VtV_tVt後,對VtV_tVt進行下式處理:

Vt1−βt\frac{V_t}{1-\beta^t}1βtVt

在剛開始的時候,t比較小,(1−βt)&lt;1(1-\beta^t)&lt;1(1βt)<1,這樣就將VtV_tVt修正得更大一些,效果是把紫色曲線開始部分向上提升一些,與綠色曲線接近重合。隨着t增大,(1−βt)≈1(1-\beta^t)\approx1(1βt)1VtV_tVt基本不變,紫色曲線與綠色曲線依然重合。這樣就實現了簡單的偏移校正,得到我們希望的綠色曲線。

值得一提的是,機器學習中,偏移校正並不是必須的。因爲,在迭代一次次數後(t較大),VtV_tVt受初始值影響微乎其微,紫色曲線與綠色曲線基本重合。所以,一般可以忽略初始迭代過程,等到一定迭代之後再取值,這樣就不需要進行偏移校正了。

6. Gradient descent with momentum

該部分將介紹動量梯度下降算法,其速度要比傳統的梯度下降算法快很多。做法是在每次訓練時,對梯度進行指數加權平均處理,然後用得到的梯度值更新權重W和常數項b。下面介紹具體的實現過程。

原始的梯度下降算法如上圖藍色折線所示。在梯度下降過程中,梯度下降的振盪較大,尤其對於W、b之間數值範圍差別較大的情況。此時每一點處的梯度只與當前方向有關,產生類似折線的效果,前進緩慢。而如果對梯度進行指數加權平均,這樣使當前梯度不僅與當前方向有關,還與之前的方向有關,這樣處理讓梯度前進方向更加平滑,減少振盪,能夠更快地到達最小值處。

權重W和常數項b的指數加權平均表達式如下:

VdW=β⋅VdW+(1−β)⋅dWV_{dW}=\beta\cdot V_{dW}+(1-\beta)\cdot dWVdW=βVdW+(1β)dW

Vdb=β⋅Vdb+(1−β)⋅dbV_{db}=\beta\cdot V_{db}+(1-\beta)\cdot dbVdb=βVdb+(1β)db

從動量的角度來看,以權重W爲例,VdWV_{dW}VdW可以成速度V,dWdWdW可以看成是加速度a。指數加權平均實際上是計算當前的速度,當前速度由之前的速度和現在的加速度共同影響。而β&lt;1\beta&lt;1β<1,又能限制速度VdWV_{dW}VdW過大。也就是說,當前的速度是漸變的,而不是瞬變的,是動量的過程。這保證了梯度下降的平穩性和準確性,減少振盪,較快地達到最小值處。

動量梯度下降算法的過程如下:

On iteration t:On\ iteration\ t:On iteration t:

    Compute dW, db on the current mini−batch\ \ \ \ Compute\ dW,\ db\ on\ the\ current\ mini-batch    Compute dW, db on the current minibatch

    VdW=βVdW+(1−β)dW\ \ \ \ V_{dW}=\beta V_{dW}+(1-\beta)dW    VdW=βVdW+(1β)dW

    Vdb=βVdb+(1−β)db\ \ \ \ V_{db}=\beta V_{db}+(1-\beta)db    Vdb=βVdb+(1β)db

    W=W−αVdW, b=b−αVdb\ \ \ \ W=W-\alpha V_{dW},\ b=b-\alpha V_{db}    W=WαVdW, b=bαVdb

初始時,令VdW=0,Vdb=0V_{dW}=0,V_{db}=0VdW=0,Vdb=0。一般設置β=0.9\beta=0.9β=0.9,即指數加權平均前10天的數據,實際應用效果較好。

另外,關於偏移校正,可以不使用。因爲經過10次迭代後,隨着滑動平均的過程,偏移情況會逐漸消失。

補充一下,在其它文獻資料中,動量梯度下降還有另外一種寫法:

VdW=βVdW+dWV_{dW}=\beta V_{dW}+dWVdW=βVdW+dW

Vdb=βVdb+dbV_{db}=\beta V_{db}+dbVdb=βVdb+db

即消去了dWdWdWdbdbdb前的係數(1−β)(1-\beta)(1β)。這樣簡化了表達式,但是學習因子α\alphaα相當於變成了α1−β\frac{\alpha}{1-\beta}1βα,表示α\alphaα也受β\betaβ的影響。從效果上來說,這種寫法也是可以的,但是不夠直觀,且調參涉及到α\alphaα,不夠方便。所以,實際應用中,推薦第一種動量梯度下降的表達式。

7. RMSprop

RMSprop是另外一種優化梯度下降速度的算法。每次迭代訓練過程中,其權重W和常數項b的更新表達式爲:

SW=βSdW+(1−β)dW2S_W=\beta S_{dW}+(1-\beta)dW^2SW=βSdW+(1β)dW2

Sb=βSdb+(1−β)db2S_b=\beta S_{db}+(1-\beta)db^2Sb=βSdb+(1β)db2

W:=W−αdWSW, b:=b−αdbSbW:=W-\alpha \frac{dW}{\sqrt{S_W}},\ b:=b-\alpha \frac{db}{\sqrt{S_b}}W:=WαSWdW, b:=bαSbdb

下面簡單解釋一下RMSprop算法的原理,仍然以下圖爲例,爲了便於分析,令水平方向爲W的方向,垂直方向爲b的方向。

從圖中可以看出,梯度下降(藍色折線)在垂直方向(b)上振盪較大,在水平方向(W)上振盪較小,表示在b方向上梯度較大,即dbdbdb較大,而在W方向上梯度較小,即dWdWdW較小。因此,上述表達式中SbS_bSb較大,而SWS_WSW較小。在更新W和b的表達式中,變化值dWSW\frac{dW}{\sqrt{S_W}}SWdW較大,而dbSb\frac{db}{\sqrt{S_b}}Sbdb較小。也就使得W變化得多一些,b變化得少一些。即加快了W方向的速度,減小了b方向的速度,減小振盪,實現快速梯度下降算法,其梯度下降過程如綠色折線所示。總得來說,就是如果哪個方向振盪大,就減小該方向的更新速度,從而減小振盪。

還有一點需要注意的是爲了避免RMSprop算法中分母爲零,通常可以在分母增加一個極小的常數ε\varepsilonε

W:=W−αdWSW+ε, b:=b−αdbSb+εW:=W-\alpha \frac{dW}{\sqrt{S_W}+\varepsilon},\ b:=b-\alpha \frac{db}{\sqrt{S_b}+\varepsilon}W:=WαSW+εdW, b:=bαSb+εdb

其中,ε=10−8\varepsilon=10^{-8}ε=108,或者其它較小值。

8. Adam optimization algorithm

Adam(Adaptive Moment Estimation)算法結合了動量梯度下降算法和RMSprop算法。其算法流程爲:

VdW=0, SdW, Vdb=0, Sdb=0V_{dW}=0,\ S_{dW},\ V_{db}=0,\ S_{db}=0VdW=0, SdW, Vdb=0, Sdb=0

On iteration t:On\ iteration\ t:On iteration t:

    Cimpute dW, db\ \ \ \ Cimpute\ dW,\ db    Cimpute dW, db

    VdW=β1VdW+(1−β1)dW, Vdb=β1Vdb+(1−β1)db\ \ \ \ V_{dW}=\beta_1V_{dW}+(1-\beta_1)dW,\ V_{db}=\beta_1V_{db}+(1-\beta_1)db    VdW=β1VdW+(

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