跳转至

五:Normalization 与 Pre-Norm/Post-Norm自测题答案

来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247483803&idx=1&sn=d269453f154454bb603184fe8acf49b9&chksm=f01eb2e2c7693bf4f313ebcd6cafd11ddf3a8dbac045ba5a86f99abe7ac3841b3af471211f29#rd

参考资料

  • Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift: https://arxiv.org/abs/1502.03167

  • Layer Normalization: https://arxiv.org/abs/1607.06450

  • Root Mean Square Layer Normalization: https://arxiv.org/abs/1910.07467

  • On Layer Normalization in the Transformer Architecture: https://arxiv.org/abs/2002.04745

  • Learning Deep Transformer Models for Machine Translation: https://arxiv.org/abs/1906.01787

  • PyTorch BatchNorm1d: https://docs.pytorch.org/docs/stable/generated/torch.nn.BatchNorm1d.html

  • PyTorch LayerNorm: https://docs.pytorch.org/docs/stable/generated/torch.nn.LayerNorm.html

  • PyTorch RMSNorm: https://docs.pytorch.org/docs/stable/generated/torch.nn.RMSNorm.html

  • 苏剑林解释 PreNorm 和 PostNorm:https://kexue.fm/archives/9009

  • 苏剑林 Transformer 的初始化、参数化与标准化:https://kexue.fm/archives/8620

  • 详细梳理多种 Normalization 方法:https://zhuanlan.zhihu.com/p/33173246

  • RMSNorm 代码实现:https://blog.csdn.net/Bug_makerACE/article/details/145621694

评分标准

  • 合格:能写出 BN/LN/RMSNorm 的基本公式,能说明 Transformer 更常用 LN/RMSNorm。

  • 良好:能讲清统计维度、训练/推理差异、pre-norm/post-norm 的公式和梯度路径。

  • 优秀:能从 warmup、深层训练、KV/自回归推理、混合精度、工程排错角度完整回答。

一、Normalization 基础

1. 请用 1 分钟解释 normalization 在深度学习中的作用。

Normalization 通过调整中间激活的均值、方差或范数,让不同层的输入尺度更稳定,从而改善优化难度和梯度传播。它可以缓解激活尺度漂移、梯度爆炸或消失,提高训练稳定性。 在 Transformer 中,normalization 还和 residual connection 一起支撑深层堆叠。现代 LLM 常用 LayerNorm 或 RMSNorm,而不是 BatchNorm。 关键得分点:稳定激活尺度、改善优化、支撑深层训练。

2. normalization 通常会执行哪些基本操作?

常见操作包括:计算某些维度上的均值或范数;减均值或不减均值;除以标准差、均方根或范数;加上 eps 保证数值稳定;最后乘可学习 scale gamma,有时再加 bias beta。 通用形式:

y = normalized(x) * gamma + beta

3. 为什么说理解 normalization 的关键是理解“统计维度”?

不同 normalization 的主要区别不是公式长得多复杂,而是均值、方差或 RMS 是在哪些维度上算的。BN 依赖 batch 统计,LN/RMSNorm 通常对每个样本每个 token 的 hidden dimension 统计。 统计维度决定了方法是否依赖 batch、是否适合变长序列、训练推理是否一致。

4. 给定 Transformer hidden states x: [B, T, H],BN、LN、RMSNorm 分别通常在哪些维度上统计?

LayerNorm 通常对每个 (b,t)H 维统计,即沿最后一维。RMSNorm 也通常沿最后一维 H 计算均方根。BatchNorm 如果用于序列,通常会跨 batch 维甚至时间维统计每个 feature/channel 的均值方差,具体取决于实现 layout。 面试中核心是:LN/RMSNorm 不跨样本统计,BN 依赖 batch 统计。

5. normalization 中的 eps 有什么作用?

eps 加在方差、RMS 或标准差计算中,防止除以 0,并提升数值稳定性。尤其在混合精度训练中,方差或 RMS 可能很小,eps 太小会导致数值不稳定。

6. normalization 后为什么还需要可学习的 gamma 和 beta?

