跳到主要内容

现代架构模式与「看见」网络在想什么

这一章讲三件事: 图像分割这个「像素级分类」任务怎么做; 现代卷积网络的三个架构模式(残差连接、批量规范化、深度可分离卷积)各解决什么问题; 以及三种方法打开卷积网络,看它到底学到了什么。 第 08 章教你「能用」,这一章教你「用得好」和「看得懂」。

1. 顶层全景

计算机视觉不止图像分类。书里列了三大基本任务1:

任务输出例子
图像分类整图一个(或多个)标签谷歌照片搜索(2 万多个类别)
图像分割每个像素一个类别视频通话换背景
目标检测感兴趣目标的边界框 + 类别自动驾驶看车看人(原书明确不讲,指去 Keras 的 RetinaNet 示例)

分割又分两档:语义分割(两只猫的像素都算「猫」类)和实例分割(猫 1、猫 2 分开)。 书里的例子用语义分割2

本章的主走查有两条。第一条是牛津宠物数据集(Oxford-IIIT,7390 张猫狗照片, 每张配一张「前景/背景/轮廓」掩码)上的分割模型——它的形状选择和第 08 章的分类模型正好相反; 第二条是 Xception 给一张非洲象照片分类(87%),再用 Grad-CAM 问它「你凭什么这么说」3

2. 分割:为什么这里用步幅、不用汇聚

分割模型的前半截和分类模型一样:一串卷积层把图越压越小(200×200 → 25×25), 通道越压越多(→256)。后半截反过来:一串 Conv2DTranspose 层(学习上采样的卷积) 把特征图重新放大回原尺寸,最后一层对每个像素做 3 路 softmax(前景/背景/轮廓)4

关键在于前半截的下采样方式:第 08 章的分类模型用最大汇聚,这里的分割模型用步幅 2 的卷积。 书里的理由一刀见血5:

2×2 最大汇聚会完全破坏每个汇聚窗口中的位置信息—— 窗口里 4 个位置只返回一个最大值,这个值来自 4 个位置中的哪一个,没人知道。

分类任务不在乎(「图里有没有猫」不需要知道猫的精确位置),分割任务在乎 (输出就是每个像素的类别)。所以记住这条通用规律:模型关注特征的位置时, 用步幅代替最大汇聚——第 12 章的生成式模型还会用到这条。

3. 三个架构模式

3.0 先立一个元原则:MHR 与消融研究

什么是「架构」?书里定义为建模型时做的全部选择:用哪些层、怎么配、怎么连—— 这些选择划定了模型的假设空间(第 01 章)。梯度下降是非常呆板的搜索过程, 好的架构就是给它圈一个好搜的空间6

复杂系统变简单的通用办法,书里叫 MHR:模块化、层次结构、复用—— 大教堂、人体、Keras 代码库都遵循它。卷积网络里的表现:层组成重复的「层块」 (VGG16 就是「卷积-卷积-汇聚」块的重复),层块叠成金字塔(通道增、特征图减)7

深而窄优于浅而宽——更深的层次鼓励特征复用和抽象。但深度有个上限, 这个上限逼出了第一个模式8

在讲模式之前,书里插入了一段「元方法论」,值得单独记住——消融研究: 如果你发现 X+Y+Z 效果很好,那就把 X、Y、Z、X+Y、X+Z、Y+Z 各试一遍, 看效果到底来自哪。深度学习论文有「为通过同行评审而优化复杂度和数学」的激励 (作者的原话:数学常常不是用来阐述,而是用来传递严肃信号,「就像推销员身上的昂贵西装」), 而消融是消除这类噪声、找到系统性能真正来源的方法9

3.1 残差连接:给梯度修一条信息捷径

深度为什么有上限?书里用了传话游戏做比:一句话在一排人耳边逐个传, 传到最后和原句面目全非——反向传播在很深的序贯模型里就是这样: 误差信息要穿过 f4、f3、f2 才能到 f1,每一层都添点噪声, 链太长,噪声盖过信号,梯度就「消失」了——这就是梯度消失10

残差连接的解法朴素到一句话:把层块的输入直接加回它的输出11:

residual = x ← 留一份原始输入
x = block(x) ← 这个层块可以有损、可以有噪声,没关系
x = add([x, residual]) ← 输出里永远保留着输入的全部信息

图说:误差梯度可以绕过有损的层块,沿「信息捷径」无损地传到前面的层。
2015 年由微软何恺明等人的 ResNet 系列引入。

