章节封面

《理解深度学习》第10章 卷积网络 读书笔记

目录


开篇导语

  前面九章我们学习的都是全连接神经网络——每一层的每个神经元都和上一层的所有神经元相连。全连接网络虽然强大,但在处理图像数据时存在一个致命问题:参数量太大。一张224×224的彩色图片有15万个输入,如果第一层有1000个神经元,光这一层就有150亿个参数!这不仅计算量巨大,还极易过拟合。

  怎么解决这个问题?答案是卷积网络(Convolutional Neural Network,CNN)。卷积网络利用了图像的两个关键特性:局部性(图像中相邻像素的关系比远距离像素更紧密)和平移不变性(一只猫不管在图片的哪个位置都是猫)。通过卷积操作,卷积网络用少量的参数(卷积核)就能提取图像中的各种特征,在计算机视觉任务中取得了革命性的成功。

  本章我们将系统学习卷积网络。首先理解不变性和等变性的概念,然后学习一维和二维卷积操作,接着讨论下采样(池化)和上采样,最后看卷积网络在实际中的应用。


10.1 不变性和等变性

平移不变性

  在理解卷积网络之前,我们需要先理解两个重要的概念:不变性(Invariance) 和等变性(Equivariance)。

不变性

  不变性是指:当输入发生某种变换时,输出保持不变。在图像分类任务中,我们希望模型具有平移不变性——不管猫在图片的左上角、中心还是右下角,模型都应该把它分类为"猫"。

  全连接网络天然不具有平移不变性。因为全连接网络的每个参数对应输入的一个特定位置,如果猫从图片中心移到左上角,激活的神经元完全不同,模型需要重新学习"左上角的猫"这个概念。

  卷积网络通过权值共享(同一个卷积核在图片的所有位置上滑动)天然具有平移等变性,再配合池化操作就能实现平移不变性。

等变性

  等变性是指:当输入发生某种变换时,输出也发生相同的变换。在卷积网络中,卷积操作具有平移等变性——如果输入图片平移了,输出的特征图也会相应地平移。

  数学上,等变性可以表示为:

f ( g ( x ) ) = g ( f ( x ) ) f(g(x)) = g(f(x)) f(g(x))=g(f(x))

  其中 g g g 是某种变换(如平移), f f f 是网络操作。等变性意味着"先变换再处理"和"先处理再变换"得到的结果相同。

  不变性和等变性的关系:等变性是比不变性更弱的性质。如果一个操作具有等变性,那么通过后续的聚合操作(如池化、全局平均)就能实现不变性。卷积网络的设计正是利用了这一点:卷积层提供平移等变性,池化层逐步实现平移不变性。


10.2 用于一维输入的卷积网络

卷积操作

  我们先从最简单的一维卷积开始理解卷积操作。一维卷积常用于处理序列数据,如文本、音频、时间序列等。

一维卷积操作

  一维卷积的操作很简单:有一个输入序列 x = [ x 1 , x 2 , … , x N ] x = [x_1, x_2, \ldots, x_N] x=[x1​,x2​,…,xN​] 和一个卷积核(也叫滤波器) w = [ w 1 , w 2 , … , w K ] w = [w_1, w_2, \ldots, w_K] w=[w1​,w2​,…,wK​],卷积核在输入序列上滑动,每次和对应位置的输入做逐元素相乘再求和,得到输出序列的一个元素。

  数学上,一维卷积的输出为:

y i = ∑ k = 1 K w k ⋅ x i + k − 1 y_i = \sum_{k=1}^{K} w_k \cdot x_{i+k-1} yi​=k=1∑K​wk​⋅xi+k−1​

  其中 i i i 是输出位置, K K K 是卷积核大小。如果输入长度为 N N N,卷积核大小为 K K K,步长(stride)为 S S S,填充(padding)为 P P P,那么输出长度为:

L o u t = ⌊ N + 2 P − K S ⌋ + 1 L_{out} = \left\lfloor \frac{N + 2P - K}{S} \right\rfloor + 1 Lout​=⌊SN+2P−K​⌋+1

关键参数

  • 卷积核大小(Kernel Size):卷积核覆盖的输入区域大小。越大的卷积核能捕捉越大范围的特征,但参数量也越多。
  • 步长(Stride):卷积核每次滑动的距离。步长越大,输出尺寸越小,相当于下采样。
  • 填充(Padding):在输入边缘补零的数量。填充可以控制输出尺寸,“same padding”(填充使得输出和输入尺寸相同)很常用。

