编程与 AI14 分钟阅读更新于 2026-08-03

残差连接与层归一化:Transformer 如何稳定堆叠多层结构

从残差连接和层归一化各自解决的问题出发,理解它们如何与多头注意力、前馈网络组成完整子层,并区分 Post-LN 与 Pre-LN 的结构差异。

相关工具

为什么 Transformer 需要两条辅助路径

多头注意力和前馈网络都能改变表示,但 Transformer 往往要把这样的结构重复堆叠很多层。层数增加后,一个问题会越来越明显:如果每一层都彻底改写输入,信息和梯度要穿过很长的变换链,训练会变得不稳定。

残差连接和层归一化就是为这个问题准备的两种机制。残差连接保留一条绕过子层的直接路径,让原始表示可以继续向后传递;层归一化则调整每个位置内部特征的数值分布,减少不同层之间的尺度波动。

它们不负责替代注意力或前馈网络,而是把这些计算包裹起来,让子层更容易被训练、被堆叠,也更不容易因为某一次变换过强而破坏已有信息。

Transformer 残差连接从输入到子层再与直接路径相加的结构图
Transformer 中的残差连接

输入同时进入子层和直接路径,子层输出与原输入逐元素相加,形成新的表示。

残差连接做的事情很简单

把一个子层记作 F,输入记作 x,残差结构的基本表达就是 y=x+F(x)。输入 x 一边进入注意力或前馈网络,一边沿着直接路径传递,最后和子层输出逐元素相加。

这里的“残差”指的是子层需要学习的增量。模型不必每次都从零构造一个完整的新表示,而是可以在原有表示上补充上下文、修正特征或添加新的关系。子层如果暂时只需要做很小的调整,只要让 F(x) 接近 0,整体输出仍然接近 x。

残差连接还有一个形状要求:x 和 F(x) 必须能相加。Transformer 中注意力和前馈网络通常都会把输出维度保持为 d_model,因此可以直接使用残差连接。

残差连接为什么有助于深层训练

从前向计算看,残差连接给信息增加了直达通道;从反向传播看,梯度也可以沿着这条路径传回更前面的层。即使子层内部包含多次矩阵变换和激活函数,直接路径仍然提供了较短的传播路线。

这不意味着有了残差连接就一定能无限加深网络。学习率、初始化、归一化方式和数据规模仍然会影响训练。但相同条件下,残差结构通常比完全串行的堆叠更容易优化。

理解残差时,不要把它当作简单的“复制一份输入”。复制只是形成了直接路径,真正的作用在于最后的逐元素相加:输出同时保留旧表示和子层学习到的增量。

层归一化归一化的是什么

Layer Normalization 通常针对单个位置的特征维度进行归一化。假设某个位置的向量是 x=(x_1,...,x_d),层归一化先在这 d 个特征上计算均值和方差,再把每个特征调整到相对稳定的尺度。

归一化后的结果还会经过可学习的缩放参数 γ 和平移参数 β:y_i=γ_i(x_i-μ)/√(σ²+ε)+β_i。这样模型既能获得稳定的数值范围,又不会被固定的标准化形式限制,训练过程中可以学习适合任务的缩放和偏移。

这里的归一化维度很关键。对语言序列来说,LayerNorm 通常在每个 token 的特征维度上计算,而不是把整个批次或整个序列混在一起。不同位置的表示不会因为另一个位置的数值变化而直接改变自己的均值。

LayerNorm 在特征维度上计算均值方差并应用缩放平移的示意图
层归一化的计算过程

对一个位置的特征向量计算均值和方差,完成标准化后再使用可学习的缩放 γ 与平移 β。

层归一化解决的是尺度问题

注意力输出、前馈网络输出和残差相加都可能改变向量的数值分布。如果某些层的数值持续放大,后续激活和矩阵运算会变得敏感;如果数值过小,信号又可能逐渐变弱。层归一化通过重新调整每个位置的特征分布,让后续子层面对更稳定的输入。

它并不是把所有信息压成相同的向量,也不是删除特征差异。归一化只改变当前向量的中心和尺度,γ、β 以及后续参数仍然可以恢复有用的变化。模型保留了表达能力,只是减少了数值范围失控的可能。

与 BatchNorm 相比,LayerNorm 不依赖批次中其他样本的统计量,因此更适合序列长度变化明显、批次较小或自回归生成的场景。这也是 Transformer 更常采用 LayerNorm 的原因之一。

编码器中的两个残差归一化子层

经典 Transformer 编码器层包含两个主要子层。第一个是多头自注意力,第二个是逐位置前馈网络。每个子层后面都配有残差连接和层归一化,因此一层中会出现两次“子层变换—残差相加—归一化”的组合。