归一化会强制激活进入某种标准尺度,可能限制表示能力。gammabeta 允许模型学习恢复或调整每个维度的尺度和偏移。 LayerNorm 通常有 gammabeta;RMSNorm 常只有 scale 参数。

7. normalization 是否一定能提升所有模型效果?为什么不能绝对化?

不一定。Normalization 改变了模型的函数形式、梯度路径和数值尺度,在大多数深层网络中有帮助,但具体效果依赖架构、任务、batch size、优化器、学习率和初始化。有些模型或小规模任务可能不需要,或者某种 norm 反而不适合。 成熟回答应避免“norm 一定更好”的绝对说法。

8. normalization 和 residual connection 在深层网络中分别解决什么问题?

normalization 稳定激活尺度和优化过程。residual connection 提供近似恒等路径,让信息和梯度更容易跨层传播。二者配合,使深层 Transformer 更容易训练。 pre-norm/post-norm 的本质就是 norm 和 residual 的相对位置不同。

二、Batch Normalization

9. BatchNorm 的核心公式是什么?

BatchNorm 公式:

mu_B = mean(x)
sigma_B^2 = var(x)
x_hat = (x - mu_B) / sqrt(sigma_B^2 + eps)
y = gamma * x_hat + beta
其中均值和方差在 BN 指定的 batch/空间维度上统计,通常对每个 channel 独立归一化。

10. BatchNorm 中训练阶段和推理阶段有什么不同?

训练阶段使用当前 mini-batch 的均值和方差,并更新 running mean/running variance。推理阶段使用训练期间累计的 running stats,不再依赖当前 batch 统计。 这是 BN 与 LN/RMSNorm 的重要差异。

11. running mean 和 running variance 是什么?

它们是训练过程中对 batch 均值和方差的滑动平均估计,用于推理阶段。推理时模型可能 batch size 很小甚至为 1,因此不能依赖当前 batch 统计,BN 使用 running stats 保持稳定。

12. BatchNorm 为什么依赖 batch size?

BN 的统计量来自 mini-batch。batch size 太小时,均值和方差估计噪声大,导致训练不稳定或泛化差。batch 内样本分布变化大时,统计也不可靠。

13. BatchNorm 在 CNN 中为什么常见且有效?

CNN 的 channel 统计在 batch 和空间维上通常比较稳定,图像样本大小和结构相对一致。BN 可以对每个 channel 统计大量元素,估计较可靠,并显著改善 CNN 优化。

14. BatchNorm 在 NLP/Transformer 中为什么不如 LayerNorm 常用?

NLP 序列长度变化大,padding 多,batch 内句子语义差异大,自回归推理常 batch size 为 1 或逐 token 生成。BN 依赖 batch 统计,训练和推理行为不同,不适合作为 Transformer/LLM 默认归一化。 LayerNorm 不依赖 batch,对每个 token 的 hidden dimension 归一化,更适合变长序列。

15. padding 会如何影响序列任务中的 BatchNorm 统计?

padding token 是无效内容,但如果参与 BN 统计,会改变 batch 均值和方差。不同样本 padding 比例不同,统计量会受到长度分布影响,从而污染真实 token 表示。

16. 小 batch size 下 BatchNorm 可能出现什么问题?

均值方差估计噪声大,训练不稳定,loss 抖动,泛化下降。极小 batch 时 BN 统计甚至没有代表性,推理 running stats 也可能不准。

17. 分布式训练中 SyncBatchNorm 解决什么问题?代价是什么?

SyncBatchNorm 在多个设备之间同步 batch 统计,扩大有效统计样本,缓解单卡 batch 太小的问题。代价是需要跨设备通信,增加训练开销和同步复杂度。

18. 如果推理时忘记把含 BN 的模型切到 eval 模式,会发生什么?

模型会继续使用当前 batch 统计而不是 running stats。推理输出会依赖当前 batch 组成,batch size 改变会影响结果,还可能更新 running stats,导致结果不稳定。

三、Layer Normalization

19. LayerNorm 的核心公式是什么?

LayerNorm 对单个样本的 feature 维统计:

