前置知识
读 ResNet 前先建立四个最小概念。
- 一层神经网络可以写成“线性变换 + 非线性激活”。没有非线性,多层线性变换仍可合并为一层。
- 反向传播依赖链式法则。网络越深,梯度经过的局部导数越多,但这并不意味着 ResNet 只是在处理传统意义上的梯度消失。
- 退化问题指增加网络深度后,训练误差反而升高。它不同于“训练误差低、测试误差高”的过拟合现象。
- 恒等映射表示输入原样成为输出。理论上,新增层若能学会恒等映射,更深网络至少不应比浅层网络差;论文关心的是优化器为什么难以找到这种解。
阅读原文时,把引言中的 vanishing/exploding gradients 与 degradation problem 分开标记。前者已有初始化和归一化等缓解手段,后者才是残差学习提出时直接瞄准的问题。
核心问题
为什么网络越深越难训练,而残差连接能让信息继续流动?更具体地说:如果更深的模型包含浅层模型能够表达的函数,为什么 plain network 的训练误差还会变差?
本页固定引用 Kaiming He、Xiangyu Zhang、Shaoqing Ren 与 Jian Sun 的 Deep Residual Learning for Image Recognition:arXiv:1512.03385v1 abstract 与 官方 PDF。阅读时重点追踪五个子问题:
- 论文如何证明退化不是过拟合;
F(x) + x中的F究竟学习什么;- shortcut 何时没有参数,何时需要投影;
- 维度不一致时如何对齐;
- bottleneck 为什么采用
1×1 → 3×3 → 1×1。
逐节中文精读导读
引言:先证明“更深”不是自动更好
引言的推理顺序很重要。作者先承认深度带来的表达能力,再指出优化上的反常现象:更深的 plain network 连训练集都拟合得更差。读图 1 时不要只比较测试误差,应先观察训练误差;这一步把问题从泛化转向优化。
第 2 节:相关工作在铺什么路
这里不是新方法的主体,而是在区分残差表示与已有的 shortcut、highway 等思想。阅读目的不是背引用,而是确认论文的新意落在“把层显式改写为残差函数并做大规模验证”的组合上。
第 3.1–3.2 节:从目标映射改写到残差块
设希望拟合的映射为 H(x),论文改为学习 F(x) = H(x) - x,于是输出为 F(x) + x。这个改写没有削弱模型表达能力;它改变的是优化参数化。若恒等映射合适,残差分支只需接近零,而输入由 shortcut 直接保留。
第 3.3–3.4 节:结构与实现约束
shortcut 并非永远可以直接相加。空间分辨率或通道数变化时,需要考虑投影或补零方案。bottleneck 通过两个 1×1 卷积控制通道宽度,把主要计算集中在中间的 3×3 卷积。阅读表格时把层数、通道数、下采样位置和参数量一起看,不要只数“多少层”。
第 4 节:实验在回答哪几个问题
ImageNet 与 CIFAR 实验承担不同证据责任:plain/residual 对照验证优化差异,更深模型验证结构是否可扩展,分类指标则报告最终任务表现。本项目尚未重跑这些训练;这里的导读只帮助定位证据,不能把论文表格变成本项目结果。
关键公式与结构
残差单元的最小表达是:
y = F(x, {W_i}) + x
当维度不一致时,可写为 y = F(x, {W_i}) + W_s x,其中 W_s 用于投影对齐。shortcut 的价值不是“保证梯度永不衰减”这么绝对,而是提供一条更直接的信息与梯度路径;实际优化仍受激活、归一化、初始化和训练设置影响。
看图 2 时可以把结构拆成两路:主路计算需要改变的部分 F(x),旁路保存输入,两路在块出口相加。看 bottleneck 时再加一层约束:先降维、处理中间特征、再升维,以控制深层模型的计算量。
最小复现
事实源固定在 paper-deep-dive 提交 2b8b41e63608725e6d4f25a44599014b1c22596e。需要 Python 3.11。以下小型离线 smoke 使用合成输入比较 plain 与 residual 路径,不下载数据集;它只能验证脚本、反向传播与输出边界,不能代表论文发表指标的复现。
git clone https://github.com/momo0205/paper-deep-dive.git
cd paper-deep-dive
git checkout 2b8b41e63608725e6d4f25a44599014b1c22596e
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -e .
python3 code/resnet/plain_vs_residual.py --smoke --offline --output-dir /tmp/paper-deep-dive-resnet
观察时不要只抄最终数字。先确认两条路径使用相同随机种子和规模,再记录 loss、浅层梯度范数及输出图。工作台曾记录 residual/plain 梯度范数差异,但该数值属于小型脚本的特定设置,不应推广到 ImageNet ResNet。
自测与能力边界
本章当前状态是“学习中”。已经核对固定原文、代码提交和离线入口;尚未独立复现 ImageNet/CIFAR 表格,也没有证明残差连接对任意网络都有效。
自测时应能解释:退化与过拟合的差别、恒等映射为什么理论上存在却难优化、维度变化时 shortcut 如何处理、bottleneck 如何控制计算量,以及为什么 smoke 不能替代论文实验。
一页纸总结
ResNet 的关键不是简单“多加一条线”,而是把目标映射改写为相对输入的残差,并用恒等路径保留信息。论文先用训练误差暴露深层 plain network 的退化,再通过成组对照说明残差参数化更易优化。
当前可公开的结论只到这里:论文论证、固定来源和最小脚本入口已经可检查;关于真实训练曲线、数据集指标和更广泛的因果解释,仍需新的版本化实验。