Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

3.4 经典骨干演进:AlexNet → VGG → ResNet

3.1–3.3 节把零件备齐了:卷积层、池化、归一化、Dropout。但零件不等于机器——把它们按什么顺序、用什么通道数、堆多深,决定了模型能不能训起来、训起来之后有多强。这一节讲三代骨干(backbone)如何一步步把「堆零件」变成「设计」。

三代网络的共同主线是一条工程问题的升级链:能不能训(AlexNet)→ 深度是不是关键变量(VGG)→ 为什么更深反而更差、怎么修(ResNet)。这条链上的每一步都不是「把网络做大」,而是发现并解决一个新的训练障碍。

这节的五条结论
  1. AlexNet 证明深度 CNN 可训,靠的是一套配方(ReLU + Dropout + 数据增强 + GPU),而不只是结构。
  2. VGG 用「小核堆叠」把结构规整化,第一次让「深度」成为可独立研究的变量。
  3. 盲目加深会出现退化(degradation):训练误差也上升——它不是过拟合,加正则救不了。
  4. 残差连接 y=F(x)+xy=F(x)+x 把「学恒等映射」变便宜、把梯度变成「连乘 + 直通和」,是超深网络可训的关键。
  5. 瓶颈与分组是同一件事的两种形态:在固定算力预算下重新分配「深度、宽度、通道混合」。

3.4.1 AlexNet:一套让深度 CNN 可训的配方

定义 3.4.1 · 骨干(backbone)

一个视觉系统中负责把图像变成特征表示的那部分网络,称为骨干(backbone)。分类器(分类头)、检测头、分割头都接在骨干之上。骨干的设计决定特征的质量与算力成本,因此它是视觉模型最关键的可复用组件。

为什么骨干能复用

骨干学到的特征有强烈的层次性:浅层是边缘、颜色块、方向纹理,中层是部件(眼睛、轮子、文字笔画),深层才是语义(整只猫、整辆车)。前两层学到的模式对绝大多数视觉任务都通用,因此一个在 ImageNet 上训好的骨干可以直接搬到完全不同的任务上当初始化——这就是 3.6 节迁移学习的物理基础。

AlexNet 是这套配方的第一个完整版本。它并不是第一个 CNN(LeNet 早得多),但它是第一个在大规模真实图像上训得出、并且在竞赛上碾压传统方法的深度网络。

例 3.4.1 · AlexNet 的形状表与参数量分布

AlexNet 的输入是 227×227×3227\times227\times3。按原论文的配置:conv1 11×11,s=4,9611\times11,s=4,96 通道 → maxpool 3×3,s=23\times3,s=2 → conv2 5×5,p=2,2565\times5,p=2,256 → maxpool → conv3/conv4/conv5 均为 3×3,p=13\times3,p=1(384/384/256)→ maxpool → 三个全连接层 40964096、40964096、10001000。写出逐层的输出形状与参数量,并指出参数集中在哪。

解

用 公式 (3.2)、(3.4)、(3.5) 逐层计算:

层配置输出形状参数量
输入—3×227×2270
conv111×11, s=4, 9696×55×5534,944
maxpool13×3, s=296×27×270
conv25×5, p=2, 256256×27×27614,656
maxpool23×3, s=2256×13×130
conv33×3, p=1, 384384×13×13885,120
conv43×3, p=1, 256256×13×13884,992
conv53×3, p=1, 256256×13×13590,080
flatten—40960
fc14096409637,752,832
fc24096409616,781,312
fc3100010004,097,000

参数量总账:卷积层合计 3,009,7923{,}009{,}792(约 3.0×1063.0\times10^6),全连接层合计 58,631,14458{,}631{,}144(约 5.86×1075.86\times10^7),总参数量约 6.16×1076.16\times10^7(不加分类头前的 10001000 类偏置为 61,640,93661{,}640{,}936)。

关键观察:95%95\% 的参数在全连接层,卷积层只占 4.9%4.9\%。这不是 AlexNet 的疏忽,而是那个时代的必然结果:把 256×6×6=9216256\times6\times6=9216 维特征直接展平接 40964096 维全连接,一层就是 37753775 万个参数。后来的骨干(VGG、ResNet)逐步把这块替换成全局池化 + 小分类头,这才是「参数效率」提升的最主要来源。

