LayerNorm:层归一化总结
1. LayerNorm 是什么?
LayerNorm = Layer Normalization,层归一化。
它的核心作用是:
对每个 token 的隐藏向量,做一次 中心化 + 尺度归一化 + 可学习缩放平移。
和 RMSNorm 相比:
- RMSNorm:只控制尺度。
- LayerNorm:先把均值移到 0,再控制尺度。
也就是说:
text
LayerNorm = 减均值 + 除标准差 + 乘 weight + 加 bias
2. 输入是什么?
假设一个 token 的隐藏向量是:
text
x = [x1, x2, x3, ..., xd]
其中:
text
d = hidden_dim
例如:
text
x = [3, 4, 5]
在 Transformer 中,输入通常是三维张量:
text
x.shape = [batch_size, seq_len, hidden_dim]
LayerNorm 是沿着最后一维 hidden_dim 做归一化。
也就是:
每个 token 自己的隐藏向量内部做标准化。
3. 第一步:计算均值
公式:
math
\mu = \frac{1}{d}\sum_{i=1}^{d}x_i
例子:
text
x = [3, 4, 5]
mean = (3 + 4 + 5) / 3
= 4
这个均值表示这个隐藏向量整体抬高或降低的程度。
4. 第二步:减去均值
text
x - mean = [3 - 4, 4 - 4, 5 - 4]
= [-1, 0, 1]
这一步的物理意义是:
把这个向量的整体偏置去掉,让它围绕 0 分布。
原始向量:
text
[3, 4, 5]
中心化后:
text
[-1, 0, 1]
这一步之后,LayerNorm 不再关心这个向量整体被抬高了多少,而更关注各个维度之间的相对差异。
5. 第三步:计算方差
公式:
math
\sigma^2 = \frac{1}{d}\sum_{i=1}^{d}(x_i-\mu)^2
例子:
text
x - mean = [-1, 0, 1]
variance = ((-1)^2 + 0^2 + 1^2) / 3
= 2 / 3
≈ 0.6667
标准差:
text
std = sqrt(variance + eps)
≈ sqrt(0.6667)
≈ 0.8165
其中 eps 是一个很小的数,用来防止除零。
6. 第四步:除以标准差
公式:
math
\hat{x}_i = \frac{x_i-\mu}{\sqrt{\sigma^2+\varepsilon}}
例子:
text
[-1, 0, 1] / 0.8165
≈ [-1.2247, 0, 1.2247]
这一步的作用是:
把向量的波动尺度压到稳定范围。
也就是说,原来不同 token 的隐藏向量可能幅值差异很大,LayerNorm 会把它们重新拉回一个稳定尺度。
7. 第五步:乘 weight,加 bias
真正的 LayerNorm 不只是归一化,还会有两个可学习参数:
text
gamma / weight:可学习缩放参数
beta / bias:可学习平移参数
完整公式是:
math
y_i = \gamma_i \cdot \frac{x_i-\mu}{\sqrt{\sigma^2+\varepsilon}} + \beta_i
其中:
text
gamma_i:每个维度的可学习缩放参数
beta_i:每个维度的可学习平移参数
所以 LayerNorm 不是把所有信息都固定死,而是:
text
先统一尺度
再让模型自己学习每个维度应该放大、缩小、平移多少
8. 完整算例
输入:
text
x = [3, 4, 5]
gamma = [1, 1, 1]
beta = [0, 0, 0]
计算过程:
text
mean = 4
text
x - mean = [-1, 0, 1]
text
variance = 2 / 3 ≈ 0.6667
text
std = sqrt(0.6667) ≈ 0.8165
text
x_norm = [-1 / 0.8165, 0 / 0.8165, 1 / 0.8165]
≈ [-1.2247, 0, 1.2247]
因为:
text
gamma = [1, 1, 1]
beta = [0, 0, 0]
所以输出:
text
y ≈ [-1.2247, 0, 1.2247]
9. LayerNorm 的物理意义
可以把隐藏向量理解成一组多维特征信号:
text
x = [特征1, 特征2, 特征3, ..., 特征d]
LayerNorm 做了两件核心事情:
text
第一:减均值,把整体偏置去掉
第二:除标准差,把波动尺度控制住
所以它的本质不是玄学,而是:
把一个多维向量重新拉回一个稳定的坐标尺度中。
更直接地说:
text
LayerNorm = 对一个 token 的隐藏向量做标准化
它把:
text
幅值很大、均值很偏的向量
变成:
text
均值接近 0、尺度接近 1 的向量
这样后面的 Attention、MLP、残差叠加会更稳定。
10. LayerNorm 和 RMSNorm 的区别
| 方法 | 是否减均值 | 是否除尺度 | 是否有 bias | 本质 |
|---|---|---|---|---|
| LayerNorm | 是 | 是 | 通常有 | 中心化 + 尺度归一化 |
| RMSNorm | 否 | 是 | 通常没有 | 只做尺度归一化 |
LayerNorm:
text
x -> x - mean -> 除以 std
RMSNorm:
text
x -> 除以 rms
所以可以这样理解:
text
LayerNorm 更"强":既调整中心,又调整尺度
RMSNorm 更"轻":只调整尺度
11. 为什么 Transformer 需要 LayerNorm?
Transformer 中有大量残差结构:
text
x = x + Attention(...)
x = x + MLP(...)
每一层都会不断叠加新的变换结果。
如果不控制尺度,隐藏向量可能出现:
text
越来越大
越来越小
不同 token 尺度差异过大
训练梯度不稳定
attention score 数值不稳定
LayerNorm 的作用就是:
每次进入核心计算模块之前,先把向量尺度整理一下。
现代 Transformer 中常见结构是:
text
x = x + Attention(LayerNorm(x))
x = x + MLP(LayerNorm(x))
这叫 Pre-LN 结构。
12. Python 手写 LayerNorm
python
import math
def layer_norm(x, gamma, beta, eps=1e-5):
"""
x: 输入向量,长度为 d
gamma: 可学习缩放参数
beta: 可学习平移参数
eps: 防止除零
"""
d = len(x)
# 1. 计算均值
mean = sum(x) / d
# 2. 计算方差
variance = 0.0
for value in x:
variance += (value - mean) ** 2
variance = variance / d
# 3. 计算标准差
std = math.sqrt(variance + eps)
# 4. 归一化 + 可学习缩放平移
y = []
for xi, gi, bi in zip(x, gamma, beta):
yi = gi * ((xi - mean) / std) + bi
y.append(yi)
return y
x = [3.0, 4.0, 5.0]
gamma = [1.0, 1.0, 1.0]
beta = [0.0, 0.0, 0.0]
print(layer_norm(x, gamma, beta))
输出大约是:
text
[-1.2247, 0.0, 1.2247]
13. PyTorch 版本
python
import torch
class MyLayerNorm(torch.nn.Module):
def __init__(self, dim, eps=1e-5):
super().__init__()
self.eps = eps
# gamma / weight
self.weight = torch.nn.Parameter(torch.ones(dim))
# beta / bias
self.bias = torch.nn.Parameter(torch.zeros(dim))
def forward(self, x):
# x shape: [batch_size, seq_len, hidden_dim]
mean = x.mean(dim=-1, keepdim=True)
variance = ((x - mean) ** 2).mean(dim=-1, keepdim=True)
x_norm = (x - mean) / torch.sqrt(variance + self.eps)
y = x_norm * self.weight + self.bias
return y
输入形状:
text
x.shape = [batch_size, seq_len, hidden_dim]
LayerNorm 沿着最后一维 hidden_dim 归一化。
14. 一句话总结
LayerNorm 的本质是:
对每个 token 的隐藏向量,先减去自己的均值,再除以自己的标准差,然后乘一个可学习缩放参数,再加一个可学习偏置参数。
从数学变换角度看:
text
LayerNorm = 一组多维向量的中心平移 + 尺度压缩 + 可学习恢复
RMSNorm 是:
text
只控制向量整体能量
LayerNorm 是:
text
先去掉整体偏置,再控制向量波动尺度
所以 LayerNorm 不是什么神秘结构,它就是一个非常明确的多维向量标准化操作。