Batch Normalization === ###### tags: `李宏毅` ## 教材 * [Youtube](https://www.youtube.com/watch?v=BZh1ltr5Rkg&ab_channel=Hung-yiLee) ## Feature Scaling 假如兩個 Input 的值差太大,在訓練時由於 Learning Rate 是一樣的,所以會變得很難同時照顧到兩邊的 Weight。 ![](https://i.imgur.com/UCvl4rQ.png) 一般的作法是算出每一維的資料的 Mean 和 Variance,然後把每個值轉成 $x_i^r=\dfrac{x_i^r-m_i}{σ_i}$ 做了 Feature Scaling 可以讓訓練變得更容易、快速。 ![](https://i.imgur.com/dAhOZkb.png) ## Hidden Layer + Feature Scaling 同理,既然 Layer1 輸入原始的 Feature 要做 Scaling,那 Layer1 的輸出,也就是 Layer2 的輸入也應該要做 Scaling。因為輸入與輸出是同時在變動的,假如不做 Scaling 會導致學習結果的變動起伏也很大。在有 Batch Normalization 之前都是把 Learning Rate 調小一點,避免一次變動太多。 圖的左下是說前一層的輸出很大,然而下一層很小,所以訓練之後前一層要變小,下一層要變大,導致兩邊擦肩而過。Batch Normalization 就是為了解決這個情況存在。 ![](https://i.imgur.com/htBafdz.png) ## Batch 在使用 GPU 運算時,會把一個 Batch 的所有 Feature 排成一個 Matrix,這樣就可以一次做矩陣運算,這就是 GPU 加速的原理。 ![](https://i.imgur.com/tbkPpz4.png) ## Batch Normalization ### Training 通常會先做 Normalization 才做 Activation,因為假設目前的 Activation Function 是 Sigmoid,一般會希望點會落在斜率較大的 0 附近,所以先做 Normalization 就可以達到這個效果。 μ 是依賴下圖 $z^1$、$z^2$、$z^3$,而 σ 是依賴 $z^1$、$z^2$、$z^3$、μ。 ![](https://i.imgur.com/PfEV9Bb.png) 每次計算整個 Batch 的 μ、σ,因此 Batch Size 要夠大,否則 Performance 會很差。 在做 Backpropogation 時也要考慮 μ、σ。 ![](https://i.imgur.com/CeIltgd.png) 做完 Normalization 後可以再乘以 β、γ,這兩個參數也是可以學習的。與 μ、σ 不同的是 μ、σ 是跟 Data 統計有關的變數。 ![](https://i.imgur.com/u9KiiYS.png) ### Testing 因為 Testing 時資料是一筆一筆進來的,在 Testing 的時候怎麼辦? 一般的作法是記錄過去訓練時的 μ、σ,當作 Testing 時的 μ、σ。但是訓練最一開始的 μ、σ 可能會有比較少參考價值,所以也可以降低訓練前期的 μ、σ 的比重。 ![](https://i.imgur.com/f8ebsfZ.png) ### Benefit * 減少訓練時間 * 可以使用較大的 Learning Rate * 受到較少 Vanishing Gradients 的影響 * 受到較少 Initialization 的影響,假設一開始每個 Feature 被乘以 k 倍,在 Normalization 時等同沒發生 * 可以抵抗 Overfitting