(注:227227 而非 224224 是原论文的实际输入;224224 版本在工程实现中更常见,形状会相应变为 55→27→1355\to27\to13 之外的偶数序列,逐层数值略有差异。)

∎
AlexNet 的六项工程创新
创新 解决的问题 为什么有效
ReLU 替代 Sigmoid/tanh 饱和激活的梯度消失,训练极慢 正区间导数为 1,梯度不衰减;在当时的硬件上训练速度提升数倍
Dropout(p=0.5p=0.5,仅用于两个大全连接层) 全连接层参数太多、极易过拟合 训练时随机丢弃单元,破坏特征间的偶然共适应
数据增强(随机裁剪、水平翻转、颜色扰动) 训练集只有 120 万张,不够 用变换人为扩大有效样本数;由于卷积的平移等变性(3.1),裁剪/翻转是语义安全的增强
局部响应归一化(LRN) 当时认为能抑制过强的相邻通道响应 现代已被 BatchNorm 取代(3.3);LRN 本身不是关键
重叠池化(3×33\times3 窗口、s=2s=2) 无重叠池化信息损失过大 窗口重叠使相邻输出共享输入,略提升精度并抑制过拟合
双 GPU 并行 + 分组卷积 单卡显存装不下 把网络沿通道切成两半分别训练;这一工程妥协启发了后来的分组卷积与深度可分离卷积(3.2.6)

AlexNet 的历史位置:2012 年 ILSVRC 上它把 top-5 错误率从第二名(传统特征方法)的约 26%26% 降到约 16%16%(具体数字以 ILSVRC 2012 官方结果页与原论文为准,引用时需核实版本)。真正的意义不在于某个小数,而在于它证明了:只要有足够的算力、数据与正确的配方,让网络自己学特征比人工设计特征更有效。这句话开启了之后十年的视觉研究。

3.4.2 VGG:用深度换宽度,把结构规整化

AlexNet 的结构是「一个天才的拼凑」:核大小 11/5/311/5/3 混用,分组随意。VGG 的价值在于它追问了一个更本质的问题:如果我把结构规整成同一个模板反复堆,深度的收益有多大?

命题 3.4.1 · 小核堆叠的等价性与收益

LL 层 3×33\times3、步幅 1 的卷积(每层之间无下采样),其感受野为 2L+12L+1,与一个 (2L+1)×(2L+1)(2L+1)\times(2L+1) 的单层卷积相同。但两者的参数与非线性层数为:

方案 感受野 参数(CC 通道) 非线性层数
1 层 7×77\times7 7×77\times7 49C249C^2 1
3 层 3×33\times3 7×77\times7 3×9C2=27C23\times9C^2=27C^2 3
1 层 5×55\times5 5×55\times5 25C225C^2 1
2 层 3×33\times3 5×55\times5 18C218C^2 2

结论:用多层小核替换单层大核,能在相同感受野下减少参数(27C227C^2 对 49C249C^2,约 −45%-45\%)并增加非线性层数(3 对 1),从而提升表达能力。

推导

感受野部分由 命题 3.2.4 直接得到:jl≡1j_l\equiv1 时 rL=k+(L−1)(k−1)=3+2(L−1)=2L+1r_L=k+(L-1)(k-1)=3+2(L-1)=2L+1。参数部分由 公式 (3.4) 得到:LL 层 3×33\times3 为 L⋅(9C2+C)L\cdot(9C^2+C),单层 (2L+1)×(2L+1)(2L+1)\times(2L+1) 为 (2L+1)2C2+C(2L+1)^2C^2+C。取 L=3L=3:27C227C^2 对 49C249C^2。非线性层数即每个卷积后接的激活函数个数:3 层 3 个、1 层 1 个。■\blacksquare

∎
为什么「更多非线性」也是收益

一个 7×77\times7 卷积核能表达的,是它输入的一个线性函数。而 3 层 3×33\times3 之间夹着 ReLU,整体是一个分段线性函数——它能拟合的映射集合严格更大。换句话说,同样的感受野,堆小核的版本表达力更强、参数更少,代价是层数更多、并行度更低、显存里的中间激活更多(这条代价在现代硬件上反而更重要:VGG 的激活值占了大量显存,因此推理速度并不快)。

这也解释了为什么「3×33\times3 是深度网络的默认核大小」:再小的核(1×11\times1)无法利用空间结构;再大的核(5×55\times5、7×77\times7)参数效率下降。3×33\times3 是「表达空间关系」的最小奇数核,奇数保证有中心像素、且 p=1p=1 时尺寸不变。

