跳到主要内容

Inception 一族 — 加宽这条路

这一章讲三件事: 2012 年之后提准确率的第二条路是什么;Inception 模块怎样用 「多路并行+小核压通道」把这条路走通;GoogLeNet 往网络中间插的那两根「监督管子」 在防什么。读完你会看清:后面所有改版(v2/v3/v4)都只是同一招的反复使用。

1. 这一章讲什么

上一章的结论是「加深能提准确率,但有上限」。这一章给另一条路。书里的原话是: 2012 年之后 CNN(卷积神经网络的缩写,第 01 章那套三板斧网络的通称)的研究分成了两大流派——一个继续加深加宽(ZFNet、VGG), 另一个去增加卷积核的拟合能力,或者说增加网络的多样性1

「多样性」听着玄,意思很土:别让整层网络只用同一种大小的窗口看图。 小窗口看细节(边缘、角),大窗口看轮廓(整只耳朵、整张脸),各有各的用处—— 那就让它们同时看。这一章的主角 Inception,就是把这件事做成一个可以反复堆的积木。

2. 顶层全景:一个模块,四条支路

输入特征图(比如 192 通道)
│ │ │ │
1×1 1×1 1×1 池化
│ 3×3 5×5 │
│ │ │ 1×1
└──────┴──┬───┴──────┘
拼接(通道叠起来)

图说:一个 Inception 模块。四条支路同时加工同一份输入,窗口大小各不相同,
最后把四路的输出在通道方向上拼成一张更厚的特征图。

这一章的主走查就是它:拿一张 192 通道的特征图喂进去,看着它怎么分流、 每条支路花多少参数、又怎么汇合。第 3.3 节走全程。

3. 核心原理

3.1 垫脚石一:Maxout,让神经元自带「货比三家」

第一个零件解决的问题是:一个神经元只有一套权重,它的表达方式就只有一种。

Maxout 的做法是给每个神经元备 k 套权重,各算一个结果,取最大的那个当输出。 书里证明:当 k 足够大时,这样一个神经元可以无限逼近任何凸函数—— 用好几段直线拼出一条弯曲线2。听着很美,但书里随即泼了冷水: 参数数量是传统神经网络的 k 倍,准确率却没有等价的提升,「现在 Maxout 网络基本已被工业界淘汰」3

它没白死:「多套权重、挑最好的」这个思路,就是下一块垫脚石的种子。

3.2 垫脚石二:NIN,和 1×1 卷积的三件功劳

第二个零件叫 NIN(Network in Network,网络中的网络)。它注意到一个事实: 一次卷积只是核与窗口的一次乘加,拟合能力有限;于是把卷积核换成了一个小型网络—— 窗口滑到哪,就在哪过一个微型神经网络4。代价书里也量了:NIN 的参数远大于同类的 普通网络,收敛快但训练慢5

NIN 真正传世的是它带火的 1×1 卷积。1×1 卷积就是一个只看单个像素的极小卷积核: 它不观察任何邻域,只在「同一个像素位置的各个通道」之间做加权混合。书里总结了它的三件功劳:

功劳意思
保存位置关系每个像素只跟自己通道 mixes,特征图上「哪里是什么」不乱
升维、降维——通道数想大就大、想小就小这就是下一节的救命稻草
跨特征图交互让不同通道的信息互相通话6

NIN 还顺手送了第三件礼物:全局平均池化——卷积完不接昂贵的全连接层, 直接对每张特征图求平均再分类,省参数又防过拟合7

3.3 主走查:一个 Inception 模块的完整流水

现在把零件拼起来。Inception 的出发点是一个观察:不同大小的卷积核,对应的感受野 (第 01 章讲过:一个输出能「看见」的输入区域)不同;而且网络越深,大小核的感受野差距越大, 所以这种「多尺寸并行」的结构在越深的层里越有用8

朴素做法:输入特征图分四路——1×1、3×3、5×5 各一路,再加一路池化——然后拼接。 问题立刻来了:四路各顾各的,输出通道数是四路之和,特征图数量直接乘 4, 堆几个模块就算不动了9。解法书里点破:把 NIN 的 1×1 卷积放在 3×3、5×5 之前先降维10

现在走数字。输入 192 通道(这是书里代码注释给的官方配置;百分比无,全是通道数)11:

