1. 程式人生 > 實用技巧 >Ng深度學習筆記 改善深層神經網路 優化演算法

Ng深度學習筆記 改善深層神經網路 優化演算法

優化演算法

Mini-batch 梯度下降(Mini-batch gradient descent)

向量化能夠有效地對所有個樣本進行計算而無需某個明確的公式。所以我們要把訓練樣本放大巨大的矩陣當中去。

但如果m很大的話,處理速度仍然緩慢。必須處理整個訓練集,然後才能進行一步梯度下降法,然後你需要再重新處理訓練樣本,才能進行下一步梯度下降法。

所以如果你在處理完整個500萬個樣本的訓練集之前,先讓梯度下降法處理一部分,演算法速度會更快:

把訓練集分割為小一點的子集訓練,這些子集被取名為mini-batch,假設每一個子集中只有1000個樣本,那麼把其中的到取出來,將其稱為第一個子訓練集,也叫做mini-batch,然後你再取出接下來的1000個樣本,從到,然後再取1000個樣本,以此類推。

x ( 1 ) x^{(1)} x(1) x ( 1000 ) x^{(1000)} x(1000)稱為 x { 1 } x^{\{1\}}

x{1} x ( 1001 ) x^{(1001)} x(1001) x ( 2000 ) x^{(2000)} x(2000)稱為 x { 2 } x^{\{2\}} x{2},如果訓練樣本一共有500萬個,每個mini-batch都有1000個樣本,也就有5000個mini-batch.對y也要進行相同處理。
在這裡插入圖片描述
在這裡插入圖片描述
符號總結:

  • 使用了上角小括號表示訓練集裡的值, x ( i ) x^{(i)} x(i)是第個訓練樣本。
  • 上角中括號來表示神經網路的層數, z [ l ] z^{[l]} z[l]表示神經網路中第l層的值
  • 大括號來代表不同的mini-batch, x { t } 和 y { t } x^{\{t\}}和 y^{\{t\}}
    x{t}y{t}
    .

x { t } 和 y { t } x^{\{t\}}和 y^{\{t\}} x{t}y{t}的維數:對於有1000個樣本的訓練集, X 1 X^{{1}} X1維數應該是 ( n x , 1000 ) (n_{x},1000) (nx,1000) X 2 X^{{2}} X2的維數應該是 ( n x , 1000 ) (n_{x},1000) (nx,1000),以此類推。因此所有的子集維數都是 ( n x , 1000 ) (n_{x},1000) (nx,1000),而這些( Y t Y^{{ t}} Yt)的維數都是 ( 1 , 1000 ) (1,1000) (1,1000)

mini-batch梯度下降法的原理: 在訓練集上執行mini-batch梯度下降法,因為我們有5000個各有1000個樣本的組, 執行for t=1……5000,因為我們有5000個各有1000個樣本的組,在for迴圈裡你要做得基本就是對 X t X^{{t}} Xt Y t Y^{{t}} Yt執行一步梯度下降法。
在這裡插入圖片描述

這是使用mini-batch梯度下降法訓練樣本的一步,也可被稱為進行“一代”(1 epoch)的訓練。一代這個詞意味著只是一次遍歷了訓練集。

使用batch梯度下降法,一次遍歷訓練集只做一個梯度下降,使用mini-batch梯度下降法,一次遍歷訓練集,能做5000個梯度下降

理解mini-batch梯度下降法(Understanding mini-batch gradient descent)

在這裡插入圖片描述

使用batch梯度下降法時,每次迭代都需要歷遍整個訓練集,每次迭代成本都會下降,成本函式 J J J會隨著每次迭代而減少,如果 J J J在某次迭代中增加了,也許是因為學習率太大。

使用mini-batch梯度下降法,則並不是每次迭代都是下降的,特別是在每次迭代中,如果要作出成本函式 J t J^{{ t}} Jt的圖,而 J t J^{{t}} Jt只和 X t X^{{ t}} Xt Y t Y^{{t}} Yt有關,很可能會看到這樣的結果:走向朝下,但有更多的噪聲

