第 8 章 · 卷积与视觉

第 7 章的普通网络(全连接)对图像是灾难:1000×1000 的图,一层 1000 神经元全连接 = 10 亿参数,而且无视「像素的邻居关系」这一图像的本质。卷积神经网络(CNN)的两板斧——局部连接与权值共享——把参数砍掉几个数量级,顺便内置了「平移不变性」(猫在图左和图右都是猫)。2012 年 AlexNet 靠它在 ImageNet 一战封神(第 1 章的引爆点),视觉 AI 至今仍是 CNN 与 Transformer(第 9 章)的双雄会。

8.1 卷积:滑动的模式探测器

卷积核(kernel) 是一个小矩阵(3×3、5×5),在图像上滑动,每到一个位置做「对应相乘再求和」,输出一个数:

图像块          卷积核(边缘检测)
1 0 1 0 1       -1 0 1
1 0 1 0 1   ×   -1 0 1     → 该位置的响应值
1 0 1 0 1       -1 0 1

不同卷积核探测不同模式:上面的核探测「竖直边缘」,横向核找水平线,模糊核做平滑。关键设定:一个核扫全图 = 权值共享——「探测竖直边缘」这个知识不需要在每个位置学一份。一层卷积有几十个核,每个核输出一张特征图(该模式在全图的响应强度图)。

参数账:全连接一层 100×1000 图像要 10⁸ 参数;3×3 核的卷积层只要 3×3×通道数(几十到几千)。参数少了 5 个数量级,训练才可行。

8.2 CNN 的三件套:卷积、激活、池化

一个标准卷积块 = 卷积 + 激活(ReLU)+ 池化(pooling):

  • 卷积:提取局部模式;
  • ReLU:非线性(第 7 章);
  • 池化:2×2 取最大值(max pooling),把特征图长宽砍半——「这块区域有没有猫耳」比「猫耳在哪个像素」重要,天然引入平移鲁棒性,参数还省了。

把这些块堆起来:

输入 224×224×3(RGB)
→ [卷积+ReLU+池化] × 5     ← 特征图越来越小、通道越来越多
  (224×224×64 → 112×112×128 → … → 7×7×512)
→ 展平 → 全连接 → softmax(1000 类)

层次特征的涌现(这是 CNN 最深刻的洞察,3Blue1Brown 的可视化值得一看):浅层学「边缘、色块」(通用到任何图像),中层组合出「眼睛、车轮、纹理」,深层才是「猫脸、汽车」这种任务语义。**「通用的底层 + 特定的顶层」**让迁移学习成立:拿 ImageNet 预训练模型,只重训最后几层,小数据任务也能到 90%+——深度学习工程的第一省钱大招。

8.3 训练细节:图像任务的独特药方

  • 数据增强(data augmentation):原图随机翻转/裁剪/变色再喂,等于免费扩充数据集并强制模型学「不变性」;图像任务的成本最低的正则化(第 7 章表);
  • 输入归一化:像素除 255、再按均值方差标准化(第 7 章的必做项,不归一化直接训不动);
  • 感受野(receptive field):堆 5 层卷积后,顶层每个像素「看得见」原图的大片区域(层层扩大);想让深层看全图,要么池化要么大核;
  • 经典架构演进:AlexNet(2012,引爆)→ VGG(堆 3×3,优雅)→ ResNet(2015,残差连接:x + F(x),让百层网络可训,「跳线」思想影响至今,Transformer 里也有它)。读架构史的收获:每个新结构都是对「梯度流」「感受野」「参数量」三个工程约束的回应,不是玄学。

8.4 任务家族:从分类到分割

视觉任务的输出形态阶梯:

  • 分类:整图一个标签(这是猫);
  • 检测:框出每个物体(边框 + 类别,YOLO 系列实时检测);
  • 分割:每个像素一个类别(语义分割,自动驾驶的像素级理解);
  • 生成:文生图(扩散模型,Stable Diffusion,第 10 章的世界)。

任务越往下,标注越贵(一个像素一个像素地画)、模型越重。工程选型从分类试水,按需上重武器。CNN 的黄金时代产出(2012~2020)奠定了「预训练 + 微调」范式,今天的 LLM(第 10 章)不过是把它推到语言上的放大版。

8.5 CNN 的失效边界

CNN 不是万能:对抗样本(加一层人眼看不见的噪声,分类从「熊猫」翻成「长臂猿」,暴露模型学的是「统计捷径」而非「猫的概念」)、分布外脆弱(训练集里没有的视角/光照,性能崩)、数据偏见(训练集医生图多护士图少,模型学「性别 = 职业」)。这些失效的根源相同:模型在学数据集的统计,不是世界的规律(第 5 章相关≠因果的图像版)。工程上「用对抗样本攻击自己的模型」已成为上线前的标准安检。

常见认知误区

  • 「CNN 在模仿视觉皮层」。Hubel & Wiesel 的「简单细胞/复杂细胞」是灵感来源,但 CNN 学到的滤波器与生物视觉的关系松散;它是为「图像数据的空间结构」定制的数学工具。
  • 「卷积核是设计出来的」。经典的边缘核可以手写,但 CNN 的核全部从数据学出来(随机初始化 + 梯度下降);人只设计「结构」(几层、多宽、怎么连),不设计「参数」。
  • 「池化必须 max」。平均池化、步幅卷积(用卷积代替池化,可学)都是合法替代;现代架构常用 stride=2 的卷积一步到位。
  • 「图像任务只能 CNN」。2020 年后 Vision Transformer(ViT)用第 9 章的注意力把图切成 16×16 块当序列处理,大数据集上超越 CNN;小数据上 CNN 的归纳偏置(局部性、平移不变)仍是优势。

练习

  1. 动手:手写 3×3 卷积(双重循环,不看性能),对一个 8×8 的手绘图案分别用「竖直边缘核」「水平边缘核」「模糊核」跑一遍,打印三张特征图,亲眼看见「核 = 模式探测器」。
  2. 动手:用 PyTorch 训练 MNIST 的 CNN(第 7 章代码把 Linear 换 Conv2d + MaxPool),对比全连接版的准确率与参数量(nn.parameters() 数一下,预期差 10 倍)。
  3. 动手:数据增强实验:训练集只有 500 张图,分别用「无增强」和「随机翻转+裁剪」训练,报验证集准确率差(预期 5 个点以上),体会「免费的数据」。
  4. 思考:对抗样本说明 CNN 学的不是「猫的概念」而是「猫的统计特征」。结合第 5 章(泛化)与本章,讨论:人类视觉有没有「对抗样本」?(提示:视觉错觉。)「鲁棒性」是否是所有「从数据学习」的系统的固有软肋?