第 6 章 深度学习卷积神经网络CNN

卷积神经网络:让网络理解图像

本章来源:本文整理自《动手学深度学习》(zh.d2l.ai)第 6 章《卷积神经网络》,原书作者 Aston Zhang、李沐、Zachary C. Lipton、Alexander J. Smola。

本章讲什么

图像是深度学习最经典的应用场景。但用全连接网络处理图像有个致命问题:一张百万像素的图像,如果连接到 1000 个隐藏单元,光这一层就有 10 亿个参数——根本没法训练。

卷积神经网络(CNN) 之所以能处理图像,是因为它利用了图像天然拥有的结构。本章讲清楚卷积是怎么来的、卷积层怎么计算、以及第一个经典 CNN——LeNet。

为什么用卷积:两条原则

图像的天然结构可以凝练成两条原则:

  1. 平移不变性:物体在图像里的哪个位置,都应该能被识别。沃尔多(《寻找沃尔多》游戏里的人物)的样子不取决于他藏在画面哪里——所以可以用同一个"沃尔多检测器"扫遍全图,给每个区域打分。
  2. 局部性:判断一个区域是什么,只需要看它附近的一小片,不用关心远处的像素。比如判断某个像素是不是脸的一部分,看它的邻域就够,不需要看整张图。

数学上可以这样理解:全连接的权重是一个巨大的四阶张量,每个输出像素依赖所有输入像素。施加平移不变性后,权重不再随位置变化——变成同一个"核"扫遍全图,这就是卷积。再施加局部性后,核只在局部窗口内非零——得到卷积层

结果:参数从几十亿降到几百。代价是引入了归纳偏置(模型内置的结构先验)——特征平移不变、每层只看局部。当这个偏置符合现实(自然图像确实如此)时,模型参数少、样本高效、泛化好;不符合时(比如任务本身需要位置信息)就难以拟合。

还有个重要概念:通道。图像是"高 × 宽 × 通道"的三维张量(RGB 是 3 个通道),隐藏表示也是多通道的(叫特征映射)。底层的通道倾向于识别边缘、纹理等低级特征。

卷积层怎么计算

严格来说,深度学习里的"卷积层"做的是互相关运算——核不翻转。但因为核是从数据里学出来的,翻转与否不影响结果,所以沿用"卷积"的叫法。

计算方式:核(一个小矩阵,比如 3×3)从输入左上角滑到右下角,每个位置把窗口内的元素与核逐元素相乘再求和,得到一个数值填入输出的对应位置。输出尺寸比输入小。

卷积层可学习的参数只有两个:核权重标量偏置

书里用一个很直观的例子说明核能编码特征:设计一个核 [1, -1],它可以检测垂直边缘——相邻像素不同则输出非零。这证明核可以手工编码特征。但复杂特征没法手设计,于是用梯度下降从输入-输出对里学习核——训练若干轮后,学到的核逼近手工设计的核。这就是"特征是从数据中学出来的"。

两个重要概念:

  • 特征映射:卷积层的输出,把输入映射到下一层空间维度的"转换器"。
  • 感受野:影响某个输出的所有前层元素范围。堆叠更深的层能扩大感受野,让高层"看见"更广的区域——像站得更高看得更广。

填充与步幅:控制输出尺寸

卷积会缩小输出并丢失边界信息(240×240 的图像过 10 层 5×5 卷积会缩到 200×200,累积丢失可观)。两个工具控制输出尺寸:

  • 填充(padding):在输入边界补 0。动机有二:补偿缩小、保留边界信息;设填充为核大小减 1 可以让输出和输入同尺寸,方便设计网络。惯例:卷积核取奇数(1、3、5、7),好处是能对称填充、且输出元素以输入对应像素为中心。
  • 步幅(stride):核窗口每次滑动的元素数,默认 1。步幅大于 1 可以大幅降采样(高效计算、缩减分辨率),比如步幅 2 让高宽减半。

多输入多输出通道

前面讲了单通道的情况,实际图像是多通道的:

  • 多输入通道:核的输入通道数必须等于输入的通道数。做法是每个通道分别做互相关,再把所有通道结果相加,得到一个输出。
  • 多输出通道:为每个输出通道准备一组核。每个输出通道可以看作对一种特征的响应——边缘、纹理等。随着网络加深,输出通道数增加、空间分辨率减小。

1×1 卷积是个特殊但重要的层:窗口只有 1×1,失去了提取相邻像素空间关系的能力,计算只发生在通道之间。它等价于在每个像素位置应用的全连接层——把输入通道变换为输出通道,跨像素共享同一组权重。它常用于调整通道数量、控制模型复杂度。像一个"通道混合器":保持空间结构的同时重组通道信息。

池化层

卷积层有个弱点:对位置过于敏感——图像整体平移 1 个像素,边缘检测的输出可能大变。但现实中物体几乎不可能恰好落在同一像素(三脚架拍静止物体,快门震动都可能让画面偏移 1 像素)。

池化层(pooling) 一举两得:降低对位置的敏感性,同时逐步降低空间分辨率、聚合信息,让高层神经元拥有更大感受野。

两种基本操作:

  • 最大池化:取窗口内最大值,最常用。
  • 平均池化:取窗口内平均值。

与卷积的关键区别:池化层没有参数,是确定性运算。多通道时每个通道单独池化,输出通道数等于输入通道数(不像卷积会合并通道)。

LeNet:第一个经典 CNN

LeNet 由 Yann LeCun 在 1989 年提出,用于手写数字识别,性能媲美当时的 SVM,曾被部署在 ATM 机上识别支票数字——最早的商用深度学习案例之一。

架构分两部分:

  1. 卷积编码器:两个卷积块(每块 = 5×5 卷积 + 激活 + 2×2 平均池化),通道数从 1 → 6 → 16,空间分辨率逐步减半。
  2. 全连接分类头:三层全连接(120 → 84 → 10),最后一层输出 10 个类别。

它确立了 CNN 的标准设计范式:卷积块逐步降低空间分辨率、同时增加通道数(编码图像特征),最后展平交给全连接层做分类——先理解图像内容,再基于理解做判断。这一范式沿用至今。

注意历史局限:当时 ReLU 和最大池化还没出现,所以 LeNet 用的是 sigmoid 和平均池化。

小结

  • 图像天然拥有平移不变性和局部性,卷积层利用这两条原则,把参数从几十亿降到几百。
  • 卷积层用核在输入上滑动做加权求和,核是从数据里学出来的。
  • 填充补偿缩小并保留边界,步幅控制降采样。
  • 多通道让网络能学习多种特征,1×1 卷积等价于逐像素全连接。
  • 池化层无参数,降低对位置的敏感、扩大感受野。
  • LeNet 确立了"卷积编码 + 全连接分类"的 CNN 范式。

关键术语

术语 一句话解释
卷积神经网络(CNN) 含卷积层的神经网络,处理图像的核心模型
平移不变性 检测结果与物体位置无关
局部性 输出只依赖输入的一小片邻域
卷积核 卷积层可学习的权重,滑动窗口
特征映射 卷积层的输出,空间化的特征图
感受野 影响某输出的所有前层元素范围
填充 输入边界补 0,保持尺寸、保留边界
步幅 核窗口每次滑动的元素数
1×1 卷积 只在通道间计算,等价于逐像素全连接
池化层 无参数的降采样层,降低位置敏感
最大池化 / 平均池化 取窗口内最大值 / 平均值
LeNet 最早的经典 CNN,用于手写数字识别