核心要点

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

  • 归一化 (x−μ)/sqrt(σ²+eps),再乘以 γ、加上 β 做逐元素仿射。

  • 与 batch 大小无关,训练与推理行为一致,适合变长序列与 Transformer

  • 易错点:归一化维度是特征维而非 batch 维;γ、β 形状与归一化维度一致。

标准回答

一、先把结论讲清楚

可以先把它和 BatchNorm 区分开:LayerNorm 是每个样本自己算均值和方差,沿特征维归一化

一、它到底归一化哪一维?

如果输入是 (..., D),LayerNorm 通常沿最后一维 D 做 mean/var,也就是每个 token、每个样本内部自己归一化。

二、拆开机制和判断点

它不需要跨 batch 统计。

二、为什么 Transformer 常用它?

因为它和 batch 大小无关,训练和推理行为一致。序列长度变化、小 batch、在线推理时,LayerNorm 都比依赖 batch 统计的 BatchNorm 更稳。

**三、代码里注意什么?

三、补上例子、边界和取舍

**

要保留维度 keepdims=True,方便广播;γ、β 的形状通常是归一化维度 D。公式就是 (x−μ)/sqrt(σ²+eps),再乘 γ 加 β。下面用 NumPy 实现,对 (..., D) 张量沿最后一维归一化:

面试里不要只停在公式或名词,可以补 手撕代码:实现 Layer Normalization 对训练稳定性、泛化、收敛速度或显存/算力的影响。再说明一个常见调参或排错场景,面试官会更容易判断你真的用过这些方法。

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 维。 那就不是 LayerNorm 了,LayerNorm 关注的是每个样本内部的特征维。

误区二:γ、β 形状乱设。 它们应该匹配被归一化的特征维,通常是 D。

追问

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

BatchNorm 看 batch 维,依赖批大小,推理要用 running 统计;LayerNorm 看样本内部的特征维,不依赖 batch,训练和推理一致。所以 CNN 里常见 BatchNorm,Transformer 里常见 LayerNorm。

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

RMSNorm 可以理解成简化版 LayerNorm:它不减均值,只用 RMS = sqrt(mean(x²)+eps) 做缩放,再乘 γ。优点是 少算一步、速度更快,所以很多大模型会采用。

🔗 相似问题

同一考点的不同问法,换着练更稳

延伸学习

按主题分类的相关资源,便于系统复习