跳到主要内容

五个模型,一部 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,
滑一步都滑不动),书自己也点了这一点。

C5 那句话为什么重要

书特意解释了 C5 为什么还叫卷积层:输出是 1×1 只是因为输入图正好这么大; 把输入图放大,这一层的输出就不再是 1×1,和全连接层的区别就显出来了4

这是一个很好的判据:一层是不是卷积层,看的是它「换个尺寸的输入还成不成立」, 而不是它这次吐出来的东西长什么样。

这一层有个坑:池化到底有没有参数

书在这里前后说了三种话,而且互相打架 —— 要当场讲清楚,否则读者会以为自己算错了。

书说 S2「在 LeNet 中采用最大池化(max pool)」, 可同一段的后半句又说:在 LeNet 中,采用平均池化后,均值乘上一个权值参数、 加上一个偏置参数,作为激活函数的输入;所以 S2 也有 6×2 = 12 个参数5。 到 S4 那一段,书又写「池化方式为最大池化」6

判断(我们的,不是书里的):这里书自相矛盾,正确的是「带权重和偏置的平均池化」。

三条理由: ① 书自己给的参数账(S2 有 12 个 = 6 张特征图各一个权重一个偏置) 只有平均池化那个说法才解释得通 —— 最大池化不带任何参数; ② 书自己在同一段里写了「均值乘上一个权值参数加上一个偏置参数」,这是平均池化的做法; ③ 书自己列的参考文献 [17] 就是 LeCun 等人 1998 年那篇原论文, LeNet-5 原始设计用的正是这种带权重的子采样。

顺带把「一般池化层是没有参数的」这句也接上: 那句话是对的 —— 今天说的池化确实没有参数,LeNet 是个例外,它给池化额外加了权重和偏置。 书把这两件事写在同一段里,读起来像自相矛盾,其实是「通例」和「这个特例」。

如果错,会错在: 如果书指的是某个 LeNet 的后世变体(有些实现确实把子采样换成了最大池化), 那「最大池化」这个说法在那个变体上成立 —— 但那样的话 12 个参数就不该存在。 判据是:参数账和池化方式,两者只能同时成立一次。

还有一处年份对不上

书写 LeNet 是 Yann LeCun 于 1988 年提出的1, 而书自己列的参考文献 [17] 是 LeCun 等人 1998 年那篇7差了整整十年。 一般说的 LeNet-5 指的是 1998 年那一版。

书自己从这张表里读出的两条观察

书在总结表里点了两件事,都比模型本身重要8:

观察说明
随着网络加深,激活值尺寸逐渐变小 —— 但降太快会伤性能32 → 28 → 14 → 10 → 5 → 1,是一路缓降,不是一步到底
卷积层的参数相对较少,大量参数都堆在全连接层上面那笔账:C1 只有 156 个,C5 就有 48 120 个

第二条是后面三代模型共同的靶子。 GoogleNet 干脆把全连接层大部分换掉, 就是冲着它来的(第 5 节)。

一处「今昔之别」,书交代得很坦白

LeNet 的输出层原来用的是径向基函数单元 —— 算的是「这个输入离这一类的标准长相有多远」, 挑最近的那一类当答案。书说:「如今已经不采用径向基函数了,而是改用 Softmax() 函数」9

Softmax 第 07 章讲过:把一串数压成加起来等于 1 的一组可能性。

3. AlexNet:结构没大改,改的是四件工程手段

这是本章第一个承重点。

现象先行:2012 年那次夺冠,靠的不是新结构

AlexNet 由多伦多大学的 Alex Krizhevsky 等人在 2012 年提出, 拿下了当年的 ImageNet 大规模视觉识别竞赛冠军10

先交代 ImageNet 是什么,否则「冠军」这两个字没有分量: 它是李飞飞团队创建的一个大型图像数据库,包含超过 1400 万张带标签的图像; 自 2010 年起每年办一次比赛(ILSVRC),分类比赛有 1000 个类别,每类 300—1000 张图11

和 LeNet 比,难度差在哪: LeNet 认的是 10 个手写数字、32×32 的黑白小图; AlexNet 认的是 1000 个类别的真实彩色照片类别数翻了一百倍。

AlexNet 的结构,以及那笔参数账

5 个卷积层 + 3 个全连接层 + 3 个池化层 + 2 个 Dropout 层; 大约 65 万个神经元、6000 万个参数12

参照物:LeNet 全网加起来 60 850 个参数(上面那笔账加一加),AlexNet 是它的一千倍。

真正的贡献是四件事

书列的四条创新点,没有一条是「改了网络结构」13:

#做了什么治的什么
数据增强训练样本不够
激活函数换成 ReLUsigmoid 太慢、梯度消失
局部响应归一化神经元之间没有竞争
Dropout过拟合