例 3.4.2 · VGG16 的参数都去哪了

VGG16 的结构可写成「卷积段 + 池化」的规整模板:2×2\times[conv3-64] → pool → 2×2\times[conv3-128] → pool → 3×3\times[conv3-256] → pool → 3×3\times[conv3-512] → pool → 3×3\times[conv3-512] → pool → FC-4096 → FC-4096 → FC-1000(输入 224×224×3224\times224\times3)。求卷积层与全连接层的参数量,并解释「VGG 的参数效率问题」。

解

卷积层:每层参数 =CinCoutk2+Cout=C_{in}C_{out}k^2+C_{out},逐段累加:

段 层配置 参数量
段 1 3→64、64→64 1,792+36,928=38,7201{,}792+36{,}928=38{,}720
段 2 64→128、128→128 73,856+147,584=221,44073{,}856+147{,}584=221{,}440
段 3 128→256、256→256 ×2 295,168+590,080×2=1,475,328295{,}168+590{,}080\times2=1{,}475{,}328
段 4 256→512、512→512 ×2 1,180,160+2,359,808×2=5,899,7761{,}180{,}160+2{,}359{,}808\times2=5{,}899{,}776
段 5 512→512 ×3 2,359,808×3=7,079,4242{,}359{,}808\times3=7{,}079{,}424
合计 — 14,714,68814{,}714{,}688

(各段中第一层与后续层的参数略有差异,例如 256→512256\to512 为 256⋅512⋅9+512=1,180,160256\cdot512\cdot9+512=1{,}180{,}160,与 512→512512\to512 的 2,359,8082{,}359{,}808 不同;上表按此逐一计算。)

全连接层:最后池化后得到 512×7×7=25,088512\times7\times7=25{,}088 维特征,

25,088×4096+4096=102,764,544,4096×4096+4096=16,781,312,4096×1000+1000=4,097,000.25{,}088\times4096+4096=102{,}764{,}544,\quad 4096\times4096+4096=16{,}781{,}312,\quad 4096\times1000+1000=4{,}097{,}000 .

全连接合计 123,642,856123{,}642{,}856。

总参数量 =14,714,688+123,642,856≈1.384×108=14{,}714{,}688+123{,}642{,}856\approx\mathbf{1.384\times10^{8}}(约 1.38 亿)。

参数效率的结论:约 89%89\% 的参数在全连接层——比 AlexNet 更极端(因为 VGG 的卷积部分很省,而全连接层输入更大)。这正是两条重要后续的直接动机:① 全局平均池化 + 小分类头(去掉大全连接,3.3.1);② 全卷积网络(把全连接换成卷积,用于分割,3.7 节)。顺带一提,1.381.38 亿参数中真正「在做视觉」的只有 1.47×1071.47\times10^7 个——这就是「大模型」这个词在 2014 年与今天的含义差别。

∎

3.4.3 退化问题:更深为什么反而更差

VGG 把深度推到 19 层,人们顺着这条路继续加深,结果遇到了一个反常现象。

定义 3.4.2 · 退化问题(degradation problem)

在相同的数据与训练配方下,把一个还不错的网络(如 20 层)单纯加深(如 56 层),出现

训练误差(深网络)>训练误差(浅网络)\text{训练误差}(\text{深网络})\gt\text{训练误差}(\text{浅网络})

的现象,称为退化(degradation)。它与过拟合有本质区别:过拟合是训练误差低、测试误差高;退化是训练误差本身就更高。

退化的根源不是「拟合能力不够」,而是「优化没走到」

逻辑上,一个更深的网络至少应该和浅网络一样好:把多出来的层全部学成恒等映射(identity:输出等于输入),整体行为就退化成浅网络。所以退化说明的是——网络有那个解,但梯度下降找不到它。

为什么找不到?两个原因叠加:

  1. 恒等映射本身不好学。让两层 3×33\times3 卷积 + ReLU 精确输出「输入本身」并不容易:卷积核与 ReLU 的组合要拼出恒等映射,需要非常精确的权重配置,随机初始化下附近没有这种配置。
  2. 梯度在深层连乘后失真。反向传播要经过每一层的雅可比连乘(第 1 讲 1.5 节);层数越多,连乘造成的尺度畸变(衰减或爆炸)越严重,浅层收到的梯度方向越来越不可靠。

