残差连接与 ResNet

介绍残差连接的两种解释、残差块结构与 ResNet 的整体设计。

知识课 · 约 30 分钟 · 更新于 2026-06-08

即使加了 BN,深度依然有上限

上节课的 BatchNorm 显著改善了"中间层分布的稳定性"—— 让 30 层的网络可以稳定训练、收敛速度加快。 那么有了 BN,是不是把网络加到 100 层就万事大吉了?

实验给出的答案是 "还不行" : 即便加入 BN、合理初始化、合适的激活函数, 把网络从 30 层加深到 100 层, 训练效果依然下降 。 深层网络训练的瓶颈尚未被完全解决—— 我们还需要一个更 结构性 的方法。

这就是 2015 年 He 等人提出的 残差连接(Residual Connection) , 以及构建在其上的 ResNet 。 残差连接思路简单到一行公式, 却让 100 层以上的网络第一次真正训得动; 而且这一结构一直延续到了今天的 Transformer 与大模型。

两种理解残差连接的视角

残差连接的核心操作非常简单—— 在两层网络的 主路径 外加一条 恒等旁路 :

其中 是主路径学到的" 残差 "—— 网络要拟合的不再是从 到 的 整个映射 , 而是 "y 相对于 x 的偏差" 。 名字"残差"也来自这里。

这个看似简单的修改,可以从两个完全不同的角度去理解:

角度 1:梯度视角

恒等旁路给梯度留了一条" 直通路径 "。 对单个残差块的 求 x 的偏导:

关键在那个 "+1" :反向传播时,梯度从深层往浅层传, 总有一条 不经过任何卷积权重的"直通路径" 。

堆叠多个残差块时,梯度严格来说 仍是各块局部偏导的连乘 ; 但残差结构让展开式里多出一项 纯加性的直通贡献 —— 这一项不随深度衰减,原本" 连乘式衰减 "的问题就被这条加性路径绕开了。

(注:极深网络仍需配合 BN 与合理初始化,残差连接并非万能。)

角度 2:函数空间视角

换个角度看一个看似显然的问题:" 网络加深,效果是不是一定不会变差? "

引入 "函数类" :一个固定结构(如 18 层)取遍所有权重,能表达的全部函数构成集合 ,更深的 30 层对应 。 设最优函数为 ,它一般不在集合里,我们只能取集合中 离 最近的 那个,作为该结构能达到的最好结果。

直觉以为"层数越多越好",但参数更多 并不意味着 : 要复现 18 层的行为,多出的层得学成 恒等映射 ,而普通卷积层很难做到。 于是两个集合 互不包含 ( 左图 ),加深时最优解到 的距离 可能不降反升 ——这就是实践中的 退化(degradation) 。

只要函数类 层层嵌套 ( , 右图 ), 大集合包含小集合,最优解 只会更近、不会更远 ,加深才稳妥。 残差块 恰好保证这点:主路径权重压到 0 时整块退化成 ,深网络随时能"关掉"多余的块、退回浅网络,嵌套自动成立。 网络于是只需学" 相比恒等还要怎样改 ",而不必从零拟合整个映射。

椭圆 = 某深度网络能表达的 函数集合 ,星号 f* 为最优函数。 悬浮任一椭圆 ,可看到它 离 f* 最近的解 到 f* 的连线: 左图(非嵌套)这段距离时近时远,右图(嵌套)则只减不增。

残差块的结构

最经典的残差块(ResNet 论文中的"basic block")结构如下:

  • 主路径 : 3×3 Conv → BN → ReLU → 3×3 Conv → BN
  • 旁路 :直接把输入 x 加到 主路径的输出上
  • 两路相加后 再过一次 ReLU

结构参考 He et al., 2015, Deep Residual Learning for Image Recognition 。

配套工具:1×1 卷积

旁路用来对齐形状的这个工具,就是 1×1 卷积 ——卷积核大小为 1×1 的卷积层。 它 并不是新东西 :在 「经典 CNN 演进」 一课里,它已作为名字出现过(GoogLeNet / Inception 引入)。

1×1 卷积的每个输出像素 仅依赖输入同位置的一个像素 , 但在 通道维上做线性组合 :

