Add: 指残差连接(Residual Connection),也叫跳跃连接(Skip Connection)
Norm: 指层归一化(Layer Normalization)
这俩加一块解决了深度神经网络训练中梯度消失/爆炸的问题,保证了训练的稳定性和收敛速度。
先看 Transformer 的一个标准 block,包含两次残差连接和两次层归一化:

残差连接(Residual Connection)#
对于一个子层(SubLayer,可以是多头注意力或前馈网络),把他的输出记作 SF(Xin),那么残差连接的输出 Xout 就是:
Xout=Xin+F(Xin)结合CNN里讲的ResNet残差块,残差连接的作用就是让网络可以直接学习恒等映射(Identity Mapping),而不是强迫网络去学习一个复杂的非线性映射。
层归一化(Layer Normalization)#
层归一化对单个样本的所有特征维度进行标准化(注意区分Batch Norm是对同一批次所有样本的同一个特征做标准化)。
一个子层的输入 Xin∈Rn,d,那么层归一化的计算公式为:(对于输入序列的一行xi∈R1,d,索引j遍历所有特征维度)
μi=d1j=1∑dxij,σi2=d1j=1∑d(xij−μi)2x^ij=σi2+ϵxij−μi,LN(xij)=γx^ij+β其中 μi 和 σi2 分别是第 i 个样本在特征维度上的均值和方差,ϵ 是一个小常数以避免除零错误,γ 和 β 是可学习的缩放和偏移参数。
拓展到整个输入矩阵 Xin,层归一化的每一步和最终输出可以表示为:
TIP在实际的代码中,算完均值向量之后会进行广播变成 n×d 的矩阵,求方差时和 Xin 做差,逐元素平方再求逐行均值,最后再广播回去。这样可以充分利用矩阵运算的并行性。
μ=[μ1,μ2,…,μn]T(n×1→n×d)σ2=[σ12,σ22,…,σn2]TX^in=σ2+ϵXin−μLN(Xin)=γ⊙X^in+β
- ⊙ 表示逐元素乘法(Hadamard Product)
- γ 和 β 是 1×d 的向量,分别表示每个特征维度的缩放和偏移参数。
- 这俩参数在计算时会广播成 n×d 的矩阵。
为什么不用 Batch Norm(批归一化)?#
Batch Norm在CNN中极其成功,但在Transformer/NLP中水土不服,原因有三:
-
序列长度变化:NLP中每句话长短不一。Batch Norm依赖于批次统计量(均值和方差),如果某个Batch恰好全是短句子,其统计量会严重偏离长句子的分布,导致训练不稳定。
-
训练与推理不一致:Batch Norm在训练时用Batch统计量,推理时用全局滑动平均。这在NLP中容易造成性能抖动。
-
并行计算干扰:在自注意力中,不同样本之间的关联性已经很强,Batch Norm会进一步引入样本间的依赖,反而容易引入噪声。
层归一化则完全独立于Batch,只依赖单个样本自身,天然适配变长序列。
把子层记作一个映射 F(Xin),把层归一化记作 LN(⋅),那么一个标准的 Transformer block 可以表示为:
Pre-LN vs Post-LN#
Post-LN(原始论文的做法):
LN(Xin+F(Xin))Pre-LN 现代主流实现(Pre-Norm,如GPT、LLaMA、ViT等):
Xin+F(LN(Xin))Post-Norm的问题:在深层网络中,残差路径的梯度虽然直通,但紧接着就进入LayerNorm。如果LayerNorm的梯度不稳定(尤其是早期训练阶段),仍可能放大噪声。
Pre-Norm的优势:它将所有子层(注意力/FFN)的输入都“摆正”(归一化到0均值1方差),使得子层的优化更加平稳。更重要的是,残差连接本身不受归一化影响,梯度可以直接“流过”加法路径,不用穿过LayerNorm。
Pre-LN 架构的梯度分析#
对于多头注意力子层F,假设输入为 Xl,输出为 Xl+1,残差连接为 Xl+2=Xl+F(LN(Xin))。
损失函数 L 对 Xl+2 的梯度为 ∂Xl+2∂L,那么对 Xl 的梯度为:
∂Xl∂L=∂Xl+2∂L⋅(I+∂Xl∂F(LN(Xl)))这个公式说明了梯度可以直接通过残差连接的 I 项传递,而不受 F 的影响,更不受 LN 的影响,从而保证了梯度的稳定性。