输入 192 通道
├─ 支路一 1×1,直接输出 64 通道
├─ 支路二 1×1 先压到 96 → 3×3 输出 128 通道
├─ 支路三 1×1 先压到 16 → 5×5 输出 32 通道
└─ 支路四 池化 → 1×1 收成 32 通道
拼接:64+128+32+32 = 256 通道输出

降维省了多少?看支路二:没有那个 1×1 的话,3×3 卷积要从 192 通道直接算出 128 通道, 每个输出位置的乘加次数按 192×3×3×128 计;先压到 96,就变成两段 192×1×1×96 与 96×3×3×128——大头从 192 降到 96,这一步乘加量省了近一半(这段账是我们按通道数 现算的,书里只给了结构没算这笔)。四个「通道数」都是书里代码注释中的官方值。

书里也如实交代了对照实验:在 MNIST 这种小数据集上,Inception 的提升非常有限—— 多尺度的红利要大图、深网络才吃得满12

3.4 GoogLeNet:堆 9 个模块,外加两根「监督管子」

把 Inception 堆 9 个、凑成 22 层,这就是 2014 年冠军 GoogLeNet(名字在致敬 LeNet)13。 它有个别的网络都没有的怪设计:网络中间还伸出两个 softmax 分支, 它们的损失按 0.3 的比例加进总损失,测试时再拆掉14

为什么要这么做?书里用信息论给了解释。数据处理不等式(data processing inequality): 数据加工的步骤越多,丢失的信息越多——原文的表述是「信息有可能消失,但绝对不会凭空增加」15。 反向传播也是一条加工链:梯度从输出层往回走,每过一层折损一次,等走到很浅的层, 责任信号已经微弱(第 01 章的梯度消失,换个马甲)。中间分支等于给浅层 另开一条直通的监督线:浅层特征不必等深层加工完,直接接受「你能不能分对图」的考核, 于是「较低层提取的特征也有分类的能力」16

判断(我们的,不是书里的): 「中间分支=浅层的直通监督」和第 03 章的残差连接, 解决的是同一个病(梯度走不到深处),只是药方不同:一个从输出端插管子, 一个让信息自带直通道道。后来居上的是残差——GoogLeNet 自己的下一版就改用了它(3.6 节)。 如果错,会错在: 如果辅助损失的主要收益其实在正则化(给网络加约束、防它把训练题背得太死的各种手段,Dropout 就是其中之一)而不是梯度(书里两条作用并列), 那它与残差就不是治同一种病;书里引的论文对两个作用也没有分出主次。

3.5 v2 与 v3:同一招用两次

之后的改版没有新哲学,只有同一招的重复:

  • Inception v2:5×5 大核换成两个 3×3——感受野相同,拟合能力更强,参数更少(第 01 章 VGG 那笔账原样复用)17;
  • Inception v3:把 n×n 核拆成 n×1 加 1×n 两个长条核,即非对称卷积—— 先横着看一遍、再竖着看一遍,省参数还增加了特征的多样性18

3.6 v4 与 Inception-ResNet:两族合流

Inception v4 把模块整理成「骨干(Stem)模块+3 个 Inception+2 个缩减模块」的规整结构19。 同篇论文的另一支 Inception-ResNet,则把 Inception 模块插上残差捷径(第 03 章正式讲残差), 书里转述了原论文的一个意外发现:残差连接并不会明显拉高准确率,而是会加快训练收敛速度20; 而且网络太深时不稳定,「到后面模型的参数可能全变为 0 了」,所以要给残差支路的输出 乘一个 0.1 到 0.3 的小缩放系数压一压21。冠军架构反过来给自己的捷径装减震器—— 这个细节第 07 章还会再见(PolyNet 的加权路径,同样取 β=0.3)。

4. 作者的判断与证据

书里给了实验证据的: Maxout 参数 k 倍但不换来准确率(论文结论转述);NIN 参数大、 收敛快、训练慢(作者自己拿 LeNet-5 改造跑的对照,图 1.18);小数据集上 Inception 提升有限 (作者实验,图 1.21);Inception 与参数一样多的 3×3 网络对比(同图)。