mu = mean(x_i)
sigma^2 = mean((x_i - mu)^2)
x_hat = (x - mu) / sqrt(sigma^2 + eps)
y = gamma * x_hat + beta
在 Transformer 中,通常对每个 token 的 hidden dimension 计算均值和方差。

20. 对 x: [B, T, H],Transformer 中 LayerNorm 的 mean/var 是如何计算的?

对每个 batch 样本 b 和 token 位置 t,在 hidden 维 H 上计算:

mean = mean(x[b, t, :])
var = var(x[b, t, :])
不会跨 batch,也不会跨 token 统计。

21. LayerNorm 为什么不依赖 batch size?

LN 的统计量来自单个样本单个 token 的 hidden vector,不使用其他样本。因此 batch size 是 1 还是 1024,LN 的计算方式都一样。

22. LayerNorm 的训练和推理行为是否一致?为什么?

一致。LN 不维护 running mean/variance,训练和推理都用当前样本当前 token 的 hidden dimension 统计。因此没有 BN 那样的 train/eval 统计差异。

23. LayerNorm 为什么适合变长序列和自回归生成?

LN 不依赖 batch 内其他样本,也不依赖序列长度统计。每个 token 独立按 hidden dimension 归一化,因此不会受 padding、batch size、生成步数影响。自回归推理中单 token 生成也能稳定使用。

24. LayerNorm 中 normalized_shape=H 是什么意思?

表示对输入最后 H 维进行归一化,并为这些维度维护 gamma/beta 参数。对 [B,T,H] 的 Transformer hidden states,normalized_shape=H 意味着每个 token 的 hidden vector 独立归一化。

25. LayerNorm 的 gamma 和 beta shape 通常是什么?

如果 normalized_shape 是 H,则:

gamma: [H]
beta:  [H]
它们会广播到 [B,T,H]

26. 如果把 LayerNorm 错误地跨 token 维度统计,可能带来什么问题?

会让一个 token 的归一化依赖其他 token,破坏 token 表示的独立稳定化,还会受 padding 和序列长度影响。自回归推理时也可能出现训练/推理不一致。 标准 Transformer LN 通常只沿 hidden dimension 统计。

27. 面试中如何回答“为什么 Transformer 用 LN 而不是 BN”?

核心回答:BN 依赖 batch 统计,训练和推理行为不同,容易受 batch size、padding、变长序列和自回归生成影响;LN 对每个 token 的 hidden dimension 独立统计,不依赖 batch,训练推理一致,因此更适合 Transformer 和 LLM。

四、RMSNorm

28. RMSNorm 的核心公式是什么?

RMS(x) = sqrt(mean(x_i^2) + eps)
y = x / RMS(x) * gamma
它通常沿 hidden dimension 计算 RMS。

29. RMSNorm 和 LayerNorm 的主要区别是什么?

LayerNorm 减均值并除以标准差,控制中心和尺度。RMSNorm 不减均值,只除以均方根,主要控制尺度。

LN:      (x - mean) / std
RMSNorm: x / rms

30. RMSNorm 为什么可以被看作只做 re-scaling、不做 re-centering?

因为 RMSNorm 没有减去均值,不把向量中心移动到 0,只把向量按 RMS 缩放到稳定尺度。因此它只做重缩放,不做重新中心化。

31. RMSNorm 通常是否有 beta bias?现代 LLM 中常见做法是什么?

RMSNorm 通常只有 scale 参数 gamma/weight,没有 beta bias。很多现代 LLM 使用 bias-free RMSNorm,以减少参数和计算,并保持结构简洁。

32. RMSNorm 相比 LayerNorm 有哪些计算或工程优势?

RMSNorm 不需要计算均值,也不需要计算中心化后的方差,只计算平方均值和开方。操作更少,速度和显存略有优势。实现也更简单,适合大规模 LLM。

33. RMSNorm 是否一定比 LayerNorm 好?如何客观回答?

不一定。RMSNorm 在很多 LLM 中效果好且高效,但是否优于 LayerNorm 取决于架构、规模、训练配方和任务。客观说法是:RMSNorm 是 LN 的轻量变体,现代 LLM 常用,但不是所有场景必然更优。

