核心要点
对每个样本单独、沿特征维(最后一维)计算均值与方差。
归一化 (x−μ)/sqrt(σ²+eps),再乘以 γ、加上 β 做逐元素仿射。
与 batch 大小无关,训练与推理行为一致,适合变长序列与 Transformer。
易错点:归一化维度是特征维而非 batch 维;γ、β 形状与归一化维度一致。
标准回答
Layer Normalization 在每个样本内部、沿特征维度做标准化,因此完全不依赖 batch 大小,训练和推理行为一致,特别适合 RNN 和 Transformer 这类变长序列场景。对每个样本计算其特征维上的均值 μ 和方差 σ²,做 (x−μ)/sqrt(σ²+eps) 归一化,再用与特征维同形状的可学习参数 γ、β 做逐元素缩放和平移。下面用 NumPy 实现,对 (..., D) 张量沿最后一维归一化:
python
import numpy as np
def layernorm_forward(x, gamma, beta, eps=1e-5):
# x: (..., D),沿最后一维(特征维)逐样本归一化
mu = x.mean(axis=-1, keepdims=True) # 每个样本自己的均值
var = x.var(axis=-1, keepdims=True) # 每个样本自己的方差
x_hat = (x - mu) / np.sqrt(var + eps) # 归一化
return gamma * x_hat + beta # gamma/beta 形状为 (D,)
if __name__ == '__main__':
np.random.seed(0)
x = np.random.randn(2, 3, 8) * 4 + 1 # (B, L, D)
D = x.shape[-1]
out = layernorm_forward(x, np.ones(D), np.zeros(D))
# 每个 token 的特征被归一化为均值~0、方差~1
print(out.mean(axis=-1).round(5), out.std(axis=-1).round(3))常见误区
⚠️ 常见踩坑
把归一化维度写成 batch 维就退化成了 BatchNorm;γ、β 的形状应等于归一化的特征维 D,而不是整个张量。注意 keepdims=True 以便广播相减。
追问
追问 1:LayerNorm 与 BatchNorm 的核心区别是什么?
追问 2:什么是 RMSNorm,相比 LayerNorm 有什么优势?
RMSNorm 去掉了减均值(中心化)这一步,只用特征的均方根 RMS = sqrt(mean(x²)+eps) 做归一化,再乘以可学习 γ。它少算一次均值、参数更少、速度更快,且实验表明效果与 LayerNorm 相当,被 LLaMA、Qwen 等大模型广泛采用。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。