mini-batch的大小:
兩種極端下成本函式的優化情況

  • 如果mini-batch的大小等於訓練集的大小 m m m,則就是batch梯度下降法。
  • mini-batch大小為1,就隨機梯度下降法,每個樣本都是獨立的mini-batch。

batch梯度下降法從某處開始,相對噪聲低些,幅度也大一些。
在這裡插入圖片描述

隨機梯度下降法中,每次迭代,只對一個樣本進行梯度下降,大部分時候向著全域性最小值靠近,有很多噪聲,平均來看它最終會靠近最小值。隨機梯度下降法永遠不會收斂,而是會一直在最小值附近波動,但它並不會在達到最小值並停留在此。

用mini-batch梯度下降法,不會總朝向最小值靠近,但它比隨機梯度下降要更持續地靠近最小值的方向,它也不一定在很小的範圍內收斂或者波動,如果出現這個問題,可以慢慢減少學習率。
在這裡插入圖片描述

m的選擇:

  1. 如果訓練集較小,直接使用batch梯度下降法;樣本數目較大的話,一般的mini-batch大小為64到512
  2. 考慮到電腦記憶體設定和使用的方式,如果mini-batch大小是2的 n n n次方,程式碼會執行地快一些
  3. 3.mini-batch中,要確保 X t ​ X^{{ t}}​ Xt Y t ​ Y^{{t}}​ Yt要符合CPU/GPU記憶體,取決於你的應用方向以及訓練集的大小。

指數加權平均數(Exponentially weighted averages)

指數加權平均數的關鍵方程:

v t = β v t − 1 + ( 1 − β ) θ t {{v}{t}}=\beta {{v}{t-1}}+(1-\beta ){{\theta }_{t}} vt=βvt1+(1β)θt
β \beta β在統計學中被稱為指數加權移動平均值,我們就簡稱為指數加權平均數。

β \beta β較大時得到的曲線要平坦一些,原因在於多平均了前面的資料,所以這個曲線,波動更小,更加平坦,缺點是曲線進一步右移。

β \beta β較小時,如0.5,平均的資料太少,所以得到的曲線有更多的噪聲,有可能出現異常值,但是這個曲線能夠更快適應變化。

β = 0.9 \beta=0.9 β=0.9的時候,得到的結果是紅線,如果它更接近於1,比如0.98,結果就是綠線,如果 β \beta β小一點,如果是0.5,結果就是黃線。

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

進一步地分析,來理解如何計算出每日溫度的平均值。

同樣的公式, v t = β v t − 1 + ( 1 − β ) θ t {{v}{t}}=\beta {{v}{t-1}}+(1-\beta ){{\theta }_{t}} vt=βvt1+(1β)θt

使 β = 0.9 \beta=0.9 β=0.9,寫下相應的幾個公式,所以在執行的時候, t t t從0到1到2到3, t t t的值在不斷增加,為了更好地分析,我寫的時候使得 t t t的值不斷減小,然後繼續往下寫。

v 100 = 0.1 θ 100 + 0.9 v 99 v_{100}= 0.1\theta_{100} + 0.9v_{99} v100=0.1θ100+0.9v99

v 99 = 0.1 θ 99 + 0.9 v 98 v_{99} = 0.1\theta_{99} +0.9v_{98} v99=0.1θ99+0.9v98),所以: v 100 = 0.1 θ 100 + 0.9 ( 0.1 θ 99 + 0.9 v 98 ) v_{100} = 0.1\theta_{100} + 0.9(0.1\theta_{99} + 0.9v_{98}) v100=0.1θ100+0.9(0.1θ99+0.9v98)

v 98 = 0.1 θ 98 + 0.9 v 97 v_{98} = 0.1\theta_{98} +0.9v_{97} v98=0.1θ98+0.9v97)所以: v 100 = 0.1 θ 100 + 0.9 ( 0.1 θ 99 + 0.9 ( 0.1 θ 98 + 0.9 v 97 ) ) v_{100} = 0.1\theta_{100} + 0.9(0.1\theta_{99} + 0.9(0.1\theta_{98} +0.9v_{97})) v100=0.1θ100+0.9(0.1θ99+0.9(0.1θ98+0.9v97))

