← 阅读室全部精读正在排版公式与图表…
PAPER ANALYZER · P25 · 共同基础

ResNet:让网络学习修正量,为什么深层训练会更容易

学术型精读 · 概念、公式、实验、源码与可验收练习

He、Zhang、Ren、Sun · CVPR 2016 · 论文 · 官方代码 a7026cb6d478

一句话总结

ResNet 用恒等捷径把输入直接加回残差分支,让深层网络学习对现有表示的修正。关键不是简单“防止梯度消失”,而是理解退化问题、维度匹配、优化证据及过拟合边界。

退化问题与过拟合不是同一个问题

论文从一个反直觉现象出发:更深的普通网络不仅测试误差更高,训练误差也可能更高。若只是过拟合,通常表现为训练拟合很好而测试变差;这里连训练集都没拟合好,说明优化变得更困难。Figure 1 展示这一现象,是理解论文动机最重要的证据。

理论上可以在浅网络后添加若干恒等层,让深网络至少表示同一个函数。但普通卷积层需要自己学出恒等映射,而优化器未必容易找到。作者改变参数化方式,让一条捷径直接传递输入,卷积分支只学习需要修正的部分。如果没有必要改变输入,残差分支接近零就能近似保留原表示。

这不等于严格证明任何深度网络都会更容易优化,也不等于增加层数必然提升泛化。它提供了一种有效架构,并通过受控训练曲线与识别实验支持。把动机、构造和实验分开理解,能避免把“捷径保证存在”误说成“优化一定找到全局最优”。

残差块究竟计算什么

Figure 2 中输入沿两条路径前进:一条经过若干卷积与非线性变换,另一条直接传递,然后逐元素相加。分支输出称为残差,是针对输入表示的修正量,并不是分类误差,也不是训练损失。相加要求两条路径的形状兼容,不能把任意两个张量直接加起来。

原始基本块包含两层三乘三卷积;卷积后配合批归一化与激活,末端相加后再经过 ReLU。这里讨论的是原始残差网络,不能将后来常见的预激活版本混入。相加后的 ReLU 会截断部分负值,所以不能不加条件地说整个块永远是精确恒等映射。

当空间分辨率与通道数保持一致,捷径可以不含可学习参数。下采样或增加通道时,需要解决形状变化:论文比较了零填充捷径和投影捷径。投影通常用一乘一卷积改变通道,并可通过步长改变空间尺寸;它引入额外参数,因此与纯恒等捷径并不完全相同。

初学者常问为什么不是把两条路径拼接。拼接会扩大通道数,要求后续层适应新的维度;逐元素相加则把残差解释为对同一坐标表示的修正。两者都能构成网络,但计算含义、参数规模和信息组织不同,不能把所有跳跃连接统称为原论文的残差学习。

为什么深层模型使用瓶颈块

Figure 5 展示瓶颈设计:先用一乘一卷积减少通道,再用三乘三卷积处理空间关系,最后一乘一卷积恢复通道。计算成本较高的空间卷积在较窄通道上执行,因此可以在可控预算内增加深度。一乘一卷积不是无用操作,它在每个位置混合通道并改变表示维数。

基本块与瓶颈块的层数不能按同一种块数直接比较。十八层、三十四层采用基本块,五十层及更深版本使用瓶颈块。论文中的“层数”有明确计数约定,并非把所有归一化、激活和池化操作都算作一层。复现时应记录具体 stage 的块数,而不是仅写一个模糊的深度名称。

全局平均池化把最后的空间特征压缩成每个通道一个数,再连接分类层。它减少了大规模全连接层的参数,但也丢失精确空间位置。对于细粒度表情,眼周、嘴角等局部关系可能重要,所以把最后池化向量作为唯一特征是一种基线选择,不是论文证明的最佳情绪表示。

梯度解释需要保留条件

如果暂时忽略末端非线性,一个块的导数包含恒等项加残差分支的导数。恒等项提供直接的信息与梯度路径,这是直观解释。但真实网络还有激活、归一化、尺度变化与多个块,不能从一个局部公式推出梯度永远不会消失或爆炸。