第一处组合让各位置交换上下文后保留原输入,第二处组合让每个位置完成非线性加工后仍能保留前一步表示。两次残差不是重复设计,而是分别包裹两个功能不同的子层。

这也解释了为什么阅读结构图时要关注箭头是否绕过子层。只看到注意力和前馈网络的方框还不够,直接路径、相加节点和归一化位置共同决定了这一层的真实计算顺序。

Transformer Post-LN 与 Pre-LN 子层结构对比图
编码器子层的两种组织方式

Post-LN 先经过子层再相加归一化,Pre-LN 先归一化再进入子层,最后与输入相加。

Post-LN 和 Pre-LN 有什么区别

在经典论文结构中,常见的是 Post-LN:先计算子层 F(x),再与输入 x 相加,最后做层归一化,形式可以写成 LayerNorm(x+F(x))。后来许多实现采用 Pre-LN:先对输入做层归一化,再送入子层,最后把子层输出加回输入,形式接近 x+F(LayerNorm(x))。

两种结构都包含残差连接和层归一化,区别在于归一化放在子层之前还是之后。这个顺序会影响训练稳定性、梯度传播和深层模型的表现,不能只把它们当作代码写法差异。

阅读资料时,如果只记住“Transformer 有残差和 LayerNorm”,容易在复现结构时漏掉顺序。更稳妥的方式是先确认采用 Post-LN 还是 Pre-LN,再按对应公式画出直接路径和归一化位置。

为什么后来常见 Pre-LN

Pre-LN 把归一化放在子层入口,残差路径可以更直接地贯穿多层。对深层结构来说,这种安排通常更容易保持梯度传播的稳定性,也减少了训练初期对精细初始化和学习率设置的敏感程度。

这不是说 Post-LN 没有价值。经典 Transformer 论文采用的结构有清晰的理论和实验背景,很多模型与资料也仍然按 Post-LN 解释。不同架构的层数、训练策略和其他组件会共同影响最终选择。

学习阶段可以先掌握两种公式的差异,再在具体模型中确认实现。不要看到 LayerNorm 就默认它一定位于子层前面或后面,结构位置需要以模型定义为准。

用形状和统计量检查实现

残差相加首先检查形状:输入和子层输出的最后一维必须一致,或者通过额外投影对齐。层归一化则检查归一化轴:通常是每个位置内部的特征维度,而不是批次维度。

再检查数值行为。归一化前,一个位置不同特征的均值和方差可能差异较大;归一化后,标准化部分的均值应接近 0、方差应接近 1,再经过 γ 和 β 调整。ε 用于避免方差过小时除零。

最后检查执行顺序:输入先进入归一化还是先进入子层,子层输出何时与残差相加。把这三个问题分开,通常比直接对着长公式排错更容易。

残差与层归一化的四个检查点
步骤 1
形状对齐

残差相加前,输入与子层输出的维度必须一致。

步骤 2
路径保留

输入应有一条绕过子层的直接路径。

步骤 3
归一化轴

LayerNorm 通常在单个位置的特征维度上计算。

步骤 4
顺序确认

明确使用 Post-LN 还是 Pre-LN,不要混用两种公式。

把它们放回 Transformer 的整体结构

到这里,Transformer 编码器的一层可以完整地串起来:输入先带有词语内容和位置信息,经过多头注意力进行跨位置交互,再通过残差与归一化稳定表示;随后进入前馈网络进行逐位置非线性变换,再经过第二组残差与归一化,得到这一层的输出。

多头注意力、前馈网络、残差连接和层归一化分别承担不同职责。注意力负责看别人,前馈网络负责加工自己,残差负责保留原路,归一化负责调整尺度。把职责分清,Transformer 的结构就不再像一串难以拆开的方框。

后面继续学习解码器时,会遇到带掩码的自注意力和编码器—解码器注意力。它们仍然会被残差和层归一化包裹,只是子层的输入来源和可见范围发生变化。

常见问题

残差连接是不是把输入和输出直接拼接?

不是。标准残差连接通常是输入与子层输出逐元素相加,因此两者需要具有一致的形状。

LayerNorm 是对整个句子做归一化吗?

通常不是。LayerNorm 一般对每个位置内部的特征维度计算均值和方差,不把整个序列或批次混在一起。

Post-LN 和 Pre-LN 哪个一定更好?

没有脱离具体架构和训练条件的绝对答案。Post-LN 是经典结构,Pre-LN 常被用于更深或更强调训练稳定性的模型,实际应以模型定义为准。