换种说法:1×1 卷积 等价于在每个像素位置上做一次全连接层 —— 相当于" 通道维度上的线性层 "。它能 改变特征图的形状 ,方式恰好有两种:

用 1×1 卷积对齐主旁路

改变通道数、改变分辨率,正好对应残差旁路可能遇到的两类不匹配。 于是当主路径改变了通道数或分辨率(例如 stride=2 )、主旁路形状对不上时, 就在旁路插入一个 1×1 卷积 ,把 对齐到 的形状:

  • 旁路 1×1 卷积的 stride 与主路径保持一致 —— 主路径用 stride=2,旁路也用 stride=2, 使两路输出可以逐元素相加;
  • 这样的 1×1 卷积在 每个 2×2 邻域里只保留左上角 1 个像素 , 确实丢掉了一部分空间位置信息;但旁路只负责 形状对齐与原始信号传递 , 丢掉一些空间位置 对最终精度影响很小 ,真正做特征提取的是主路径。

实战:实现一个残差块

我们用 PyTorch 实现一个通用的残差块 Residual , 支持上述两种情况:

  • 构造参数: in_channels / out_channels / use_1x1conv / stride ;
  • use_1x1conv=True 时在旁路上挂一个 1×1 卷积,否则旁路就是 identity;
  • stride 同时作用于主路径首个 3×3 卷积和旁路 1×1 卷积,保证两路下采样一致。

ResNet 的整体结构与"块结构"思想的延续

把若干残差块按"通道翻倍 + 分辨率减半"的节奏堆叠起来,再前接 7×7 大卷积 + 池化、后接全局平均池化 + 全连接, 就得到了 ResNet 的整体结构。 ResNet 的不同变体(18 / 34 / 50 / 101 / 152 层)的主要差别在 每个 stage 内残差块的数量 , 以及 块的内部结构 ——较浅的版本(18 / 34)使用上面讲的 basic block , 较深的版本(50 / 101 / 152)改用更省参数的 bottleneck block (见下表标注)。

本节不要求复现完整 ResNet —— 上面的结构表只是为了让你 看清"块堆叠"的节奏 。 关键观察是:

  • VGG 块为纯前向卷积块;残差块在前向卷积之外引入了旁路恒等连接 。 块的 内部 结构不同, 但" 以同构块堆叠构建网络 "的 外层思想 与 VGG 一致;
  • 通过残差连接, 网络深度可达 100 层以上仍可训练 ;
  • ResNet-50 / ResNet-101 至今仍是 常用的视觉模型 backbone , 各种下游任务(检测、分割、跨模态)经常拿来作为预训练特征提取器。

后两栏的层结构 完全相同 ,唯一区别是 ResNet 在每个块上多了一条旁路(弧线)—— 这正对应「 残差块 = 普通块 + 旁路 」。三者都遵循同一个外层思想: 把同构的块按「 通道翻倍、分辨率减半 」的节奏堆叠。

结构参考 He et al., 2015, Deep Residual Learning for Image Recognition (图 3)。

整章总结:CNN 知识与深层网络训练工具

12 节课走下来,本章给了你两套相辅相成的工具: 一套是 CNN 这种针对图像的结构 , 一套是让深层网络真正可训练的训练技巧 。

  • 卷积层 :可学习的局部特征提取器,参数共享;
  • 池化层 :降采样 + 有限平移鲁棒性;
  • 全连接层 :把特征图映射到分类输出。
  • 混淆矩阵
  • 精确率 / 召回率 / F1
  • 多分类下的 macro / micro 平均
  • 合适的激活函数 (ReLU 系列)
  • 合理参数初始化 (Xavier / He)
  • BatchNorm :稳定中间层分布
  • 残差连接 :让梯度直接跳过若干层

本章结束,下一章开始

本章学到的 残差连接 不仅在 CNN 中重要—— 它是 Transformer 中的常见结构 。 Transformer 的每一个子层(multi-head attention 与 feed-forward network)后面, 都接着一组 残差连接 + LayerNorm :

换句话说:" 残差 + 规范化 "这个组合,从 CNN 章节出发, 会一路陪你走到 Transformer 与大模型——它已经成了所有深层网络的"标配胶水"。