1 从线性分类器到卷积网络
1.1 图像分类任务
图像分类(Image
Classification)的输入是一张图像,输出是在给定类别集合中的预测类别。例如类别集合可以是
{dog, cat, truck, plane, ...},模型需要根据像素内容给出每个类别的分数,最后选择分数最高的类别。
在前几讲中,最基本的做法是把图像表示成一个向量,然后使用线性分类器:
\[ f(x, W) = Wx + b \]
其中 \(x\) 是输入图像展平后的向量,\(W\) 是可学习权重,\(b\) 是偏置,输出是每个类别的 score。训练时用损失函数衡量预测和真实标签的差距,例如 Softmax loss,再用 SGD、Momentum、RMSProp、Adam 等优化算法更新参数。
1.2 线性分类器的局限
线性分类器有两个重要局限。
| 视角 | 局限 |
|---|---|
| 视觉视角 | 每个类别只能学习一个模板,难以表达同一类别内部的大量外观变化 |
| 几何视角 | 只能在特征空间中画线性决策边界,难以处理复杂非线性分类问题 |
例如“猫”可以有不同姿态、尺度、背景、光照和遮挡。一个线性模板很难同时匹配所有猫的外观,又排除外观相似但不是猫的图像。两层神经网络已经能通过隐藏层表达非线性函数,但如果直接把 \(32 \times 32 \times 3\) 图像展平成 \(3072\) 维向量,二维空间结构会被破坏:相邻像素在图像中的局部关系被压成一维位置关系,模型不能自然利用“边缘、角点、纹理、局部形状”等图像结构。
2 图像特征:从手工设计到端到端学习
2.1 像素空间与特征空间
直接在像素空间上训练线性分类器,等价于希望原始 RGB 数值已经足够线性可分。但图像中的语义往往不是由单个像素决定,而是由局部模式和更高层结构决定。因此传统计算机视觉常先把图像转换成特征表示(Feature Representation),再在特征上训练分类器:
\[ \text{image} \rightarrow \text{feature representation} \rightarrow f(x)=Wx \rightarrow \text{class scores} \]
这里的核心思想是:如果特征提取器能把颜色、边缘、纹理、局部部件等信息编码得更好,后面的线性分类器就更容易完成分类。
2.2 典型手工特征
2.2.1 颜色直方图(Color Histogram)
颜色直方图统计图像中不同颜色或颜色区间出现的频率。它对整体颜色分布很敏感,适合区分颜色差异明显的类别,但会丢失空间布局。例如一张蓝天图和一张蓝色物体图可能有相似颜色分布,但语义完全不同。
2.2.2 方向梯度直方图(Histogram of Oriented Gradients, HoG)
HoG 把图像划分为小区域,在每个区域内统计边缘方向。例如一张 \(320 \times 240\) 图像可以划分成 \(40 \times 30\) 个 \(8 \times 8\) 区域,每个区域量化成 9 个方向 bin,则特征维度为:
\[ 40 \times 30 \times 9 = 10800 \]
HoG 比颜色直方图更关注局部边缘和形状,因此曾广泛用于行人检测等任务。它的关键假设是:物体的局部形状可以通过边缘方向分布表达。
2.2.3 视觉词袋(Bag of Words)
视觉词袋的流程通常分两步:
- 从训练图像中提取大量局部 patch,并聚类形成视觉词典(codebook / visual words)。
- 对每张图像,把局部 patch 映射到最近的视觉词,再统计视觉词出现频率作为图像特征。
这种方法借鉴了文本中的词袋模型,把图像看成由许多局部视觉词组成。它比简单全局统计更灵活,但仍然依赖人工设计流程,并且空间关系表达有限。
2.3 ConvNet 与手工特征的区别
传统流程把“特征提取”和“分类器训练”分成两个阶段:特征通常由人设计,分类器再学习。卷积神经网络(Convolutional Neural Network, ConvNet / CNN)把这两部分合在一起:卷积层和池化层负责学习图像特征,后面的分类层负责输出类别分数,整个系统通过反向传播和梯度下降端到端训练。
这意味着特征不再是固定的 HoG 或视觉词袋,而是为了当前任务和数据自动学习出来的。浅层卷积可能学到边缘和颜色对比,深层卷积可能学到眼睛、轮子、字母、纹理组合或更抽象的物体部件。
3 卷积神经网络的整体思想
3.1 CNN 保留图像的空间结构
全连接层(Fully Connected Layer, FC layer)会把 \(32 \times 32 \times 3\) 图像展平成 \(3072 \times 1\) 向量,每个神经元都看整个输入。这种做法参数多,而且不显式利用局部空间结构。
卷积层则把输入保留为三维张量,例如 \(C \times H \times W\)。对于 RGB 图像,\(C=3\),\(H,W\) 是高度和宽度。卷积核在空间维度上滑动,对局部区域做点积,从而生成空间上仍然有位置对应关系的 feature map。
核心直觉:图像中的局部模式很重要,而且同一种局部模式可以出现在不同位置。卷积层通过局部连接和权重共享,把这种归纳偏置直接写进模型结构。
3.2 CNN 的常见组成
本讲涉及四类基本模块:
| 模块 | 作用 |
|---|---|
| 卷积层(Convolution Layer) | 提取局部空间特征,产生 feature maps |
| 激活函数(Activation Function) | 引入非线性,常见如 ReLU |
| 池化层(Pooling Layer) | 下采样,减少空间尺寸,增强小位移不敏感性 |
| 全连接层(Fully Connected Layer) | 在网络末端形成分类器,输出类别分数 |
历史上常见 CNN 结构可以概括为:
\[ [(\mathrm{CONV}-\mathrm{RELU}) \times N-\mathrm{POOL?}] \times M -(\mathrm{FC}-\mathrm{RELU}) \times K-\mathrm{SOFTMAX} \]
其中 \(N\) 表示连续卷积块数量,\(M\) 表示堆叠多少个阶段,\(K\) 是末端全连接层数量。现代结构逐渐减少池化层和全连接层的使用,更多用卷积、残差连接、归一化和注意力等模块。
4 卷积层(Convolution Layer)
4.1 卷积核如何作用在图像上
以输入图像 \(3 \times 32 \times 32\) 和一个 \(3 \times 5 \times 5\) 卷积核为例。卷积核的深度必须覆盖输入的全部通道,因此 RGB 输入上的 \(5 \times 5\) 空间窗口实际包含:
\[ 3 \times 5 \times 5 = 75 \]
个数值。卷积核与这个局部块做点积,再加上一个 bias,得到输出 feature map 上的一个数。然后卷积核在图像平面上滑动,对所有空间位置重复同样操作。
如果有 6 个不同卷积核,每个卷积核都会产生一张 activation map。把 6 张 activation map 堆叠起来,就得到输出张量。例如无 padding、stride 为 1 时:
\[ 3 \times 32 \times 32 \xrightarrow[]{6\ \text{filters of } 3 \times 5 \times 5} 6 \times 28 \times 28 \]
对于 batch 输入,形状通常写作:
\[ N \times C_{in} \times H \times W \]
卷积权重形状为:
\[ C_{out} \times C_{in} \times K_H \times K_W \]
输出形状为:
\[ N \times C_{out} \times H' \times W' \]
偏置向量长度为 \(C_{out}\)。
4.2 卷积层与全连接层的对比
| 层类型 | 每个神经元看的范围 | 是否保留空间结构 | 参数共享 |
|---|---|---|---|
| 全连接层 | 整个输入向量 | 否,通常先展平 | 否 |
| 卷积层 | 局部感受野 | 是,输出仍是空间网格 | 是,同一个 filter 在所有位置共享 |
全连接层中的一个输出神经元对 \(3072\) 维输入做点积;卷积层中的一个输出位置只对局部区域做点积。例如 \(5 \times 5\) RGB filter 只看 \(75\) 个输入值。由于同一个 filter 在所有位置复用,卷积层能用较少参数检测在任意位置出现的相同局部模式。
4.3 多个 filter 与通道数
卷积层的输出通道数等于 filter 的数量。若输入是 \(C_{in} \times H \times W\),使用 \(C_{out}\) 个大小为 \(C_{in} \times K_H \times K_W\) 的 filter,则每个空间位置输出一个 \(C_{out}\) 维向量。
可以把卷积层理解为:在每个位置提取一组局部特征,每个 filter 对应一种局部模式检测器。浅层 filter 常学到方向边缘、颜色对比;深层 feature 更难直接可视化,但往往对应更大的结构和语义部件。
4.4 \(1 \times 1\) 卷积
\(1 \times 1\) 卷积看起来空间范围很小,但它非常有意义。若输入为 \(64 \times 56 \times 56\),使用 32 个 \(1 \times 1 \times 64\) filter,输出为 \(32 \times 56 \times 56\)。每个空间位置上,\(1 \times 1\) 卷积对 64 维通道向量做线性变换:
\[ \mathbb{R}^{64} \rightarrow \mathbb{R}^{32} \]
它不混合相邻空间位置,但会混合通道信息,常用于改变通道数、降低计算量或在通道维度上组合特征。
5 空间尺寸、填充、步幅与感受野
5.1 无 padding、stride 为 1 的输出尺寸
一维情况下,输入宽度为 \(W\),卷积核大小为 \(K\),不使用 padding,stride 为 1,则输出宽度为:
\[ W' = W - K + 1 \]
例如 \(7 \times 7\) 输入配 \(3 \times 3\) filter,输出为 \(5 \times 5\)。原因是 \(3 \times 3\) 窗口能在长度为 7 的方向上合法放置 5 个位置。
这带来一个问题:如果连续堆很多层卷积,feature map 会不断变小。
5.2 Padding
填充(Padding)是在输入边缘补零,使卷积核可以覆盖图像边界附近的位置。若 padding 大小为 \(P\),stride 为 1,则输出尺寸变为:
\[ W' = W - K + 1 + 2P \]
常见设置是:
\[ P = \frac{K-1}{2} \]
当 \(K\) 为奇数时,这会让输出和输入空间尺寸相同,称为 same padding。例如 \(K=3\) 时取 \(P=1\),\(K=5\) 时取 \(P=2\)。
5.3 Stride
步幅(Stride)控制卷积核每次滑动多少个像素。stride 越大,输出空间尺寸越小,也就实现了下采样。一般公式为:
\[ H' = \frac{H - K + 2P}{S} + 1 \]
\[ W' = \frac{W - K + 2P}{S} + 1 \]
其中 \(S\) 是 stride。实际网络设计中需要确保结果是整数,否则说明该组超参数不能整齐覆盖输入。
5.4 卷积层参数量
卷积层参数量只与 filter 尺寸、输入通道数和输出通道数有关,与输入图像的 \(H,W\) 无关。对于 \(C_{out}\) 个 filter,每个 filter 大小为 \(C_{in} \times K_H \times K_W\),再加一个 bias,则参数总量为:
\[ C_{out} \times (C_{in}K_HK_W + 1) \]
例子:输入 \(3 \times 32 \times 32\),使用 10 个 \(5 \times 5\) filter,stride \(1\),padding \(2\)。
输出空间尺寸:
\[ 32' = \frac{32 + 2 \times 2 - 5}{1} + 1 = 32 \]
所以输出为:
\[ 10 \times 32 \times 32 \]
每个 filter 的参数量为:
\[ 3 \times 5 \times 5 + 1 = 76 \]
总参数量为:
\[ 10 \times 76 = 760 \]
乘加运算量可以按“输出元素个数 \(\times\) 每个输出的点积长度”估算。输出元素个数为:
\[ 10 \times 32 \times 32 = 10240 \]
每个输出位置需要 \(3 \times 5 \times 5=75\) 次乘加,因此总量约为:
\[ 10240 \times 75 = 768000 \]
5.5 感受野(Receptive Field)
感受野指输出中的某个元素依赖输入中的多大区域。对于 kernel size 为 \(K\)、stride 为 1 的连续卷积,每加一层卷积,输入感受野大小增加 \(K-1\)。如果堆叠 \(L\) 层,则感受野大小为:
\[ 1 + L(K-1) \]
例如连续堆叠 3 层 \(3 \times 3\) 卷积,感受野大小为:
\[ 1 + 3(3-1)=7 \]
这说明小卷积核通过加深网络也能逐渐看到更大区域。对大图像来说,如果希望高层特征覆盖足够大的上下文,通常需要网络更深,或者在网络中进行下采样。
5.6 卷积层常见设置
| 设置 | 作用 |
|---|---|
| \(K=3, P=1, S=1\) | 常见 \(3 \times 3\) same convolution |
| \(K=5, P=2, S=1\) | 常见 \(5 \times 5\) same convolution |
| \(K=1, P=0, S=1\) | \(1 \times 1\) 卷积,主要混合通道 |
| \(K=3, P=1, S=2\) | 空间尺寸下采样约 2 倍 |
输出通道数常取 32、64、128、256 等 2 的幂,这是一种工程上常见的维度设计习惯。
6 池化层(Pooling Layer)
6.1 池化的作用
池化层是另一种下采样方式。给定输入 \(C \times H \times W\),池化通常对每个通道独立操作,只在空间维度上聚合局部区域,不改变通道数。
池化的常见目的有三个:
- 降低 feature map 的空间尺寸,减少后续计算量。
- 让表示对小范围空间位移更不敏感。
- 聚合局部响应,保留局部区域中最显著或平均的信息。
6.2 Max Pooling
最大池化(Max Pooling)在每个局部窗口中取最大值。例如对单个通道的 \(4 \times 4\) 输入使用 \(2 \times 2\) kernel、stride 为 2:
\[ \begin{bmatrix} 1 & 1 & 2 & 4 \\ 5 & 6 & 7 & 8 \\ 3 & 2 & 1 & 0 \\ 1 & 2 & 3 & 4 \end{bmatrix} \rightarrow \begin{bmatrix} 6 & 8 \\ 3 & 4 \end{bmatrix} \]
每个 \(2 \times 2\) 区域只保留最大激活值。直觉上,如果某个局部特征在窗口内稍微移动,最大值仍可能被保留下来,因此 max pooling 能带来一定的局部空间不变性。
6.3 池化输出尺寸
池化层没有可学习参数。若 kernel size 为 \(K\),stride 为 \(S\),输入为 \(C \times H \times W\),输出为:
\[ C \times H' \times W' \]
其中:
\[ H' = \frac{H-K}{S}+1 \]
\[ W' = \frac{W-K}{S}+1 \]
常见设置是 max pooling,\(K=2, S=2\),这会把空间尺寸下采样 2 倍。
7 平移等变性与空间不变性
7.1 平移等变性(Translation Equivariance)
卷积和池化都具有重要的平移等变性。设 \(\mathrm{Translate}(X)\) 表示把输入图像平移,卷积满足近似关系:
\[ \mathrm{Conv}(\mathrm{Translate}(X)) = \mathrm{Translate}(\mathrm{Conv}(X)) \]
意思是:如果输入中的物体移动了,输出 feature map 中对应的激活也会以相同方式移动。卷积不会因为猫从左边移动到右边就需要重新学习一套完全不同的参数;同一个 filter 可以在所有位置检测相同局部模式。
7.2 平移不变性(Translation Invariance)
等变性和不变性不同。
| 概念 | 含义 |
|---|---|
| 平移等变性 | 输入移动,输出表示也按对应方式移动 |
| 平移不变性 | 输入移动,最终预测基本不变 |
卷积层本身更接近等变性;池化、下采样、全局平均池化、分类头等结构可以逐渐让最终分类结果对小范围位移更不敏感。图像分类通常希望模型最终具有一定平移不变性,因为物体在图像中的绝对位置不应改变类别。
8 CNN 的历史位置与现代视觉模型
8.1 CNN 为什么曾经主导视觉任务
CNN 直接编码了图像的几个重要先验:
- 局部性:相邻像素之间关系最密切。
- 权重共享:同一种局部模式可以出现在不同空间位置。
- 层级结构:浅层检测边缘和纹理,中层组合局部部件,深层形成更抽象语义。
- 可端到端训练:卷积特征和分类器一起通过反向传播优化。
从 LeNet 到 AlexNet,CNN 在文档识别、ImageNet 分类等任务中取得关键成功。约 2012 到 2020 年,ConvNet 是许多视觉任务的核心架构,包括分类、检测、图像描述和生成模型中的视觉组件。
8.2 Transformer 的兴起
2021 年以后,Transformer 在视觉任务中变得越来越重要。Vision Transformer 把图像切成 patch token,然后用自注意力建模全局关系。与 CNN 相比,Transformer 较少依赖局部卷积先验,更依赖大规模数据和训练策略学习视觉结构。
这并不意味着 CNN 的思想过时。卷积的局部连接、权重共享、平移等变性、感受野和下采样仍然是理解现代视觉网络的基础。很多现代架构仍会混合使用卷积、注意力和 MLP。
9 复习重点与易混点
9.1 必须掌握的公式
卷积输出尺寸
\[ H' = \frac{H-K+2P}{S}+1 \]
\[ W' = \frac{W-K+2P}{S}+1 \]
卷积参数量
\[ C_{out}(C_{in}K_HK_W + 1) \]
其中 \(+1\) 是每个 filter 的 bias。
池化输出尺寸
\[ H' = \frac{H-K}{S}+1,\quad W' = \frac{W-K}{S}+1 \]
池化层通常没有参数。
多层卷积感受野
当 stride 为 1,连续堆叠 \(L\) 层 kernel size 为 \(K\) 的卷积时:
\[ \text{receptive field} = 1 + L(K-1) \]
9.2 易混点
| 易混点 | 正确理解 |
|---|---|
| filter 的深度 | filter 必须覆盖输入的全部通道,空间大小是 \(K_H \times K_W\),完整大小是 \(C_{in} \times K_H \times K_W\) |
| filter 数量与输出通道 | filter 数量就是输出通道数 \(C_{out}\) |
| 参数量与输入空间尺寸 | 卷积参数量与 \(H,W\) 无关,但计算量与输出空间尺寸有关 |
| padding 的作用 | padding 可以控制输出尺寸,常用 same padding 保持空间大小 |
| stride 与 pooling | 二者都可下采样;stride convolution 有可学习参数,pooling 通常无参数 |
| 等变性与不变性 | 卷积更强调平移等变,最终分类器希望获得一定平移不变 |
| \(1 \times 1\) 卷积 | 不是“没用的卷积”,它在每个空间位置混合通道并改变通道数 |
9.3 典型计算题
输入为 \(3 \times 32 \times 32\),使用 10 个 \(5 \times 5\) filter,stride \(S=1\),padding \(P=2\)。
输出尺寸:
\[ H' = W' = \frac{32-5+2 \times 2}{1}+1=32 \]
输出张量:
\[ 10 \times 32 \times 32 \]
参数量:
\[ 10 \times (3 \times 5 \times 5 + 1)=760 \]
乘加量:
\[ 10 \times 32 \times 32 \times 3 \times 5 \times 5=768000 \]
9.4 一句话总结
CNN 的关键思想是:用局部连接和权重共享保留图像空间结构,用卷积层学习可复用的局部模式,用下采样扩大有效感受野并降低计算量,最后通过端到端训练把特征提取和分类统一起来。