所以需要用结构改动「让恒等映射变得免费、让梯度有一条不经过任何变换的路」——这正是残差连接做的一件事(其实是两件事)。

例 3.4.3 · 退化的定量感受:为什么「更多层 = 至少不差」不成立

设一个 LL 层网络上某条路径的雅可比连乘的谱范数上界为 ρL\rho^L(ρ\rho 表示单层雅可比的典型缩放)。取 ρ=0.9\rho=0.9,比较 L=20L=20 与 L=56L=56 时梯度传递到第 1 层时的相对量级;再取 ρ=1.1\rho=1.1 做同样比较。据此解释「退化」与「梯度消失/爆炸」的关系。

解

ρ=0.9\rho=0.9:0.920≈0.1220.9^{20}\approx0.122,0.956≈0.00270.9^{56}\approx0.0027。深层网络的梯度衰减到前者的约 1/451/45。

ρ=1.1\rho=1.1:1.120≈6.731.1^{20}\approx6.73,1.156≈207.91.1^{56}\approx207.9。深层网络的梯度放大到前者的约 3131 倍。

解读:ρ\rho 只要略偏离 1,深度就把它变成指数级的因子。这就是「深度对优化敏感」的定量含义:浅网络里可接受的尺度畸变(如 12%12\% 衰减)在 5656 层时变成几乎收不到的梯度(0.27%0.27\%)。反过来,ρ\rho 略大于 1 就会爆炸。

但要注意:这个论证说明的是梯度病态,而退化问题的实验现象(训练误差更高)是它的后果之一而不是全部。ResNet 原文同时用「恒等映射难学」来解释——后者与梯度病态是两个互补的假说,工程上两者都靠同一个结构改动缓解(3.4.4)。■\blacksquare

∎

3.4.4 残差连接:让恒等映射变便宜、让梯度直通

定义 3.4.3 · 残差块与残差连接

一个残差块把「直接学目标映射」改成「学残差再加回输入」:

y=F(x)+x,(3.9)y=F(x)+x, \tag{3.9}

其中 xx 是块输入,FF 是该块内若干卷积层的输出(学习到的残差),xx 经恒等映射(identity,即 shortcut / skip connection)直接加到输出上。当空间尺寸或通道数不匹配时,用线性投影 WsxW_s x 对齐:y=F(x)+Wsxy=F(x)+W_s x(WsW_s 常取 1×11\times1 卷积,步幅与 FF 的输出一致)。

残差块在做两件事

① 让恒等映射变便宜。 如果某几层的最优行为是「什么都不做」,普通网络要把它学成 y≈xy\approx x(一堆非线性层拼出恒等,很难);残差块只需把 FF 学成 ≈0\approx0,因为 y=F(x)+x≈xy=F(x)+x\approx x 这条恒等通路已经免费提供。用优化语言说:残差参数化把「恒等映射」这个解预先放在了参数空间的零附近,而零是初始化天然靠近的地方。

② 让梯度有一条不经过变换的路。 下一节的推导会给出 ∂y/∂x=I+∂F/∂x\partial y/\partial x=I+\partial F/\partial x:多出来的那个 II 是一条恒等项,它保证梯度里总有一部分原样回传,不因为 FF 的雅可比很小而被完全衰减。

这两件事合起来,就同时回应了 3.4.3 提出的两个病根。这也是「残差连接不是技巧,而是让深网络在优化上变得可达」这句话的含义。

定理 3.4.1 · 残差网络的梯度结构

设网络由 LL 个残差块串联,xl+1=xl+Fl(xl)x_{l+1}=x_l+F_l(x_l),损失为 L\mathcal L。则对任意浅层 ll,有

∂L∂xl=∂L∂xL∏i=lL−1(I+∂Fi∂xi)=∂L∂xL[I+∑i=lL−1∂Fi∂xi+(高阶交叉项)].(3.10)\frac{\partial\mathcal L}{\partial x_l}=\frac{\partial\mathcal L}{\partial x_L}\prod_{i=l}^{L-1}\Bigl(I+\frac{\partial F_i}{\partial x_i}\Bigr)=\frac{\partial\mathcal L}{\partial x_L}\Bigl[I+\sum_{i=l}^{L-1}\frac{\partial F_i}{\partial x_i}+(\text{高阶交叉项})\Bigr] . \tag{3.10}

