核心要点

  • 对每个样本单独、沿特征维(最后一维)计算均值与方差。

  • 归一化 (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 以便广播相减。

追问

追问 1LayerNorm 与 BatchNorm 的核心区别是什么?

BatchNorm 沿 batch 维统计、依赖批大小、训练与推理用不同统计量(需维护 running 统计);LayerNorm 逐样本沿特征维统计、与 batch 无关、训推一致。前者多用于 CNN,后者是 Transformer/RNN 的标配,对变长序列和小 batch 更鲁棒。

追问 2什么是 RMSNorm,相比 LayerNorm 有什么优势?

RMSNorm 去掉了减均值(中心化)这一步,只用特征的均方根 RMS = sqrt(mean(x²)+eps) 做归一化,再乘以可学习 γ。它少算一次均值、参数更少、速度更快,且实验表明效果与 LayerNorm 相当,被 LLaMA、Qwen 等大模型广泛采用。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。