Layer Normalization(层归一化)并不是把一句话中所有 token 的 word embedding 都一起归一化,而是在**每个 token 对应的隐藏向量(hidden state)维度上**做归一化。下面用通俗的语言和具体例子来说明。
---
## 1. 为什么要归一化
在深度模型(如 Transformer)中,每个 token 都会被映射成一个维度为 $d$ 的向量
$$\mathbf{h} = [h_1, h_2, \dots, h_d].$$
不同维度的激活值可能分布差异很大,这会导致训练时梯度传播不稳定、收敛缓慢。Layer Norm 的作用,就是让向量内部的每个维度都“缩放”到相近的分布,缓解训练中的协变量偏移(internal covariate shift)。
---
## 2. 归一化的数学公式
对单个 token 的隐藏向量 $\mathbf{h}$ 做归一化,步骤如下:
1. **计算均值**
$$\mu = \frac{1}{d} \sum_{i=1}^d h_i$$
2. **计算方差**
$$\sigma^2 = \frac{1}{d} \sum_{i=1}^d (h_i - \mu)^2$$
3. **归一化并线性变换**
$$\hat h_i = \frac{h_i - \mu}{\sqrt{\sigma^2 + \epsilon}},\quad
y_i = \gamma_i \,\hat h_i + \beta_i$$
其中 $\gamma_i, \beta_i$ 是可学习的缩放和平移参数,$\epsilon$ 是防止除零的小常数。
---
## 3. 手工计算示例
假设某个 token 对应的隐藏向量是三维的:
$$\mathbf{h} = [1.0,\; 2.0,\; 4.0],\quad d = 3.$$
1. 计算均值
$$\mu = \frac{1.0 + 2.0 + 4.0}{3} = \frac{7.0}{3} \approx 2.3333.$$
2. 计算方差
$$\sigma^2
= \frac{(1.0-2.3333)^2 + (2.0-2.3333)^2 + (4.0-2.3333)^2}{3}
= \frac{(−1.3333)^2 + (−0.3333)^2 + (1.6667)^2}{3}
= \frac{1.7778 + 0.1111 + 2.7778}{3}
= \frac{4.6667}{3} \approx 1.5556.$$
3. 归一化(设 $\epsilon=10^{-5}$ 且 $\gamma_i=1,\ \beta_i=0$)
$$\hat h_1 = \frac{1.0 - 2.3333}{\sqrt{1.5556 + 10^{-5}}}
= \frac{-1.3333}{1.2472} \approx -1.0693,$$
$$\hat h_2 = \frac{2.0 - 2.3333}{1.2472}
= \frac{-0.3333}{1.2472} \approx -0.2673,$$
$$\hat h_3 = \frac{4.0 - 2.3333}{1.2472}
= \frac{1.6667}{1.2472} \approx 1.3366.$$
归一化后,三个维度的分布(大约)变成均值 0、方差 1。这样有助于模型稳定训练。
---
## 4. 与其他归一化的对比
- **Batch Normalization**:在一个 minibatch 里,对所有样本的同一维度做统计,适合卷积/全连接在图像任务中,依赖较大 batch。
- **Layer Normalization**:在单个样本的所有维度上做统计,完全独立于 batch 大小,更适合 RNN、Transformer 等序列模型。
- **Instance Normalization**、**Group Normalization** 等,也都是在不同“粒度”上做归一化。
---
### 小结
- **归一化的对象**:Layer Norm 针对的是**单个 token 对应的隐藏向量的所有维度**,而**不是**把一句话中所有 token 的向量(如多个 token)混在一起做归一化。
- **归一化的好处**:消除特征内部的尺度差异,提升训练稳定性和收敛速度。