逐条讲开:

① 数据增强:拿现有的图片变着花样造出更多训练样本。 书说 AlexNet 用了两种 —— 镜像加随机剪裁(把图翻过来、随机切一块), 以及改变训练样本 RGB 通道的强度值(调颜色)。 目的是从数据这一侧增加多样性,从而增强网络的泛化能力13

⚠ 这一味药在第 13 章会出问题,现在就记一笔: 「镜像」这一手在预测转角那个任务上会毁掉数据 —— 图翻过来了,该左转了, 可标签还写着右转。为什么、以及那里改用什么,第 13 章讲。

② ReLU 换掉 sigmoid —— 第 07 章讲透了,这里不重讲。

书在这里补了一条第 07 章没提的好处: ReLU 会让部分神经元的输出为 0,可以提高网络的稀疏性、 减少参数之间的相关性,从而在一定程度上减少过拟合13。 (「稀疏」就地解释:一堆数里绝大多数是 0 的那种状态。)

③ 局部响应归一化:对局部神经元创建竞争机制 —— 让响应大的值更大、响应小的受到抑制13这一手后来基本被淘汰了(被批归一化取代),书没有提这一点。(补充:不在书里,来自通用知识。)

④ Dropout —— 这是本节的承重词,单独讲。

Dropout:治的正是第 07 章那个过拟合

先把病复述一句(第 07 章讲过,这里只回指): 模型把训练那批数据背下来了,训练集上分数漂亮,一换成没见过的数据就掉下来。 参数越多越容易背 —— 而 AlexNet 有 6000 万个参数。

做法出奇地简单: 对一层里的神经元,按一个事先定好的概率, 随机让其中一部分这一次输出 0 —— 也就是这一次前向和回传它都不参与; 同时保证输入层与输出层的神经元个数不变13

这一批数据: ○ ● ○ ● ● ○ ● ● ● 参与,○ 这次被丢掉
下一批数据: ● ● ● ○ ○ ● ○ ● 丢掉的换了一批
再下一批: ● ○ ● ● ○ ○ ● ●

⇒ 网络永远不知道下一次哪几个神经元在,
**所以它没法依赖某几个神经元的固定组合**,只能让每个神经元各自都学到点真东西。

图说:注意「随机」是每一批重新掷一次,不是一次性删掉几个神经元。
预测的时候全部神经元都在,不丢。(最后这一句是我们补的,书没写。)

书还给了第二种理解方式: 因为每次随机置零的是不同的一批, 所以可以看成是「不同模型之间的组合」13 —— 你训的其实不是一个网络, 而是无数个「缺了几个神经元」的网络,最后把它们的本事合在一起用。

第 13 章那个巡航模型也用了 Dropout,但丢弃率只取 0.1(丢一成) —— 为什么取这么小,那一章讲。

4. VGGNet:全用 3×3,靠层数换视野

现象先行:一个反直觉的选择

AlexNet 里的卷积核相对都比较大(比如 7×7)。 VGGNet 反过来 —— 基本只用 3×3 的小核,同时把层数加上去14

卷积核越小看得越窄,这不是往回走吗?

书给的账:三个 3×3 顶一个 7×7

书的原话是:用 3 个 3×3 的卷积核,其感受野大小就与一个 7×7 的卷积核相等15

为什么(这一步书没有拆开,是我们补的):

第一层 3×3:输出上的一个格子,看得见输入上 3×3
第二层 3×3:它的一个格子看得见上一层 3×3 个格子,
而那 3×3 个格子各自看得见输入上 3×3、互相错开一格
⇒ 合起来覆盖输入上 **5×5**
第三层 3×3:同理再撑一圈 ⇒ **7×7**

图说:每叠一层 3×3,感受野的边长就 +2。所以 3 层 = 3 + 2 + 2 = 7。
**视野不是靠核大挣来的,是靠层数攒出来的。**

换来的三个好处,书都给了15:

好处
参数更少两个 3×3 = 2 × 9 = 18 个;一个 5×5 = 25 个。前者只占后者的 72%
非线性更多每个卷积层后面都跟一道激活函数(第 07 章那道「掰弯」)。层数多一倍,掰弯的次数就多一倍 —— 网络能表示的形状更复杂
通道更多每个通道就是一张特征图,通道多意味着能提取的特征更多

书还提了 1×1 的核:它不改变感受野,但照样带一道激活函数 —— 所以它是「只加非线性、不加视野」的一个纯手段15。这一手在下一节还会出现。

深度不是越深越好,VGG 自己撞到了墙

书说得很明白:原作者通过对比不同深度的网络证明了深度提升有利于提高准确率, 但深度加深并非没有限制 —— 加深到一定程度后继续加深会导致网络性能的退化; 所以 VGGNet 的深度最终被确定在 16—19 层之间14