工程细节:相加要求形状相同。层块里滤波器变多了,就用一个 1×1 卷积把残差投影到匹配的形状; 层块里有最大汇聚,残差就用步幅 2 跟上。有了它,网络想堆多深就堆多深, 不用再担心梯度消失12

3.2 批量规范化:有用,但没人真正知道为什么

第 06 章讲过输入数据的规范化(减均值、除标准差)。批量规范化是把同样的操作 施加到网络中间层的输出上:训练时用当前批量的均值方差,推断时用训练期间攒下的移动平均13

然后是作者一段非常出名的坦白14:

虽然原始论文指出,批量规范化的作用是「减少内部协变量偏移」, 但没有人能真正确定批量规范化为何有效。 有各种假说,但没有确定的说法。

他紧接着说:深度学习里许多事情就是这样——「我们知道如何做,但不知道为何要这样做。 只要有可靠的解释,我一定会提到。然而,批量规范化还没有一个可靠的解释。」 实践上能确定的效果是:它有助于梯度传播(和残差连接类似),让更深的网络训得动15

两个工程细节:用批量规范化时前一层可以 use_bias=False(规范化会把均值归零,偏置多余); 作者建议把激活放在批量规范化之后(规范化的输出均值是 0,正好是 relu 的分界点)16

3.3 深度可分离卷积:参数少 8 倍的替代

深度可分离卷积把普通卷积拆成两步:先对输入的每个通道单独做空间卷积(各扫各的), 再用 1×1 卷积把通道混合起来。它背后的假设是:空间位置之间高度相关, 而不同通道之间几乎不相关——普通卷积假设「模式与位置无关」,它再加一条「通道可分」17

参数对比是硬数字:3×3 窗口、64 输入通道、64 输出通道, 普通卷积要 3×3×64×64 = 36,864 个参数;等效的深度可分离卷积只要 3×3×64 + 64×64 = 4,672 个—— 约为 1/8。参数更少意味着更快收敛——收敛就是训练到头了: 损失一路往下降,降到某一轮之后基本不再动,曲线压平成一条横线,再多训也没用18。 所以「更快收敛」的意思是同样的效果少训几轮就到,不是「训出来更好」。 参数少的另一个好处是更不容易过拟合。 这个模式是 Xception 架构的基础——作者本人就是 Xception 论文的作者, 读这一节时把这条利益相关放在心里19

书里还给了一段极有价值的「冷水」:理论上快 8 倍,实际上并不快。 因为 GPU 上跑的是 cuDNN 的极端优化卷积内核,普通卷积被优化到了每条机器指令, 而可分离卷积没有吃到同等优化。作者的推广更狠:现代深度学习是硬件、软件、算法 共同发展的产物——整个生态已经围绕「反向传播训练的卷积网络」微优化, 你想换条路(无梯度优化、脉冲神经网络),哪怕想法更好, 前几种实现的慢速也会让你无法说服别人20

3.4 合体:迷你 Xception,83.5% → 90.8%

把三个模式叠进同一个模型(SeparableConv2D + 批量规范化 + 残差连接块, 最后用 GlobalAveragePooling2D 代替 Flatten),用在第 08 章同一个猫狗任务上: 参数 721,857 个(比原来还少),测试精度 90.8%—— 比第 08 章从头训练的 83.5% 高出 7 个多点。这就是「架构最佳实践」的即时回报21

一个细节:模型的第一层仍是普通 Conv2D——「通道不相关」的假设对 RGB 三通道不成立 (自然图像里红绿蓝高度相关),可分离卷积要从第二层开始用22

4. 打开网络:三种可视化

人们常说深度学习是黑盒。书里的反驳:对卷积网络来说这绝不是真的—— 它学到的表示是视觉概念的表示,天生适合可视化23

4.1 中间激活:信息蒸馏管道

第一种:给模型喂一张猫图,把每个卷积层、汇聚层的输出逐通道画出来 (做法是再造一个「一输入九输出」的激活模型,第 04 章讲过函数式模型可以这样查层输出)。 看到的规律有三条24:

  1. 第一层是各种边缘检测器——激活值几乎保留了原图的全部信息;
  2. 越往后越抽象:从边缘、纹理,到「猫耳朵」「猫眼睛」—— 关于「这张图具体长什么样」的信息越来越少,关于「这是猫还是狗」的信息越来越多;
  3. 激活越来越稀疏:深层很多滤波器完全空白——输入里没有它们负责的模式。