推导

逐块链式法则:由 xi+1=xi+Fi(xi)x_{i+1}=x_i+F_i(x_i) 得

∂xi+1∂xi=I+∂Fi∂xi⟹∂xL∂xl=∏i=lL−1(I+∂Fi∂xi),\frac{\partial x_{i+1}}{\partial x_i}=I+\frac{\partial F_i}{\partial x_i}\qquad\Longrightarrow\qquad \frac{\partial x_L}{\partial x_l}=\prod_{i=l}^{L-1}\Bigl(I+\frac{\partial F_i}{\partial x_i}\Bigr),

再由 ∂L/∂xl=(∂L/∂xL)(∂xL/∂xl)\partial\mathcal L/\partial x_l=(\partial\mathcal L/\partial x_L)(\partial x_L/\partial x_l) 得 (3.10) 的第一式。

展开:把连乘展开,II 是其中的恒等因子,故

∏i=lL−1(I+Ji)=I+∑iJi+∑i<jJiJj+⋯+JlJl+1⋯JL−1,Ji:=∂Fi∂xi.\prod_{i=l}^{L-1}\Bigl(I+J_i\Bigr)=I+\sum_i J_i+\sum_{i\lt j}J_iJ_j+\cdots+J_{l}J_{l+1}\cdots J_{L-1},\qquad J_i:=\frac{\partial F_i}{\partial x_i}.

展开式里每一项都包含至少一个 JJ;唯一不含 JJ 的项是 II,它就是那条「直通项」。

直通项的机制:对 L\mathcal L 关于 xlx_l 的梯度而言,II 提供了

∂L∂xL⋅I=∂L∂xL,\frac{\partial\mathcal L}{\partial x_L}\cdot I=\frac{\partial\mathcal L}{\partial x_L},

即从深层原样带回的一份梯度。因此即使所有 JiJ_i 都很小(频域上表现为整体衰减),梯度也不会降到零;反之若某些 JiJ_i 很大,梯度也不会像普通深层网络那样被指数放大。

两个补充观察(用来避免过度解读):

  1. 上式的 II 不依赖于任何权重,所以它不可能被梯度下降「学掉」;但它是矩阵意义下的直通,一个具体参数所收到的梯度是否真的大,还取决于后续层的组合方式与总深度——残差缓解梯度消失,不等于「梯度不会消失」。
  2. 展开式中的高阶交叉项在深层会累积,这是残差网络并非「无条件可训」的原因之一;实践中通常配合 BN/LN(3.3.3)与合理的初始化。■\blacksquare
∎
为什么 II 是「不经过任何非线性层的通路」

把 ∂y/∂x=I+∂F/∂x\partial y/\partial x=I+\partial F/\partial x 读成「输出对输入的敏感度」。FF 由卷积 + ReLU 组成,它在 xx 变化时可能几乎不响应(ReLU 死区、权重很小),但 +x+x 这条边直接从输入连到输出,无论中间层怎么变,这部分导数始终是 1。

一个类比:残差连接相当于给梯度修了一条高架桥——堵在下面(非线性层)的部分走不动时,仍有一条路能通到浅层。桥不需要任何维护(无参数),也不会被训练改掉。

例 3.4.4 · 残差与「事后拼接」的区别:为什么必须是加法

有人提出另一种「抄近路」的方式:把输入拼接到输出(y=concat(F(x),x)y=\mathrm{concat}(F(x),x),类似 DenseNet 的做法),或者把输入只接到某一侧。比较「加法残差」和「拼接」在梯度与维度上的差别。

解

加法 y=F(x)+xy=F(x)+x:∂y/∂x=I+∂F/∂x\partial y/\partial x=I+\partial F/\partial x。输入与输出维度相同(通道数一致),梯度直接相加回传,不需要额外参数。

拼接 y=[F(x);x]y=[F(x);x]:输出通道数是二者之和,∂y/∂x\partial y/\partial x 是一个 C×2CC\times 2C 的「选择矩阵」堆叠——反向传播时 xx 的梯度仍可直接回传(梯度会进入拼接的另一半),因此拼接也提供直通项;代价是通道数随层数线性增长,后续层的计算量与参数量随之上升(这也是 DenseNet 需要「过渡层」压缩通道的原因)。