VGG16 的规模:输入 224×224×3,参数约 1.38 亿个16

参照物:AlexNet 是 6000 万,VGG16 是它的 2.3 倍;LeNet 约 6 万,VGG16 是它的两千多倍。

「退化」这个现象在这里被点了名,但没有被解决 —— 它要等到第 6 节的 ResNet。

5. GoogleNet:不挑核,几种一起上

现象先行:「这一层该用多大的核」凭什么由人来猜

VGG 的答案是「全用 3×3」,GoogleNet 的答案是 「都要」

它是 2014 年 ILSVRC 分类比赛的冠军(VGGNet 是那年的亚军)17

做法:把几种核并联成一个模块

书的说法是:把多个卷积和池化操作放在一起组装成一个网络模块, 设计网络时以模块为单位去组装。这个模块叫 Inception。18

最初版本的 Inception,四条路并联:

┌──▶ 1×1 卷积 ──┐
上一层的输出 ──┼──▶ 3×3 卷积 ──┼──▶ 拼在一起 ──▶ 输出
├──▶ 5×5 卷积 ──┤
└──▶ 3×3 最大池化 ──┘

图说:核心思想是**用不同大小的核在不同尺度上看同一片输入**,
最后把几种视角的信息融合起来。
**既然不知道该用多大的核,那就都算一遍,让训练自己决定哪条路重要。**

但这个版本有两个毛病,书自己指出来了

书列了两条19:

毛病说明
计算量很大所有卷积层直接和前一层的全部输入对接 —— 上一层有多厚,每条路就要吃多厚
越拼越厚那条池化的支路原样保留了输入的深度,所以每过一个模块,输出的厚度只增不减

「厚度」就地解释: 一层吐出多少张特征图,这个数就是它的厚度(也叫通道数)。 第 10 章讲过 —— 每个卷积核立方体吐一张特征图,放几个核就有几张。

治法:先用 1×1 卷积把厚度压回去

Inception V1 相较最初版本,加了 3 个 1×1 卷积,目的是「压缩降维、减少参数量」, 从而让整个网络能做得更深更宽;而且 1×1 卷积也带一道激活函数, 顺带提升了网络的表达能力20

1×1 卷积怎么就能压厚度(书没拆开,我们补): 一个 1×1 的核立方体,平面上只看一个格子,但纵向要吃完全部通道所以放 32 个这样的核,不管进来多厚,出去就是 32 张。 —— 它一个像素的视野都不加,只管调厚薄。

结果:22 层,却只有 500 万参数

模型层数参数
GoogleNet22 层(算上池化层 27 层)约 500 万
VGG1616 层约 1.38 亿 —— 是它的 27 倍多21
AlexNet8 层6000 万 —— GoogleNet 只有它的 1/1217

更深、参数更少、精度更高 —— 三样同时拿到。这在这条演进线上是唯一一次。

参数是从哪儿省下来的:书给的答案很直接

GoogleNet 没有采用 VGGNet、LeNet、AlexNet 都有的三层全连接层, 而是在 Inception 模块之后直接用平均池化和 Dropout, 既降了维,又在一定程度上防止了过拟合。

平均池化之后只留一个全连接层,用来做微调22。 (「微调」就地解释:拿一个已经训好的模型,再用少量数据小幅改一改它的参数,而不是推倒重训。)

这正是第 2 节那条观察的兑现:「大量参数都堆在全连接层」—— 那就把全连接层拆掉。

一个只在训练时存在的部件

GoogleNet 里还有两个辅助分类器 —— 挂在网络中间,也吐一个分类结果。 书给的目的是:避免梯度消失,让训练更稳、收敛更快; 它们只在训练时用,预测的时候会被去掉23

为什么这管用(接第 07 章): 梯度消失是「误差信号从输出往回传,越传越弱」。 从网络中间再插一个出口,那一段就多了一条短得多的回传路径。 (这一句是我们补的,书只说了目的。)

6. ResNet:治「越深反而越差」

这是本章第二个承重点,而且它从一个反直觉的现象讲起。

现象先行:56 层比 20 层还差

书给的这个数值得记住:随着网络深度增加,精度达到饱和; 继续增加深度,反而会导致精度快速下降、误差增大 —— 56 层的神经网络表现明显要比 20 层的差24

这不是过拟合。 过拟合是「训练集上好、测试集上差」; 而这里是训练集上就差 —— 网络连背都背不下来。 书把这个现象叫退化问题

书还列了深度增加带来的另一个问题:梯度消失或梯度爆炸 —— 但书接着说,这一个「可以通过归一化处理和 Batch Normalization 得到很大程度的解决」24; 退化才是那个没被解决的。

