残差连接(Residual Connection / Skip Connection)和归一化(Normalization)的结合,是现代深度学习模型(尤其是深度神经网络和Transformer架构)成功的关键因素之一。
核心概念回顾
-
残差连接 (Residual Connection):
- 思想: 不是让网络层直接学习目标映射
H(x)
,而是让它们学习残差映射F(x) = H(x) - x
。然后,最终的输出是H(x) = F(x) + x
。 - 实现: 将某一层(或一组层)的输入
x
直接跳过这些层,加到这些层的输出F(x)
上。通常通过简单的加法(y = F(x, {W_i}) + x
)或连接(y = F(x, {W_i}) || x
)实现,加法更常见。 - 主要作用:
- 缓解梯度消失/爆炸: 在反向传播时,梯度可以通过残差路径(
+ x
部分)几乎无损地传递回浅层,使得深层网络能够被有效训练。 - 恒等映射: 如果最优的
F(x)
是零映射(即什么都不做是最好的),那么学习F(x) = 0
比学习H(x) = x
更容易(因为后者需要精确的恒等变换)。 - 促进信息流动: 允许原始输入信息更直接地传递到后面的层,减少信息在多层变换中的损失或扭曲。
- 简化优化: 优化残差映射
F(x)
通常比优化原始映射H(x)
更容易。
- 缓解梯度消失/爆炸: 在反向传播时,梯度可以通过残差路径(
- 思想: 不是让网络层直接学习目标映射
-
归一化 (Normalization):
- 思想: 对神经网络层内部的激活值或权重进行标准化处理,使其分布(如均值、方差)保持稳定。
- 常见类型:
- 批归一化 (Batch Normalization, BN): 对单个特征通道在一个小批量(Batch)的所有样本上进行归一化(减均值除标准差)。广泛应用于CNN。
- 层归一化 (Layer Normalization, LN): 对单个样本的所有特征通道(或一个子集)进行归一化。广泛应用于RNN、Transformer。
- 实例归一化 (Instance Normalization, IN): 对单个样本的单个特征通道进行归一化。常用于风格迁移。
- 组归一化 (Group Normalization, GN): 将通道分组,对单个样本的每个组进行归一化。是BN在小批量场景下的替代方案。
- 主要作用:
- 加速训练收敛: 通过稳定层输入的分布,减少内部协变量偏移(Internal Covariate Shift),使得网络可以使用更大的学习率。
- 缓解梯度问题: 有助于缓解梯度消失/爆炸问题。
- 轻微的正则化效果: BN在训练时使用小批量的统计量,引入了随机性,有轻微正则化效果。
残差连接与归一化的结合:协同效应
将残差连接和归一化结合使用,能产生强大的协同效应,解决深度模型训练中的关键挑战:
-
解决残差加法带来的分布偏移:
- 残差连接
y = F(x) + x
将两个不同来源(原始输入x
和变换后的输出F(x)
)的数据相加。F(x)
和x
的分布可能差异很大(尤其是F(x)
经过了权重矩阵和非线性激活)。 - 直接将它们相加可能导致
y
的分布发生剧烈变化(分布偏移),这不利于后续层的处理和学习。 - 归一化的作用: 在
y
输入到下一层之前(或之后,取决于具体结构),应用归一化层(如 BN 或 LN)可以将y
重新调整到期望的分布(例如,零均值、单位方差),稳定后续层的输入。这抵消了残差加法可能引入的分布不稳定性。
- 残差连接
-
稳定深层训练:
- 深度网络的核心问题是梯度在反向传播过程中会逐层衰减(消失)或急剧增大(爆炸)。
- 残差连接的作用: 提供了一条梯度可以几乎无损回传的“高速公路”。
- 归一化的作用: 通过稳定各层的输入分布,使得梯度计算更加稳定可靠,避免了因输入分布剧烈变化导致的梯度异常。
- 结合效果: 残差连接确保了梯度流的通畅,而归一化确保了梯度流经的路径是平滑稳定的。两者共同作用,使得训练非常深的网络(如数百层的 ResNet 或数十层的 Transformer)成为可能。
-
提升模型性能和收敛速度:
- 稳定的梯度流和输入分布使得优化器(如 SGD, Adam)能够更有效地工作。
- 模型能够更快地收敛到更好的解,通常也能获得更高的最终精度。
结合方式:常见模式
最常见的结合方式是在残差块(Residual Block)内部或周围放置归一化层。具体位置有多种设计,各有优缺点:
-
Pre-Normalization (Pre-Norm):
- 结构:
Norm -> Layer (Conv/Linear/Attention) -> Activation -> + Shortcut
- 流程: 输入
x
先经过归一化层(如 LN),然后进入主要的计算层(卷积、全连接、注意力等),再经过激活函数(如 ReLU, GELU),最后与原始输入x
(或经过投影的x
)相加。 - 优点: 梯度流更稳定,尤其对非常深的模型(如 Transformer)效果更好。训练通常更稳定。
- 缺点: 原始输入
x
没有经过归一化就直接参与加法,理论上加法后的分布可能不如 Post-Norm 稳定(但在实践中,Pre-Norm 的稳定性优势通常更显著)。 - 典型应用: Transformer 架构(如 GPT, BERT 的后续变种,T5)普遍采用 Pre-LN 结构。
- 结构:
-
Post-Normalization (Post-Norm):
- 结构:
Layer (Conv/Linear/Attention) -> Norm -> Activation -> + Shortcut
或Layer -> Activation -> Norm -> + Shortcut
- 流程: 输入
x
先经过主要的计算层和激活函数,然后进行归一化,最后再与原始输入x
(或经过投影的x
)相加。 - 优点: 加法操作
F(x) + x
的输出y
会立即被归一化,理论上能更直接地稳定输出分布。 - 缺点: 对于非常深的模型,梯度流经过多个 Post-Norm 层时可能会累积不稳定因素,导致训练困难(如梯度消失或爆炸)。
- 典型应用: 原始 ResNet 使用
Conv -> BN -> ReLU
结构(BN 在卷积后、激活前),加法后不再归一化(可视为一种 Post-Norm 变体)。原始 Transformer 论文使用的是 Post-LN(Add & Norm 在计算层之后)。
- 结构:
-
其他变体:
- 有些结构会在残差块内部使用多个归一化层。
- 有些结构(如原始的 ResNet)只在卷积层后使用 BN,残差加法后不再归一化(因为 BN 已经稳定了卷积层的输出,且 CNN 的深度相对 Transformer 较浅)。
实际应用例子
-
ResNet (图像识别 - CNN 代表):
- 结构: 核心是残差块。一个基本块包含:
- 卷积层 1 -> 批归一化 (BN) -> ReLU
- 卷积层 2 -> 批归一化 (BN)
- 残差连接:将块的输入
x
加到第二个 BN 的输出上 (F(x) + x
) - ReLU (在加法之后)
- 结合方式: 这是 Post-Normalization 的一种形式(BN 在卷积后,加法前)。BN 稳定了卷积层的输出
F(x)
,使得F(x) + x
的分布相对可控,然后最后的 ReLU 再进行非线性变换。BN 在这里至关重要,它使得 ResNet 能够训练超过 100 层,并在 ImageNet 等任务上取得突破性成果。
- 结构: 核心是残差块。一个基本块包含:
-
Transformer Encoder/Decoder Layer (NLP/CV - Transformer 代表):
- 结构 (以 Pre-LN 为例,如 BERT, GPT):
- 子层 1 (如 Multi-Head Self-Attention):
- 输入
x
- 层归一化 (LN) -> 多头注意力计算 -> Dropout
- 残差连接:
x + Dropout(Attention(LN(x)))
- 输入
- 子层 2 (如 Feed-Forward Network):
- 输入
y
(子层 1 的输出) - 层归一化 (LN) -> 全连接层 1 -> 激活 (如 GELU) -> Dropout -> 全连接层 2 -> Dropout
- 残差连接:
y + Dropout(FFN(LN(y)))
- 输入
- 子层 1 (如 Multi-Head Self-Attention):
- 结合方式: 这是典型的 Pre-Normalization (Pre-LN)。在每个子层(注意力或前馈网络)的核心计算之前进行层归一化 (LN)。LN 稳定了子层的输入,然后子层进行计算,最后通过残差连接与子层输入相加。这种 Pre-LN 结构被证明在训练非常深的 Transformer 模型(如大型语言模型)时比原始的 Post-LN 更稳定。
- 结构 (以 Pre-LN 为例,如 BERT, GPT):
-
Vision Transformer (ViT - CV):
- 结构: ViT 将 Transformer 架构应用于图像。其编码器层结构与上述 Transformer Encoder Layer 几乎完全相同。
- 结合方式: 同样采用类似 Pre-LN 或 Post-LN 的结构(现代实现多倾向 Pre-LN),在每个多头注意力层和前馈网络层前后使用层归一化 (LN) 和残差连接。这使得 ViT 能够有效处理图像块序列,并在大规模图像识别任务上取得优异性能。
-
BERT / GPT (NLP):
- 结构: BERT(编码器)和 GPT(解码器)的核心构建块就是 Transformer 层。
- 结合方式: 与上述 Transformer 例子一致。BERT/GPT 及其后续变种(RoBERTa, GPT-2, GPT-3 等)的成功,很大程度上依赖于残差连接和层归一化 (LN) 的结合,使得训练包含数亿甚至数千亿参数的数十层深度模型成为可能。
总结
残差连接解决了深度模型训练中的梯度流问题,使得训练极深网络成为可能。归一化(BN, LN 等)解决了网络内部激活值分布不稳定的问题,加速收敛并提升稳定性。两者的结合是协同的:
- 归一化补偿了残差连接中直接加法操作可能引起的输入分布偏移,为后续层提供了稳定的输入。
- 残差连接为归一化层提供了更通畅、更稳定的梯度回传路径。
- 这种组合极大地增强了深度模型的训练稳定性、收敛速度和最终性能,是现代深度学习架构(从 ResNet 到 Transformer 及其各种衍生模型)不可或缺的核心设计范式。选择 Pre-Norm 还是 Post-Norm 取决于具体架构和深度,Pre-Norm 在极深模型中通常表现出更好的稳定性。