维度差异是关键:若 FF 改变了通道数(如瓶颈块 256→256256\to256 不变、但若块内中间层降维),加法残差就要求用 WsW_s 投影对齐;拼接则不需要对齐但会让通道数增长。

结论:加法残差是「保持维度、零参数(或极少投影参数)、提供直通项」三者的最简组合,因此成为主流;拼接在需要强特征复用的场景(DenseNet)中更受青睐,代价是通道膨胀与显存增长。

∎

3.4.5 瓶颈与分组:在固定预算下重新分配算力

残差让网络能做深。但深了之后算力吃紧,于是出现了两种「在同样 FLOPs 下买更多深度」的结构。

定义 3.4.4 · 瓶颈块与 pre-activation 块
  • 瓶颈块(bottleneck block):用 1×11\times1 先降维、在低维上做 3×33\times3、再用 1×11\times1 升维,即「1×1→3×3→1×11{\times}1 \to 3{\times}3 \to 1{\times}1」,中间宽度常取输入通道的 1/41/4。
  • pre-activation 块(预激活块):把 BN 与 ReLU 放到卷积之前(即 xl+1=xl+Fl(BN-ReLU(xl))x_{l+1}=x_l+F_l(\mathrm{BN\text{-}ReLU}(x_l))),使残差的加法路径上没有任何非线性,恒等映射成为真正干净的通路,训练更容易收敛、泛化更好。
为什么「先降维再升维」等价于「用算力买深度」

由 例 3.2.2 的实测:56×56×25656\times56\times256 上,单层 3×33\times3(256→256256\to256)要 590,080590{,}080 个参数、1.85×1091.85\times10^9 MACs;而瓶颈块只要 69,01669{,}016 个参数、2.18×1082.18\times10^8 MACs——约 1/8.51/8.5。

省下的算力去哪了?ResNet-50 把 256→256256\to256 这类「同样宽度的堆叠」从 18 层减到 3 块(每块 3 层共 9 层卷积但宽度按瓶颈处理),同时把总深度从 18 层的量级推到 50 层的量级,而同年代的 VGG16 参数是它的 5.45.4 倍。瓶颈的本质不是「省」,而是「把通道维的一部分预算换成了深度」。

pre-activation 的动机则来自 定理 3.4.1:既然直通项的价值在于「不经过任何非线性」,那么把 BN 与 ReLU 移到加法之后就污染了这条通路。原文实验显示预激活版本在超深(>100 层)时训练更稳定、精度更高;这也是后续骨干(如 ConvNeXt 等现代设计在块结构上)普遍采用「归一化在前」的原因(3.5 节会看到它和 Transformer 的 Pre-LN 是同一个设计动作)。

ResNet 家族的结构对照(瓶颈 vs 基础块)
变体 块类型 层数 参数量 输入分辨率 备注
ResNet-18 基础块(2×3×3) 18 1.17×1071.17\times10^7 224² 无瓶颈
ResNet-34 基础块(2×3×3) 34 2.18×1072.18\times10^7 224² 无瓶颈
ResNet-50 瓶颈(1×1,3×3,1×1) 50 2.55×1072.55\times10^7 224² 3:4:6:3 块,m=C/4m=C/4
ResNet-101 瓶颈 101 4.45×1074.45\times10^7 224² 3:4:23:3 块
ResNet-152 瓶颈 152 6.02×1076.02\times10^7 224² 3:8:36:3 块

(参数量由逐块累加手算得到;ResNet-50 的 25.5×10625.5\times10^6 与论文报告 25.6M 一致。更深变体的参数与论文报告值的细微差异通常来自是否计入分类头与偏置,引用时需核实具体实现。)

同期的另外三条支线(各用一句话概括,避免把骨干史读成单线进化):

  • Inception 家族(GoogLeNet 起):在同一层并联多种尺度的卷积核(1×11\times1、3×33\times3、5×55\times5、池化)并把结果沿通道拼起来,让网络自己选择「看多大」,再用 1×11\times1 卷积压降维控制算力。它把「设计选择」交给了结构的多分支。
  • DenseNet:把残差的加法换成拼接,每一层都接收前面所有层的特征(xl=[x0;… ;xl−1]x_l=[x_0;\dots;x_{l-1}])。好处是特征复用极致、参数少;代价是通道数随深度线性增长、显存占用高(需过渡层压缩)。
  • ResNeXt:把残差块里的 3×33\times3 卷积换成分组卷积(分组数常取 3232,称 cardinality),即在「深度、宽度」之外引入第三个维度「分组数」。它说明了:增加分组与增加宽度/深度是三件不同的事,可以分别调。
  • 现代重参数化:RepVGG 把「训练时多分支、推理时等价融合为纯 3×33\times3 结构」的路线工程化(利用 定理 3.2.1 的线性可合并性),在推理速度上比同期多分支结构更有优势。

