owned this note
owned this note
Published
Linked with GitHub
# LayerNorm v.s. BatchNorm

1. Layer Normalization(層歸一化)
2. Batch Normalization(批次歸一化)
都是深度學習中的 **正規化(Normalization)技術**,它們可以 **加速模型訓練、穩定梯度、提高收斂速度**,但在 **適用場景** 和 **計算方式** 上有所不同。
---
## **Batch Normalization(BN)**
Batch Normalization 是 **針對一個批次(Batch)內所有樣本的相同dimension** 進行Normalization,使該維度的輸出均值為 0,標準差為 1。
### **BatchNorm formula**
假設神經網路輸入為:
$$
X = [x_1, x_2, ..., x_B]
$$
其中 $B$ 為 **Batch Size**。
對於每個 mini-batch,計算:
1. **均值(Mean)**:
$$
\mu_B = \frac{1}{B} \sum_{i=1}^{B} x_i
$$
2. **標準差(Standard Deviation)**:
$$
\sigma_B^2 = \frac{1}{B} \sum_{i=1}^{B} (x_i - \mu_B)^2
$$
3. **正規化(Normalization)**:
$$
\hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}
$$
4. **學習可調參數**:
$$
y_i = \gamma \hat{x}_i + \beta
$$
- $\gamma$(scale):學習到的縮放參數
- $\beta$(shift):學習到的平移參數
- $\epsilon$ 是小數值,防止除零錯誤
### **🔹 直覺解釋**
- BatchNorm 會根據一個 batch 的均值和標準差,將該 batch 內的數據縮放到標準正態分佈。
- 然後再通過 $\gamma$ 和 $\beta$ 進行調整,確保模型能學習適當的數值範圍。
### **pros**
✅ **加速收斂**,減少內部共變異轉移(Internal Covariate Shift)
✅ **能夠提高學習率,避免梯度消失或爆炸**
✅ **適用於 CNN**,特別是 ResNet、VGG、EfficientNet 等
### **cons**
❌ **對 Batch Size 敏感**(Batch 太小時,均值和方差估計不準確)
❌ **在 NLP 中效果較差**(因為 NLP 的句子長度不同,BatchNorm 無法有效應用)
### **PyTorch**
```python
import torch
import torch.nn as nn
# 針對 2D 輸入 (適用於 CNN)
batch_norm = nn.BatchNorm2d(num_features=64) # 64 個通道
x = torch.randn(32, 64, 28, 28) # (batch_size, channels, height, width)
output = batch_norm(x)
```
---
## **Layer Normalization(LN)**
Layer Normalization 是 **針對單個樣本的所有神經元維度** 進行正規化,使每個樣本的輸出均值為 0,標準差為 1。
### **LayerNorm formula**
對於單個樣本 $x$,計算:
1. **均值**:
$$
\mu_L = \frac{1}{N} \sum_{i=1}^{N} x_i
$$
2. **標準差**:
$$
\sigma_L^2 = \frac{1}{N} \sum_{i=1}^{N} (x_i - \mu_L)^2
$$
3. **正規化**:
$$
\hat{x}_i = \frac{x_i - \mu_L}{\sqrt{\sigma_L^2 + \epsilon}}
$$
4. **學習可調參數**:
$$
y_i = \gamma \hat{x}_i + \beta
$$
### **🔹 直覺解釋**
- LayerNorm 是對 **每一個樣本的所有神經元** 進行正規化,而不是針對整個 batch。
- 這樣可以確保即使 batch size 很小,或者輸入是變長序列(如 NLP),也不會影響正規化效果。
### **pros**
✅ **不依賴 Batch Size**,適合變長輸入(NLP)
✅ **適用於 Transformer(BERT, GPT, T5)**
✅ **適合 RNN、LSTM 等序列模型**
### **cons**
❌ **在 CNN 上效果不如 BatchNorm**(因為 CNN 需要 batch-wise 統計資訊)
❌ **計算成本稍高**(因為它需要針對每個樣本計算均值和標準差)
### **PyTorch**
```python
import torch
import torch.nn as nn
# 針對 5 維輸入 (適用於 Transformer)
layer_norm = nn.LayerNorm(normalized_shape=512) # 512 維輸入
x = torch.randn(32, 512) # (batch_size, feature_dim)
output = layer_norm(x)
```
---
## **3. BatchNorm vs. LayerNorm 的關鍵區別**
| 特性 | **Batch Normalization(BN)** | **Layer Normalization(LN)** |
|------|----------------------|----------------------|
| **計算方式** | 在一個 batch 內對每個特徵歸一化 | 在單個樣本內對所有特徵歸一化 |
| **適用場景** | CNN(ResNet, VGG, EfficientNet) | NLP(Transformer, RNN, LSTM) |
| **是否受 Batch Size 影響** | ✅ 受影響 | ❌ 不受影響 |
| **是否適用於變長序列** | ❌ 不適用 | ✅ 適用 |
| **是否能加速訓練** | ✅ 是 | ✅ 是 |
| **是否適用於 Self-Attention** | ❌ 不適用 | ✅ 適用 |
| **對小 Batch Size 是否穩定** | ❌ 可能不穩定 | ✅ 穩定 |
---
## **4. 何時使用 BatchNorm vs. LayerNorm?**
✅ **使用 BatchNorm(BN)** **→ CNN(ResNet, VGG, MobileNet, EfficientNet)**
- 適合影像處理,因為 CNN 具有空間維度的特性
- 適合大 Batch Size,能提高訓練速度
✅ **使用 LayerNorm(LN)** **→ NLP(Transformer, BERT, GPT, T5, LSTM, RNN)**
- 適用於變長輸入,如 NLP、對話系統、機器翻譯
- 在 **Transformer(Self-Attention 機制)** 中是標準做法
- 適合小批量(Batch Size 小於 32)
---
## **5. 進階問題**
### **Q1: 為什麼 Transformer 使用 LayerNorm,而不是 BatchNorm?**
- Transformer 主要應用於 **NLP**,批次中的序列長度可能不同,BatchNorm 無法有效處理變長序列,而 LayerNorm 針對 **單個樣本** 進行歸一化,能穩定學習。
- Self-Attention 機制是高度依賴層輸出的,如果 BatchNorm 改變了不同批次的特徵分佈,可能會影響學習。
### **Q2: 為什麼 CNN 更適合 BatchNorm,而不是 LayerNorm?**
- CNN 的特徵來自 **卷積操作(Convolution)**,它在 **通道維度** 進行學習,BatchNorm 可以利用 **批次內的統計資訊** 來加速學習。
- LayerNorm 無法利用 **批次內的統計特性**,因此效果通常不如 BatchNorm。
---
## **6. 總結**
| **問題** | **BN(BatchNorm)** | **LN(LayerNorm)** |
|----------|----------------|----------------|
| **適用場景** | CNN(影像處理) | NLP(Transformer, RNN) |
| **是否受 Batch Size 影響** | ✅ 是 | ❌ 否 |
| **是否適用於變長輸入** | ❌ 否 | ✅ 是 |
✅ **CNN → BatchNorm**
✅ **Transformer → LayerNorm** 🚀
## Ref
https://blog.csdn.net/Little_White_9/article/details/123345062