残差连接与LayerNorm-深层网络稳定训练的秘密
> **[进阶选读]** 本文适合想深入理解 LLM 内部机制的读者。了解深层网络如何保持稳定训练的底层机制。路径 A 的读者可以跳过。
残差连接与 LayerNorm:深层网络稳定训练的秘密
[进阶选读] 本文适合想深入理解 LLM 内部机制的读者。了解深层网络如何保持稳定训练的底层机制。路径 A 的读者可以跳过。
[进阶选读] 本篇讲解 Transformer 内部稳定训练的工程机制,属于模型架构细节。如果你的目标是应用开发(路径 A),可以跳过本篇,不影响后续学习。
GPT-4 拥有据传超过 100 层的 Transformer 层叠。DeepSeek V3 有 61 层。就连"小模型" LLaMA-7B 也有 32 层。
为什么可以叠这么多层?叠深了不会把信号搞乱吗?
背后有两个看起来简单、却极为关键的设计:残差连接(Residual Connection)和 层归一化(Layer Normalization,LayerNorm)。
1.1 问题根源:深层网络为什么难训练
1.1.1 深层的必要性与其代价
为什么需要深层网络?每一层 Transformer 都在对 token 表示做一次精炼——浅层捕捉表面语法特征,深层提炼抽象语义。LLM 之所以能理解复杂的语言和逻辑关系,依赖于这种多层次的信息提炼。没有足够的深度,模型无法学到高级的语言理解能力。
图 6.18:有无残差连接的梯度流对比——残差跳跃连接为深层网络建立梯度高速公路
但深度带来了一个数学上的根本问题:梯度消失。
1.1.2 梯度消失与梯度爆炸
神经网络的训练靠反向传播(Backpropagation,从输出层向输入层逐层计算梯度、更新参数的过程)——通过计算损失对每个参数的梯度,来决定参数如何调整。
梯度从输出层往输入层逐层传递。每经过一层,梯度值要乘以该层的参数矩阵(以及激活函数的导数)。如果每层的梯度系数略小于 1,经过 50 层之后,梯度就变成一个极小的数,接近于零——梯度消失,靠近输入的层完全得不到更新信号,学不到东西。
反之,如果每层的梯度系数略大于 1,经过 50 层,梯度就变成一个天文数字——梯度爆炸,参数更新剧烈,训练直接崩溃。
类比接力赛传话:一条消息从最后一个人往第一个人传,每次传递都有一点失真。20 个人之后,第一个人收到的消息已经面目全非,甚至完全空白。
这个问题在 2015 年之前极大地限制了网络深度——超过 20 层的网络几乎无法有效训练。
1.1.3 数值不稳定问题
更深的层数还带来另一个问题:随着前向传播的进行,各层的激活值(Activation,神经元经过激活函数后的输出值)量级可能差异悬殊。有的层输出值在 0.001 数量级,有的层输出值在 1000 数量级,这种不一致会导致训练极不稳定。
1.2 解决方案一:残差连接
1.2.1 核心思想
残差连接(Residual Connection)由 He Kaiming 等人在 2015 年的 ResNet 论文中提出,后来被 Transformer 全面采用。
核心思路只有一行公式:
非程序员可跳过代码,重点看文字说明
输出 = 输入 + F(输入)
其中 F(输入) 是某一层的变换操作(比如一个注意力模块,或者一个前馈网络)。
不用残差连接时,一层的输出完全依赖变换结果。用了残差连接后,输出 = 变换结果 + 原始输入。原始输入通过一条"捷径"(Shortcut)绕过变换,直接加到输出里。
1.2.2 直觉类比:在原有基础上微调
想象学一门新技能:
- 没有残差连接的学习:每次都从空白开始重新学,上一层学到的内容在传到下一层时可能完全被覆盖。
- 有残差连接的学习:每一层只学"在现有基础上需要补充什么",积累式地增强,不破坏已有能力。
更形象地说,残差连接是一条"加法高速公路":信息流有两条路,一条经过复杂变换,一条直接"高速通行"不做任何处理,最后两路相加。
1.2.3 为什么能解决梯度消失
反向传播时,梯度经过加法节点的规则是:两条路径的梯度直接相加。
即使变换路径 F 的梯度消失为零,"高速公路"那条路径的梯度是 1(梯度原样传回),整体梯度不会消失。
非程序员可跳过代码,重点看文字说明
# 反向传播时,对输入的梯度:
d_output / d_input = d_F(input) / d_input + 1
# ↑
# 这个 "+1" 确保梯度永远不会消失为零
有了这个 "+1",即使网络有 100 层,梯度也能从最后一层顺畅地流回第一层,每一层都能收到足够的更新信号。
1.3 解决方案二:层归一化(LayerNorm)
1.3.1 BatchNorm 在 LLM 中为什么不适用
在图像处理领域,Batch Normalization 是标准配置。为什么 LLM 不用 BatchNorm,而要发明 LayerNorm?
BatchNorm 的工作方式:在一个批次中,对同一个特征维度上的所有样本做归一化。这要求批次中的所有样本是可比较的,且批次足够大(否则统计量不准确)。
LLM 有两个特性使 BatchNorm 无法工作:第一,文本序列长度不同,不同样本在对应位置上的激活值并不"可比";第二,在推理(生成)阶段,通常一次只处理一个序列(batch size = 1),BatchNorm 在批次大小为 1 时完全失效。
LayerNorm 的工作方式:对每个样本独立地在特征维度上做归一化,与批次大小无关,与序列长度无关,完美适配 LLM 的特性。
1.3.2 为什么需要归一化
即使有了残差连接,深层网络中还存在数值量级不一致的问题。想象经过 32 层的残差叠加,每层都往输入上"加了一点东西",累积下来,第 32 层的激活值可能比第 1 层大几十倍。这种量级漂移会让后续层的计算严重不稳定。
归一化(Normalization)的作用就是把每一层的输出"拉回"到一个合理的数值范围,消除量级漂移。
1.3.3 Layer Norm vs Batch Norm
归一化有多种方式,最重要的区分是沿哪个维度归一化。
批归一化(Batch Normalization,BatchNorm):对每个特征维度,在一个批次(Batch)内的所有样本上做归一化。
层归一化(Layer Normalization,LayerNorm):对每个样本,在该样本的所有特征维度上做归一化。
类比:
- BatchNorm:比较班里同学的某门课成绩,按科目算班级平均分,每个学生的该科成绩都减去班级平均分。
- LayerNorm:比较一个学生所有科目的成绩,按个人算个人的平均分,该学生每科成绩都减去自己的总平均。
LLM 为什么选择 LayerNorm 而非 BatchNorm
| 问题 | BatchNorm 的困难 | LayerNorm 的表现 |
|---|---|---|
| 变长序列 | 每个样本长度不同,跨样本归一化难以实现 | 在每个 Token 的特征维度内归一化,长度无关 |
| 批次大小 | 小批次时统计量不准确,效果差 | 和批次大小无关,单条样本也能工作 |
| 自回归推理 | 推理时批次为 1,BatchNorm 完全失效 | 推理时正常工作 |
| 分布式训练 | 多卡时需要同步统计量,通信开销大 | 每个样本独立,无需跨设备通信 |
结论:LLM 的自回归特性(逐 Token 生成)、变长序列、超大规模分布式训练,让 LayerNorm 成为唯一合理的选择。
1.3.4 Pre-LN vs Post-LN
LayerNorm 在 Transformer 层里放在哪个位置?历史上有两种方案:
Post-LN(原始 Transformer 论文的方案):
输出 = LayerNorm(输入 + F(输入))
先做残差加法,再做 LayerNorm。
Pre-LN(GPT-2 以后的主流方案):
输出 = 输入 + F(LayerNorm(输入))
先对输入做 LayerNorm,再送进变换函数,最后做残差加法。
Pre-LN 的关键优势:训练更稳定,不容易出现梯度爆炸。
原因:Post-LN 中,训练初期各层参数随机,F(输入) 的值可能很大,残差加法后量级可能突然变大,LayerNorm 来不及"救场"。Pre-LN 先归一化再变换,每一层的输入量级都是受控的,整个训练过程平稳得多。
代价是 Pre-LN 在层数较浅时效果略低于 Post-LN(有一点表达能力的损失),但在大模型(数十层以上)场景下,稳定性远比那一点点效果更重要。
这就是为什么 GPT 系列、LLaMA、Qwen、DeepSeek 全部采用 Pre-LN。
1.4 两者在 Transformer 层中的位置
一个标准的 Transformer 层由两个子层组成:自注意力(Self-Attention)和前馈网络(FFN,Feed-Forward Network)。残差连接和 LayerNorm 围绕这两个子层各出现一次。
完整的数据流(Pre-LN 方案):
- 输入
x进入 LayerNorm,得到归一化后的表示 - 归一化表示进入自注意力模块,产生注意力输出
- 注意力输出与原始输入
x相加(第一个残差连接) - 相加结果再次进入 LayerNorm,得到新的归一化表示
- 归一化表示进入前馈网络,产生 FFN 输出
- FFN 输出与步骤 3 的结果相加(第二个残差连接)
- 得到这一层的最终输出,传入下一层
每一层都是这个结构,堆叠 32 层、61 层乃至更多层,就构成了完整的 LLM。
1.5 完整对比表格
| 维度 | 无残差连接 | 有残差连接 |
|---|---|---|
| 梯度流动 | 经过每层乘法,可能消失为零 | 加法高速公路保证梯度至少为 1 |
| 可训练深度 | 实践中难以超过 20 层 | 轻松支持 100+ 层 |
| 层的学习目标 | 从零学完整变换 | 只需学"修正量"(残差) |
| 初始化行为 | 随机初始化影响大 | 初始时 F≈0,等于恒等映射,训练稳定启动 |
| 维度 | BatchNorm | LayerNorm |
|---|---|---|
| 归一化维度 | 跨样本,每个特征 | 跨特征,每个样本 |
| 变长序列 | 困难 | 天然支持 |
| 小批次/批次为 1 | 效果差/失效 | 正常工作 |
| 推理阶段 | 需要存储训练期统计量 | 即时计算,无需存储 |
| LLM 适用性 | 不适用 | 标准选择 |
1.6 对开发者的实际意义
为什么这些机制让 LLM 可以做到 96 层
没有残差连接和 LayerNorm,把 Transformer 叠到 10 层以上,训练就会因为梯度问题彻底崩溃。现代大模型动辄 32-96 层,完全依赖这两个机制作为基础保障。
微调时的注意事项
做 LoRA(Low-Rank Adaptation,低秩适应,一种只训练少量参数就能微调大模型的高效方法)等参数高效微调时,理解残差结构有助于选择注入位置。LoRA 通常注入在注意力层的投影矩阵上,其效果等价于在残差分支 F 上叠加一个低秩修正——和残差连接的哲学完全一致:在原有基础上微调,不破坏已学到的能力。
观察训练稳定性
训练大模型时,监控各层激活值的统计量(均值、方差)是常规操作。如果某层的激活值突然膨胀或崩溃,是 LayerNorm 出现问题的信号,往往意味着学习率过大或数据异常。
选择模型时
市面上所有主流 LLM(GPT、LLaMA、Qwen、DeepSeek、Claude)都采用 Pre-LN + 残差连接。这个设计已经是不需要考虑的行业标准,差异主要体现在层数、隐藏层维度等超参数上。
1.7 小结
两个机制分工明确:
- 残差连接通过加法高速公路,保证梯度在数十乃至上百层间自由流动,让深层训练成为可能
- LayerNorm 在每一层入口处控制激活值量级,消除数值漂移,保障训练全程的数值稳定性
- Pre-LN 方案(先 LayerNorm 再变换)是当前大模型的标准,比原始 Post-LN 更稳定
- 两者共同构成 Transformer 每一层的"脚手架",让堆叠数十层成为日常操作
下一篇将介绍 MoE(混合专家架构)——DeepSeek 用来在保持高性能的同时大幅降低计算成本的核心技术。