(梯度爆炸就地解释:第 07 章讲了梯度消失 —— 信号往回传越传越弱; 爆炸是它的反面 —— 越传越大,大到数值溢出,训练直接崩掉。书只提了名字。)

做法:加一条跳过去的线

书的核心公式是 H(x) = F(x) + x25。拆开看:

┌──────── x 原样跳过来(书叫 shortcut)────────┐
│ ▼
输入 x ───┴──▶ 两三层网络 ──▶ F(x) ──────────────▶ 相加 ──▶ H(x)

「相加」是字面的:**两个形状相同的特征图,对应位置上的数字相加**。
所以这两条路的尺寸必须一样,否则加不起来。

图说:关键在于「如果这两三层什么用都没有,会怎样」——
那就让 F(x) 学成 0,H(x) = x,**这一段等于不存在,信息原样通过。**

为什么这一条线就治好了退化

书给的解释一句话就够:让模型的内部结构至少有恒等映射的能力, 以保证在堆叠网络的过程中,网络至少不会因为继续堆叠而产生退化26

「恒等映射」就地解释:进去什么、出来什么,原样不动。

把这句话翻译成人话:

❌ 没有直连:
多加两层,这两层必须**学会「原样传递」**才能不添乱。
而「用一堆乘加拼出原样传递」其实很难学 —— 这就是退化的根源。

✅ 有直连:
多加两层,只要让它们学出 0,原样传递就白送。
**网络不需要学会「不添乱」,不添乱是默认状态。**
它只需要在有用的时候学出一点有用的东西。

图说:所以残差网络真正的贡献不是「更强」,
而是**把「加深不会变差」变成了一个下限保证**。

「残差」这两个字是什么意思

字面意思:剩下的那一份差额。

看上面那张图 —— 直连把 x 原样送到了终点,所以中间那两三层 不需要再算出 H(x) 本身,只需要算出「H(x) 比 x 多出来的那一部分」。 多出来的那一部分,就叫残差。

这就是为什么它更好学: 原来要求这几层「把 x 变成正确答案」, 现在只要求它们「说出正确答案比 x 多了多少」——没多多少的时候,答 0 就行。

书给了这个名字的口径:残差是网络搭建的一种操作, 任何使用了这种操作的网络都可以被称为残差网络25 —— 它不是一个特定的模型,是一个可以到处装的零件。

五种深度,以及层数是怎么数出来的

书给了 5 种:18、34、50、101、152 层。 拿 101 层当例子, 书把这个数拆开算了一遍27:

ResNet101 = 1(打头的 7×7 卷积)
+ (3 + 4 + 23 + 3) 个残差模块 × 每个 3 层 = 33 × 3 = 99
+ 1(最后的全连接层)
= **101 层**

⚠ 书特意说明:这 101 层只算卷积层和全连接层,
**激活层和池化层不计在内**。

顺带一个对照:ResNet50 和 ResNet101 唯一的差别在中间那一段 ——
50 层有 6 个模块,101 层有 23 个,相差 17 个模块 = 17 × 3 = **51 层**。

两种残差模块,以及一笔很漂亮的参数账

书给了两种摆法28:

摆法长什么样用在哪
BasicBlock两层 3×3 卷积ResNet18 / 34
Bottleneck三层:1×1 降维 → 3×3 → 1×1 升维ResNet50 / 101 / 152

Bottleneck 的做法是:第一层 1×1 把厚度从 256 压到 64, 中间用 3×3 干活,第三层 1×1 再把 64 撑回 25628「先降后升」还有一个必须的理由: 撑回 256 是为了让这一路的输出和跳过来的 x 形状相同, 否则加不起来。

书给的两笔账,当场核一遍:

BasicBlock(两层 3×3,厚度全程 256):
256 × 256 × 3 × 3 × 2 = **1 179 648 个参数**

Bottleneck(三层):
1×1 降维: 1 × 1 × 256 × 64 = 16 384
3×3 干活: 3 × 3 × 64 × 64 = 36 864
1×1 升维: 1 × 1 × 256 × 64 = 16 384
─────────
**69 632 个参数**

降幅:1 179 648 → 69 632,**降到原来的十七分之一**

图说:两个数都是书给的,加法我们核过对得上。
**这就是为什么深的那几个版本(50/101/152)反而用得起更多层** ——
每个模块便宜了十七倍。
(怎么读那个乘法:「输入厚度 × 输出厚度 × 核高 × 核宽」——
每一个输入通道到每一个输出通道,都要配一个 核高×核宽 的小方块。)

7. 主走查:一张 32×32 的手写数字图,换五个模型走

这是本章的主走查。第 2 节那一趟是它的前半程,这里是后半程。

━━ 前半程:在 LeNet-5 里逐层走完(第 2 节的账,一行总结) ━━━━━━━