34. 为什么现代 decoder-only LLM 常用 RMSNorm?

因为 decoder-only LLM 层数深、规模大,需要高效稳定的 normalization。RMSNorm 不依赖 batch,适合自回归生成;计算简单;与 pre-norm residual 结构配合稳定;实践效果好。

35. 请写出 RMSNorm 的 PyTorch 风格伪代码。

def rms_norm(x, weight, eps=1e-6):
    # x: [B, T, H]
    variance = x.float().pow(2).mean(dim=-1, keepdim=True)
    x = x * torch.rsqrt(variance + eps)
    return (weight * x).to(dtype=weight.dtype)
实际实现中通常保留输入 dtype 或输出 dtype,内部统计可用 fp32 增强稳定性。

五、BN、LN、RMSNorm 对比

36. 请用一张表口头对比 BN、LN、RMSNorm 的统计维度、训练推理差异和适用场景。

BN:
  跨 batch/空间统计,每个 channel 归一化。
  训练用 batch stats,推理用 running stats。
  CNN 常用,LLM 不常默认使用。

LN:
  每个样本/每个 token 沿 hidden dimension 统计。
  训练推理一致。
  Transformer 经典选择。

RMSNorm:
  每个 token 沿 hidden dimension 计算 RMS。
  训练推理一致。
  现代 LLM 常用。

37. BN、LN、RMSNorm 分别是否依赖 batch 内其他样本?

BN 依赖 batch 内其他样本。LN 和 RMSNorm 不依赖,它们对每个样本每个 token 自己的 hidden vector 统计。

38. BN、LN、RMSNorm 对 batch size=1 的推理分别有什么影响?

BN 推理时通常使用 running stats,若误用训练模式则 batch size=1 的统计不可靠。LN/RMSNorm batch size=1 没问题,因为它们不依赖 batch 统计。

39. 为什么 BN 有 running stats,而 LN/RMSNorm 通常没有?

BN 训练时依赖 batch 统计,推理时 batch 可能不同或太小,因此需要 running mean/variance。LN/RMSNorm 的统计来自当前样本 hidden dimension,训练和推理一致,所以不需要 running stats。

40. 词表、序列长度、padding、batch size 中,哪些会直接影响 LN 的统计?哪些不会?

标准 Transformer LN 对每个 token 的 hidden dimension 统计,因此 batch size 不直接影响 LN 统计,其他 token 和 padding token 也不会影响某个真实 token 的 LN 统计。词表只通过 embedding 内容间接影响 hidden vector,不作为统计维度。序列长度也不直接进入单个 token 的 LN 统计。

41. 混合精度训练中 normalization 可能有哪些数值稳定问题?

fp16 下方差、RMS、rsqrt 可能精度不足,极小方差可能导致除法不稳定,eps 太小可能出现 NaN。常见做法是内部统计转 fp32,使用合适 eps,并配合梯度裁剪和 loss scaling。

六、Pre-Norm 与 Post-Norm

42. 什么是 Post-Norm Transformer block?请写出公式。

Post-Norm 把 Norm 放在 residual 相加之后:

y = Norm(x + Sublayer(x))
原始 Transformer 使用的是这种结构。

43. 什么是 Pre-Norm Transformer block?请写出公式。

Pre-Norm 把 Norm 放在子层之前:

y = x + Sublayer(Norm(x))
attention 子层和 MLP 子层通常都这样处理。

44. 原始 Transformer 使用的是 pre-norm 还是 post-norm?

原始 Transformer 使用 post-norm,即 residual 相加后做 LayerNorm。

45. Pre-Norm 和 Post-Norm 的核心结构差异是什么?

差异是 Norm 相对 residual 和 sublayer 的位置。Post-Norm 是先子层、加残差、再 Norm。Pre-Norm 是先 Norm、再子层、再加残差。

46. 为什么 Pre-Norm 更容易训练深层 Transformer?

Pre-Norm 的 residual path 更接近恒等映射,梯度可以沿 x -> x + ... 的路径直接传播。深层堆叠时,这条稳定梯度路径有助于避免梯度消失或爆炸。

47. 从梯度路径角度解释 Pre-Norm 的优势。

