吳恩達深度學習筆記(52)-將 Batch Norm 擬合進神經網絡

Batch Norm 擬合進神經網絡(Fitting Batch Norm into a neural network)

你已經看到那些等式,它可以在單一隱藏層進行Batch歸一化,接下來,讓我們看看它是怎樣在深度網絡訓練中擬合的吧。

吳恩達深度學習筆記(52)-將 Batch Norm 擬合進神經網絡

假設你有一個這樣的神經網絡,我之前說過,你可以認為每個單元負責計算兩件事。

第一,它先計算z,然後應用其到激活函數中再計算a,所以我可以認為,每個圓圈代表著兩步的計算過程

同樣的,對於下一層而言,那就是z_1^([2])和a_1^([2])等。

所以如果你沒有應用Batch歸一化,你會把輸入X擬合到第一隱藏層,然後首先計算z^([1]),這是由w^([1])和b^([1])兩個參數控制的。

接著,通常而言,你會把z^([1])擬合到激活函數以計算a^([1])。

Batch歸一化的做法是將z^([1])值進行Batch歸一化,簡稱BN,此過程將由β^([1])和γ^([1])兩參數控制,這一操作會給你一個新的規範化的z^([1])值(̃z^([1])),然後將其輸入激活函數中得到a^([1]),即a^([1])=g^([1]) (̃z^([l]))。

吳恩達深度學習筆記(52)-將 Batch Norm 擬合進神經網絡

現在,你已在第一層進行了計算,此時Batch歸一化發生在z的計算和a之間,接下來,你需要應用a^([1])值來計算z^([2]),此過程是由w^([2])和b^([2])控制的。

與你在第一層所做的類似,你會將z^([2])進行Batch歸一化,現在我們簡稱BN,這是由下一層的Batch歸一化參數所管制的,即β^([2])和γ^([2]),現在你得到̃z^([2]),再通過激活函數計算出a^([2])等等。

所以需要強調的是Batch歸一化是發生在計算z和a之間的

直覺就是,與其應用沒有歸一化的z值,不如用歸一過的̃z,這是第一層(̃z^([1]))。

第二層同理,與其應用沒有規範過的z^([2])值,不如用經過方差和均值歸一後的̃z^([2])。

所以,你網絡的參數就會是w^([1]),b^([1]),w^([2])和b^([2])等等,我們將要去掉這些參數。但現在,想象參數w^([1]),b^([1])到w^([l]),b^([l]),我們將另一些參數加入到此新網絡中β^([1]),β^([2]),γ^([1]),γ^([2])等等。

對於應用Batch歸一化的每一層而言。需要澄清的是,請注意,這裡的這些β(β^([1]),β^([2])等等)和超參數β沒有任何關係,後面會解釋原因,後者是用於Momentum或計算各個指數的加權平均值。

Adam論文的作者,在論文裡用β代表超參數。Batch歸一化論文的作者,則使用β代表此參數(β^([1]),β^([2])等等),但這是兩個完全不同的β。我在兩種情況下都決定使用β,以便你閱讀那些原創的論文,但Batch歸一化學習參數β^([1]),β^[2] 等等和用於Momentum、Adam、RMSprop算法中的β不同。

吳恩達深度學習筆記(52)-將 Batch Norm 擬合進神經網絡

所以現在,這是你算法的新參數,接下來你可以使用想用的任何一種優化算法,比如使用梯度下降法來執行它。

舉個例子,對於給定層,你會計算dβ^([l]),接著更新參數β為β^([l])=β^([l])-αdβ^([l])。你也可以使用Adam或RMSprop或Momentum,以更新參數β和γ,並不是只應用梯度下降法

即使在之前的筆記中,已經解釋過Batch歸一化是怎麼操作的,計算均值和方差,減去均值再除以方差,如果它們使用的是深度學習編程框架,通常你不必自己把Batch歸一化步驟應用於Batch歸一化層。

因此,探究框架,可寫成一行代碼,比如說,在TensorFlow框架中,你可以用這個函數(tf.nn.batch_normalization)來實現Batch歸一化,我們稍後講解,但實踐中,你不必自己操作所有這些具體的細節,但知道它是如何作用的,你可以更好的理解代碼的作用。但在深度學習框架中,Batch歸一化的過程,經常是類似一行代碼的東西。(這些框架是個好東西,要知道里面咋麼用的,其實就很簡單了,這裡是概念培養)

所以,到目前為止,我們已經講了Batch歸一化,就像你在整個訓練站點上訓練一樣,或就像你正在使用Batch梯度下降法。

吳恩達深度學習筆記(52)-將 Batch Norm 擬合進神經網絡

實踐中,Batch歸一化通常和訓練集的mini-batch一起使用

