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

Transformer 的 LayerNorm 到底在每个位置上做了什么

围绕残差连接和层归一化的描述,解释 LayerNorm 的处理对象、计算范围,以及它如何帮助编码器和解码器稳定传递表示。

相关工具

先分清残差和归一化各自负责什么

Transformer 相关概念 在介绍编码器时指出,每个子层都有残差连接,随后执行层标准化。残差连接解决的是信息如何继续向前传递,LayerNorm 解决的是传递后的数值尺度如何保持稳定。两者经常连在一起出现,但它们不是同一件事。

把一个子层记成 F,把输入记成 x,那么常见的结构可以写成 LayerNorm(x+F(x))。先把子层的新结果和原输入相加,再对相加后的表示做归一化。这样既保留了原始通路,又让后续层接收到尺度更可控的向量。

Transformer 子层输出与输入经过残差相加再进行 LayerNorm 的流程图
子层、残差与 LayerNorm 的顺序

输入一方面直接走残差路径,另一方面进入子层,二者相加后再进行 LayerNorm。

LayerNorm 处理的是一个位置的隐藏向量

假设一批输入经过 Transformer 后形成形状为 batch×length×d_model 的张量。对于某个固定样本、某个固定位置,LayerNorm 主要在这个位置的 d_model 个特征上计算均值和方差,再对这个位置的向量做标准化。它不是把整句话所有位置的数值混在一起,也不是把不同样本放在一起比较。

因此,同一句话中第一个词和第二个词各自拥有自己的归一化范围。它们仍然通过 Self-Attention 建立信息关系,但 LayerNorm 本身只调整当前位置的特征尺度。这个区别很重要:跨位置的信息交换由注意力负责,逐位置的数值整理由 LayerNorm 负责。

Transformer LayerNorm 在每个序列位置的 d_model 特征上独立归一化的示意图
LayerNorm 的逐位置处理范围

归一化沿单个位置的模型维度进行,每个位置独立整理自己的隐藏特征。

为什么不能把整句话直接一起归一化

如果把所有位置混在一起计算均值和方差,一个位置的数值就会受到其他位置长度、词义和激活状态的影响。句子变长、批次中样本不同,都会改变这组统计量。这样的处理会让某个位置的表示尺度依赖于无关位置,增加后续计算的不确定性。

逐位置归一化保留了一个清晰边界:注意力可以读取其他位置,LayerNorm 不负责替注意力做关系聚合。模型先通过注意力把有用信息带到当前位置,再在当前位置内部整理这组已经融合的特征。职责分开后,结构更容易理解。

残差相加为什么要求统一 d_model

残差连接要把 x 和 F(x) 相加,两者必须具有相同形状。资料 在第 1.6 节后面进一步说明,编码器、解码器和嵌入层的输出维度需要保持一致,经典 Transformer 使用 d_model=512。这个统一宽度让每个子层都能接入同一条主干。

注意力内部可以暂时把 d_model 拆成多个头,FFN 也可以先把特征映射到更宽的中间空间,但子层输出最终要回到 d_model。LayerNorm 就在这个统一模型空间上整理每个位置的特征,之后结果才能继续参与下一次残差相加。

LayerNorm 不是把所有值都压成一样

归一化并不意味着一个位置的所有特征会变成同一个数。它只是根据当前位置向量的均值和方差重新缩放,再通过可学习的增益和偏置恢复模型需要的表达范围。不同特征之间的相对结构仍然存在,后续层仍可以利用这些差异。

如果没有可学习的缩放和偏移,归一化可能过度限制表示;有了这两个参数,模型可以在稳定数值范围的同时保留适合任务的特征幅度。理解 LayerNorm 时,应该把它看成“调整坐标尺度”,而不是“删除信息”。

编码器和解码器都需要这条稳定路径

编码器中的 Self-Attention 和 FFN 子层都使用残差与归一化。解码器还多一个交叉注意力子层,因此目标前缀经过掩码自注意力、读取源记忆和 FFN 后,也需要相似的稳定处理。不同子层的 Query、Key、Value 来源可以不同,但它们最终都要回到统一的隐藏表示空间。

这条路径让多层堆叠不至于每经过一个子层就完全改变数值尺度。底层表示经过注意力和 FFN 加工后传给上层,上层继续加工;残差保留原有信息,LayerNorm 整理当前尺度,两者共同支持深层传递。

Transformer 编码器和解码器子层通过残差与 LayerNorm 传递隐藏表示的结构图
编码器与解码器中的稳定路径

编码器和解码器的多个子层都沿着残差与 LayerNorm 路径传递统一宽度的隐藏表示。

Pre-LN 和 Post-LN 不能混为一谈

经典 Transformer 论文常见的表达是先完成子层计算和残差相加,再进行 LayerNorm,可以称为 Post-LN 形式。后来一些模型把 LayerNorm 放到子层之前,形成 Pre-LN 结构。两种结构都围绕残差和归一化组织,但计算顺序不同,训练行为也可能不同。

阅读资料或模型实现时,不能只看到“有 LayerNorm”就默认顺序完全相同。需要看清是 Norm(x+F(x)),还是 x+F(Norm(x))。对入门理解来说,先掌握 文中的经典顺序,再把其他变体当作结构差异来比较。

把 LayerNorm 记成三个检查点

第一,看它处理的是哪个位置的隐藏向量,通常沿 d_model 特征维整理;第二,看它位于残差相加之前还是之后;第三,看归一化后的输出是否回到统一的模型宽度,并继续传给下一子层。

这样阅读结构图时,就不会把 LayerNorm 误解成跨句子的平均操作,也不会把它和注意力的信息聚合混在一起。注意力负责让当前位置读取上下文,残差负责保留输入路径,LayerNorm 负责稳定当前位置的特征尺度,三者共同组成 Transformer 子层的基本传递方式。

常见问题

LayerNorm 会不会把一句话中不同词的位置混在一起?

通常不会。它主要在每个位置自己的 d_model 特征上计算统计量;不同位置之间的信息关系由 Self-Attention 或交叉注意力建立。

LayerNorm 会不会丢掉隐藏状态中的语义信息?

它主要调整数值尺度,并通过可学习的增益和偏置恢复适合模型的表达范围,不等于把向量内容压成同一个值。

为什么有些模型把 LayerNorm 放在子层前面?

这是 Pre-LN 结构,与经典 Transformer 常见的 Post-LN 顺序不同。两者都使用残差和归一化,但具体训练行为需要结合模型定义判断。