作者的个人判断: 在讲 Inception v2 时直接用「我们知道」引出 5×5 换两个 3×3 的理由—— 这是把 VGG 的结论当作公理在复用;GoogLeNet 辅助损失的「两个作用」是转述原论文, 书里没有自己跑实验验证。

5. 边界与局限

  • 这一章的模块设计全是人工雕出来的:几条支路、每支路多大核、1×1 压到多少通道, 都是作者拍板。第 07、08 章的 NAS 会把这些决定交给搜索——Inception 是「人工设计」 这个范式的巅峰,也是它力竭的样子(书里 2.4 节点评 ResNeXt 时会点破这一点);
  • 辅助损失在后来的复现中被认为收益不稳,今天的主流网络(ResNet 及其后代)都不再带它;
  • 书里对 1×1 卷积「保存位置关系」的表扬,在检测、分割任务上才兑现——分类任务里 这条功劳是闲置的。

6. 可带走的

  1. 提准确率有两条路:加深(VGG)与加宽加多样(Inception);后者=每层多种感受野并行;
  2. 1×1 卷积是全章最值钱的零件:跨通道混合、升降维、省参数的瓶颈,三件事一件不少;
  3. 朴素并行会让特征图数量乘 4;先 1×1 降维再大核卷积是多尺度并行的标准姿势;
  4. 大核永远可以拆小核:5×5→两个 3×3(v2),n×n→n×1+1×n(v3),每次都省参数还涨表达;
  5. 辅助损失=给浅层开直通监督线,依据是数据处理不等式(加工越多,信息越少);
  6. Maxout、NIN 都被淘汰了,但它们各自留下的思路(多套权重挑最好、小网络替大核) 都活在 Inception 里;
  7. 残差连接的初次登场是在 Inception-ResNet 里,而且要配 0.1~0.3 的缩放才稳。

7. 原文地图

主题原书节原文位置
两大流派1.3 更宽:GoogLeNettext/02-p21-40.txt:331(搜「两大流派」) · text/02-p21-40.txt:333(搜「拟合能力」)
Maxout 取最大、逼近凸函数、k 倍参数1.3.1 背景知识text/02-p21-40.txt:355(搜「有条件地选择节点」) · text/02-p21-40.txt:374(搜「逼近任何凸函数」) · text/02-p21-40.txt:383(搜「基本已被工业界淘汰」)
NIN 用小网络替卷积核1.3.1 背景知识text/02-p21-40.txt:386(搜「小型 MLP」) · text/02-p21-40.txt:393(搜「远大于」)
1×1 卷积三用途、全局平均池化1.3.1 背景知识text/02-p21-40.txt:421(搜「升维和降维」) · text/02-p21-40.txt:422(搜「跨特征图的交互」) · text/02-p21-40.txt:423(搜「全局平均池化」)
Inception 动机与乘 4 问题1.3.2 Inception v1text/02-p21-40.txt:431(搜「感受野的大小差距」) · text/02-p21-40.txt:438(搜「乘 4」) · text/02-p21-40.txt:440(搜「降采样」)
Inception v1 官方通道数1.3.2 Inception v1text/02-p21-40.txt:448(搜「inception_3x3_reduce」)
小数据集提升有限1.3.2 Inception v1text/02-p21-40.txt:462(搜「提升非常有限」)
GoogLeNet 结构与辅助损失1.3.3 GoogLeNettext/02-p21-40.txt:469(搜「9 个 Inception」) · text/02-p21-40.txt:475(搜「0.3 的比例」) · text/02-p21-40.txt:477(搜「分类的能力」)
数据处理不等式1.3.3 GoogLeNettext/02-p21-40.txt:481(搜「数据处理的步骤越多」) · text/02-p21-40.txt:484(搜「绝对不会凭空增加」)
v2 拆 5×5、v3 非对称核1.3.4 / 1.3.5text/02-p21-40.txt:491(搜「更强的拟合能力」) · text/02-p21-40.txt:519(搜「1 × n 的卷积」) · text/02-p21-40.txt:523(搜「特征的多样性」)
v4 结构1.3.6 Inception v4text/02-p21-40.txt:552(搜「骨干」)
残差不提精度只提收敛、缩放 0.1~0.31.3.7 Inception-ResNettext/03-p41-60.txt:16(搜「加快训练收敛速」) · text/03-p41-60.txt:19(搜「0.1到0.3」)