32×32 → C1 六个 5×5 核 → 6 张 28×28(**156** 个参数)
→ S2 → 6 张 14×14(**12**)
→ C3 → 16 张 10×10(**1516**)
→ S4 → 16 张 5×5(**32**)
→ C5 一百二十个核 → 120 张 1×1(**48 120**)
→ F6 → 84 个数(**10 164**,这一笔书正文没给,我们按它自己的口径算的)
→ 输出层 10 个(**850**)
全网合计 **60 850**、约 **6 万** 个参数(把上面几笔加起来)

━━ 后半程:同一张图,换成后面四个会经历什么 ━━━━━━━━━━━━━━━

┌ AlexNet ─────────────────────────────────────────────
│ 结构上还是「卷积 → 池化 → 全连接」那一套,只是宽得多、深得多
│ **真正的差别在四件工程手段**:这张图会被镜像、随机剪裁、调色
│ 造出好几张;激活换成 ReLU;全连接层里随机丢掉一批神经元
│ 代价:**6000 万个参数**(LeNet 的一千倍)

├ VGG16 ───────────────────────────────────────────────
│ 一路只有 3×3 的核,靠层数把视野撑起来
│ (三层 3×3 之后,一个格子看得见的范围就相当于一个 7×7 的核)
│ 代价:**1.38 亿个参数** —— 这条线上最贵的一次

├ GoogleNet ───────────────────────────────────────────
│ 每一步,1×1 / 3×3 / 5×5 / 池化四条路同时算,再拼起来;
│ 拼完用 1×1 把厚度压回去;末尾不用三层全连接,直接平均池化
│ 代价:**约 500 万个参数** —— 22 层却只有 VGG16 的 1/27

└ ResNet ──────────────────────────────────────────────
每两三层就有一条直连把输入原样加到输出上,
于是这张图的信息**永远有一条不衰减的通路直达末端**
代价:看用哪种模块 —— 同一段,BasicBlock **1 179 648** 个参数,
Bottleneck 只要 **69 632** 个

━━ 一句话读完这张表 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

参数量: 6 万 → 6000 万 → 1.38 亿 → 500 万 → (按模块算)
**注意它不是单调上升的。** GoogleNet 那一步是往下掉的 ——
**说明「参数越多越强」从 2014 年起就不成立了。**

这条走查里的数几乎全部是书给的(LeNet 各层、6000 万、1.38 亿、500 万、 1 179 648、69 632);加法是我们核的,LeNet 的 F6 那一笔和全网合计 60 850 是我们算出来的。

8. 作者的判断与证据

说法是哪一类
LeNet 各层的尺寸与参数量有证据,而且我们用第 10 章的公式逐层核过,全部对得上
LeNet 是 1988 年提出的书内错误。 书自己的参考文献 [17] 是 1998 年
S2 用最大池化 / 用平均池化书内自相矛盾。 我们判定为带权重和偏置的平均池化(见第 2 节判断块)
「卷积层参数少,大量参数堆在全连接层」有证据(从它自己那张表读出来的),而且是这一章最有用的一条观察
AlexNet 的四个创新点有证据,与公开资料一致
VGG「两个 3×3 = 18 个参数,一个 5×5 = 25 个,占 72%」有证据,能自己核
「三个 3×3 的感受野等于一个 7×7」有证据(结论正确),但书没有拆开讲为什么,第 4 节那一步是我们补的
GoogleNet 的参数对比(1/27、1/12)有证据,两个数都能对上
「56 层比 20 层误差大」有证据(引自 ResNet 原论文的实验),而且这是全章最有冲击力的一个数
「让模型内部结构至少有恒等映射的能力」有证据,而且是对残差最准确的一句概括
Bottleneck 的两笔参数账有证据,加法我们核过
1×1 卷积为什么能压厚度、辅助分类器为什么能治梯度消失、Dropout 在预测时不丢不在书里。 书给了做法和目的,这三处解释是我们补的
局部响应归一化后来被淘汰不在书里,来自通用知识