作者在讨论中指出,配合归一化后,普通深层网络的梯度已经并非简单失控,仍然会出现退化。因此“ResNet 只为解决梯度消失”过于狭窄。更准确的说法是残差参数化改善了深层优化,并让网络较容易保留已有表示,在实验中缓解了训练误差随深度增加而上升的现象。

批归一化使用批内统计与可学习仿射参数,训练和推理的行为不同。小批量训练、域分布变化以及冻结骨干时是否更新统计,都可能影响结果。做跨场景情绪实验时,仅冻结卷积权重而继续改变归一化统计,也会改变特征提取器,必须作为明确设置记录。

论文数据怎样支持结构设计

Table 2 对比十八层与三十四层普通网络和残差网络。在对应设置下,普通三十四层比普通十八层更差,而残差三十四层明显改善。这种同一系列的受控比较比只引用最深模型的最佳测试结果更能支持残差结构的动机。

Table 3 比较不同捷径方案及更深模型。不同方案的差异并非都很大,因此不能把投影捷径的存在当作全部收益来源。Table 4 的单模型多尺度测试结果与 Table 5 的集成测试结果又是不同协议;著名的 3.57 顶五错误率属于集成,不能写成一个标准 ResNet-18 的识别错误率。

Table 6 的 CIFAR-10 实验提供重要反例:一千二百零二层网络没有优于一百一十层。作者把其表现与过拟合联系起来,因为参数量大幅增加。它提醒我们残差连接缓解优化困难,并没有取消数据规模、正则化和模型容量之间的权衡。

Figure 4 与 Figure 6 的训练曲线比单个最终数值提供更多信息:训练误差、测试误差与收敛速度可以帮助区分优化失败和泛化失败。学习时应自己重画这两类曲线,而不是只保留一个最优点。如果深模型训练更好但测试更差,下一步应该考虑正则化和数据,而非继续声称出现原论文的退化现象。

源码的发布范围要讲清楚

作者仓库公开 Caffe 格式网络定义与预训练权重,README 说明这些模型经过转换,并非在 Caffe 中完成原始训练。因此本页的源码对照使用真实的模型定义文件,而不是虚构一段作者没有发布的 PyTorch 训练循环。推理网络可核对残差相加、投影和激活位置,却不等于完整训练协议已经可一键重现。

定义文件用 Eltwise 层实现分支相加,后面紧接 ReLU。投影分支的一乘一卷积改变通道数。归一化与缩放在 Caffe 中拆成 BatchNorm 与 Scale 两层;若只看其中一层,容易误以为缺少可学习偏移。跨框架转换需要检查这些等价关系,而不是只逐层匹配名字。

现代框架中同名残差网络的步长放置、归一化设置、训练配方可能不同。作为教学实现可以使用现代版本,但报告应明确它是兼容基线,而非逐项还原原论文。固定预训练权重来源、输入颜色顺序、归一化均值与标准差,是比模型名称更具体的复现信息。

如何用于细粒度与跨场景方向

细粒度路线可以先比较末层平均池化与中间层局部区域表示。早层通常保留较高空间分辨率,后层更抽象,但哪一层最适合微弱表情不能仅凭直觉决定。固定分类头与训练划分,在眼部、嘴部或全脸输入间做一个受控比较,才能把结构选择与具体错误联系起来。

跨场景路线可以先冻结骨干,检查不同数据来源的特征和分类表现;再决定是否仅更新分类头、部分层或全部网络。若源域性能上升而目标域下降,可能是过度适应源域纹理或背景。原论文的 ImageNet 与检测实验不能自动证明跨场景情绪泛化,这属于新的任务证据。

作者限制的核心例子是一千二百零二层模型的过拟合。独立判断还应补充静态图像骨干缺少显式时间建模、全局池化可能丢失局部细节、预训练类别与情绪标签之间存在差异。把 ResNet 接到视频平均池化后,并不等于模型已经理解表情变化过程。

