五个模型,一部 CNN 进化史
这一章讲三件事: 第一个卷积网络长什么样(逐层带参数走一遍); 后面四代各自治的是上一代的什么病; 以及一个反直觉的现象 —— 56 层的网络,误差比 20 层的还大。 它在全书链条里的位置是第 10 级台阶的后半:第 10 章讲了卷积这一招,这一章讲别人已经卷成了什么样。 这一章的主走查是一张 32×32 的手写数字图,先在第一个模型里逐层走完,再问「换成后面四个会怎样」。 遇到的生词都在当场解释。
1. 顶层全景
LeNet(1998) 把结构定下来:卷积 → 池化 → 卷积 → 池化 → 全连接
│ 约 6 万个参数,认手写数字
│ 病:换成一千个类别的真实照片就不够用了,而且训不动
▼
AlexNet(2012) 不改大结构,改**四件工程手段**:
│ 数据增强 / ReLU / 局部响应归一化 / Dropout
│ 6000 万参数,拿下 ImageNet 冠军
│ 病:卷积核挑得随意(7×7、11×11 都有), 没有规律
▼
VGGNet(2014 亚军) **一律只用 3×3**,靠层数换视野
│ 1.38 亿参数 —— 深度有好处,但停在了 16—19 层
│ 病:参数太多,而且「这一层该用多大的核」仍然要人猜
▼
GoogleNet(2014 冠军)**几种核并联,让网络自己挑**(Inception)
│ 22 层却只有 500 万参数,是 VGG16 的 1/27
│ 病:再往深了堆,精度反而掉
▼
ResNet 加一条**跳过两层的直连**,让这一段至少能「什么都不做」
18 / 34 / 50 / 101 / 152 层都训得动
图说:这条线的读法只有一个 —— **箭头上写的「病」才是重点,不是模型名字。**
每一代都是为了解决上一代那个具体的毛病才长出来的。
2. LeNet:第一个,也是所有后来者的骨架
书称它是卷积神经网络的基石,之后的多种结构都是在它的基础上改进演变而来, 所以 Yann LeCun 也被称为「卷积之父」1。
结构:八层,每层干什么
书给的是 LeNet-5:总共 8 层 —— 1 个输入层、3 个卷积层、2 个池化层、 1 个全连接层、1 个输出层2。书用首字母标层:C 是卷积层,S 是下采样(池化)层,F 是全连接层。
输入是一张 32×32 的黑白图,而真正的数字只占中间 28×28,四周是填出来的3。
逐层走一遍(这是本章主走查的前半程)
每一层的输出尺寸和参数量都是书给的(只有 F6 那一笔书正文没给,是我们补算的), 我们用第 10 章那条公式核过一遍。
输入 32 × 32 黑白图
── C1 卷积层 ────────────────────────────────────────
6 个 5×5 的核,步长 1
输出边长 = (32 − 5 + 0) ÷ 1 + 1 = 28 ⇒ **6 张 28×28**
神经元个数 = 6 × 28 × 28 = **4704**
参数 = 6 个核 × 25 + 6 个偏置 = **156**
── S2 池化层 ────────────────────────────────────────
池化核 2×2,步长 2
28 ÷ 2 = 14 ⇒ **6 张 14×14**
参数 = 6 × 2 = **12** ← 见下面「这一层有个坑」
── C3 卷积层 ────────────────────────────────────────
60 个 5×5 的核
输出边长 = (14 − 5) ÷ 1 + 1 = 10 ⇒ **16 张 10×10**
参数 = 60 × 25 + 16 = **1516**
⚠ C3 与 S2 **不是全连接的** —— 哪张输入图连到哪张输出图,书给了一张对照表
(那张表在书里是图片,不在清洗文本里)
── S4 池化层 ────────────────────────────────────────
10 ÷ 2 = 5 ⇒ **16 张 5×5**
参数 = 16 × 2 = **32**
── C5 卷积层 ────────────────────────────────────────
120 个 5×5 的核,和 S4 的全部特征图相连
输出边长 = (5 − 5) ÷ 1 + 1 = 1 ⇒ **120 张 1×1**
核的总数 = 120 × 16 = 1920
参数 = 1920 × 25 + 120 = **48 120** ← 一层就占了全网的八成
── F6 全连接层 ──────────────────────────────────────
和 C5 那 120 个数全连接,输出 **84** 个数
参数 = (120 + 1) × 84 = **10 164**
⚠ 这一笔**书正文没给**(它在书里那张汇总表的图片上),
是我们照它自己算输出层的口径补的:每个输出接全部输入,再各配一个偏置
── 输出层 ───────────────────────────────────────────
10 个单元,对应 0—9
参数 = (84 + 1) × 10 = **850**
── 全网合计 ─────────────────────────────────────────
156 + 12 + 1516 + 32 + 48 120 + 10 164 + 850 = **60 850**,约 **6 万**
图说:除 F6 那一笔外,所有尺寸和参数量都是书给的;每一步的尺寸我们用第 10 章那条公式核过,对得上。
**C5 那一层是个信号 —— 它其实已经和全连接层没什么两样了**(输入 5×5、核 5×5,
滑一步都滑不动),书自己也点了这一点。