一维卷积的优势

  相比于全连接网络,一维卷积有两个核心优势:

  1. 参数共享:同一个卷积核在所有位置上使用,参数量从 N × H N \times H N×H 减少到 K K K( K ≪ N K \ll N K≪N)。
  2. 局部连接:每个输出只依赖输入的一个局部区域,利用了序列数据的局部相关性。

10.3 二维输入的卷积网络

特征图

  二维卷积是卷积网络中最常用的形式,主要用于处理图像数据。二维卷积的原理和一维卷积完全相同,只是卷积核从一维变成了二维。

二维卷积操作

  对于二维输入 X ∈ R H × W X \in \mathbb{R}^{H \times W} X∈RH×W 和二维卷积核 W ∈ R k H × k W W \in \mathbb{R}^{kH \times kW} W∈RkH×kW,二维卷积的输出为:

Y i , j = ∑ m = 1 k H ∑ n = 1 k W W m , n ⋅ X i + m − 1 , j + n − 1 Y_{i,j} = \sum_{m=1}^{kH} \sum_{n=1}^{kW} W_{m,n} \cdot X_{i+m-1, j+n-1} Yi,j​=m=1∑kH​n=1∑kW​Wm,n​⋅Xi+m−1,j+n−1​

  输出尺寸的计算公式和一维类似:

H o u t = ⌊ H + 2 P H − k H S H ⌋ + 1 , W o u t = ⌊ W + 2 P W − k W S W ⌋ + 1 H_{out} = \left\lfloor \frac{H + 2P_H - kH}{S_H} \right\rfloor + 1, \quad W_{out} = \left\lfloor \frac{W + 2P_W - kW}{S_W} \right\rfloor + 1 Hout​=⌊SH​H+2PH​−kH​⌋+1,Wout​=⌊SW​W+2PW​−kW​⌋+1

多通道卷积

  实际的图像通常有多个通道(如RGB三通道)。对于多通道输入,卷积核也需要有相同数量的通道,每个通道独立做卷积,然后将所有通道的结果相加,得到一个单通道的输出特征图。

  如果有 C i n C_{in} Cin​ 个输入通道和 C o u t C_{out} Cout​ 个输出通道(即 C o u t C_{out} Cout​ 个卷积核),那么卷积层的参数量为:

参数数量 = C o u t × ( C i n × k H × k W + 1 ) \text{参数数量} = C_{out} \times (C_{in} \times kH \times kW + 1) 参数数量=Cout​×(Cin​×kH×kW+1)

  其中最后的 + 1 +1 +1 是偏置项。可以看到,参数量和输入图像的尺寸 H × W H \times W H×W 完全无关!这就是卷积网络能处理大尺寸图像的关键。

特征图的层次化抽象

  卷积网络的一个神奇特性是层次化特征学习。浅层的卷积核学习简单的低级特征(如边缘、角点、颜色变化),中间层学习中级特征(如纹理、简单形状),深层学习高级特征(如物体部件、整个物体)。这种从低级到高级的层次化抽象,是卷积网络在视觉任务中成功的关键原因。


10.4 下采样和上采样

池化操作

下采样:池化层

  池化(Pooling) 是卷积网络中常用的下采样操作,它的作用是减小特征图的空间尺寸,从而:

  1. 减少参数量和计算量
  2. 扩大感受野(每个神经元能看到的输入区域)
  3. 提供一定程度的平移不变性

  最常用的池化操作是最大池化(Max Pooling):在每个池化窗口中取最大值。例如2×2最大池化,就是把2×2的区域压缩成一个值(最大值),特征图尺寸减半。

  另一种是平均池化(Average Pooling):取窗口内的平均值。平均池化更平滑,但会丢失显著特征的位置信息,因此最大池化更常用。

  需要注意的是,池化层没有可学习的参数,它只是一个固定的下采样操作。近年来,也有一些网络用步长卷积(stride=2的卷积层)代替池化层来进行下采样,因为步长卷积有可学习的参数,可能更灵活。