3.4.6 骨干设计对照表

网络(年份)核心贡献结构要点参数量该记住的一句话
AlexNet(2012)深度 CNN 可训的「配方」11/5/3 混合核 + 重叠池化 + 3 层大全连接6.2×10⁷ReLU + Dropout + 增强 + GPU;95% 参数在全连接层
VGG16(2014)小核堆叠、结构规整全部 3×3、通道逐段翻倍、5 段 + 3 层全连接1.38×10⁸小核堆叠 = 同感受野、更省参数、更多非线性;89% 参数在分类器
ResNet-50(2015)残差连接 + 瓶颈7×7 首层、4 阶段瓶颈块(3:4:6:3)、全局池化分类头2.55×10⁷残差解决退化;瓶颈把算力换成深度
Inception-v3(2015)多尺度并联 + 1×1 降维Inception 模块、辅助分类器、分解卷积约 2.4×10⁷让网络自己选「看多大」
DenseNet-121(2016)稠密拼接复用每层接收前面所有层、过渡层压缩通道约 8×10⁶拼接版残差:参数省、显存贵
ResNeXt-101(2016)分组卷积作为第三维度瓶颈 + cardinality=32 的分组 3×33\times3约 4.4×10⁷分组数、宽度、深度是可分别调的三件事
ConvNeXt-T(2022)卷积分支的「现代化」Patchify + 深度可分离 7×7 + LN + GELU + 倒瓶颈约 2.8×10⁷换训练配方与微观设计后,纯卷积仍可与 ViT 家族打平(见 3.5.4)

表中 AlexNet / VGG16 / ResNet 的数字由本章公式逐层手算;后几行的参数量按常见开源实现的口径给出,不同实现与是否含分类头会造成几个百分点的差异,引用时注明来源与版本。

本节常见误解
  1. 「更深一定更好」:错。深度带来退化(定义 3.4.2),必须靠残差 / 归一化 / 预激活等手段让深的部分可训。ResNet 原文的对照实验正是「同样深度、有无残差」的对照,而不是「深 vs 浅」。
  2. 「退化就是过拟合」:不是。过拟合是训练误差低、测试误差高;退化是训练误差本身就更高——这意味着问题出在优化,而不是容量。用加正则、加数据的方法解决退化是无效的。
  3. 「残差连接因为它能防止梯度消失」:只说对一半。残差的价值还包括把恒等映射变成廉价解(优化视角),并且最终精度提升不能简单归因为「梯度变大」。引用时要区分「机制解释」与「实验现象」。
  4. 「有了残差就可以无脑加深」:1000 层的 ResNet 在原文里能训起来但精度并不比 100 多层更好(需核实原文对比数字);残差解决了「可训」,没有解决「更深一定带来更好泛化」。
  5. 「VGG 就是简单地把 AlexNet 加宽加深」:VGG 的关键是规整化(统一 3×33\times3)与系统性的深度实验,这才让「深度」成为可独立研究的变量;同时它暴露了「大全连接层占绝大多数参数」这个结构缺陷,直接催生了全局池化与全卷积网络。
  6. 「小核堆叠在任何情形下都优于大核」:它省参数、增非线性,但中间激活 更多、并行度更低、延迟更高。在推理延迟敏感的场景,大核 + 深度可分离(如 ConvNeXt 的 7×77\times7 深度卷积)反而更划算——这是条件性结论,不是普适定律。
即时自测 · 3.4

Q1 3 层 3×33\times3 卷积(CC 通道)与 1 层 7×77\times7 卷积,感受野相同吗?参数量各是多少?谁的非线性更强?

Q2 用一句话区分「过拟合」与「退化」,并说明为什么「加正则」不能解决退化。

Q3 写出残差块的 yy 与 ∂y/∂x\partial y/\partial x;解释 II 这一项为什么不会随训练消失。

Q4 为什么pre-activation(归一化在前)在超深网络上更好?它和 Transformer 的 Pre-LN 是不是同一个设计动作?