书里给这个过程起了个名字:信息蒸馏管道——接收原始像素, 反复变换,滤掉无关的(具体外观),放大有用的(类别)。 这和人的感知同构:你看一眼街景,记得住「有辆自行车」, 却画不出一辆真实的自行车——你的大脑也把视觉输入抽象成了概念,滤掉了细节25

4.2 滤波器:梯度上升画出「它喜欢什么」

第二种:想知道某个滤波器到底响应什么,就反过来用网络—— 冻结权重,把输入图像当成可变量,用梯度上升修改图像, 让那个滤波器的激活值越来越大;几十步之后,图像上浮现的图案就是「它喜欢的东西」26

把 Xception 各层的滤波器各画 64 个,结论和第 08 章的「空间层次」完美互证27:

滤波器响应的图案
前几层简单方向边缘和颜色
block4边缘和颜色组成的纹理
block8自然图像里的东西:羽毛、眼睛、树叶

4.3 Grad-CAM:主走查第 ② 步(非洲象的耳朵)

第三种回答的是「它凭什么做这个决定」。类激活热力图(CAM)给输入图的每个位置算一个分数: 这个位置对「最终判成这一类」有多重要。Grad-CAM 的做法:取最后一个卷积层的特征图, 用「类别分数对每个通道的梯度」给各通道加权,再叠加成一张热力图28

主走查:一张母象带小象的草原照片,Xception 的预测是29:

非洲象 87%
长牙动物 8%
印度象 2% ← 「非洲象」在输出向量里的索引是 386

算出「非洲象」这一类对最后一个卷积层的梯度,加权叠成热力图,叠回原图—— 小象耳朵的位置热得发亮。这正好解释了模型凭什么区分非洲象和印度象: 非洲象耳朵大。一张热力图同时回答了两个问题:为什么它认为图里有非洲象? 它认为非洲象在图里的什么地方?30

5. 作者的判断与证据

实测证据: 90.8% vs 83.5%(同一任务、同一数据管道);36,864 vs 4,672 的参数对比(算术); Grad-CAM 的热力图(方法来自 2017 年论文,书里给了出处)。

作者明确标为「没有确定说法」的: 批量规范化的原理——「没有人能真正确定」, 这是全书对「我们知道怎么做,不知道为何」最直白的一次坦白;

作者的个人洞察(不是学界共识): 「数学像昂贵西装」「硬件软件算法共同发展产生锁定」—— 这两段是作者在框架作者位置上的行业观察,论证有力但属于观点; Xception 一节他有作者身份的利益相关。

6. 边界与局限

  • 目标检测原书明确不讲(对入门书太复杂),给了 Keras RetinaNet 示例(约 450 行)的出口;
  • 批量规范化「激活放前还是放后」作者明说仍存在争议,他给的只是自己的建议;
  • 可视化三法针对卷积网络;Transformer 的可解释性是另一套工具,原书没有覆盖;
  • 「可分离卷积更快」在 2021 年的 cuDNN 生态里不成立(理由见 §3.3:普通卷积被优化到了每条机器指令)。

判断(我们的,不是书里的): 这一章的三个模式里,可分离卷积那条结论是最容易过期的一条, 而另外两条(残差连接、批量规范化)不是。差别在于它们各自靠什么成立: 残差连接靠的是「加法让信号有一条直通路」这个数学事实,批量规范化靠的是大量经验, 而「可分离卷积快不快」靠的是某一代显卡驱动里某个算子被优化到什么程度—— 这是三者里唯一一条会随硬件换代整个翻面的。所以引用书里这条时要注明年份; 引用另外两条不用。 如果错,会错在: 如果后来的驱动把可分离卷积也优化到同等程度, 那这条结论不是「过期」,而是反过来成立了——书里说的「理论快 8 倍、实际不快」 会变成「理论和实际都快」。我们没有在今天的硬件上实测过,这条判断是从 作者自己那段「硬件、软件、算法共同发展」的论证推出来的。

7. 可带走的

  1. 三大视觉任务:分类、分割(每像素分类)、检测;关注位置就用步幅,不用最大汇聚;
  2. 架构 = 假设空间;梯度下降很呆板,好架构就是给它圈个好空间;
  3. 消融研究:X+Y+Z 好,就把各子集都试一遍——找性能真正来源,别信复杂度本身;
  4. 残差连接 = 把输入加回输出,给梯度修信息捷径;形状不匹配用 1×1 卷积投影;
  5. 批量规范化「没人真正确定为何有效」,但实践上帮梯度传播;激活放它后面,前层 use_bias=False;
  6. 深度可分离卷积:逐通道卷 + 1×1 混合,参数约 1/8;第一层别用(RGB 通道相关);
  7. 深度学习是硬件、软件、算法共同发展的产物——偏离主路径的成本极高;
  8. 卷积网络不是黑盒:激活可视化(信息蒸馏)、滤波器可视化(梯度上升)、Grad-CAM(决策依据);
  9. 深层表示的规律:关于输入外观的信息递减,关于类别的信息递增,激活越来越稀疏