上采样:转置卷积

  在一些任务中(如图像分割、图像生成),我们需要将低分辨率的特征图恢复到高分辨率,这就需要上采样操作。

  最简单的上采样方法是最近邻插值和双线性插值,这些是固定的插值方法,没有可学习参数。

  更常用的是转置卷积(Transposed Convolution),也叫反卷积(Deconvolution,这个名字有误导性,它不是真正的反卷积)。转置卷积可以看作是卷积的"逆向"操作:它通过学习参数,将低分辨率特征图上采样到高分辨率。转置卷积在图像分割(如U-Net)和图像生成(如DCGAN)中广泛使用。


10.5 应用

  卷积网络在计算机视觉领域有着极其广泛的应用,几乎所有视觉任务的SOTA(State-of-the-Art)方法都基于卷积网络(直到最近被Transformer挑战)。

图像分类

  图像分类是卷积网络最经典的应用。从2012年AlexNet在ImageNet竞赛中一鸣惊人,到VGG、GoogLeNet、ResNet、DenseNet、EfficientNet等一系列经典架构,卷积网络不断刷新图像分类的准确率。现代卷积网络在ImageNet上的top-5准确率已经超过99%,超过了人类水平。

目标检测

  目标检测需要在图像中找出所有物体的位置(边界框)和类别。经典方法包括两阶段的R-CNN系列(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN)和一阶段的YOLO系列、SSD等。目标检测在自动驾驶、安防监控、医学影像等领域有广泛应用。

图像分割

  图像分割需要为图像中的每个像素分配类别标签。分为语义分割(不区分同一类别的不同实例)和实例分割(区分同一类别的不同实例)。经典方法包括FCN、U-Net(医学影像分割的标准架构)、DeepLab系列、Mask R-CNN等。

其他应用

  • 人脸识别:FaceNet、ArcFace等基于卷积网络的方法
  • 姿态估计:OpenPose、HRNet等
  • 图像超分辨率:SRCNN、ESRGAN等
  • 图像生成:DCGAN、StyleGAN等(卷积网络作为生成器和判别器)
  • 视频理解:C3D、I3D等三维卷积网络
  • 自然语言处理:TextCNN等一维卷积网络(在Transformer出现前常用)

10.6 本章小结

  本章我们系统学习了卷积网络。核心要点如下:

  1. 卷积网络解决了全连接网络处理图像时参数量过大的问题:通过局部连接和权值共享,参数量从和输入尺寸成正比变为和输入尺寸无关。

  2. 不变性和等变性是卷积网络的核心设计理念:卷积操作提供平移等变性,池化操作逐步实现平移不变性。

  3. 一维卷积用于序列数据,二维卷积用于图像数据:原理完全相同,都是卷积核在输入上滑动,逐元素相乘再求和。

  4. 多通道卷积:卷积核的通道数和输入通道数相同,多个卷积核产生多个输出通道。参数量 = 输出通道数 × (输入通道数 × 卷积核高 × 卷积核宽 + 1)。

  5. 输出尺寸公式: H o u t = ⌊ ( H + 2 P − k H ) / S ⌋ + 1 H_{out} = \lfloor (H + 2P - kH) / S \rfloor + 1 Hout​=⌊(H+2P−kH)/S⌋+1,这个公式非常重要,设计网络架构时经常用到。

  6. 池化层用于下采样:最大池化最常用,没有可学习参数。也可以用步长卷积代替池化。

  7. 转置卷积用于上采样:在图像分割和生成任务中广泛使用。

  8. 层次化特征学习:浅层学低级特征(边缘),中层学中级特征(纹理),深层学高级特征(物体),这是卷积网络成功的关键。

  9. 应用广泛:图像分类、目标检测、图像分割、人脸识别、姿态估计、超分辨率、图像生成等几乎所有视觉任务。


代码实验结果

  我们编写了完整的Python代码,从零实现了2D卷积层和最大池化层,并训练了一个简单的CNN在手写数字数据集上进行二分类。以下是真实运行结果。

实验1:从零实现2D卷积层

  • 输入:8×8图像(中间一个4×4白色方块)
  • 卷积核:3×3 Sobel边缘检测核
  • 输出:6×6特征图
输入形状: (8, 8)
卷积核形状: (3, 3)
输出形状: (6, 6)
边缘检测输出最大值: 4.2426

实验2:从零实现最大池化层

  • 输入:8×8图像
  • 池化窗口:2×2,步长2
  • 输出:4×4
