经典 CNN 演进
介绍 AlexNet 与 VGG,理解其历史地位与块结构的设计思想。
从 MNIST 走向 ImageNet
《CNN 实战:MNIST》中训练的 SimpleCNN 在 MNIST 上拿到 99% 已经"看起来很好"了—— 但 MNIST 只是 28 × 28 的灰度小图,分类目标只有 10 类。 要让 CNN 真正 改变整个计算机视觉的格局 ,需要更大、更难的舞台。
这个舞台就是 ImageNet 大规模视觉识别挑战赛 (ILSVRC)—— 1000 个类别、上百万张彩色图像。 2012 年开始的几年里,一系列经典 CNN 在这个比赛上接连刷新记录, 把 深度学习 送上了今天的位置。
本节 不深入 讲解这些网络的每一层结构—— 历史上的具体 CNN,我们只需要建立" 它们解决了什么、留下了什么思想 "的印象。 重点关注 AlexNet 与 VGG : 前者是 CNN 时代的开启者,后者贡献了一个会一直延续到 ResNet / Transformer 的关键设计—— 块结构 。
CNN 的历史脉络(简要梳理)
把这条时间线对应到 ImageNet 比赛的成绩上,趋势会更清楚: 2012 年 AlexNet 夺冠之后的几年里,冠军模型的识别错误率快速下降,网络深度却在同时大幅增长 ——下面这张图正是把这两条线索放在一起。
图中衡量精度的指标是 ImageNet 上常用的 Top-5 错误率 :模型为每张图给出概率最高的 5 个类别, 只要真实类别落在这 5 个里就算判对, Top-5 错误率 就是"真实类别没能进前 5"的图像所占比例。 它比只看最有把握的那一个预测(即我们已熟悉的 准确率 ,这里也叫 Top-1 )更宽松。
折线是历年冠军的 Top-5 错误率:从 2010 年传统方法的 28.2% 一路降到 2015 年 ResNet 的 3.6%, 已低于约 5% 的人类水平;柱子是对应里程碑模型的层数,2012—2015 间深度从 8 层快速增长到 152 层。 2010、2011 年的冠军是传统方法、2016、2017 年是多模型集成,都没有单一「网络层数」, 因此这些年份只有错误率、没有层数柱。将鼠标悬停在图上可读出每年的具体数值。
AlexNet:CNN 时代的开关
2012 年的 ImageNet 比赛上, AlexNet (Krizhevsky / Sutskever / Hinton)以 Top-5 错误率 15.3% 拿到冠军—— 比第二名(传统手工特征方法)足足领先约 10 个百分点。 15.3% 的 Top-5 错误率意味着约 85% 的图像,正确答案都进了模型预测的前 5 名。 这场比赛被广泛认为是 深度学习时代的起点 。
网络结构
- 输入: 227 × 227 × 3 (彩色图,比 MNIST 大近两个数量级)
- 5 个卷积层 + 3 个全连接层 ——层数只比 LeNet 多几层,真正变大的是 规模 :参数量约 6000 万 ,约为 LeNet(6 万)的上千倍
- 训练时使用了两块 GPU 做并行(这是当年的关键工程努力)
下图按与《卷积神经网络的结构》中"形状演算:跟着 LeNet 走一遍"一节相同的画法, 把逐层输出张量的形状可视化:每个卷积阶段的输出是一个 的三维张量,用一组堆叠的方块表示—— 单个方块的边长越大,表示该层输出的空间尺寸 越大; 堆叠的层数越多,表示通道数 越多。 末端的全连接层输出为一维向量,用一根竖条表示。 每个图形 下方 标注该层输出的形状(记作"通道数@高×宽"), 产生它的层名标注在 指向它的箭头上方 ; 最前面的输入张量没有前置层,因此在其上方直接标注"输入"。颜色仅用于区分相邻的层。
主要贡献
VGG:把网络"模块化"
AlexNet 之后两年,2014 年的 VGG(Visual Geometry Group, Oxford)带来了 一个新设计思路 —— 与其手工堆叠不同尺寸、不同配置的层,不如 把网络拆成若干相同模式的"块" , 再把这些块重复堆叠。
VGG 块(VGG block)
每个 VGG 块由 若干 3 × 3 卷积层 + ReLU + 一次最大池化 组成:
块内的 3 × 3 卷积层数 n 是一个可调参数。 VGG-16 / VGG-19 等不同变体的差异, 主要就在每个块内的卷积层数不同 。
下面是 vgg_block 的一种 PyTorch 实现,逐步展开即可(仅作浏览,不要求精读):
VGG 整体网络
VGG-16 把 5 个 VGG 块依次堆叠,块内卷积层数为 [2, 2, 3, 3, 3] , 输出通道数翻倍递增 [64, 128, 256, 512, 512] , 最后接 3 个全连接层。整网约 1.38 亿 参数。
VGG-19 在后三个块(块 3、4、5)中各多加一层卷积,使块内卷积层数从 [2, 2, 3, 3, 3] 变为 [2, 2, 4, 4, 4], 结构上的 差异仅此而已 ——这正是块结构带来的" 可参数化扩展性 "。
下图用与上面 AlexNet 相同的画法呈现 VGG-16 的逐块形状变化: 每经过一个 VGG 块,空间尺寸减半(方块变小)、通道数大致翻倍(堆叠变厚), 直到末端展平接入全连接层(竖条)。
"块结构"是一个会延续下去的思想
VGG 真正的价值不在它具体的 16 / 19 层, 而在它示范了一种 构建大型网络的方法论 :
这种思想后续会反复出现:
- ResNet (本章后续课程):把 VGG 块替换为 残差块 , 块的内部多了一条恒等旁路。整体仍然是"块堆叠 + 通道递增"的范式;
- Transformer (后续章节):每一层都是同样的" 多头注意力 + 前馈网络 + 残差 + LayerNorm "模块, 堆叠 6 / 12 / 24 / 96 层不等。 整个 Transformer 就是一种块结构 。
加深,是不是越深越好?
VGG-19 已经做到 19 层,再深一些会怎样?直觉是 越深越强 —— 毕竟感受野更大、特征层次更丰富。然而实验告诉我们另一个故事: 把一种网络从 20 层 加深到 56 层 , 训练损失反而上升 。 不是过拟合(如果是过拟合,训练损失应该比浅网络更低), 而是 连训练集都难以拟合 。
这是怎么回事?为什么"加层"反而让网络"变笨"了?