Footnotes

  1. 出处:「1.3 更宽:GoogLeNet」(text/02-p21-40.txt:331,搜「两大流派」)。原文:「一个流派的研究方向是增加 CNN 的深度和宽度……另外一个流派的研究方向是增加卷积核的拟合能力,或者说是增加网络的多样性」。

  2. 出处:「1.3.1 背景知识」(text/02-p21-40.txt:374,搜「逼近任何凸函数」)。书里的比喻:每条直线代表一个输出节点 z_i,多段直线拼出弯曲线。凸函数:不会「凹下去」的函数,像一个碗。

  3. 出处:「1.3.1 背景知识」(text/02-p21-40.txt:382,搜「k 倍」)与(text/02-p21-40.txt:383,搜「基本已被工业界淘汰」)。

  4. 出处:「1.3.1 背景知识」(text/02-p21-40.txt:386,搜「小型 MLP」)。原文:「将 CNN 的卷积核替换成了一个小型 MLP 网络」;「MLP 替代卷积操作增加了每次滑窗的拟合能力」。

  5. 出处:「1.3.1 背景知识」(text/02-p21-40.txt:393,搜「远大于」)。三条实验结论:参数远大于同类型 CNN、收敛快、训练慢。

  6. 出处:「1.3.1 背景知识」(text/02-p21-40.txt:418,搜「位置关系」)与(text/02-p21-40.txt:421,搜「升维和降维」)、(text/02-p21-40.txt:422,搜「跨特征图的交互」)。

  7. 出处:「1.3.1 背景知识」(text/02-p21-40.txt:423,搜「全局平均池化」)。

  8. 出处:「1.3.2 Inception v1」(text/02-p21-40.txt:431,搜「感受野的大小差距」)。原文:「网络的层数越多,不同大小的卷积核对应在原图的感受野的大小差距越大,这也就是 Inception 通常在越深的层次中效果越明显的原因」。

  9. 出处:「1.3.2 Inception v1」(text/02-p21-40.txt:438,搜「乘 4」)。

  10. 出处:「1.3.2 Inception v1」(text/02-p21-40.txt:440,搜「降采样」)。原文:「Inception 使用了 NIN 中介绍的 1 × 1 卷积在卷积操作之前进行降采样」。

  11. 出处:「1.3.2 Inception v1」(text/02-p21-40.txt:448,搜「inception_3x3_reduce」)。代码注释:1×1 支路官方 64 通道;3×3 支路先降 96 再出 128;5×5 支路先降 16 再出 32;池化支路接 1×1 出 32;输入以 GoogLeNet 官方 192 通道计,书里复现时改用 4 通道窄网络。

  12. 出处:「1.3.2 Inception v1」(text/02-p21-40.txt:462,搜「提升非常有限」)。

  13. 出处:「1.3.3 GoogLeNet」(text/02-p21-40.txt:469,搜「9 个 Inception」)。

  14. 出处:「1.3.3 GoogLeNet」(text/02-p21-40.txt:475,搜「0.3 的比例」)与(text/02-p21-40.txt:479,搜「移除」)。

  15. 出处:「1.3.3 GoogLeNet」(text/02-p21-40.txt:481,搜「数据处理的步骤越多」)与(text/02-p21-40.txt:484,搜「绝对不会凭空增加」)。

  16. 出处:「1.3.3 GoogLeNet」(text/02-p21-40.txt:477,搜「分类的能力」)。

  17. 出处:「1.3.4 Inception v2」(text/02-p21-40.txt:491,搜「更强的拟合能力」)。

  18. 出处:「1.3.5 Inception v3」(text/02-p21-40.txt:519,搜「1 × n 的卷积」)与(text/02-p21-40.txt:523,搜「特征的多样性」)。

  19. 出处:「1.3.6 Inception v4」(text/02-p21-40.txt:552,搜「骨干」)。

  20. 出处:「1.3.7 Inception-ResNet」(text/03-p41-60.txt:16,搜「加快训练收敛速」)。

  21. 出处:「1.3.7 Inception-ResNet」(text/03-p41-60.txt:18,搜「尺度变量」)与(text/03-p41-60.txt:19,搜「0.1到0.3」)。