现代卷积神经网络:CNN 的进化史
本章来源:本文整理自《动手学深度学习》(zh.d2l.ai)第 7 章《现代卷积神经网络》,原书作者 Aston Zhang、李沐、Zachary C. Lipton、Alexander J. Smola。
本章讲什么
上一章的 LeNet 证明了卷积网络可行。这一章讲述 CNN 接下来十几年的进化史——从 AlexNet 到 DenseNet,每一代网络解决一个关键问题,留下一个深刻的设计思想。理解这条进化线,你就理解了现代深度网络的骨架。
AlexNet:深度学习的翻身仗
在 AlexNet 之前,计算机视觉的主流是手工设计特征:先用 SIFT、HOG 等算法从原始像素中提取特征,再送入 SVM 等分类器。整个流水线是"手工特征 + 浅层分类器",进步主要来自对特征更聪明的想法。
AlexNet(2012 年)首次证明"学习到的特征"可以完胜"手工设计的特征"。它用 8 层卷积神经网络(5 个卷积层 + 2 个全连接隐藏层 + 1 个输出层)赢得 ImageNet 挑战赛,是深度学习复兴的标志性事件。
突破依赖两个此前缺失的成分:
- 大数据:ImageNet 提供了百万级标注样本。
- 大算力:GPU 让卷积、矩阵乘法这些可并行操作变得可行。GPU 用上千个较弱的核心换来数量级更高的并行性能——像多个小工人协作胜过少数强人。
AlexNet 相对 LeNet 的改进:网络更深更宽、用 ReLU 替代 sigmoid(避免梯度饱和)、用 Dropout 控制复杂度、用图像增强扩充数据。
它深刻揭示了"端到端学习"(从像素直接到分类结果)相对经典流水线的优势。
VGG:用块组装网络
AlexNet 证明了深网络有效,但没给出可复用的"设计模板"。VGG 提出**块(block)**这一抽象:把"若干卷积层 + 一个池化层"打包成标准单元,通过循环堆叠块来构建任意深度的网络。
VGG 块的标准配置:带填充保持分辨率的 3×3 卷积 + ReLU + 2×2 最大池化(步幅 2,分辨率减半)。VGG-11 由 5 个卷积块(共 8 个卷积层)和 3 个全连接层组成。
论文的关键发现:深层且窄的卷积比浅层且宽的卷积更有效——多个小卷积核堆叠可以在更少的参数下获得同样的感受野。这就好比工程师从晶体管 → 逻辑元件 → 逻辑块的层级设计,思考方式不断抽象。
NiN:1×1 卷积与全局平均池化
LeNet、AlexNet、VGG 有个共同模式:先用卷积提取空间特征,再用全连接层处理。但全连接层有两个问题:破坏特征的空间结构、参数巨大极易过拟合。
NiN(网络中的网络)的解决方案很巧妙:
- 用 1×1 卷积充当"逐像素的全连接层":把每个像素看成独立样本、把通道看成特征,多层感知机就作用在每一个像素的通道上——既保留了空间结构,又在卷积阶段引入更多非线性。
- 完全取消全连接层,改用全局平均池化层(对整张特征图求平均)直接输出类别分数,大幅减少参数、缓解过拟合。
"1×1 卷积 = 逐像素 MLP"和"全局平均池化替代全连接"这两个设计深刻影响了后续所有现代 CNN。
GoogLeNet:Inception 块与多尺度
GoogLeNet(2014 年 ImageNet 冠军)回答了一个问题:到底多大的卷积核最合适?答案是:不同大小的卷积核各有好处,组合使用效果更好——不同尺寸的滤波器可以识别不同范围的图像细节。
它设计了 Inception 块:一个由四条并行路径组成的子网络——
- 1×1 卷积;
- 1×1 卷积 → 3×3 卷积;
- 1×1 卷积 → 5×5 卷积;
- 3×3 最大池化 → 1×1 卷积。
其中大卷积核前的 1×1 卷积用来降低通道数、控制计算量。四条路径的输出在通道维度上拼接成块的输出。GoogLeNet 用 9 个 Inception 块堆叠,结尾用全局平均池化替代全连接层。
名字取自电影《盗梦空间》(Inception)——片中台词"我们需要走得更深"恰好呼应加深网络的追求。
批量规范化:加速收敛
训练深层网络很难快速收敛。批量规范化(BatchNorm,BN) 是一种持续加速收敛的实用技术。
动机:输入特征做标准化(均值 0、方差 1)对优化很有帮助;但网络中间层的输出分布会随训练剧烈波动,可能阻碍收敛。
BN 的做法:在每个(可选的)层中,先把输入减去当前小批量的均值、除以标准差,变成零均值单位方差,然后再乘以可学习的拉伸参数、加上偏移参数以恢复表达能力。它放在线性变换/卷积之后、激活函数之前。
关键细节:
- BN 依赖小批量统计量,所以批量太小(如 1)无法工作。
- 训练模式用小批量统计(其噪声反而带来正则化效果),预测模式用全数据集统计量的移动平均。
- 卷积层是"每个通道"单独做 BN。
- BN 让各层输出分布稳定,允许使用大得多的学习率;与残差块结合后,训练 100 层以上的网络成为可能。
一个有意思的历史注脚:BN 原始论文把效果归因于"减少内部协变量偏移",但这个解释后来被普遍质疑(还引发了"炼金术"之争)。不过 BN 作为一种被广泛验证有效的技术,地位无可撼动。
ResNet:残差连接解决"加深变差"
一个核心困惑:为什么网络不是越深越好?
数学视角:如果新加的层不能表达为旧函数的超集(非嵌套函数类),更复杂的函数类反而不保证更接近真函数。理想情况下,我们希望新加的层至少能被训练成恒等映射(f(x) = x),这样深层模型至少不比浅层差。
但让层直接学恒等映射很困难。ResNet 的关键洞察:让层去学习残差映射(f(x) - x)要容易得多——只需把权重设为零,就能得到恒等映射。
于是有了残差块:两个 3×3 卷积(各接 BN 和 ReLU)之后,把输入通过跨层捷径直接加到输出上。需要改变通道数或分辨率时,用 1×1 卷积把输入变换成匹配的形状再相加。
残差连接像"搭积木加保险":即使新层没学到任何东西,输出仍通过捷径保留原有信息——因此加深至少不坏事。它让输入信息更快向前传播,使训练上百层的网络成为可能。ResNet-18 等模型赢得 2015 年 ImageNet 冠军,架构比 GoogLeNet 更简洁、更易修改,深刻影响了后续所有深度网络设计。
DenseNet:通道拼接的极致特征复用
DenseNet 是 ResNet 的逻辑扩展。书中用泰勒展开类比:ResNet 把函数展开成两项(一个简单线性项加一个复杂非线性项),而 DenseNet 想展开成"超过两部分的信息"。
关键区别在跨层连接的结合方式:ResNet 用相加,DenseNet 用通道维上的拼接——每一层的输入是前面所有层输出的拼接,最后一层与之前所有层"稠密相连"。
DenseNet 由两种构件组成:
- 稠密块:内部每个卷积块把输入和输出在通道维上拼接,输出通道数固定增量(叫增长率)。
- 过渡层:用 1×1 卷积减小通道数、用步幅 2 的平均池化减半高宽,控制模型复杂度,防止通道数无限膨胀。
由于每个卷积块只增加少量通道,DenseNet 参数比 ResNet 更少、特征复用更充分;代价是中间层输出需要拼接保存,显存消耗较大。
小结
- AlexNet 证明学习到的特征胜过手工特征,靠大数据 + GPU 开启深度学习复兴。
- VGG 提出"块"抽象,发现深而窄的卷积更有效。
- NiN 用 1×1 卷积和全局平均池化取代全连接层。
- GoogLeNet 用 Inception 块并行融合多尺度卷积。
- 批量规范化稳定中间层分布、加速收敛。
- ResNet 用残差连接让加深真正有效,是后续所有深度网络的基石。
- DenseNet 用通道拼接实现极致的特征复用。
关键术语
| 术语 | 一句话解释 |
|---|---|
| AlexNet | 2012 年赢得 ImageNet 的 8 层 CNN,深度学习复兴标志 |
| 端到端学习 | 从原始像素直接学习到结果,无需手工特征 |
| VGG 块 | 若干 3×3 卷积后接一个池化的可复用单元 |
| 1×1 卷积 | 等价于逐像素全连接,可增删通道 |
| 全局平均池化 | 对整张特征图求平均,替代全连接层 |
| Inception 块 | 四条并行路径融合多尺度信息的子网络 |
| 批量规范化(BN) | 标准化层输出再学缩放偏移,加速收敛 |
| 残差连接 | 把输入跳过若干层直接加到输出的捷径 |
| 残差块 | 带跨层加法连接的块,学习残差映射 |
| 恒等映射 | f(x)=x,新增层最理想的"无害退化"状态 |
| 稠密块 / 过渡层 | DenseNet 的构件:通道拼接 / 控制复杂度 |