输入形状: (8, 8)
池化后形状: (4, 4)
池化输出:
[[0. 0. 0. 0.]
 [0. 1. 1. 0.]
 [0. 1. 1. 0.]
 [0. 0. 0. 0.]]

实验3:简单CNN在digits数据集上训练

  • 数据集:sklearn digits(8×8手写数字),二分类(0 vs 1)
  • 训练集:252样本,测试集:108样本
  • 网络结构:卷积(2个3×3核) → ReLU → 最大池化(2×2) → 全连接 → sigmoid
Epoch 20:  训练损失=0.5796, 测试准确率=0.9444
Epoch 40:  训练损失=0.4989, 测试准确率=0.9444
Epoch 60:  训练损失=0.4420, 测试准确率=0.9444
Epoch 80:  训练损失=0.4005, 测试准确率=0.9444
Epoch 100: 训练损失=0.3691, 测试准确率=0.9352

最终测试准确率: 0.9352

结果可视化

CNN实验结果

结果分析

  1. 卷积和池化从零实现验证通过:8×8输入经过3×3卷积(无padding、stride=1)得到6×6输出,符合公式 H o u t = ( 8 − 3 ) / 1 + 1 = 6 H_{out} = (8-3)/1 + 1 = 6 Hout​=(8−3)/1+1=6。经过2×2最大池化(stride=2)得到4×4输出,符合公式 H o u t = ( 8 − 2 ) / 2 + 1 = 4 H_{out} = (8-2)/2 + 1 = 4 Hout​=(8−2)/2+1=4。

  2. Sobel边缘检测有效:Sobel核成功检测出了白色方块的边缘,输出最大值4.2426出现在方块边缘位置。这验证了卷积核可以提取特定的图像特征。

  3. 最大池化保留显著特征:池化输出中,白色方块区域的值为1,背景为0,最大池化成功保留了最显著的特征,同时将尺寸减半。

  4. 简单CNN达到93.5%准确率:只有2个卷积核、只训练全连接层(卷积核随机初始化不更新)的极简CNN,在8×8手写数字二分类任务上达到了93.5%的测试准确率。这说明卷积特征即使是随机初始化的,也包含了有用的信息。

  5. 训练损失持续下降但准确率波动:训练损失从0.58降到0.37,但测试准确率在94.4%附近波动,最后降到93.5%。这可能是因为只训练全连接层、卷积核固定,模型容量有限,且学习率可能偏大。如果端到端训练(包括卷积核),准确率应该会更高。


本章核心总结

第10章思维导图

  一句话概括:卷积网络通过局部连接和权值共享大幅减少参数量,利用卷积操作提取层次化特征,配合池化下采样,在计算机视觉任务中取得革命性成功。

卷积网络核心公式清单:

概念公式
2D卷积输出 Y i , j = ∑ m , n W m , n ⋅ X i + m − 1 , j + n − 1 Y_{i,j} = \sum_{m,n} W_{m,n} \cdot X_{i+m-1,j+n-1} Yi,j​=∑m,n​Wm,n​⋅Xi+m−1,j+n−1​
输出尺寸 H o u t = ⌊ ( H + 2 P − k H ) / S ⌋ + 1 H_{out} = \lfloor (H + 2P - kH) / S \rfloor + 1 Hout​=⌊(H+2P−kH)/S⌋+1
参数量 C o u t × ( C i n × k H × k W + 1 ) C_{out} \times (C_{in} \times kH \times kW + 1) Cout​×(Cin​×kH×kW+1)
最大池化 Y i , j = max ⁡ m , n X i S + m , j S + n Y_{i,j} = \max_{m,n} X_{iS+m, jS+n} Yi,j​=maxm,n​XiS+m,jS+n​

结语

  本章我们彻底搞懂了卷积网络。从不变性和等变性的设计理念,到一维和二维卷积的具体操作,再到池化下采样和转置卷积上采样,最后看了卷积网络在各个视觉任务中的广泛应用。卷积网络是深度学习在计算机视觉领域的基石,理解了它,你就掌握了视觉AI的核心。

  卷积网络虽然强大,但也有一个问题:随着网络层数加深,训练变得越来越困难,容易出现梯度消失和性能退化。怎么解决这个问题?下一章的主题是残差网络(Residual Networks)——通过残差连接(跳跃连接),让训练上百层甚至上千层的深度网络成为可能,彻底改变了深度学习的发展轨迹。

  下一章见!

更多推荐