---
# System prepended metadata

title: Batch Normalization
tags: [李宏毅]

---

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