9. 边界与局限

  • 这一章对应原书 §9.3。 原书把它和卷积原理放在同一章,合起来会有十个小节, 我们拆成第 10、11 两章:10 答「为什么要卷积」,11 答「别人已经卷成了什么样」。
  • 两处书内错误已在正文当场改正(年份、池化方式),都给了判断块和判据。
  • 书正文没给 F6 那一层的参数数(它在书里那张汇总表的图片上,清洗文本里只有表名)。 上面那 10 164 是我们按书自己算输出层的口径补的:120 个输入各连到 84 个输出, 每个输出再配一个偏置。LeNet 全网的 6 万这个数,依赖这一笔。
  • 书没有讲批归一化(Batch Normalization)。 它在讲 ResNet 时被顺口提了一次 (说梯度消失可以靠它解决),但从来没有解释过是什么、怎么做。 在今天的卷积网络里这是标配。(补充:不在书里,来自通用知识。)
  • 书没有讲这些模型的训练细节。 用什么数据、训多久、怎么调,一概没有。
  • 书停在 2015 年前后。 ResNet 之后的十年,书一个字没有。 这不是遗漏,是成书范围 —— 这本书要的只是「够用来设计一个能塞进小板子的模型」。
  • 那十年里最要紧的一件事,是一套叫「注意力」的做法被搬进了视觉。 注意力的意思是:让模型自己决定该重点看输入的哪几部分, 而不是像卷积那样,永远只看固定大小的一小片。 (补充:不在书里,来自通用知识。)
  • 用这套做法搭起来的视觉模型有个名字:Vision Transformer,今天和卷积网络并列。 这个名字要留住 —— 你出门看任何一份视觉模型的榜单都会撞见它。 (另外两条常被提到的线是 DenseNet 和 EfficientNet。补充:不在书里,来自通用知识。)
  • 这五个模型在本书后面用不上几个。 第 13 章那个巡航模型是自己设计的小网络 (只借鉴了 AlexNet 的层数安排),第 15、16 章用的是 YOLOV3 加 MobileNetV1。 这一章的作用是给你一套读模型的眼光,不是给你一个能直接用的模型。

10. 可带走的

全章主走查一行写完:

一张 32×32 的手写数字图,在 LeNet-5 里走完: C1(156)→ S2(12)→ C3(1516)→ S4(32)→ C5(48 120)→ F6(10 164,书正文没给,我们算的)→ 输出(850), 全网 60 850、约 6 万个参数。

同一张图换成后面四代:AlexNet 6000 万 → VGG16 1.38 亿 → GoogleNet 500 万(22 层,VGG16 的 1/27)→ ResNet 每个模块 1 179 648(BasicBlock)或 69 632(Bottleneck)。

  1. CNN 不是一次发明出来的,每一代治的都是上一代留下的具体毛病 —— 记箭头上的「病」,别记模型名字;
  2. LeNet 定下了骨架: 卷积 → 池化 → 卷积 → 池化 → 全连接 → 输出。 今天所有认图的模型还是这个顺序;
  3. 一层是不是卷积层,看它「换个尺寸的输入还成不成立」, 不看它这次吐出来的东西长什么样(LeNet 的 C5);
  4. 大量参数堆在全连接层,卷积层反而很省 —— 这是后面三代共同的靶子;
  5. AlexNet 的贡献不在结构,在四件工程手段: 数据增强、ReLU、局部响应归一化、Dropout;
  6. Dropout:每一批随机让一部分神经元这次不参与。 逼着网络不能依赖某几个神经元的固定组合;也可以看成「无数个残缺网络的组合」;
  7. VGG:一律 3×3,靠层数换视野。 每叠一层 3×3,感受野边长 +2; 两个 3×3(18 个参数)顶一个 5×5(25 个),只花 72%;
  8. 深度有好处但有上限 —— VGG 自己撞到了墙,停在 16—19 层;
  9. GoogleNet:不挑核,几种并联,再用 1×1 把厚度压回去。 1×1 卷积一个像素的视野都不加,只管调厚薄;
  10. 它还砍掉了三层全连接,换成平均池化 —— 于是 22 层只要 500 万参数;
  11. 56 层比 20 层误差大 —— 这叫退化,不是过拟合(它在训练集上就差);
  12. ResNet 的直连 H(x) = F(x) + x,真正的贡献是把「加深不会变差」变成下限保证 —— 网络不需要学会「不添乱」,不添乱是默认状态;
  13. Bottleneck 用两个 1×1 先降后升,同一段参数从 1 179 648 降到 69 632 —— 十七分之一,这才是深层版本训得起的原因;
  14. 参数量不是单调上升的 —— GoogleNet 那一步是往下掉的。 「参数越多越强」从 2014 年起就不成立了。

11. 原文地图

