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)混在一起做归一化。 - **归一化的好处**:消除特征内部的尺度差异,提升训练稳定性和收敛速度。