省流
层归一化就是对每个样本的所有特征进行归一化处理,而不是像批归一化那样对一批数据的同一特征维度进行归一化。
层归一化的原理是通过对每个样本的特征进行独立处理,计算每个样本在所有特征上的均值和方差,然后对该样本进行归一化。这样,每个样本在其所有特征维度上的值都会被调整到一个相对统一的尺度。
这种方法的好处在于,它消除了批次大小的依赖,适用于那些批次大小较小或者批次中样本数量不一致(NLP)的任务。对于RNN、Transformer等序列模型来说,层归一化表现尤为出色,因为这些模型的输入数据通常是具有时序性质的,批归一化可能会在这种情况下丧失时序信息。
层归一化相较于批归一化,在模型训练过程中更适合处理长序列数据。层归一化则能够确保每个样本的特征独立归一化,从而保持模型在每个时刻的数据分布稳定。
比如:
假设我们有一个 批次大小为 2,序列长度为 3,隐藏维度为 4 的输入张量:
[
X \in \mathbb{R}^{\text{Batch_size} \times \text{Seq_len} \times \text{Dim}}
]
假设数据如下:
[
X =
\begin{bmatrix}
\begin{bmatrix} 1.0 & 2.0 & 3.0 & 4.0 \end{bmatrix} \
\begin{bmatrix} 5.0 & 6.0 & 7.0 & 8.0 \end{bmatrix} \
\begin{bmatrix} 9.0 & 10.0 & 11.0 & 12.0 \end{bmatrix}
\end{bmatrix}
]
计算层归一化
层归一化是在 每个 token(每一行) 内部进行归一化,即 沿着 Dim
维度计算均值和标准差。
第一个 token:([1.0, 2.0, 3.0, 4.0])
计算均值
[
\mu = \frac{1.0 + 2.0 + 3.0 + 4.0}{4} = 2.5
]
计算标准差
[
\sigma = \sqrt{\frac{(1.0 - 2.5)^2 + (2.0 - 2.5)^2 + (3.0 - 2.5)^2 + (4.0 - 2.5)^2}{4}}
]
[
= \sqrt{\frac{2.25 + 0.25 + 0.25 + 2.25}{4}} = \sqrt{1.25} \approx 1.12
]
归一化
[
\hat{x} = \frac{x - \mu}{\sigma} = \left[ \frac{1.0 - 2.5}{1.12}, \frac{2.0 - 2.5}{1.12}, \frac{3.0 - 2.5}{1.12}, \frac{4.0 - 2.5}{1.12} \right]
]
[
\approx [-1.34, -0.45, 0.45, 1.34]
]
第二个 token:([5.0, 6.0, 7.0, 8.0])
[
\mu = \frac{5+6+7+8}{4} = 6.5, \quad \sigma = \sqrt{\frac{(-1.5)^2 + (-0.5)^2 + (0.5)^2 + (1.5)^2}{4}} = 1.12
]
[
\hat{x} = \left[ \frac{5.0 - 6.5}{1.12}, \frac{6.0 - 6.5}{1.12}, \frac{7.0 - 6.5}{1.12}, \frac{8.0 - 6.5}{1.12} \right]
]
[
\approx [-1.34, -0.45, 0.45, 1.34]
]
第三个 token:([9.0, 10.0, 11.0, 12.0])
[
\mu = 10.5, \quad \sigma = 1.12
]
[
\hat{x} \approx [-1.34, -0.45, 0.45, 1.34]
]
最终归一化结果
[
\hat{X} =
\begin{bmatrix}
\begin{bmatrix} -1.34 & -0.45 & 0.45 & 1.34 \end{bmatrix} \
\begin{bmatrix} -1.34 & -0.45 & 0.45 & 1.34 \end{bmatrix} \
\begin{bmatrix} -1.34 & -0.45 & 0.45 & 1.34 \end{bmatrix}
\end{bmatrix}
]乘以缩放参数 (\gamma) 并加上偏移参数 (\beta)
[
y = \hat{x} \cdot \gamma + \beta
]
其中,(\gamma) 和 (\beta) 是可学习参数(形状为(Dim,)
),它们帮助恢复特征表达能力。
如果 (\gamma = [1, 1, 1, 1]) 且 (\beta = [0, 0, 0, 0]),则最终输出与 (\hat{x}) 相同。
总的来说,层归一化不仅提高了模型的稳定性,也让模型在处理时序数据时具有更好的表现,特别是在自然语言处理和序列生成任务中。
层归一化(Layer Normalization)详解
1. 概述
层归一化(Layer Normalization, LN)是一种用于深度神经网络的归一化方法,通常用于 自然语言处理(NLP) 和 自注意力网络(Transformer) 中。与批归一化(Batch Normalization, BN)不同,LN 主要 针对单个样本的所有特征维度 进行归一化,而不是在 batch 维度上计算均值和标准差。
2. 计算公式
对于输入 ( X \in \mathbb{R}^{\text{Batch_size} \times \text{Seq_len} \times \text{Dim}} ),层归一化的计算过程如下:
计算均值
对 每个 token 的所有特征维度 计算均值:
[
\mu = \frac{1}{\text{Dim}} \sum_{i=1}^{\text{Dim}} x_i
]
计算标准差
[
\sigma = \sqrt{\frac{1}{\text{Dim}} \sum_{i=1}^{\text{Dim}} (x_i - \mu)^2 + \epsilon}
]
其中,(\epsilon) 是一个很小的数,用于防止分母为零。
归一化
[
\hat{x} = \frac{x - \mu}{\sigma}
]
缩放和平移
为了恢复模型的表达能力,LN 引入了可学习参数 (\gamma) 和 (\beta)(形状均为 (Dim,)
):
[
y = \hat{x} \cdot \gamma + \beta
]
3. 归一化作用范围
假设输入数据形状为:
[
X \in \mathbb{R}^{\text{Batch_size} \times \text{Seq_len} \times \text{Dim}}
]
层归一化会 针对每个 token 的 Dim
维度进行归一化,即计算每个 token 内部的均值和标准差,而 不考虑 batch 维度或序列长度 Seq_len
。
4. 层归一化 vs. 批归一化
归一化方法 | 归一化维度 | 计算均值/方差的范围 | 适用场景 |
---|---|---|---|
批归一化(BN) | 纵向(Batch 维度) | 计算相同特征维度在整个 batch 维度上的均值和标准差 | CNN,计算机视觉 |
层归一化(LN) | 横向(特征维度) | 计算每个 token 的所有特征维度的均值和标准差 | NLP,Transformer |
5. 计算示例
假设:
[
X =
\begin{bmatrix}
\begin{bmatrix} 1.0 & 2.0 & 3.0 & 4.0 \end{bmatrix} \
\begin{bmatrix} 5.0 & 6.0 & 7.0 & 8.0 \end{bmatrix} \
\begin{bmatrix} 9.0 & 10.0 & 11.0 & 12.0 \end{bmatrix}
\end{bmatrix}
]
对于第一行 ([1.0, 2.0, 3.0, 4.0]):
[
\mu = 2.5, \quad \sigma = \sqrt{1.25} \approx 1.12
]
归一化:
[
\hat{x} \approx [-1.34, -0.45, 0.45, 1.34]
]
最终:
[
y = \hat{x} \cdot \gamma + \beta
]
6. 为什么 Transformer 使用层归一化?
- 适用于变长序列
- Transformer 处理变长文本,BN 依赖 batch 统计信息,不适用于 NLP。
- 对 batch size 不敏感
- BN 在 batch size 小(甚至为 1)时效果较差,而 LN 仍然稳定。
- 更适合自注意力机制
- Transformer 依赖 token 间的关系,LN 可以在 每个 token 内部 归一化,使模型更加稳定。