3.5 将 Batch 拟合进神经网络-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
| 3.4 正則化網絡的激活函數 | 回到目錄 | 3.6 Batch Norm 為什么奏效 |
將 Batch 擬合進神經網絡 (Fitting Batch Norm into a Neural Network)
你已經看到那些等式,它可以在單一隱藏層進行Batch歸一化,接下來,讓我們看看它是怎樣在深度網絡訓練中擬合的吧。
假設你有一個這樣的神經網絡,我之前說過,你可以認為每個單元負責計算兩件事。第一,它先計算 zzz ,然后應用其到激活函數中再計算 aaa ,所以我可以認為,每個圓圈代表著兩步的計算過程。同樣的,對于下一層而言,那就是 z1[2]z_1^{[2]}z1[2]? 和 a1[2]a_1^{[2]}a1[2]? 等。所以如果你沒有應用Batch歸一化,你會把輸入 XXX 擬合到第一隱藏層,然后首先計算 z[1]z^{[1]}z[1] ,這是由 w[1]w^{[1]}w[1] 和 b[1]b^{[1]}b[1] 兩個參數控制的。接著,通常而言,你會把 z[1]z^{[1]}z[1] 擬合到激活函數以計算 a[1]a^{[1]}a[1] 。但Batch歸一化的做法是將值進行Batch歸一化,簡稱BN,此過程將由 β[1]\beta^{[1]}β[1] 和 γ[1]\gamma^{[1]}γ[1] 兩參數控制,這一操作會給你一個新的規范化的 z[1]z^{[1]}z[1] 值( z~[1]\tilde{z}^{[1]}z~[1] ),然后將其輸入激活函數中得到 a[1]a^{[1]}a[1] ,即 a[1]=g[1](z~[l])a^{[1]}=g^{[1]}(\tilde{z}^{[l]})a[1]=g[1](z~[l]) 。
現在,你已在第一層進行了計算,此時Batch歸一化發生在 zzz 的計算和 aaa 之間,接下來,你需要應用 a[1]a^{[1]}a[1] 值來計算 z[2]z^{[2]}z[2] ,此過程是由 w[2]w^{[2]}w[2] 和 b[2]b^{[2]}b[2] 控制的。與你在第一層所做的類似,你會將 z[2]z^{[2]}z[2] 進行Batch歸一化,現在我們簡稱BN,這是由下一層的Batch歸一化參數所管制的,即 β[2]\beta^{[2]}β[2] 和 γ[2]\gamma^{[2]}γ[2] ,現在你得到 z~[2]\tilde{z}^{[2]}z~[2] ,再通過激活函數計算出 a[2]a^{[2]}a[2] 等等。
所以需要強調的是Batch歸一化是發生在計算 zzz 和 aaa 之間的。直覺就是,與其應用沒有歸一化的 zzz 值,不如用歸一過的 z~\tilde{z}z~ ,這是第一層( z~[1]\tilde{z}^{[1]}z~[1] )。第二層同理,與其應用沒有規范過的 z[2]z^{[2]}z[2] 值,不如用經過方差和均值歸一后的 z~[2]\tilde{z}^{[2]}z~[2] 。所以,你網絡的參數就會是 w[1],b[1],w[2]w^{[1]},b^{[1]},w^{[2]}w[1],b[1],w[2] 和 b[2]b^{[2]}b[2] 等等,我們將要去掉這些參數。但現在,想象參數 w[1],b[1]w^{[1]},b^{[1]}w[1],b[1] 到 w[l],b[l]w^{[l]},b^{[l]}w[l],b[l] ,我們將另一些參數加入到此新網絡中 β[1],β[2],γ[1],γ[2]\beta^{[1]},\beta^{[2]},\gamma^{[1]},\gamma^{[2]}β[1],β[2],γ[1],γ[2] 等等。對于應用Batch歸一化的每一層而言。需要澄清的是,請注意,這里的這些 β\betaβ ( β[1],β[2]\beta^{[1]},\beta^{[2]}β[1],β[2] 等等)和超參數 β\betaβ 沒有任何關系,下一張幻燈片中會解釋原因,后者是用于Momentum或計算各個指數的加權平均值。Adam論文的作者,在論文里用 β\betaβ 代表超參數。Batch歸一化論文的作者,則使用 β\betaβ 代表此參數( β[1],β[2]\beta^{[1]},\beta^{[2]}β[1],β[2] 等等),但這是兩個完全不同的 β\betaβ 。我在兩種情況下都決定使用 β\betaβ ,以便你閱讀那些原創的論文,但Batch歸一化學習參數 β[1],β[2]\beta^{[1]},\beta^{[2]}β[1],β[2] 等等和用于Momentum、Adam、RMSprop算法中的 β\betaβ 不同。
所以現在,這是你算法的新參數,接下來你可以使用想用的任何一種優化算法,比如使用梯度下降法來執行它。
舉個例子,對于給定層,你會計算 dβ[l]d\beta^{[l]}dβ[l],接著更新參數 β\betaβ 為 β[l]=β[l]?αdβ[l]\beta^{[l]}=\beta^{[l]}-\alpha d\beta^{[l]}β[l]=β[l]?αdβ[l] 。你也可以使用Adam或RMSprop或Momentum,以更新參數 β\betaβ 和 γ\gammaγ ,并不是只應用梯度下降法。
即使在之前的視頻中,我已經解釋過Batch歸一化是怎么操作的,計算均值和方差,減去均值,再除以方差,如果它們使用的是深度學習編程框架,通常你不必自己把Batch歸一化步驟應用于Batch歸一化層。因此,探究框架,可寫成一行代碼,比如說,在TensorFlow框架中,你可以用這個函數(tf.nn.batch_normalization)來實現Batch歸一化,我們稍后講解,但實踐中,你不必自己操作所有這些具體的細節,但知道它是如何作用的,你可以更好的理解代碼的作用。但在深度學習框架中,Batch歸一化的過程,經常是類似一行代碼的東西。
所以,到目前為止,我們已經講了Batch歸一化,就像你在整個訓練站點上訓練一樣,或就像你正在使用Batch梯度下降法。
實踐中,Batch歸一化通常和訓練集的mini-batch一起使用。你應用Batch歸一化的方式就是,你用第一個mini-batch( X{1}X^{\{1\}}X{1} ),然后計算 z[1]z^{[1]}z[1] ,這和上張幻燈片上我們所做的一樣,應用參數 w[1]w^{[1]}w[1] 和 b[1]b^{[1]}b[1] ,使用這個mini-batch( X{1}X^{\{1\}}X{1} )。接著,繼續第二個mini-batch( X{2}X^{\{2\}}X{2} ),接著Batch歸一化會減去均值,除以標準差,由 β[1]\beta^{[1]}β[1] 和 γ[1]\gamma^{[1]}γ[1] 重新縮放,這樣就得到了 z~[1]\tilde{z}^{[1]}z~[1] ,而所有的這些都是在第一個mini-batch的基礎上,你再應用激活函數得到 a[1]a^{[1]}a[1] 。然后用 w[2]w^{[2]}w[2] 和 b[2]b^{[2]}b[2] 計算 z[2]z^{[2]}z[2] ,等等,所以你做的這一切都是為了在第一個mini-batch( X{1}X^{\{1\}}X{1} )上進行一步梯度下降法。
類似的工作,你會在第二個mini-batch( X{2}X^{\{2\}}X{2} )上計算 z[1]z^{[1]}z[1] ,然后用Batch歸一化來計算 z~[1]\tilde{z}^{[1]}z~[1] ,所以Batch歸一化的此步中,你用第二個mini-batch( X{2}X^{\{2\}}X{2} )中的數據使 z~[1]\tilde{z}^{[1]}z~[1] 歸一化,這里的Batch歸一化步驟也是如此,讓我們來看看在第二個mini-batch( X{2}X^{\{2\}}X{2} )中的例子,在mini-batch上計算 z[1]z^{[1]}z[1] 的均值和方差,重新縮放的 β\betaβ 和 γ\gammaγ 得到 z[1]z^{[1]}z[1] ,等等。
然后在第三個mini-batch( X{3}X^{\{3\}}X{3} )上同樣這樣做,繼續訓練。
現在,我想澄清此參數的一個細節。先前我說過每層的參數是 w[l]w^{[l]}w[l] 和 b[l]b^{[l]}b[l] ,還有 β[l]\beta^{[l]}β[l] 和 γ[l]\gamma^{[l]}γ[l] ,請注意計算 zzz 的方式如下, z[l]=w[l]a[l?1]+b[l]z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]}z[l]=w[l]a[l?1]+b[l] ,但Batch歸一化做的是,它要看這個mini-batch,先將 z[l]z^{[l]}z[l] 歸一化,結果為均值0和標準方差,再由 β\betaβ 和 γ\gammaγ 重縮放,但這意味著,無論 b[l]b^{[l]}b[l] 的值是多少,都是要被減去的,因為在Batch歸一化的過程中,你要計算 z[l]z^{[l]}z[l] 的均值,再減去平均值,在此例中的mini-batch中增加任何常數,數值都不會改變,因為加上的任何常數都將會被均值減去所抵消。
所以,如果你在使用Batch歸一化,其實你可以消除這個參數( b[l]b^{[l]}b[l] ),或者你也可以,暫時把它設置為0,那么,參數變成 z[l]=w[l]a[l?1]z^{[l]}=w^{[l]}a^{[l-1]}z[l]=w[l]a[l?1] ,然后你計算歸一化的 z[l]z^{[l]}z[l] , z~[l]=γ[l]z[l]+β[l]\tilde{z}^{[l]}=\gamma^{[l]}z^{[l]}+\beta^{[l]}z~[l]=γ[l]z[l]+β[l] ,你最后會用參數 β[l]\beta^{[l]}β[l] ,以便決定 z~[l]\tilde{z}^{[l]}z~[l] 的取值,這就是原因。
所以總結一下,因為Batch歸一化超過了此層 z[l]z^{[l]}z[l] 的均值, b[l]b^{[l]}b[l] 這個參數沒有意義,所以,你必須去掉它,由 β[l]\beta^{[l]}β[l] 代替,這是個控制參數,會影響轉移或偏置條件。
最后,請記住 z[l]z^{[l]}z[l] 的維數,因為在這個例子中,維數會是( n[l],1n^{[l]},1n[l],1 ), b[l]b^{[l]}b[l] 的尺寸為( n[l],1n^{[l]},1n[l],1 ),如果是 lll 層隱藏單元的數量,那 β[l]\beta^{[l]}β[l] 和 γ[l]\gamma^{[l]}γ[l] 的維度也是( n[l],1n^{[l]},1n[l],1 ),因為這是你隱藏層的數量,你有 n[l]n^{[l]}n[l] 隱藏單元,所以 β[l]\beta^{[l]}β[l] 和 γ[l]\gamma^{[l]}γ[l] 用來將每個隱藏層的均值和方差縮放為網絡想要的值。
讓我們總結一下關于如何用Batch歸一化來應用梯度下降法,假設你在使用mini-batch梯度下降法,你運行 t=1t=1t=1 到batch數量的for循環,你會在mini-batch X{1}X^{\{1\}}X{1} 上應用正向prop,每個隱藏層都應用正向prop,用Batch歸一化代替 z[l]z^{[l]}z[l] 為 z~[l]\tilde{z}^{[l]}z~[l] 。接下來,它確保在這個mini-batch中, zzz 值有歸一化的均值和方差,歸一化均值和方差后是 z~[l]\tilde{z}^{[l]}z~[l] ,然后,你用反向prop計算 dw[l]dw^{[l]}dw[l] 和 db[l]db^{[l]}db[l] ,及所有 lll 層所有的參數, dβ[l]d\beta^{[l]}dβ[l] 和 dγ[l]d\gamma^{[l]}dγ[l] 。盡管嚴格來說,因為你要去掉 bbb ,這部分其實已經去掉了。最后,你更新這些參數: w[l]=w[l]?αdw[l]w^{[l]}=w^{[l]}-\alpha dw^{[l]}w[l]=w[l]?αdw[l] ,和以前一樣, β[l]=β[l]?αdβ[l]\beta^{[l]}=\beta^{[l]}-\alpha d\beta^{[l]}β[l]=β[l]?αdβ[l] ,對于 γ\gammaγ 也是如此 γ[l]=γ[l]?αdγ[l]\gamma^{[l]}=\gamma^{[l]}-\alpha d\gamma^{[l]}γ[l]=γ[l]?αdγ[l] 。
如果你已將梯度計算如下,你就可以使用梯度下降法了,這就是我寫到這里的,但也適用于有Momentum、RMSprop、Adam的梯度下降法。與其使用梯度下降法更新mini-batch,你可以使用這些其它算法來更新,我們在之前幾個星期中的視頻中討論過的,也可以應用其它的一些優化算法來更新由Batch歸一化添加到算法中的 β\betaβ 和 γ\gammaγ 參數。
我希望,你能學會如何從頭開始應用Batch歸一化,如果你想的話。如果你使用深度學習編程框架之一,我們之后會談。,希望,你可以直接調用別人的編程框架,這會使Batch歸一化的使用變得很容易。
現在,以防Batch歸一化仍然看起來有些神秘,尤其是你還不清楚為什么其能如此顯著的加速訓練,我們進入下一個視頻,詳細討論Batch歸一化為何效果如此顯著,它到底在做什么。
課程PPT
| 3.4 正則化網絡的激活函數 | 回到目錄 | 3.6 Batch Norm 為什么奏效 |
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的3.5 将 Batch 拟合进神经网络-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.4 归一化网络的激活函数-深度学习第
- 下一篇: 3.6 BatchNorm 为什么起作用