Pre-Norm:

x_{l+1} = x_l + F(Norm(x_l))
x_l 的导数包含直接的恒等项:

d x_{l+1}/d x_l = I + ...
这使反向传播更稳定。

48. 从梯度路径角度解释 Post-Norm 的潜在问题。

Post-Norm:

x_{l+1} = Norm(x_l + F(x_l))
梯度必须经过 Norm 的 Jacobian:

d x_{l+1}/d x_l = J_Norm * (I + ...)
深层堆叠时,多个 Norm Jacobian 会影响梯度尺度,使训练更难。

49. Post-Norm 为什么通常更依赖 warmup 或谨慎初始化?

Post-Norm 深层训练初期梯度尺度可能不稳定。如果直接使用较大学习率,参数更新可能过大导致发散。warmup 在训练初期逐步增加学习率,可以降低早期不稳定风险。 谨慎初始化和残差缩放也可以缓解类似问题。

50. Pre-Norm 是否完全不需要 warmup?为什么?

不是。Pre-Norm 更稳定、对 warmup 依赖较弱,但大规模 LLM 训练仍常使用 warmup、学习率调度、梯度裁剪和稳定初始化。warmup 还与优化器状态、数据噪声和训练规模有关。

51. Pre-Norm 有哪些潜在局限?

Pre-Norm 每层输出没有立即被归一化,残差累加可能导致 hidden scale 随深度增长。因此常需要 final norm、residual scaling 或合适初始化。某些设置下 Post-Norm 或 DeepNorm 可能在最终性能上有优势,但训练更复杂。

52. 为什么 Pre-Norm 模型常在最后加 final norm?

因为 pre-norm block 的输出没有在每层末尾强制归一化,经过多层残差累加后最终 hidden state 尺度可能不稳定。final norm 在输出 LM head 前稳定 hidden scale,有利于 logits 和训练。

53. 现代 LLM 中常见的 RMSNorm + Pre-Norm + Final Norm 结构是什么样?

典型结构:

x = x + Attention(RMSNorm(x))
x = x + MLP(RMSNorm(x))
...
x = FinalRMSNorm(x)
logits = LMHead(x)
这是很多 decoder-only LLM 的常见范式。

七、实现与代码题

54. 请写出 LayerNorm 的 PyTorch 风格伪代码。

def layer_norm(x, gamma, beta, eps=1e-5):
    mean = x.mean(dim=-1, keepdim=True)
    var = ((x - mean) ** 2).mean(dim=-1, keepdim=True)
    x_hat = (x - mean) / torch.sqrt(var + eps)
    return x_hat * gamma + beta
[B,T,H] 来说,dim=-1 就是 hidden dimension。

55. 请写出一个 Pre-Norm Transformer block 的伪代码。

def prenorm_block(x):
    x = x + attention(norm1(x))
    x = x + mlp(norm2(x))
    return x
关键是 norm 在 sublayer 前,residual 加在 sublayer 输出后。

56. 请写出一个 Post-Norm Transformer block 的伪代码。

def postnorm_block(x):
    x = norm1(x + attention(x))
    x = norm2(x + mlp(x))
    return x
关键是 residual 相加后再 norm。

57. 给定 x: [B, T, H],gamma: [H],LayerNorm 输出 shape 是什么?

输出 shape 仍是:

[B, T, H]
LayerNorm 不改变张量形状,只改变数值分布。

58. RMSNorm 中为什么常用 x.float() 计算 RMS,再 cast 回原 dtype?

混合精度下,fp16/bf16 的平方、均值和 rsqrt 可能不够稳定。转 fp32 计算 RMS 可以降低 NaN 和精度误差风险,最后再 cast 回模型 dtype 保持计算效率。

59. eps 取值过大或过小可能有什么影响?

eps 太小可能除以接近 0 的数,引发 NaN 或梯度爆炸。eps 太大则会主导分母,削弱真实方差/RMS 的作用,改变归一化效果。

60. 如果从 LayerNorm 替换成 RMSNorm,权重迁移时需要注意什么?

