3.6 BatchNorm 为什么起作用-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
| 3.5 將 Batch Norm 擬合進神經網絡 | 回到目錄 | 3.7 測試時的 Batch Norm |
BatchNorm 為什么起作用? (Why does Batch Norm work?)
為什么Batch歸一化會起作用呢?
一個原因是,你已經看到如何歸一化輸入特征值 xxx ,使其均值為0,方差1,它又是怎樣加速學習的,有一些從0到1而不是從1到1000的特征值,通過歸一化所有的輸入特征值 xxx ,以獲得類似范圍的值,可以加速學習。所以Batch歸一化起的作用的原因,直觀的一點就是,它在做類似的工作,但不僅僅對于這里的輸入值,還有隱藏單元的值,這只是Batch歸一化作用的冰山一角,還有些深層的原理,它會有助于你對Batch歸一化的作用有更深的理解,讓我們一起來看看吧。
Batch歸一化有效的第二個原因是,它可以使權重比你的網絡更滯后或更深層,比如,第10層的權重更能經受得住變化,相比于神經網絡中前層的權重,比如第1層,為了解釋我的意思,讓我們來看看這個最生動形象的例子。
這是一個網絡的訓練,也許是個淺層網絡,比如logistic回歸或是一個神經網絡,也許是個淺層網絡,像這個回歸函數。或一個深層網絡,建立在我們著名的貓臉識別檢測上,但假設你已經在所有黑貓的圖像上訓練了數據集,如果現在你要把此網絡應用于有色貓,這種情況下,正面的例子不只是左邊的黑貓,還有右邊其它顏色的貓,那么你的cosfa可能適用的不會很好。
如果圖像中,你的訓練集是這個樣子的,你的正面例子在這兒,反面例子在那兒(左圖),但你試圖把它們都統一于一個數據集,也許正面例子在這,反面例子在那兒(右圖)。你也許無法期待,在左邊訓練得很好的模塊,同樣在右邊也運行得很好,即使存在運行都很好的同一個函數,但你不會希望你的學習算法去發現綠色的決策邊界,如果只看左邊數據的話。
所以使你數據改變分布的這個想法,有個有點怪的名字“Covariate shift”,想法是這樣的,如果你已經學習了 xxx 到 yyy 的映射,如果 xxx 的分布改變了,那么你可能需要重新訓練你的學習算法。這種做法同樣適用于,如果真實函數由 xxx 到 yyy 映射保持不變,正如此例中,因為真實函數是此圖片是否是一只貓,訓練你的函數的需要變得更加迫切,如果真實函數也改變,情況就更糟了。
“Covariate shift”的問題怎么應用于神經網絡呢?試想一個像這樣的深度網絡,讓我們從這層(第三層)來看看學習過程。此網絡已經學習了參數 w[3]w^{[3]}w[3] 和 b[3]b^{[3]}b[3] ,從第三隱藏層的角度來看,它從前層中取得一些值,接著它需要做些什么,使希望輸出值 y^\hat{y}y^? 接近真實值 yyy 。
讓我先遮住左邊的部分,從第三隱藏層的角度來看,它得到一些值,稱為 a1[2],a2[2],a3[2],a4[2]a_1^{[2]},a_2^{[2]},a_3^{[2]},a_4^{[2]}a1[2]?,a2[2]?,a3[2]?,a4[2]? ,但這些值也可以是特征值 x1,x2,x3,x4x_1,x_2,x_3,x_4x1?,x2?,x3?,x4? ,第三層隱藏層的工作是找到一種方式,使這些值映射到 y^\hat{y}y^? ,你可以想象做一些截斷,所以這些參數 w[3]w^{[3]}w[3] 和 b[3]b^{[3]}b[3] 或 w[4]w^{[4]}w[4] 和 b[4]b^{[4]}b[4] 或 w[5]w^{[5]}w[5] 和 b[5]b^{[5]}b[5] ,也許是學習這些參數,所以網絡做的不錯,從左邊我用黑色筆寫的映射到輸出值 y^\hat{y}y^? 。
現在我們把網絡的左邊揭開,這個網絡還有參數 w[2],b[2]w^{[2]},b^{[2]}w[2],b[2] 和 w[1],b[1]w^{[1]},b^{[1]}w[1],b[1] ,如果這些參數改變,這些 a[2]a^{[2]}a[2] 的值也會改變。所以從第三層隱藏層的角度來看,這些隱藏單元的值在不斷地改變,所以它就有了“Covariate shift”的問題,上張幻燈片中我們講過的。
Batch歸一化做的,是它減少了這些隱藏值分布變化的數量。如果是繪制這些隱藏的單元值的分布,也許這是重整值 zzz ,這其實是 z1[2],z2[2]z^{[2]}_1,z^{[2]}_2z1[2]?,z2[2]? ,我要繪制兩個值而不是四個值,以便我們設想為2D,Batch歸一化講的是 z1[2],z2[2]z^{[2]}_1,z^{[2]}_2z1[2]?,z2[2]? 的值可以改變,它們的確會改變,當神經網絡在之前層中更新參數,Batch歸一化可以確保無論其怎樣變化 z1[2],z2[2]z^{[2]}_1,z^{[2]}_2z1[2]?,z2[2]? 的均值和方差保持不變,所以即使 z1[2],z2[2]z^{[2]}_1,z^{[2]}_2z1[2]?,z2[2]? 的值改變,至少他們的均值和方差也會是均值0,方差1,或不一定必須是均值0,方差1,而是由 β[2]\beta^{[2]}β[2] 和 γ[2]\gamma^{[2]}γ[2] 決定的值。如果神經網絡選擇的話,可強制其為均值0,方差1,或其他任何均值和方差。但它做的是,它限制了在前層的參數更新,會影響數值分布的程度,第三層看到的這種情況,因此得到學習。
Batch歸一化減少了輸入值改變的問題,它的確使這些值變得更穩定,神經網絡的之后層就會有更堅實的基礎。即使使輸入分布改變了一些,它會改變得更少。它做的是當前層保持學習,當改變時,迫使后層適應的程度減小了,你可以這樣想,它減弱了前層參數的作用與后層參數的作用之間的聯系,它使得網絡每層都可以自己學習,稍稍獨立于其它層,這有助于加速整個網絡的學習。
所以,希望這能帶給你更好的直覺,重點是Batch歸一化的意思是,尤其從神經網絡后層之一的角度而言,前層不會左右移動的那么多,因為它們被同樣的均值和方差所限制,所以,這會使得后層的學習工作變得更容易些。
Batch歸一化還有一個作用,它有輕微的正則化效果,Batch歸一化中非直觀的一件事是,每個mini-batch,我會說mini-batch X{t}X^{\{t\}}X{t} 的值為 z[t],z[l]z^{[t]},z^{[l]}z[t],z[l] ,在mini-batch計算中,由均值和方差縮放的,因為在mini-batch上計算的均值和方差,而不是在整個數據集上,均值和方差有一些小的噪聲,因為它只在你的mini-batch上計算,比如64或128或256或更大的訓練例子。因為均值和方差有一點小噪音,因為它只是由一小部分數據估計得出的。縮放過程從 z[l]z^{[l]}z[l] 到 z~[l]\tilde{z}^{[l]}z~[l] ,過程也有一些噪音,因為它是用有些噪音的均值和方差計算得出的。
所以和dropout相似,它往每個隱藏層的激活值上增加了噪音,dropout有增加噪音的方式,它使一個隱藏的單元,以一定的概率乘以0,以一定的概率乘以1,所以你的dropout含幾重噪音,因為它乘以0或1。
對比而言,Batch歸一化含幾重噪音,因為標準偏差的縮放和減去均值帶來的額外噪音。這里的均值和標準差的估計值也是有噪音的,所以類似于dropout,Batch歸一化有輕微的正則化效果,因為給隱藏單元添加了噪音,這迫使后部單元不過分依賴任何一個隱藏單元,類似于dropout,它給隱藏層增加了噪音,因此有輕微的正則化效果。因為添加的噪音很微小,所以并不是巨大的正則化效果,你可以將Batch歸一化和dropout一起使用,如果你想得到dropout更強大的正則化效果。
也許另一個輕微非直觀的效果是,如果你應用了較大的mini-batch,對,比如說,你用了512而不是64,通過應用較大的min-batch,你減少了噪音,因此減少了正則化效果,這是dropout的一個奇怪的性質,就是應用較大的mini-batch可以減少正則化效果。
說到這兒,我會把Batch歸一化當成一種正則化,這確實不是其目的,但有時它會對你的算法有額外的期望效應或非期望效應。但是不要把Batch歸一化當作正則化,把它當作將你歸一化隱藏單元激活值并加速學習的方式,我認為正則化幾乎是一個意想不到的副作用。
所以希望這能讓你更理解Batch歸一化的工作,在我們結束Batch歸一化的討論之前,我想確保你還知道一個細節。Batch歸一化一次只能處理一個mini-batch數據,它在mini-batch上計算均值和方差。所以測試時,你試圖做出預測,試著評估神經網絡,你也許沒有mini-batch的例子,你也許一次只能進行一個簡單的例子,所以測試時,你需要做一些不同的東西以確保你的預測有意義。
在下一個也就是最后一個Batch歸一化視頻中,讓我們詳細談談你需要注意的一些細節,來讓你的神經網絡應用Batch歸一化來做出預測。
課程PPT
| 3.5 將 Batch Norm 擬合進神經網絡 | 回到目錄 | 3.7 測試時的 Batch Norm |
總結
以上是生活随笔為你收集整理的3.6 BatchNorm 为什么起作用-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3.5 将 Batch 拟合进神经网络-
- 下一篇: 3.7 测试时的 BatchNorm-深