8. 原文地图

主题原书章原文位置
三大视觉任务计算机视觉深度学习进阶text/16-ch09.txt:15(搜「三项基本」)
语义/实例分割与数据集计算机视觉深度学习进阶text/16-ch09.txt:65(搜「语义分割」) · text/16-ch09.txt:84(搜「7390」)
步幅 vs 汇聚的位置信息计算机视觉深度学习进阶text/16-ch09.txt:265(搜「位置信息」)
MHR 与深而窄计算机视觉深度学习进阶text/16-ch09.txt:361(搜「模块化」) · text/16-ch09.txt:385(搜「深度堆叠」)
消融研究计算机视觉深度学习进阶text/16-ch09.txt:415(搜「消融研究」)
传话游戏与梯度消失计算机视觉深度学习进阶text/16-ch09.txt:422(搜「传话游戏」) · text/16-ch09.txt:432(搜「梯度消失」)
残差连接与 1×1 投影计算机视觉深度学习进阶text/16-ch09.txt:436(搜「残差连接」) · text/16-ch09.txt:459(搜「1×1」)
批量规范化与坦白计算机视觉深度学习进阶text/16-ch09.txt:591(搜「Ioffe」) · text/16-ch09.txt:597(搜「没有人能真正确定」)
可分离卷积与参数对比计算机视觉深度学习进阶text/16-ch09.txt:651(搜「深度可分离卷积」) · text/16-ch09.txt:684(搜「36 864」) · text/16-ch09.txt:685(搜「4672」)
cuDNN 与共同发展计算机视觉深度学习进阶text/16-ch09.txt:694(搜「cuDNN」) · text/16-ch09.txt:708(搜「共同发展」)
迷你 Xception 90.8%计算机视觉深度学习进阶text/16-ch09.txt:762(搜「721 857」) · text/16-ch09.txt:764(搜「90.8%」)
中间激活与信息蒸馏计算机视觉深度学习进阶text/16-ch09.txt:961(搜「边缘检测器」) · text/16-ch09.txt:971(搜「信息蒸馏」)
自行车例子计算机视觉深度学习进阶text/16-ch09.txt:976(搜「自行车」)
滤波器可视化计算机视觉深度学习进阶text/16-ch09.txt:985(搜「梯度上升」) · text/16-ch09.txt:1180(搜「羽毛」)
Grad-CAM 与非洲象计算机视觉深度学习进阶text/16-ch09.txt:1187(搜「类激活图」) · text/16-ch09.txt:1244(搜「87%」) · text/16-ch09.txt:1347(搜「小象耳朵」)

Footnotes

  1. 出处:「计算机视觉深度学习进阶」第 15 段(text/16-ch09.txt:15,搜「三项基本」)与第 54 段(text/16-ch09.txt:54,搜「过于专业和复杂」)。

  2. 出处:「计算机视觉深度学习进阶」第 65 段(text/16-ch09.txt:65,搜「语义分割」)与第 68 段(text/16-ch09.txt:68,搜「实例分割」)。

  3. 出处:「计算机视觉深度学习进阶」第 84 段(text/16-ch09.txt:84,搜「7390」)。掩码取值:1 前景、2 背景、3 轮廓。

  4. 出处:「计算机视觉深度学习进阶」第 188 段(text/16-ch09.txt:188,搜「strides=2」)与第 270 段(text/16-ch09.txt:270,搜「Conv2DTranspose」)。

  5. 出处:「计算机视觉深度学习进阶」第 265 段(text/16-ch09.txt:265,搜「位置信息」)与第 267 段(text/16-ch09.txt:267,搜「步进卷积」)。

  6. 出处:「计算机视觉深度学习进阶」第 339 段(text/16-ch09.txt:339,搜「假设空间」)与第 347 段(text/16-ch09.txt:347,搜「呆板」)。

  7. 出处:「计算机视觉深度学习进阶」第 361 段(text/16-ch09.txt:361,搜「模块化」)与第 380 段(text/16-ch09.txt:380,搜「金字塔」)。

  8. 出处:「计算机视觉深度学习进阶」第 385 段(text/16-ch09.txt:385,搜「深度堆叠」)。

  9. 出处:「计算机视觉深度学习进阶」第 402 段(text/16-ch09.txt:402,搜「消融研究在深度学习研究中的重要性」)与第 415 段(text/16-ch09.txt:415,搜「消融研究」)。「昂贵西装」的比喻见第 411 段(text/16-ch09.txt:411,搜「严肃的信号」)。

  10. 出处:「计算机视觉深度学习进阶」第 422 段(text/16-ch09.txt:422,搜「传话游戏」)与第 432 段(text/16-ch09.txt:432,搜「梯度消失」)。

  11. 出处:「计算机视觉深度学习进阶」第 436 段(text/16-ch09.txt:436,搜「残差连接」)与第 444 段(text/16-ch09.txt:444,搜「何恺明」)。

  12. 出处:「计算机视觉深度学习进阶」第 459 段(text/16-ch09.txt:459,搜「1×1」)与第 576 段(text/16-ch09.txt:576,搜「任意深度」)。

  13. 出处:「计算机视觉深度学习进阶」第 591 段(text/16-ch09.txt:591,搜「Ioffe」)与第 596 段(text/16-ch09.txt:596,搜「指数移动平均」)。

  14. 出处:「计算机视觉深度学习进阶」第 597 段(text/16-ch09.txt:597,搜「没有人能真正确定」)。

  15. 出处:「计算机视觉深度学习进阶」第 601 段(text/16-ch09.txt:601,搜「知道如何做」)与第 603 段(text/16-ch09.txt:603,搜「有助于梯度传播」)。

  16. 出处:「计算机视觉深度学习进阶」第 621 段(text/16-ch09.txt:621,搜「use_bias」)与第 638 段(text/16-ch09.txt:638,搜「分界点」)。微调时应冻结批量规范化层,见第 643 段。

  17. 出处:「计算机视觉深度学习进阶」第 651 段(text/16-ch09.txt:651,搜「深度可分离卷积」)与第 670 段(text/16-ch09.txt:670,搜「非常不相关」)。

  18. 出处:「计算机视觉深度学习进阶」第 684 段(text/16-ch09.txt:684,搜「36 864」)与第 685 段(text/16-ch09.txt:685,搜「4672」)。

  19. 出处:「计算机视觉深度学习进阶」第 678 段(text/16-ch09.txt:678,搜「Xception」)及其文献注(第 680 段):François Chollet, Xception, CVPR 2017。

  20. 出处:「计算机视觉深度学习进阶」第 689 段(text/16-ch09.txt:689,搜「等一下」)至第 711 段(text/16-ch09.txt:711,搜「重新设计」)。

  21. 出处:「计算机视觉深度学习进阶」第 762 段(text/16-ch09.txt:762,搜「721 857」)与第 764 段(text/16-ch09.txt:764,搜「90.8%」)。

  22. 出处:「计算机视觉深度学习进阶」第 177 段(text/16-ch09.txt:177,搜「RGB」)。

  23. 出处:「计算机视觉深度学习进阶」第 781 段(text/16-ch09.txt:781,搜「黑盒子」)。

  24. 出处:「计算机视觉深度学习进阶」第 878 段(text/16-ch09.txt:878,搜「激活值的模型」)与第 961 段(text/16-ch09.txt:961,搜「边缘检测器」)至第 966 段(text/16-ch09.txt:966,搜「稀疏度」)。

  25. 出处:「计算机视觉深度学习进阶」第 971 段(text/16-ch09.txt:971,搜「信息蒸馏」)与第 976 段(text/16-ch09.txt:976,搜「自行车」)。

  26. 出处:「计算机视觉深度学习进阶」第 985 段(text/16-ch09.txt:985,搜「梯度上升」)。

  27. 出处:「计算机视觉深度学习进阶」第 1178 段(text/16-ch09.txt:1178,搜「方向边缘」)与第 1180 段(text/16-ch09.txt:1180,搜「羽毛」)。

  28. 出处:「计算机视觉深度学习进阶」第 1187 段(text/16-ch09.txt:1187,搜「类激活图」)与第 1194 段(text/16-ch09.txt:1194,搜「Grad-CAM」)。

  29. 出处:「计算机视觉深度学习进阶」第 1240 段(text/16-ch09.txt:1240,搜「0.8699266」)与第 1248 段(text/16-ch09.txt:1248,搜「386」)。

  30. 出处:「计算机视觉深度学习进阶」第 1344 段(text/16-ch09.txt:1344,搜「两个重要问题」)与第 1347 段(text/16-ch09.txt:1347,搜「小象耳朵」)。