最值得带走的研究思想是:先定位失败原因,再改变参数化。原论文并非看到深度不够便盲目继续加层,而是分析深层训练误差、提出可以保留浅层解的结构,并用对应实验验证。你做自己的拓展时也应先形成这种证据顺序,再考虑给模型加入新的模块。

公式逐步读:变量、运算与适用范围

原文式 (1):恒等捷径

$$y=F(x,\{W_i\})+x$$

x 与残差分支输出同形状。原始块相加后还有非线性,图示与公式的边界要一起读。

原文式 (2):投影捷径

$$y=F(x,\{W_i\})+W_sx$$

Ws 用于匹配维度,通常是一乘一卷积;这里的矩阵写法代表线性投影,不限于平面矩阵实现。

教学推导:残差目标

$$F(x)=H(x)-x$$

若期望映射为 H,残差分支学习相对输入的变化。它解释参数化含义,不是额外的监督损失或人工提供的标签。

教学推导:局部导数

$$\frac{\partial y}{\partial x}=I+\frac{\partial F}{\partial x}$$

仅针对相加节点,未包含后续 ReLU 的门控;用它说明直接路径,不声称全网梯度永不消失。

教学整理:卷积参数量

$$P=k^2C_{in}C_{out}\quad\text{(不计偏置)}$$

先降低通道再做三乘三卷积可以降低主要计算。比较瓶颈时还需加上两端一乘一卷积的成本。

实验读数:先固定协议,再比较数值

原文 Table 2:ImageNet 十裁剪验证,Top-1 错误率
网络18 层34 层
普通网络27.9428.54
残差网络,方案 A27.8825.03
原文 Table 6:CIFAR-10 测试错误率
深度错误率
208.75
327.51
447.17
566.97
1106.43(最好);6.61±0.16(五次均值)
12027.93

计算流程图

flowchart LR
A[Input x] --> B[Convolution BN ReLU]
B --> C[Convolution and BN]
A --> D[Identity or projection shortcut]
C --> E[Elementwise addition]
D --> E
E --> F[ReLU]
F --> G[Next residual block]

沿图逐条检查箭头:每个箭头传递的是张量或监督信号,并不代表额外的数据集;训练目标旁的分支在部署时未必保留。建议先在纸上填入批大小、序列长度、通道数,再阅读下面的源码。一个模块即使名字相同,只要输入轴、掩码或输出使用方式改变,也不能直接视作同一个实验。

论文方法与固定版本源码对照

prototxt/ResNet-50-deploy.prototxt:210–224

layer {
	bottom: "res2a_branch1"
	bottom: "res2a_branch2c"
	top: "res2a"
	name: "res2a"
	type: "Eltwise"
}

layer {
	bottom: "res2a"
	top: "res2a"
	name: "res2a_relu"
	type: "ReLU"
}

Eltwise 层合并捷径与残差分支,随后是 ReLU;这对应原始相加后激活的结构。此处引用的是作者发布的 Caffe 模型定义。

prototxt/ResNet-50-deploy.prototxt:59–71


