核心要点
对每个样本单独、沿特征维(最后一维)计算均值与方差。
归一化 (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 对训练稳定性、泛化、收敛速度或显存/算力的影响。再说明一个常见调参或排错场景,面试官会更容易判断你真的用过这些方法。
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。
🔗 相似问题
同一考点的不同问法,换着练更稳
延伸学习
按主题分类的相关资源,便于系统复习