主题原书章原文位置
LeNet 的地位、「卷积之父」、1988 那个年份第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:119(搜「卷积之父」)
LeNet-5 八层构成;输入 32×32、数字占中间 28×28第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:121(搜「该网络总共有8层」) · text/10-ch09.txt:125(搜「数字仅为图像中间28×28的范围区域」)
C1 的 156 个参数第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:127(搜「共有6×25+6=156个参数」)
S2 那处自相矛盾;12 个参数第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:129(搜「在LeNet中采用最大池化」) · text/10-ch09.txt:129(搜「均值乘上一个权值参数」)
C3 的 1516 个参数;C3 与 S2 不是全连接第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:131(搜「C3与S2并不是全连接的」)
S4 的 32 个参数(又写成最大池化)第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:135(搜「共有16×2=32个参数」)
C5 的 48 120 个参数;C5 为什么仍算卷积层第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:137(搜「倘若将输入图像尺寸增大」)
输出层 850 个参数;径向基函数已改用 Softmax第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:141(搜「如今已经不采用径向基函数了」)
两条观察:激活值尺寸缓降、参数堆在全连接层第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:143(搜「大量的参数都存在于全连接层」)
AlexNet:2012、ImageNet 冠军第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:149(搜「取得了当年的ImageNet大规模视觉识别竞赛冠军」)
ImageNet 是什么:李飞飞团队、1400 万张、1000 类第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:151(搜「李飞飞团队创建」)
AlexNet 的规模:65 万神经元、6000 万参数第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:157(搜「6000万个参数」)
四个创新点(含 Dropout 的做法)第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:161(搜「镜像加随机剪裁」) · text/10-ch09.txt:163(搜「提高网络的稀疏性」) · text/10-ch09.txt:167(搜「按照定义的概率将部分神经元输出置零」)
VGG:2014 亚军、深度停在 16—19 层第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:171(搜「深度最终被确定在16~19层之间」)
VGG16:224×224×3、16 个子层第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:177(搜「输入层为224×224×3的三通道RGB图像」)
三个 3×3 = 一个 7×7;18 vs 25 = 72%;1×1 只加非线性第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:181(搜「仅为前者的72%」) · text/10-ch09.txt:181(搜「不改变模型感受野的情况下增加模型的非线性」)
GoogleNet:2014 冠军、参数是 AlexNet 的 1/12第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:185(搜「参数量仅为AlexNet的1/12」)
22 层、500 万参数、VGG16 是它的 27 倍多第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:187(搜「是GoogleNet的27倍多」)
Inception 的思想与最初版本的四条路第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:189(搜「组装成一个网络模块」)
最初版本的两个毛病第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:193(搜「计算量很大」)
Inception V1 加三个 1×1 卷积压缩降维第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:197(搜「加入了3个1×1卷积」)
用平均池化代替三层全连接;两个辅助分类器第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:199(搜「采用平均池化」) · text/10-ch09.txt:201(搜「辅助分类器」)
退化问题:56 层比 20 层差;梯度消失可靠 BN 解决第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:211(搜「56层的神经网络表现明显要比20层的差」)
残差核心:H(x) = F(x) + x;shortcut;逐元素相加第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:217(搜「恒等映射」) · text/10-ch09.txt:217(搜「shortcut」)
「至少有恒等映射的能力」第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:220(搜「至少有恒等映射的能力」)
五种深度;101 层怎么数出来;50 与 101 的差别第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:222(搜「分别是18、34、50、101和152」) · text/10-ch09.txt:228(搜「1+99+1=101层网络」)
BasicBlock 1 179 648 vs Bottleneck 69 632第9章 卷积神经网络及斑马线识别项目实践text/10-ch09.txt:236(搜「1179648」) · text/10-ch09.txt:236(搜「69632」)
参考文献 [17]:LeCun 等 1998参考文献text/13-fm.txt:37(搜「Gradient-based learning applied to document recognition」)

