简介:本文系统梳理大模型面试中的高频底层原理:Pre-Norm与Post-Norm的差异与取舍、BatchNorm/LayerNorm/RMSNorm的对比、Decoder掩码注意力的动机与实现、注意力缩放因子√d_k的完整推导,以及Softmax防溢出的标准写法,帮助读者打通Transformer核心机制,高效备战面试并指导工程实践。
大模型面试中反复出现的“高频八股”,表面上是零散的问答,实质上围绕 Transformer 架构的三个核心环节展开:归一化策略(Pre-Norm/Post-Norm、BatchNorm/LayerNorm/RMSNorm)、注意力机制(掩码注意力、缩放点积注意力)与数值稳定性(Softmax 防溢出)。它们分别回答了三个根本问题:深层网络如何稳定训练、序列生成如何做到正确且可并行、指数运算如何在大数值下保持安全。
先给出几个关键定义:
x_{l+1} = LN(x_l + Sublayer(x_l))。每个子层输出都会再经过 LN,相当于梯度每层都要“穿过”LN 的雅可比矩阵。x_{l+1} = x_l + Sublayer(LN(x_l))。输入先被“标准化”再喂给子层,而残差主路径保持数据的“整洁”,上面没有任何会改变梯度尺度的算子。反向传播时,Pre-Norm 的残差主路上至少存在一条恒等映射的梯度通路(残差 x 直接回传),因此即使层数堆得很深,梯度也不容易消失或爆炸,对学习率和 warmup 策略也更宽容。这正是大模型、深层 Transformer 普遍偏向 Pre-Norm 的核心原因。
Post-Norm 中,梯度每经过一层都要乘以该层 LN 的雅可比,深层堆叠时这些雅可比连乘容易导致梯度尺度失稳,表现为训练不稳定,通常需要更小的学习率、更精细的 warmup 才能收敛。也有工程经验认为 Post-Norm 在训练充分时效果上限略好,但其训练成本与风险更高,因此在大模型时代 Pre-Norm 成为主流默认选择。
一句话记忆:BatchNorm 是“一个特征跨样本看”,LayerNorm 是“一个样本看所有特征”。
RMSNorm 是 LayerNorm 的简化变体:不再同时计算均值和方差,只计算均方根,用均方根做缩放后再乘可学习增益。对比公式:
y = γ ⊙ (x − μ) / √(σ² + ε) + βy = γ ⊙ x / √(mean(x²) + ε)省去减均值和方差计算后,运算量明显下降,在大模型中被广泛采用。
自回归生成要求:预测第 t 个 token 时,只能依赖 t 之前的位置,不能“偷看”未来。训练阶段为了并行效率,会把整个目标序列一次性输入,如果不在注意力中加掩码,位置 t 的注意力会直接看到 t 之后的 token,模型在训练时“作弊”,推理时却没有未来信息可看,导致训练与推理行为严重不一致。因此 Decoder 的自注意力必须加因果掩码。
Decoder 每层通常包含两个注意力子层,职责不同:
实现思路很直接:在 softmax 之前,把所有不允许注意的位置加上一个极大负数(如 -1e9 或负无穷),softmax 之后这些位置的权重就趋近于 0:
scores = Q @ K.transpose(-2, -1) / sqrt(d_k) # 打分scores = scores + mask # 上三角位置为 -1e9,其余为 0attn = softmax(scores, dim=-1) # 未来位置权重≈0out = attn @ V
工程实践中常把因果掩码与 padding 掩码叠加使用。
设 q、k 的各分量是独立同分布的随机变量,维度为 d_k,且均值均为 0、方差均为 1(经过合理初始化与归一化后近似成立)。
点积 q·k = Σ_{i=1}^{d_k} q_i·k_i,逐项分析:
E[q·k] = Σ E[q_i]·E[k_i] = 0。E[(q·k)²] = Σ E[q_i²]·E[k_i²] = d_k。Var(q·k) = E[(q·k)²] − (E[q·k])² = d_k。当 d_k 足够大时,q·k 是 d_k 个独立同分布随机变量之和,根据中心极限定理,其分布趋近于正态分布 N(0, d_k)。为了将其标准化——目的是防止 softmax 在大幅值输入下饱和或溢出——我们减去期望(已是 0)并除以标准差 √d_k,使打分近似服从标准正态分布。这就是缩放因子 √d_k 的来历。
若不除以 √d_k,点积幅值会随维度增大而线性放大,softmax 的输入差距被急剧拉大,输出趋于 one-hot(赢者通吃),梯度趋近于 0,注意力分布失去平滑的“软”加权能力,训练信号变差。
Softmax 中的指数运算对大数值非常敏感:输入达到上千时,e^x 会直接上溢为 inf;输入很负时又会下溢为 0。标准做法是先减去该行最大值再取指数:
import numpy as npdef stable_softmax(x):x = x - np.max(x, axis=-1, keepdims=True) # 减最大值e = np.exp(x)return e / np.sum(e, axis=-1, keepdims=True)
其数学等价性来自:对任意常数 m,e^{x_i} / Σ_j e^{x_j} = e^{x_i−m} / Σ_j e^{x_j−m},分子分母同乘同一因子,结果不变;取 m = max(x) 后,所有指数输入都不超过 0,从根本上避免了上溢。
axis 参数。回到定义本身:这一组高频考点共同构成 Transformer 的“稳定训练三件套”。归一化(Pre-Norm/Post-Norm、BN/LN/RMSNorm)回答“如何让深层网络稳定训练”;掩码注意力回答“如何让序列生成既正确又可并行”;缩放点积与数值稳定 Softmax 回答“如何让打分与指数运算在大维度、大数值下依然安全”。理解它们的定义、推导与适用边界,不仅能从容应对面试,更是阅读大模型源码、调优训练配置的必备基础。