Q5 单层 3×33\times3、256→256256\to256 与瓶颈块(m=64m=64)在 56×5656\times56 上的参数量与 MACs 各是多少?瓶颈省下的算力被用来做了什么?

参考要点

Q1 感受野相同(7×77\times7)。参数:3×(9C2+C)3\times(9C^2+C) 对 49C2+C49C^2+C,约 27C227C^2 对 49C249C^2(省 45%45\%)。3 层版本的非线性更强(3 个 ReLU 夹在中间,整体是分段线性函数)。

Q2 过拟合:训练误差低、测试误差高(容量相对数据过大);退化:训练误差本身随深度增加而上升(优化问题)。正则化的作用是限制有效容量、压低泛化差距,它不影响「深网络的优化能不能找到恒等解」,所以对退化无效——退化要靠结构(残差)与优化手段(归一化、预激活、初始化)解决。

Q3 y=F(x)+xy=F(x)+x;∂y/∂x=I+∂F/∂x\partial y/\partial x=I+\partial F/\partial x。II 是恒等矩阵,不来源于任何权重,因此它不能被梯度下降改变或「学掉」——这是它作为稳定直通项的根据(但注意它是矩阵意义下的直通,具体参数收到的梯度大小仍取决于整体结构)。

Q4 因为 BN/ReLU 放在加法之后会污染那条恒等通路(xl+1=ReLU(BN(y))x_{l+1}=\mathrm{ReLU}(\mathrm{BN}(y)) 之后,恒等映射不再干净),而放在加法之前(y=x+F(BN-ReLU(x))y=x+F(\mathrm{BN\text{-}ReLU}(x)))能让直通项真正无阻碍。Transformer 的 Pre-LN(x + Sublayer(LN(x)))与它是同一个设计动作:把归一化从残差通路上挪走。

Q5 单层:Params =590,080=590{,}080、MACs =1.85×109=1.85\times10^{9}。瓶颈(m=64m=64):Params =69,016=69{,}016、MACs =2.18×108=2.18\times10^{8}(约 1/8.51/8.5)。省下的算力主要换来更深的网络(同预算下深度从十几层量级提升到五十层量级),以及每个块内额外的非线性层。

延伸阅读
  • Krizhevsky, Sutskever & Hinton, ImageNet Classification with Deep Convolutional Neural Networks(2012,NeurIPS)——AlexNet 原文(ReLU / Dropout / 数据增强 / 双 GPU 分组)。
  • Simonyan & Zisserman, Very Deep Convolutional Networks for Large-Scale Image Recognition(2014,arXiv:1409.1556)——VGG,含 3×33\times3 堆叠的系统对照实验(论文表 1 的 A–E 列)。
  • He, Zhang, Ren & Sun, Deep Residual Learning for Image Recognition(2015,arXiv:1512.03385)——ResNet,含退化问题的实验对照与瓶颈设计(表 1)。
  • He, Zhang, Ren & Sun, Identity Mappings in Deep Residual Networks(2016,arXiv:1603.05027)——pre-activation 版本与「恒等通路必须干净」的论证。
  • Szegedy et al., Going Deeper with Convolutions(2014,arXiv:1409.4842)——Inception / GoogLeNet。
  • Huang et al., Densely Connected Convolutional Networks(2016,arXiv:1608.06993)——DenseNet。
  • Xie et al., Aggregated Residual Transformations for Deep Neural Networks(2016,arXiv:1611.05431)——ResNeXt 与 cardinality。
  • Ding et al., RepVGG: Making VGG-style ConvNets Great Again(2021,arXiv:2101.03697)——训练多分支、推理单分支的重参数化。
  • Liu et al., A ConvNet for the 2020s(2022,arXiv:2201.03545)——ConvNeXt,把 ResNet「现代化」到与 Swin 同级。

本节小结:AlexNet 的贡献是一套可训配方(并暴露出「参数全在全连接层」这一结构缺陷);VGG 用小核堆叠 + 结构规整把深度变成可研究的变量;盲目加深会退化(训练误差也升,不是过拟合),残差连接同时提供了「恒等映射变便宜」与「梯度直通项 II」两条机制;瓶颈与分组是在固定预算下重新分配深度 / 宽度 / 通道混合的手段。下一节把视角从「卷积怎么堆」切换到「能不能不用卷积」——Vision Transformer 及其混合设计。