ResNet 论文阅读(一):从 VGG 的加深困境到残差学习如何缓解退化问题 📅 2026/8/13 22:37:44 论文信息论文标题Deep Residual Learning for Image RecognitionCVPR 官方页面CVPR 2016 Open Access PagearXiv 摘要页Deep Residual Learning for Image Recognition官方 PDFCVPR 2016 PDFKaiming He、Xiangyu Zhang、Shaoqing Ren 与 Jian Sun 于2015-12-10提交了这篇论文的 arXiv 初版后发表于CVPR 2016。如果说 AlexNet 证明了深度卷积网络在大规模视觉任务上的可行性VGG 则进一步说明了“增加深度”本身具有显著收益那么 ResNet 的历史位置就在于它正面回答了另一个更难的问题当网络继续加深时为什么模型反而会更难训练以及这个问题应该如何解决。如果只用一句话概括 ResNet这篇论文真正完成的是下面这件事它不是简单地把网络做得更深而是通过残差学习重新组织了深层网络的优化方式使“更深”重新变成一件可训练、可扩展、可迁移的事情。这也是我理解 ResNet 时最值得抓住的主线。它的核心价值不在于“多了一条连接线”而在于作者把深层网络中的退化问题明确提了出来并给出了一种既简洁又有效的解决思路。一、从 VGG 的成功说起更深的网络为什么会成为下一步在 ResNet 之前VGG 已经通过相对统一的卷积架构验证了一个关键判断在大规模图像分类任务上增加网络深度通常能够带来性能提升。也正因为如此当时一个非常自然的研究方向就是继续沿着这条路线走下去把网络做得更深。但是VGG 的成功并不意味着“只要继续堆层数性能就一定继续上升”。从今天回看VGG 至少留下了两个尚未被最终解决的问题第一模型很深但训练和推理代价也很高第二更关键的是继续加深普通卷积网络时优化过程会变得越来越困难。因此ResNet 要回答的并不是“深度有没有用”而是更具体的问题如果更深的网络理论上表达能力更强为什么实际训练时效果反而会变差如果问题出在优化而不是表达能力那么网络结构应该如何改写才能让深层模型重新变得可训练这两个问题决定了整篇 ResNet 论文的叙述逻辑。读这篇论文时最重要的不是先背ResNet-50、ResNet-101这些名字而是先理解作者是在解决“深层网络为什么训不起来”这个核心问题。二、问题出现更深的 plain network 为什么反而更差ResNet 论文中反复强调的不是简单的过拟合而是一个更值得警惕的现象degradation problem也就是退化问题。这里要先区分两个概念overfitting训练误差很低但测试误差较高说明模型对训练集记得太死degradation网络加深之后连训练误差本身都变差了说明优化过程出现了困难。这两者不是一回事。对于过拟合通常的思路是加强正则化、增加数据增强或者控制模型容量但退化问题更像是在提醒我们网络虽然更深了却没有被成功优化到它本应达到的位置。论文先在CIFAR-10上给出了一个非常直观的现象展示。作者比较了20层和56层的 plain network结果如图所示图 1 展示了 ResNet 论文中关于退化问题的一个经典现象左图为训练误差右图为测试误差。图源He et al.,Deep Residual Learning for Image Recognition,CVPR 2016.从图中可以看到56层 plain network 不仅测试误差更高训练误差也始终明显高于20层 plain network。这一点很关键因为它说明问题并不是“更深的模型把训练集记得太死”而是“更深的普通网络在训练阶段就已经更难优化”。从直觉上看这件事似乎不应该发生。因为一个更深的网络理论上至少可以“模仿”浅层网络的效果。假设一个浅层网络已经学到了不错的表示那么更深的网络只需要让新增层学习成恒等映射理论上就不应比浅层网络更差。但论文中的实验并没有支持这种乐观判断。类似的现象在ImageNet上同样存在。作者比较了18层和34层的普通网络plain network结果显示plain-18的验证集top-1 error为27.94%plain-34的验证集top-1 error为28.54%也就是说更深的普通网络不仅没有更好反而更差了。更关键的是这种恶化并不只是出现在测试阶段训练误差本身也更高。这正是 ResNet 要解决的起点。三、ResNet 的核心改写不直接学 H(x)而是学残差 F(x)为了解决这个问题ResNet 没有直接在卷积层类型上做大改动而是换了一种组织函数映射的方式。在普通网络里若干层卷积希望直接学习一个目标映射H(x)这里x是输入H(x)是经过若干层之后想得到的输出。ResNet 的想法是与其直接逼近H(x)不如让这些层去学习输入和目标之间的差值F(x) H(x) - x于是目标映射就可以改写成H(x) F(x) x在实际网络里残差块的输出通常写成y F(x, W) x其典型结构如图所示图 2 展示了 ResNet 中典型残差块的结构左侧主分支学习残差映射右侧 identity shortcut 直接传递输入。图源He et al.,Deep Residual Learning for Image Recognition,CVPR 2016.在这张图里左侧两层带权重的变换负责学习残差映射F(x, W)右侧的identity shortcut则将输入x直接传到加法节点二者相加后得到F(x, W) x再送入后续非线性层。这里x是残差块输入F(x, W)是由卷积层和非线性层组成的残差分支x通过 shortcut connection 直接加到输出上y是残差块最终输出。这一步看起来只是在原来网络旁边加了一条 shortcut但它真正改变的是问题的表达方式网络不再被要求从零构造一个完整映射而是只需要在已有表示的基础上学习一个修正量。这个改写的意义非常大。因为在很多中间层里理想映射往往离恒等映射并不远。换句话说后面的层不一定需要“推翻前一层重做一遍”很多时候只需要在原有表示上做一点增强、修正或筛选。如果某一段网络最理想的行为刚好就是把输入原样保留下来那么在普通网络中它需要自己学出一个完整的恒等映射而在残差形式下只需要让F(x) 0这显然更容易优化。从残差块到 ResNet-34上面介绍的是 ResNet 的基本残差块。完整的 ResNet 网络就是将这样的残差块按照不同特征图尺寸和通道数分阶段堆叠起来。以ResNet-34为例网络前面先经过一个7x7卷积和池化层随后进入conv2_x、conv3_x、conv4_x、conv5_x四个阶段。每个阶段内部由多个残差块组成阶段之间通过步长为2的卷积完成下采样使特征图尺寸减小、通道数增加。图 3 展示了 ResNet-34 的整体结构。可以看到ResNet 的核心并不是某一个孤立的 shortcut而是将残差块系统地堆叠到不同深度阶段中。这张图不需要在本文中展开到每一层参数。对于这篇文章来说我们只需要抓住一点ResNet 的完整网络结构本质上是由许多F(x) x形式的残差块堆叠而成。真正需要深入理解的仍然是残差块为什么能缓解退化问题。补充basic block 与 bottleneck block如果继续阅读 ResNet 的结构表还会看到两种不同形式的残差块basic block和bottleneck block。图 4 展示了 ResNet 中两种常见残差块。左侧是 basic block主要用于 ResNet-18 和 ResNet-34右侧是 bottleneck block主要用于 ResNet-50、ResNet-101 和 ResNet-152。左侧的basic block比较直接由两个3x3卷积组成主分支学习到的结果再与 shortcut 传来的输入相加。前面讲到的ResNet-34使用的就是这种基本残差块。右侧的bottleneck block则采用1x1 - 3x3 - 1x1的结构。这里的1x1卷积并不是为了观察空间邻域而是为了调整通道数。第一个1x1卷积通常用于降维比如将256个通道压缩到64个通道中间的3x3卷积在较低通道数上提取空间特征最后一个1x1卷积再升维把通道数恢复或扩展回去。为什么1x1卷积可以升维和降维因为它虽然在空间上只看当前位置但会同时作用于这个位置上的所有通道。假设输入是H x W x 256如果使用64个1x1卷积核输出就会变成H x W x 64这就是降维。反过来如果使用256个1x1卷积核输出就会变成H x W x 256这就是升维。也就是说1x1卷积本质上是在每一个空间位置上对通道维度做重新组合。这样设计的好处是降低计算量。如果直接在256个通道上做3x3卷积开销会很大而 bottleneck block 先用1x1卷积把通道数压缩到64再做3x3卷积最后再升维回来就可以在保持表达能力的同时显著减少计算成本。不过对于本文来说basic block 和 bottleneck block 的差异不是主线。它们共同的核心仍然是主分支学习残差映射F(x)shortcut 分支保留输入x最终得到F(x) x。四、数学视角为什么残差学习更容易优化这一节是理解 ResNet 的关键。结合上面的残差块结构图可以看到一个残差块并不只有一条变换路径而是由残差分支和恒等捷径两部分组成。这里我不用难读的分式写法而是直接用最直观的形式来说明它为什么更容易训练。1. 前向传播从“完整重建”变成“增量修正”普通网络的一层可以抽象为y F(x)而 ResNet 的残差块写成y F(x) x这意味着输出由两部分组成一部分是当前层学到的变换F(x)另一部分是输入x本身。从表示学习的角度看这就像是在说新表示 旧表示 一点修正如果目标结果和输入已经很接近那么网络只需要学会一个较小的修正量而不必重新生成整份表示。也正因为如此残差学习本质上是一种更容易优化的重参数化方式。2. 反向传播梯度为什么会多一条“直达通路”假设损失函数是L我们关心的是损失对输入x的梯度也就是后面的误差信号要怎样传回前面。对于普通网络y F(x)梯度回传写成dL/dx dL/dy * dF(x)/dx它的含义很直接前一层能收到多少梯度完全依赖于F(x)这条路径的变化率。如果网络很深这类变化率会在很多层里连续相乘。这里可以举一个很直观的数值例子。假设每经过一层梯度都会乘上同一个系数。如果这个系数小于1比如每层都乘上0.5那么经过4层以后梯度会变成1 - 0.5 - 0.25 - 0.125 - 0.0625也就是说误差信号在一层层回传的过程中会越来越弱这就是典型的梯度消失现象。反过来如果这个系数大于1比如每层都乘上2那么经过4层以后梯度会变成1 - 2 - 4 - 8 - 16这时梯度会在回传过程中快速放大容易导致训练不稳定这就是梯度爆炸。因此在普通深层网络中梯度完全依赖这一连串变化率的乘积一旦这些系数整体偏小或偏大前面层接收到的更新信号就可能出现明显失真。而在 ResNet 中y F(x) x由于输出是两部分相加所以这一层对输入的变化率可以写成dy/dx dF(x)/dx 1于是梯度回传变成dL/dx dL/dy * (dF(x)/dx 1)展开以后就是dL/dx dL/dy * dF(x)/dx dL/dy这行公式非常重要因为它清楚地告诉我们ResNet 中传回输入x的梯度分成了两部分。第一部分dL/dy * dF(x)/dx表示梯度经过残差分支F(x)回传。第二部分dL/dy表示梯度可以不穿过复杂变换直接通过图中右侧的identity shortcut回传到前面。这就是 ResNet 反向传播更稳的根本原因。普通网络里梯度只有一条路ResNet 里梯度除了经过残差分支还多了一条恒等映射的直达通路。即使残差分支在某一阶段还没有学好梯度也不至于完全被困在层层复杂变换之中。如果想写得再严谨一点可以补上一句严格来说当x是向量或特征图时上面公式中的1应理解为恒等映射。但对理解 ResNet 的基本思想来说把它看成“多出来的一条直接回传路径”已经足够。3. 为什么这能缓解退化问题把前向传播和反向传播放在一起看残差连接实际上同时带来了两层收益。第一层收益发生在前向阶段网络不必从零学习完整映射如果最优结果接近输入本身只需让F(x)接近0这使更深网络更容易退回到“至少不比浅层差”的状态。第二层收益发生在反向阶段梯度不再只能穿过复杂的残差分支shortcut 为误差信号提供了更直接的回传路径深层网络的优化过程因此更稳定。因此更准确的表述不是“ResNet 单纯解决了梯度消失”而是ResNet 通过残差重参数化和恒等捷径连接改善了深层网络的优化条件从而缓解了随着网络深度增加而出现的退化问题。五、论文实验说明了什么ResNet 确实把更深网络重新变成了优势ResNet 这篇论文最有说服力的地方在于作者没有只给出一个漂亮的新结构而是用清楚的对照实验证明了它为什么有效。1. 它先证明退化问题真实存在前面提到plain-34的top-1 error为28.54%反而差于plain-18的27.94%。这组结果非常关键因为它说明“更深不一定更好”并不是抽象担忧而是可以在标准基准上直接观测到的现实问题。2. 它再证明残差连接能让更深网络重新受益在加入残差连接后结果发生了明显变化ResNet-18的验证集top-1 error为27.88%ResNet-34的验证集top-1 error降到25.03%也就是说在普通网络里加深会带来退化而在残差框架下加深重新变成了一件有收益的事情。这正是论文最核心的实验结论。3. 它证明这种思路可以扩展到极深网络论文进一步给出了ResNet-50、ResNet-101与ResNet-152的结果。以单模型为例ResNet-152在 ImageNet 验证集上做到4.49%的top-5 error说明残差学习并不是只对 30 多层有效而是真的把超深网络带进了可训练区间。更进一步作者使用集成模型在ILSVRC 2015测试集上将top-5 error做到3.57%最终获得分类任务第一名。4. 它还证明 ResNet 不只是分类网络ResNet 的影响力之所以这么大还因为它很快成为通用视觉骨干网络。论文中将 Faster R-CNN 的 backbone 从VGG-16换成ResNet-101后COCO 基准上的mAP[.5,.95]从21.2提升到27.2。这说明 ResNet 的价值不仅在于分类分数高更在于它提供了一种可迁移的深层特征提取框架。六、这篇论文真正贡献了什么今天回看 ResNet它最重要的贡献至少有三层。1. 它明确指出了“更深网络更难优化”这个问题在 VGG 之后很多人已经相信深度有用但 ResNet 更进一步把“深度继续增加时为何反而训练变差”这个问题正式摆上台面。它让研究者意识到深层网络的关键不只是表达能力还包括优化方式。2. 它用非常简洁的结构改写解决了一个大问题ResNet 的美感就在这里它并没有用过于复杂的机制来处理退化问题而是用H(x) F(x) x这样一个极其简洁的重写把深层网络从“完整映射学习”转成了“恒等映射 残差修正”。很多重要方法的经典之处恰恰就在于这种简洁性。3. 它改变了后续视觉模型的主流设计方式从分类、检测到分割再到后来的大量 backbone 设计残差连接几乎成为深层视觉网络的基础组件。也就是说ResNet 的意义不只是在2015到2016那个时间点拿到了好成绩更在于它重新定义了“深层网络应该怎样被构建和优化”。七、小结如何用一句更准确的话理解 ResNet如果把这篇论文压缩成一个最核心的理解我会这样表述ResNet 并不是简单地“在网络里加了一条 shortcut”而是通过残差学习把深层网络的目标映射重写为“输入本身 修正量”并在反向传播时为梯度提供了更直接的回传通路。正因为如此它缓解了普通深层网络中的退化问题让“把网络做得更深”重新成为一条可行且有效的路线。这一篇先把 ResNet 的问题背景、方法思想和数学原理讲清楚。下一篇如果继续展开更适合换一种通俗的视角用传话游戏之类的类比把“为什么学习修正量比重写全文更容易”讲得更直观。参考文献He, K., Zhang, X., Ren, S., Sun, J. (2015).Deep Residual Learning for Image Recognition. arXiv:1512.03385.