Footnotes

  1. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 119 段(text/10-ch09.txt:119,搜「卷积之父」)。原文写的是「Yann LeCun于1988年提出」,与书自己的参考文献 [17] 差了十年,见正文与脚注 7。 2

  2. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 121 段(text/10-ch09.txt:121,搜「该网络总共有8层」)。原文的标记法:C 表示卷积层,S 表示下采样层(池化层),F 表示全连接层。

  3. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 125 段(text/10-ch09.txt:125,搜「数字仅为图像中间28×28的范围区域」)。逐层的尺寸与参数量分别在第 127、129、131、135、137、139、141 段;我们用第 10 章那条尺寸公式逐层核过,全部对得上。

  4. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 137 段(text/10-ch09.txt:137,搜「倘若将输入图像尺寸增大」)。原文:C5 作为卷积层实际上与全连接层非常相似,但其本质上为卷积层,输出为 1×1 仅是因为输入图像大小导致。

  5. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 129 段(text/10-ch09.txt:129,搜「在LeNet中采用最大池化」;同段搜「均值乘上一个权值参数」)。同一段里两种说法并存,见第 2 节的判断块。

  6. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 135 段(text/10-ch09.txt:135,搜「共有16×2=32个参数」)。原文这里又写「池化方式为最大池化」。

  7. 出处:「参考文献」第 37 段(text/13-fm.txt:37,搜「Gradient-based learning applied to document recognition」)。书自己列的 [17] 是 LECUN Y, BOTTOU L, BENGIO Y 等 1998 年发表在 Proceedings of the IEEE 上的那篇。

  8. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 143 段(text/10-ch09.txt:143,搜「大量的参数都存在于全连接层」)。原文同段还说:激活值尺寸下降太快会影响神经网络的性能。

  9. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 141 段(text/10-ch09.txt:141,搜「如今已经不采用径向基函数了」)。原文说明了径向基函数单元的做法:计算输入与该类别标记向量之间的欧式距离,取最近的那一类。

  10. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 149 段(text/10-ch09.txt:149,搜「取得了当年的ImageNet大规模视觉识别竞赛冠军」)。

  11. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 151 段(text/10-ch09.txt:151,搜「李飞飞团队创建」)。原文:超过 1400 万张带标签图像;自 2010 年起每年举办 ILSVRC;分类比赛 1000 个类别,每类 300—1000 张。

  12. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 153 段(text/10-ch09.txt:153,搜「2个Dropout层」)与第 157 段(text/10-ch09.txt:157,搜「6000万个参数」)。

  13. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 161—167 段(text/10-ch09.txt:161,搜「镜像加随机剪裁」;text/10-ch09.txt:163,搜「提高网络的稀疏性」;text/10-ch09.txt:165,搜「局部响应归一化」;text/10-ch09.txt:167,搜「按照定义的概率将部分神经元输出置零」)。补充(不在书里,来自通用知识):预测时全部神经元都参与、不再丢弃;局部响应归一化后来基本被批归一化取代。 2 3 4 5 6

  14. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 171 段(text/10-ch09.txt:171,搜「深度最终被确定在16~19层之间」)。原文:VGGNet 是 2014 年 ILSVRC 分类任务比赛的亚军,由 Simonyan 等人提出。 2

  15. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 181 段(text/10-ch09.txt:181,搜「仅为前者的72%」;同段搜「不改变模型感受野的情况下增加模型的非线性」)。「每叠一层 3×3,感受野边长 +2」这一步的推演是我们补的,书只给了结论。 2 3

  16. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 177 段(text/10-ch09.txt:177,搜「输入层为224×224×3的三通道RGB图像」)与第 187 段(text/10-ch09.txt:187,搜「VGG16参数约为1.38亿个」)。

  17. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 185 段(text/10-ch09.txt:185,搜「参数量仅为AlexNet的1/12」)。原文还提到 GoogleNet 在比赛中用 7 个模型集成、每张图 144 个随机裁剪。 2

  18. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 189 段(text/10-ch09.txt:189,搜「组装成一个网络模块」)。最初版本的四条路:1×1 卷积、3×3 卷积、5×5 卷积、3×3 最大池化。

  19. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 193 段(text/10-ch09.txt:193,搜「计算量很大」)。

  20. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 197 段(text/10-ch09.txt:197,搜「加入了3个1×1卷积」)。「1×1 卷积为什么能压厚度」的机制是我们补的,书只说了目的是压缩降维。

  21. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 187 段(text/10-ch09.txt:187,搜「是GoogleNet的27倍多」)。原文:GoogleNet 参数总量约 500 万个,VGG16 约 1.38 亿个。

  22. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 199 段(text/10-ch09.txt:199,搜「采用平均池化」)。原文:由于全连接网络参数多、计算量大、容易过拟合,GoogleNet 没有采用三层全连接层。

  23. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 201 段(text/10-ch09.txt:201,搜「辅助分类器」)。原文:这两个辅助分类器只在训练时使用,预测时会去掉。「为什么这管用」是我们补的解释。

  24. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 211 段(text/10-ch09.txt:211,搜「56层的神经网络表现明显要比20层的差」)。原文同段还说梯度消失或梯度爆炸「可以通过归一化处理和 Batch Normalization 得到很大程度的解决」,但书全书没有解释过 Batch Normalization 是什么。 2

  25. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 217 段(text/10-ch09.txt:217,搜「shortcut」)。原文:残差模块有两条路径,F(x) 是残差路径,x 是恒等映射(shortcut);相加是逐元素相加,所以两者尺寸必须相同。公式本体在书里是图片。 2

  26. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 220 段(text/10-ch09.txt:220,搜「至少有恒等映射的能力」)。

  27. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 222 段(text/10-ch09.txt:222,搜「分别是18、34、50、101和152」)与第 228 段(text/10-ch09.txt:228,搜「1+99+1=101层网络」)。第 230 段给了 50 层与 101 层的差别。

  28. 出处:「第9章 卷积神经网络及斑马线识别项目实践」第 236 段(text/10-ch09.txt:236,搜「1179648」;同段搜「69632」)。原文说明了先降后升的第二个理由:让主分支和捷径分支输出的特征矩阵形状相同,以便相加。两笔账的加法我们核过。 2