前置知识

读 ResNet 前先建立四个最小概念。

  1. 一层神经网络可以写成“线性变换 + 非线性激活”。没有非线性,多层线性变换仍可合并为一层。
  2. 反向传播依赖链式法则。网络越深,梯度经过的局部导数越多,但这并不意味着 ResNet 只是在处理传统意义上的梯度消失。
  3. 退化问题指增加网络深度后,训练误差反而升高。它不同于“训练误差低、测试误差高”的过拟合现象。
  4. 恒等映射表示输入原样成为输出。理论上,新增层若能学会恒等映射,更深网络至少不应比浅层网络差;论文关心的是优化器为什么难以找到这种解。

阅读原文时,把引言中的 vanishing/exploding gradients 与 degradation problem 分开标记。前者已有初始化和归一化等缓解手段,后者才是残差学习提出时直接瞄准的问题。

核心问题

为什么网络越深越难训练,而残差连接能让信息继续流动?更具体地说:如果更深的模型包含浅层模型能够表达的函数,为什么 plain network 的训练误差还会变差?

本页固定引用 Kaiming He、Xiangyu Zhang、Shaoqing Ren 与 Jian Sun 的 Deep Residual Learning for Image RecognitionarXiv: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 的退化,再通过成组对照说明残差参数化更易优化。

当前可公开的结论只到这里:论文论证、固定来源和最小脚本入口已经可检查;关于真实训练曲线、数据集指标和更广泛的因果解释,仍需新的版本化实验。