你應用Batch歸一化的方式就是,你用第一個mini-batch(X^({1})),然後計算z^([1]),這和上張幻燈片上我們所做的一樣,應用參數w^([1])和b^([1]),使用這個mini-batch(X^({1}))。接著,繼續第二個mini-batch(X^({2})),接著Batch歸一化會減去均值,除以標準差,由β^([1])和γ^([1])重新縮放,這樣就得到了̃z^([1]),而所有的這些都是在第一個mini-batch的基礎上,你再應用激活函數得到a^([1])。然後用w^([2])和b^([2])計算z^([2]),等等,所以你做的這一切都是為了在第一個mini-batch(X^({1}))上進行一步梯度下降法。

吳恩達深度學習筆記(52)-將 Batch Norm 擬合進神經網絡

類似的工作,你會在第二個mini-batch(X^{2} )上計算z^([1]),然後用Batch歸一化來計算̃z^([1]),所以Batch歸一化的此步中,你用第二個mini-batch(X^{2} )中的數據使̃z^([1])歸一化,這裡的Batch歸一化步驟也是如此,讓我們來看看在第二個mini-batch(X^{2} )中的例子,在mini-batch上計算z^([1])的均值和方差,重新縮放的β和γ得到z^([1]),等等。

吳恩達深度學習筆記(52)-將 Batch Norm 擬合進神經網絡

然後在第三個mini-batch(X^{3} )上同樣這樣做,繼續訓練。

現在,我想澄清一個參數的一個細節。

先前我說過每層的參數是w^([l])和b^([l]),還有β^([l])和γ^([l]),請注意計算z的方式如下,z^([l])=w^([l]) a^[l-1] +b^([l]),但Batch歸一化做的是,它要看這個mini-batch,先將z^([l])歸一化,結果為均值0和標準方差,再由β和γ重縮放,但這意味著,無論b^([l])的值是多少,都是要被減去的,因為在Batch歸一化的過程中,你要計算z^([l])的均值,再減去平均值,在此例中的mini-batch中增加任何常數,數值都不會改變,因為加上的任何常數都將會被均值減去所抵消。

吳恩達深度學習筆記(52)-將 Batch Norm 擬合進神經網絡

所以,如果你在使用Batch歸一化,其實你可以消除這個參數(b^([l])),或者你也可以,暫時把它設置為0,那麼,參數變成z^([l])=w^([l]) a^[l-1] ,然後你計算歸一化的z^([l]),̃z^([l])=γ^([l]) z^([l])+β^([l]),你最後會用參數β^([l]),以便決定̃z^([l])的取值,這就是原因。

吳恩達深度學習筆記(52)-將 Batch Norm 擬合進神經網絡

所以總結一下,因為Batch歸一化超過了此層z^([l])的均值,b^([l])這個參數沒有意義,所以,你必須去掉它,由β^([l])代替,這是個控制參數,會影響轉移或偏置條件

最後,請記住z^([l])的維數,因為在這個例子中,維數會是(n^([l]),1),b^([l])的尺寸為(n^([l]),1),如果是l層隱藏單元的數量,那β^([l])和γ^([l])的維度也是(n^([l]),1),因為這是你隱藏層的數量,你有n^([l])隱藏單元,所以β^([l])和γ^([l])用來將每個隱藏層的均值和方差縮放為網絡想要的值。

吳恩達深度學習筆記(52)-將 Batch Norm 擬合進神經網絡

讓我們總結一下關於如何用Batch歸一化來應用梯度下降法,假設你在使用mini-batch梯度下降法,你運行t=1到batch數量的for循環,你會在mini-batch X^{t} 上應用正向prop,每個隱藏層都應用正向prop,用Batch歸一化代替z^([l])為̃z^([l])。

接下來,它確保在這個mini-batch中,z值有歸一化的均值和方差,歸一化均值和方差後是̃z^([l]),然後,你用反向prop計算dw^([l])和db^([l]),及所有l層所有的參數,dβ^([l])和dγ^([l])。儘管嚴格來說,因為你要去掉b,這部分其實已經去掉了。

最後,你更新這些參數:w^([l])=w^([l])-αdw^([l]),和以前一樣,β^([l])=β^([l])-αdβ^([l]),對於γ也是如此γ^([l])=γ^([l])-αdγ^([l])。

如果你已將梯度計算如下,你就可以使用梯度下降法了,這就是我寫到這裡的,但也適用於有Momentum、RMSprop、Adam的梯度下降法。

與其使用梯度下降法更新mini-batch,你可以使用這些其它算法來更新,我們在之前一些筆記中討論過的,也可以應用其它的一些優化算法來更新由Batch歸一化添加到算法中的β 和γ 參數。

吳恩達深度學習筆記(52)-將 Batch Norm 擬合進神經網絡

我希望,你能學會如何從頭開始應用Batch歸一化,如果你想的話。

如果你使用深度學習編程框架之一,我們之後會談。希望你可以直接調用別人的編程框架,這會使Batch歸一化的使用變得很容易(其實學會了之後,一般都是這麼用的,沒有人會自己去推導著寫)。

現在,以防Batch歸一化仍然看起來有些神秘,尤其是你還不清楚為什麼其能如此顯著的加速訓練,我們進入下一個筆記,詳細討論Batch歸一化為何效果如此顯著,它到底在做什麼。


分享到:


相關文章: