跳到主要内容

卷积神经网络 — 参数共享如何驯服图像

这一章讲三件事: 全连接网络为什么处理不了大图;卷积、步幅、填充、池化这套「小窗流水线」每一步在干什么; 经典网络谱系怎么一路解到「百层可训」;以及 CIFAR-10 上 68%→95% 的四级台阶各自靠什么。 这是原书称为「三大硬骨头」的第一块,也是全书篇幅最长的一章。

1. 顶层全景:从亿级参数到一张小滤网

全连接:1000×1000 图像 ×100 隐层 → 权重矩阵 1,000,000×100(1 亿个数)
卷积: 3×3 的小滤网在图上滑动 = 9 个数(整张图共用)


[图] → 卷积(提特征) → 激活(加非线性) → 池化(缩尺寸) → …×N → 全连接(做分类)
↑ 这三步是一个标准「积木块」,网络越深、积木块越多

书里算的这笔账值得背下来:一张 1000×1000 的灰度图,输入节点就是 100 万个;隐含层只放 100 个神经元,输入到隐层的权重矩阵就是 1000000×100——1 亿个参数,再叠层、再反向传播,「结果可想而知」,而且全连接极易过拟合1。卷积的破局思路:不用「每个输入连每个输出」,用一把小滤网扫全图

2. 主走查:一次卷积的真实算术

卷积(convolution)在深度学习语境里没有数学课那么玄:拿一个小矩阵(卷积核,kernel,又叫过滤器 filter)当滑窗,在输入图上逐格滑动;每停一格,把窗内 9 个数与核上 9 个数对应相乘再求和,填进输出矩阵的一格。下面把书里的例子逐格算一遍2:

输入 5×5: 核 3×3: 第 1 步(窗口在左上角):
1 1 1 0 0 1 0 1
0 1 1 1 0 0 1 0 1×1 + 1×0 + 1×1
0 0 1 1 1 1 0 1 + 0×0 + 1×1 + 1×0
0 0 1 1 0 + 0×1 + 0×0 + 1×1 = 4
0 1 1 0 0
窗口右移一格 → 算出右边那格
整行扫完 → 下移一格 → 依此类推

输出第一行第一列的 4 就是这么来的——原文把这个九连乘写在算式里,可逐项核对。三个控制参数各管一件事:步幅(stride)是窗口每次跳几格,跳 2 格输出就缩小约一半;填充(padding)是在图四周补零圈,「Same」方式补零保住尺寸不丢边角信息,「Valid」方式不补、输出变小3;多通道(彩色图的 R、G、B)时,核也变成 3 层,每个通道各自卷完再求和——6×6×3 的图配 3×3×3 的核,输出还是一张 4×4 的平面4。多放几组不同的核,输出就有几个平面:7×7×3 的输入配两组核,得到 3×3×2 的输出5

最关键的一句藏在书里朴素的一行里:核上的 9 个数整张图共用——原文叫「共享变量」,卷积神经网络靠参数共享大大降低参数量(可调数的总数)6。1 亿参数的墙就是这么翻过去的。至于核里该是什么数?不是人工设计的边缘检测器,而是像普通权重一样由训练学出来7

池化(pooling)是流水线的第二站:在 2×2 的窗里取最大值(最大池化)或平均值,把特征图尺寸减半——保留显著特征、降维、抗微小位移8。第三站的升级版是全局平均池化(GAP):不再滑窗,直接对整张特征图求一个平均数,一张特征图输出一个值;用它替换分类前的全连接层,「没有参数需要调,避免了过拟合」,空间平移也更鲁棒,书里说现在卷积网络末尾的全连接大都这么替换9

还有一站往反方向走:转置卷积(transposed convolution)。把卷积写成大稀疏矩阵 C 乘输入向量,那 C 的转置 Cᵀ 乘输出就是逆操作——把小特征图放大回去(上采样:把小图放大回去)10。本章只需记住它的用途:生成式(「会造数据」的那一类)网络要「从小到大造图」,第 08、12 章会反复用到。

3. 经典网络谱系:每一代在解上一代的痛

谱系不是年代陈列,是问题清单的交接——从 1998 年把「卷积+池化+全连接」三段式定型的 LeNet-5(开山的第一代卷积网络)讲起:

网络(年份)接手的痛点关键一招
LeNet-5(1998)卷积网络有没有定型定下「卷积+池化+全连接」三段式,开山鼻祖11
AlexNet(2012)网络训不动、数据不够ReLU+Dropout+数据增强+GPU 两卡训练;ImageNet 夺冠、超第二名 10.9 个百分点12
VGG(2014)想更深,层怎么堆全用 3×3 小核堆深:两个 3×3 的感受野等价 5×5,参数还更少;Top5 错误率降到 7.3%13
GoogLeNet(2014)深不动了,换个维度Inception 模块多路并行「加宽」,1×1 卷积先降维省计算;全连接替换成全局平均池化(AlexNet 末三层全连接占全部参数约 90%),精度 93.3% 还比 VGG 快14
ResNet(2015)层数加深反而退化残差(把输入直连加回输出)连接:恒等通路当「梯度高速通道」,层数从 22 层跃到 152 层15
胶囊网络(2017)池化丢姿态信息神经元输出向量+动态路由,保留位置旋转等细节;但书如实说它在 ImageNet/CIFAR-10 上还没有表现,「仍处于起步阶段」16

读这张表的正确方式:每一行第三列都是对上一行遗留痛点的回答。「感受野」(receptive field,一个输出点能「看见」的输入范围)是贯穿的暗线——VGG 用两个 3×3 顶一个 5×5,ResNet 让百层网络每个点仍能回看全图。

判断(我们的,不是书里的): 这张谱系表里真正的分水岭是 ResNet。此后「加深度」不再是技术冒险,残差连接成了几乎所有后续架构(包括 Transformer)的标准件;今天读 2015 年之前的网络结构,主要价值是读懂「为什么要残差」。 如果错,会错在: 如果卷积网络后来在视觉任务中被完全替代,那「分水岭」的评价就要让位——事实上 2020 年后视觉 Transformer 确实分走了大片领地,但残差连接本身原样搬了过去。

4. 实战:68%→95% 的四级台阶

CIFAR-10:6 万张 32×32 彩色小图,10 个类别17。书里的四级台阶——也是原书前言预告的主线——每一级都值得看清「靠什么涨」:

台阶做法结果涨的点靠什么
0两层卷积+两层全连接的简单网68%基线(起点评的参照)
1三个模型投票(模型集成)~74%集思广益:单模型最高 71%,集成 74%;多样性比单模型强度更重要——书里的比喻是盲人摸象,每人摸一部分,合起来才完整18
2换 VGG16~90%换经过大赛验证的结构,不是调参19
3迁移学习+数据增强(第 10 章)~95%站在 ImageNet 预训练的肩膀上

两级细节值得单独记。其一,参数都压在全连接:逐层统计这个简单网,第一个卷积层 1216 个参数、第二个 5220,而第一个全连接层 166016 个——全是最后一跳贡献的;换成 GAP 后,全网的参数从 173742 降到 16022(十分之一多),代价是同轮数下精度 63%、收敛变慢,书里的裁决是「参数少、泛化好,慢可以用加轮数补」20。其二,精度不均揭示瓶颈:整体 68%,但猫只有 46%、鸟 50%,青蛙和船有 79%——小图上的细粒度类别是真正的短板,涨精度该往哪使劲,类别明细比总数诚实21

5. 作者的判断与证据

给了证据的: 卷积九连乘=4 有算式;CIFAR-10 四级台阶每一级都有实际运行输出(68%、73.18~74.19%、90%、95%);GAP 版参数量 16022 对 173742 是逐层清点的数字。

转述文献的: 谱系各网络的战绩(10.9 个百分点、7.3%、93.3%、152 层)均为公开赛事结果,书转述而未注原始论文——这是全书引用习惯里最薄弱的一段,读者需要知道这些数字的原始出处都在各网络论文里(补充(不在书里,来自通用知识))。

作者的前瞻与保留: 对胶囊网络书里明显持观望态度——「这个概念是合理的」但「还没有很成熟的任务」;事后看这个保留是对的,胶囊网络没有成为主流。

6. 边界与局限

  • 没有 Transformer/视觉注意力。 书成稿时 ViT 尚未发表;今天图像分类的另一个主流路线(把图切成小块当序列处理)完全不在书内。
  • 2014 年那句话有一处笔误: 前言写「谷歌研发出20层的VGG模型」,正文自己更正为 VGG 是 16/19 层的牛津团队作品——读时以正文为准。
  • 训练细节从简: 数据增强只在本章一笔带过,批标准化在本章实例里没出现(第 04 章讲过机制);学习率调度也没进这章的实验。
  • 目标检测、图像分割只在第 09 章顺带提及,本章不含。

7. 可带走的

  1. 全连接处理图像先算参数账:百万像素×百隐层=亿级参数;卷积用 9 个数的共享小核破局;
  2. 一次卷积=窗口九连乘求和;步幅管跳格、填充管边角、多通道逐层卷完求和;核的数值是训出来的;
  3. 卷积核参数全图共享,这是「参数共享」四个字的具体含义;
  4. 池化缩尺寸抗位移;GAP 一张特征图一个值,换掉全连接能把参数砍到十分之一,代价是收敛慢;
  5. 转置卷积=卷积的转置=上采样,生成网络的标配;
  6. 谱系表按「痛点→解法」读:AlexNet 训得动、VGG 小核堆深、GoogLeNet 加宽省参数、ResNet 残差破百层;
  7. 模型集成的关键是多样性,不是单模型精度;
  8. 看类别明细再判断瓶颈:整体 68% 时猫只有 46%,该补的是细粒度特征,不是更多轮数。

8. 原文地图

主题原书章原文位置
全连接参数爆炸第6章 视觉处理基础text/07-ch06.txt:5(搜「1000000」)
CNN 简史与低谷第6章 视觉处理基础text/07-ch06.txt:31(搜「LeNet-5」) · text/07-ch06.txt:37(搜「ImageNet大赛上CNN夺冠」)
更少参数更高性能第6章 视觉处理基础text/07-ch06.txt:48(搜「更少的参数」)
卷积核=移动窗口第6章 视觉处理基础text/07-ch06.txt:99(搜「移动窗口」)
核由训练得到第6章 视觉处理基础text/07-ch06.txt:133(搜「通过模型训练来得到」)
九连乘=4 主走查第6章 视觉处理基础text/07-ch06.txt:145(搜「1×1+1×0」)
步幅第6章 视觉处理基础text/07-ch06.txt:153(搜「步幅」)
共享变量/参数共享第6章 视觉处理基础text/07-ch06.txt:159(搜「共享变量」)
Same/Valid 填充第6章 视觉处理基础text/07-ch06.txt:178(搜「Same」)
多通道卷积第6章 视觉处理基础text/07-ch06.txt:191(搜「6×6×3」) · text/07-ch06.txt:199(搜「7×7×3」)
转置卷积与 Cᵀ第6章 视觉处理基础text/07-ch06.txt:270(搜「转置卷积」) · text/07-ch06.txt:294(搜「CTY」)
三种池化第6章 视觉处理基础text/07-ch06.txt:310(搜「最大池化」)
GAP 原理与优势第6章 视觉处理基础text/07-ch06.txt:375(搜「全局平均池化」) · text/07-ch06.txt:396(搜「大都用GAP替换」)
LeNet 开山鼻祖第6章 视觉处理基础text/07-ch06.txt:433(搜「开山鼻祖」)
AlexNet 10.9 个百分点第6章 视觉处理基础text/07-ch06.txt:462(搜「10.9」)
VGG 3×3 与 7.3%第6章 视觉处理基础text/07-ch06.txt:485(搜「7.3%」) · text/07-ch06.txt:499(搜「3×3的卷积核」)
GoogLeNet 1×1 与 90%第6章 视觉处理基础text/07-ch06.txt:521(搜「1×1卷积」) · text/07-ch06.txt:528(搜「90%」)
ResNet 残差与 152 层第6章 视觉处理基础text/07-ch06.txt:547(搜「梯度高速通道」) · text/07-ch06.txt:549(搜「152层」)
胶囊网络保留意见第6章 视觉处理基础text/07-ch06.txt:593(搜「动态路由」) · text/07-ch06.txt:598(搜「没有这种表现」)
CIFAR-10 数据集第6章 视觉处理基础text/07-ch06.txt:611(搜「60000」)
基线 68% 与类别明细第6章 视觉处理基础text/07-ch06.txt:801(搜「68 %」) · text/07-ch06.txt:832(搜「46 %」)
GAP 版 63% 与参数第6章 视觉处理基础text/07-ch06.txt:871(搜「63%」) · text/07-ch06.txt:872(搜「16022」) · text/07-ch06.txt:886(搜「173742」)
集成=盲人摸象、多样性第6章 视觉处理基础text/07-ch06.txt:988(搜「盲人摸象」) · text/07-ch06.txt:996(搜「多样性」)
集成 74% 的账本第6章 视觉处理基础text/07-ch06.txt:829(搜「74%」) · text/07-ch06.txt:1090(搜「74.19」)
VGG16 90% 与预告 95%第6章 视觉处理基础text/07-ch06.txt:1108(搜「90%」) · text/07-ch06.txt:1145(搜「95%」)

Footnotes

  1. 出处:「第6章 视觉处理基础」第 5 段(text/07-ch06.txt:5,搜「1000000」)。

  2. 出处:「第6章 视觉处理基础」第 145 段(text/07-ch06.txt:145,搜「1×1+1×0」)。输入、核与输出数值均出自原文及图 6-3 的说明。

  3. 出处:「第6章 视觉处理基础」第 153 段(text/07-ch06.txt:153,搜「步幅」)与第 178 段(text/07-ch06.txt:178,搜「Same」)。

  4. 出处:「第6章 视觉处理基础」第 191 段(text/07-ch06.txt:191,搜「6×6×3」)。

  5. 出处:「第6章 视觉处理基础」第 199 段(text/07-ch06.txt:199,搜「7×7×3」)。

  6. 出处:「第6章 视觉处理基础」第 159 段(text/07-ch06.txt:159,搜「共享变量」)。

  7. 出处:「第6章 视觉处理基础」第 133 段(text/07-ch06.txt:133,搜「通过模型训练来得到」)。

  8. 出处:「第6章 视觉处理基础」第 310 段(text/07-ch06.txt:310,搜「最大池化」)与第 322 段(text/07-ch06.txt:322,搜「减小尺寸」)。

  9. 出处:「第6章 视觉处理基础」第 375 段(text/07-ch06.txt:375,搜「全局平均池化」)与第 396 段(text/07-ch06.txt:396,搜「大都用GAP替换」)。

  10. 出处:「第6章 视觉处理基础」第 285 段(text/07-ch06.txt:285,搜「卷积核展成一个」)与第 294 段(text/07-ch06.txt:294,搜「CTY」)。

  11. 出处:「第6章 视觉处理基础」第 433 段(text/07-ch06.txt:433,搜「开山鼻祖」)。

  12. 出处:「第6章 视觉处理基础」第 462 段(text/07-ch06.txt:462,搜「10.9」)与第 481 段(text/07-ch06.txt:481,搜「数据增广」)。

  13. 出处:「第6章 视觉处理基础」第 485 段(text/07-ch06.txt:485,搜「7.3%」)与第 499 段(text/07-ch06.txt:499,搜「3×3的卷积核」)。

  14. 出处:「第6章 视觉处理基础」第 521 段(text/07-ch06.txt:521,搜「1×1卷积」)与第 528 段(text/07-ch06.txt:528,搜「90%」)。

  15. 出处:「第6章 视觉处理基础」第 547 段(text/07-ch06.txt:547,搜「梯度高速通道」)与第 549 段(text/07-ch06.txt:549,搜「152层」)。

  16. 出处:「第6章 视觉处理基础」第 593 段(text/07-ch06.txt:593,搜「动态路由」)与第 598 段(text/07-ch06.txt:598,搜「没有这种表现」)。

  17. 出处:「第6章 视觉处理基础」第 611 段(text/07-ch06.txt:611,搜「60000」)。

  18. 出处:「第6章 视觉处理基础」第 988 段(text/07-ch06.txt:988,搜「盲人摸象」)与第 996 段(text/07-ch06.txt:996,搜「多样性」);集成账本见第 829 段(text/07-ch06.txt:829,搜「74%」)。

  19. 出处:「第6章 视觉处理基础」第 1108 段(text/07-ch06.txt:1108,搜「90%」)。

  20. 出处:「第6章 视觉处理基础」第 871 段(text/07-ch06.txt:871,搜「63%」)、第 872 段(text/07-ch06.txt:872,搜「16022」)、第 886 段(text/07-ch06.txt:886,搜「173742」)与第 876 段(text/07-ch06.txt:876,搜「泛化能力」)。

  21. 出处:「第6章 视觉处理基础」第 801 段(text/07-ch06.txt:801,搜「68 %」)与第 832 段(text/07-ch06.txt:832,搜「46 %」)。