layer {
	bottom: "pool1"
	top: "res2a_branch1"
	name: "res2a_branch1"
	type: "Convolution"
	convolution_param {
		num_output: 256
		kernel_size: 1
		pad: 0
		stride: 1
		bias_term: false
	}

一乘一卷积把捷径投影到二百五十六通道,与主分支输出匹配。它是可学习投影,不应称为无参数恒等路径。

代码核查固定在提交 a7026cb6d478e131b765b898c312e25f9f6dc031。这里展示的是公开仓库的实际文件,不把重新写的教学代码冒充作者实现。仓库后续可能包含新版本、工程兼容选项和不同默认参数;本文只将已核实的语句对应到论文机制。下载权重成功、模型能够前向传播、复现论文最终指标是三个不同的验收层级。

从读懂到能够独立实现:可执行学习任务

第一步,手写一个同维残差块,将残差分支权重暂时置零。验收:在相加节点输出等于输入;若再经过 ReLU,负数部分会被截断。用这个反例说明为什么“整个块总是恒等”是不准确的表述。

第二步,构造通道数增加、空间尺寸减半的输入输出,分别实现投影捷径与错误的直接相加。验收:能解释形状不匹配的原因,并记录两个分支的步长、通道和输出尺寸。

第三步,在小型图像任务上比较相近预算的普通网络与残差网络,保存训练和验证曲线。验收:如果训练更差,讨论优化;如果训练更好而验证更差,讨论泛化,不把两者混成一个概念。

第四步,使用固定预训练骨干提取全脸与局部区域特征,只训练一个轻量分类器。验收:固定数据划分与预处理,记录局部区域检测失败,不能只挑选裁剪成功的测试样本。

第五步,做一次跨场景评估并明确 BatchNorm 行为。验收:列出哪些参数更新、哪些统计更新,分别报告源域与目标域结果。只有确认基础数据与冻结设置正确后,才进入更复杂的时序或细粒度模块。

建立可检查的实验记录

开始第一轮实验前,建立四份小文件:数据清单记录样本编号、来源、标签与划分;配置文件记录预处理、随机种子、模型名称和冻结范围;结果表记录验证指标、选中轮次与最后测试指标;错误清单保存预测错误的样本编号及观察理由。这些文件比一张最高准确率截图更能说明你真正控制了实验条件,也能让后续细粒度或跨场景拓展沿用同一条证据链。

对视频、语音或多模态情绪数据,必须优先检查主体、会话和视频来源是否跨集合重复。同一原始视频切出的多个片段高度相关,随机按片段划分可能让模型记住说话人、背景或录制设备。跨场景问题至少要明确源域训练集、源域验证集和目标域测试集;若使用目标域标签选择提示词或超参数,就不应再把它描述为完全未见目标域的泛化结果。

为避免把实现错误误认为研究发现,先运行一个极小批次,打印输入输出形状、数值范围、有效长度以及损失是否有限。随后在少量训练样本上尝试拟合,验证模型确实能够更新指定参数。如果极小训练集都学不会,优先检查标签编码、掩码方向、归一化、学习率和冻结设置;此时直接扩大数据量通常只会延长排查时间,而不能证明模型本身不适合任务。

消融实验一次只改变一个关键因素,其他预处理、划分、优化预算和选择规则保持一致。第一轮以发现实现问题为目标,只用一个种子;确认代码与趋势合理之后,再增加多个种子并保留每次独立结果。均值用于概括趋势,标准差用于展示训练波动,但都不能替代对样本泄漏和评价口径的检查。不同论文中的最优数字不能在协议不明时直接相减。

解释实验失败时,先区分三层原因:实现层是否正确地执行了计算;优化层是否在给定预算内学到了信号;数据层是否提供了任务需要的信息。比如文本缺少反讽语调、静态图像看不到表情变化、音频包含录音噪声,这些问题不能仅靠增加网络深度解决。把失败样本分组后再提出修改,每项修改应能对应一个可观察的问题和一个预先规定的验证指标。

学习笔记采用“论文本身说了什么—源码实际做了什么—我在本地验证了什么”三栏记录。第一栏附页码或图表编号,第二栏附固定提交与行号,第三栏附命令、环境和输出。本文已完成原文及源码核对,未宣称在你的机器上重训原论文。下面的练习属于待执行计划;只有真正运行并保存结果后,才能把相应项目改为“已完成”。

短引语与阅读定位

原文短语 Deep Residual Learning(标题):深层网络学习相对于输入的修正。

原文短语 degradation problem(Introduction):训练误差随深度增加而恶化,不等于普通过拟合。

原文短语 identity mapping(Section 3):恒等捷径提供直接传递路径,但需要注意激活与尺寸变化。

参考资料与核验边界

论文摘要与版本信息;完整论文 PDF;作者公开仓库固定版本。公式中标注“教学整理”的表达用于显式说明原文的计算步骤,不声称具有原文公式编号。所有实验数字均指原论文报告结果,不是本次新训练得到的结果。英文短引语合计不超过二十五个词。

自己的解释与验收记录

写出一条输入到输出的链路、一个关键公式的含义,以及你完成的最小检查。笔记仅保存在当前浏览器,可从主站「我的学习笔记」导出。