LayerNorm 有 gamma 和 beta,RMSNorm 通常只有 weight,没有 beta;并且归一化公式不同,不能简单保证等价。迁移时需要处理参数缺失、结构不匹配,并通常需要继续训练或微调。

八、工程排错与面试追问

61. 训练出现 NaN,normalization 相关排查点有哪些?

检查 eps 是否过小,fp16 方差/RMS 是否不稳定,norm 输入是否已有 inf/NaN,gamma 是否异常放大,学习率是否过大,梯度是否爆炸,RMSNorm 是否内部用 fp32 统计,BN batch stats 是否异常。

62. 如果 Transformer 训练很深时不收敛,pre/post norm 角度可以如何分析?

如果是 Post-Norm,深层梯度可能不稳定,可尝试 Pre-Norm、增加 warmup、降低学习率、使用 residual scaling、DeepNorm 或调整初始化。如果已经是 Pre-Norm,则检查 final norm、残差尺度、norm eps 和优化器设置。

63. 如果把 Post-Norm checkpoint 加载到 Pre-Norm 结构中,会有什么问题?

虽然某些权重 shape 可能相同,但计算图不同,Norm 的位置改变会导致函数完全不同。直接加载通常不能保持模型行为,需要结构匹配或重新训练。

64. 如果模型输出 logits 前 hidden state scale 很不稳定,normalization 角度可以怎么处理?

可以检查 final norm 是否存在,norm eps 和 dtype 是否合理,residual scale 是否过大,RMSNorm/LayerNorm 参数是否异常,是否需要 residual scaling 或更稳定初始化。

65. 为什么说 BN 的训练/推理不一致对自回归 LLM 不友好?

自回归 LLM 推理时逐 token 生成,batch size 和上下文分布变化大。BN 训练用 batch stats、推理用 running stats,这种行为差异可能让生成分布不稳定。LN/RMSNorm 训练推理一致,更适合自回归模型。

66. Pre-Norm 更稳定,为什么还有研究关注 Post-Norm 或 DeepNorm 等方法?

Pre-Norm 稳定但可能有表示尺度累积、最终性能或表示规范性问题。Post-Norm 输出更规范,但训练深层困难。DeepNorm 等方法尝试通过残差缩放和初始化,让更深的 Post-Norm 或混合结构也能稳定训练。

67. Sandwich Norm、DeepNorm、ScaleNorm 大致想解决什么问题?

它们都试图稳定深层 Transformer 的激活和梯度。Sandwich Norm 在子层前后都归一化;DeepNorm 通过残差缩放和初始化支持深层训练;ScaleNorm 用向量范数控制尺度。

68. 面试官问“RMSNorm 为什么省计算”,你会如何回答?

RMSNorm 不计算均值,也不需要先中心化再算方差,只计算平方均值和 rsqrt,然后乘 scale。因此比 LayerNorm 少一些 reduce 和逐元素操作,结构更简单,现代 LLM 中更高效。

69. 面试官问“LayerNorm 会不会破坏 token 之间的信息交互”,你会如何回答?

标准 Transformer LayerNorm 对每个 token 的 hidden dimension 独立归一化,不直接混合不同 token,因此不会破坏 attention 建立的 token 间交互。它只是稳定每个 token 表示的尺度。token 间信息交互主要由 self-attention 完成。

70. 请总结第五天知识链路:从 normalization 到 BN/LN/RMSNorm,再到 pre-norm/post-norm。

Normalization 的目标是稳定激活尺度和梯度传播。BN 跨 batch 统计,训练推理行为不同,适合 CNN,但不适合作为 LLM 默认归一化。LN 对每个 token 的 hidden dimension 统计,不依赖 batch,训练推理一致,适合 Transformer。RMSNorm 是 LN 的轻量变体,只按 RMS 缩放,不减均值,现代 LLM 常用。Transformer block 中,Post-Norm 是 Norm(x + Sublayer(x)),原始 Transformer 使用但深层训练较难;Pre-Norm 是 x + Sublayer(Norm(x)),残差路径更接近恒等,梯度更稳定。现代 LLM 常见组合是 RMSNorm + Pre-Norm + Final Norm。

            预览时标签不可点




































<div class="