以此類推把這些括號都展開,

v 100 = 0.1 θ 100 + 0.1 × 0.9 θ 99 + 0.1 × ( 0.9 ) 2 θ 98 + 0.1 × ( 0.9 ) 3 θ 97 + 0.1 × ( 0.9 ) 4 θ 96 + … v_{100} = 0.1\theta_{100} + 0.1 \times 0.9 \theta_{99} + 0.1 \times {(0.9)}^{2}\theta_{98} + 0.1 \times {(0.9)}^{3}\theta_{97} + 0.1 \times {(0.9)}^{4}\theta_{96} + \ldots v100=0.1θ100+0.1×0.9θ99+0.1×(0.9)2θ98+0.1×(0.9)3θ97+0.1×(0.9)4θ96+

計算 v 100 v_{100} v100是通過,把兩個函式對應的元素,然後求和,用這個數值100號資料值乘以0.1,99號資料值乘以0.1乘以 ( 0.9 ) 2 {(0.9)}^{2} (0.9)2,這是第二項,以此類推,所以選取的是每日溫度,將其與指數衰減函式相乘,然後求和,就得到了 v 100 v_{100} v100

v θ = 0 v_{\theta} =0 vθ=0,然後每一天,拿到第 t t t天的資料,把 v v v更新為 v : = β v θ + ( 1 − β ) θ t v: = \beta v_{\theta} + (1 -\beta)\theta_{t} v:=βvθ+(1β)θt

指數加權平均數公式的好處之一在於,它佔用極少記憶體,電腦記憶體中只佔用一行數字而已。但缺點是,如果儲存所有最近的溫度資料,和過去10天的總和,必須佔用更多的記憶體,執行更加複雜,計算成本也更加高昂。

指數加權平均的偏差修正(Bias correction in exponentially weighted averages)

做偏差修正,可以讓平均數運算更加準確。

v t = β v t − 1 + ( 1 − β ) θ t {{v}{t}}=\beta {{v}_{t-1}}+(1-\beta ){{\theta }_{t}} vt=βvt1+(1β)θt

計算移動平均數的時候,初始化 v 0 = 0 v_{0} = 0 v0=0 v 1 = 0.98 v 0 + 0.02 θ 1 v_{1} = 0.98v_{0} +0.02\theta_{1} v1=0.98v0+0.02θ1,但是 v 0 = 0 v_{0} =0 v0=0,所以這部分沒有了( 0.98 v 0 0.98v_{0} 0.98v0),所以 v 1 = 0.02 θ 1 v_{1} =0.02\theta_{1} v1=0.02θ1,所以如果一天溫度是40華氏度,那麼 v 1 = 0.02 θ 1 = 0.02 × 40 = 8 v_{1} = 0.02\theta_{1} =0.02 \times 40 = 8 v1=0.02θ1=0.02×40=8,因此得到的值會小很多,所以第一天溫度的估測不準。

所以,在估測初期,也就是不用 v t v_{t} vt,而是用 v t 1 − β t \frac{v_{t}}{1- \beta^{t}} 1βtvt,t就是現在的天數。舉個具體例子,當 t = 2 t=2 t=2時, 1 − β t = 1 − 0.98 2 = 0.0396 1 - \beta^{t} = 1 - {0.98}^{2} = 0.0396 1βt=10.982=0.0396,因此對第二天溫度的估測變成了 v 2 0.0396 = 0.0196 θ 1 + 0.02 θ 2 0.0396 \frac{v_{2}}{0.0396} =\frac{0.0196\theta_{1} + 0.02\theta_{2}}{0.0396} 0.0396v2=0.03960.0196θ1+0.02θ2,也就是 θ 1 \theta_{1} θ1 θ 2 \theta_{2} θ2的加權平均數,並去除了偏差。你會發現隨著 t t t增加, β t \beta^{t} βt接近於0,所以當 t t t很大的時候,偏差修正幾乎沒有作用,因此當 t t t較大的時候,紫線基本和綠線重合了。