这是本文档旧的修订版!
第六章 卷积神经网络
1. 概念定义与原理讲解
1.1 卷积神经网络概述
卷积神经网络(Convolutional Neural Network,CNN或ConvNet)是一种专门为处理具有网格结构数据(如图像)而设计的深度学习模型。CNN通过局部连接、权值共享和池化操作,大大减少了参数数量,同时保持了对空间层次结构的建模能力。
CNN的发展历程:
- 1989年:LeCun提出LeNet,用于手写数字识别
- 1998年:LeNet-5成为经典架构
- 2012年:AlexNet在ImageNet竞赛中获胜,引发深度学习热潮
- 2014年:VGGNet、GoogLeNet提出更深层的网络
- 2015年:ResNet引入残差连接,解决深层网络训练问题
- 后续:DenseNet、EfficientNet、Vision Transformer等
CNN的核心优势:
1. 参数效率:相比全连接网络,参数量大幅减少
2. 平移等变性:卷积操作具有平移不变性
3. 层次特征学习:自动学习从低级到高级的特征表示
4. 端到端学习:直接从原始数据学习特征
1.2 卷积操作原理
1.2.1 一维卷积
一维卷积定义为:
$$y[n] = \sum_{m=0}^{M-1} x[n-m] \cdot h[m]$$
其中$x$是输入信号,$h$是卷积核(滤波器),$M$是核的大小。
1.2.2 二维卷积
在图像处理中,二维卷积是最常用的操作:
$$Y[i, j] = \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} X[i+m, j+n] \cdot W[m, n] + b$$
其中:
- $X$:输入特征图($H \times W$)
- $W$:卷积核($k \times k$)
- $b$:偏置项
- $Y$:输出特征图
卷积的关键参数:
1. 卷积核大小(Kernel Size):通常为$3 \times 3$、$5 \times 5$、$7 \times 7$
2. 步长(Stride):卷积核移动的步长,通常为1或2
3. 填充(Padding):在输入边缘添加零值,控制输出尺寸
- Valid卷积:无填充
- Same卷积:填充使输出尺寸等于输入尺寸
输出尺寸计算公式:
$$H_{out} = \left\lfloor \frac{H_{in} + 2P - K}{S} \right\rfloor + 1$$
其中$P$是填充大小,$K$是核大小,$S$是步长。
1.2.3 三维卷积
对于多通道输入(如RGB图像):
$$Y[i, j] = \sum_{c=0}^{C_{in}-1} \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} X_c[i+m, j+n] \cdot W_c[m, n] + b$$
输出通道数等于卷积核的数量。
1.3 CNN的核心组件
1.3.1 卷积层(Convolutional Layer)
卷积层是CNN的基本构建块:
- 输入:$(N, C_{in}, H_{in}, W_{in})$,其中$N$是批量大小
- 输出:$(N, C_{out}, H_{out}, W_{out})$
- 参数:$C_{out} \times C_{in} \times k \times k$个权重 + $C_{out}$个偏置
卷积层的特性:
1. 局部连接:每个神经元只与输入的局部区域连接
2. 权值共享:同一个卷积核在整个输入上滑动,共享参数
3. 平移等变性:输入平移对应输出平移
1.3.2 激活函数
卷积后通常接非线性激活函数:
- ReLU:$f(x) = \max(0, x)$
- 计算简单,缓解梯度消失
- 可能导致“神经元死亡”
- Leaky ReLU:$f(x) = \max(\alpha x, x)$,$\alpha$通常取0.01
- 解决ReLU的死亡问题
- PReLU:可学习的$\alpha$
- ELU:$f(x) = x$ if $x \geq 0$ else $\alpha(e^x - 1)$
- 输出均值接近零,加速收敛
- GELU:平滑的ReLU变体,在Transformer中常用
1.3.3 池化层(Pooling Layer)
池化层降低特征图的空间维度,减少计算量,提供平移不变性。
最大池化(Max Pooling):
$$Y[i, j] = \max_{m,n} X[i \cdot S + m, j \cdot S + n]$$
平均池化(Average Pooling):
$$Y[i, j] = \frac{1}{k^2} \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} X[i \cdot S + m, j \cdot S + n]$$
全局池化:对整个特征图进行池化,输出$1 \times 1$
1.3.4 批归一化层(Batch Normalization)
对卷积层的输出进行归一化,加速训练,稳定学习过程。
1.3.5 全连接层(Fully Connected Layer)
网络末端,将特征图展平后进行分类或回归。
1.4 经典CNN架构
1.4.1 LeNet(1998)
结构:Conv → Pool → Conv → Pool → FC → FC → Output
- 输入:$32 \times 32$灰度图像
- 参数:约6万个
- 应用:手写数字识别(MNIST)
1.4.2 AlexNet(2012)
突破:ReLU、Dropout、GPU训练、数据增强 结构:5个卷积层 + 3个全连接层
- 输入:$227 \times 227 \times 3$
- 参数:约6000万个
- Top-5错误率:15.3%(第二名26.2%)
1.4.3 VGGNet(2014)
核心理念:使用小卷积核($3 \times 3$)堆叠替代大卷积核
- VGG-16:13个卷积层 + 3个全连接层
- VGG-19:16个卷积层 + 3个全连接层
- 参数:VGG-16约1.38亿个
两个$3 \times 3$卷积的 receptive field 等于一个$5 \times 5$卷积,但参数量更少,非线性更强。
1.4.4 GoogLeNet/Inception(2014)
创新:Inception模块、$1 \times 1$卷积、辅助分类器
- 22层深度
- 参数:约500万个(远小于VGG)
- Inception模块并行使用不同尺寸的卷积核
Inception模块结构:
输入 → [1×1卷积]
→ [1×1卷积 → 3×3卷积]
→ [1×1卷积 → 5×5卷积]
→ [MaxPool → 1×1卷积]
→ 通道拼接
1.4.5 ResNet(2015)
革命性创新:残差学习(Residual Learning)
核心问题:深层网络训练困难(梯度消失/爆炸、退化问题)
解决方案:跳跃连接(Skip Connection) $$y = F(x, \{W_i\}) + x$$
其中$F(x)$是残差映射。
变体: - ResNet-18/34:基本残差块 - ResNet-50/101/152:瓶颈残差块(Bottleneck)
- 使用$1 \times 1$卷积降维/升维
- 结构:$1 \times 1$(降维)→ $3 \times 3$ → $1 \times 1$(升维)
1.4.6 DenseNet(2017)
密集连接:每一层与前面所有层相连 $$x_l = H_l([x_0, x_1, ..., x_{l-1}])$$
优点:特征重用、缓解梯度消失、减少参数量
1.4.7 EfficientNet(2019)
复合缩放:同时缩放网络的深度、宽度和分辨率 - 使用神经架构搜索(NAS)找到基础网络 - 通过复合系数统一缩放
1.5 感受野与特征层次
感受野(Receptive Field):
输出特征图中某个单元对应输入图像的区域大小。
计算:第$l$层的感受野 $$RF_l = RF_{l-1} + (k_l - 1) \times \prod_{i=1}^{l-1} s_i$$
其中$k_l$是第$l$层卷积核大小,$s_i$是第$i$层步长。
特征层次:
- 浅层(低层):边缘、角点、纹理等低级特征 - 中层:纹理模式、简单形状 - 高层:物体部件、语义概念
这种层次结构使CNN能够从简单特征构建复杂表示。
1.6 卷积的变体与扩展
1.6.1 空洞卷积(Dilated/Atrous Convolution)
在卷积核中插入空洞,扩大感受野而不增加参数: $$Y[i] = \sum_{m=0}^{k-1} X[i + r \cdot m] \cdot W[m]$$
其中$r$是空洞率(dilation rate)。
应用:语义分割(DeepLab)、语音识别
1.6.2 转置卷积(Transposed Convolution)
用于上采样,是卷积的逆操作(非数学逆): - 别名:反卷积(Deconvolution)、分数步长卷积 - 应用:图像生成、语义分割的上采样
1.6.3 可分离卷积(Separable Convolution)
将标准卷积分解为深度卷积(Depthwise)和逐点卷积(Pointwise): - 深度卷积:对每个输入通道单独卷积 - 逐点卷积:$1 \times 1$卷积混合通道
计算量大幅减少,MobileNet的核心技术。
1.6.4 分组卷积(Grouped Convolution)
将输入通道分组,每组独立卷积: - AlexNet中使用(GPU内存限制) - ResNeXt的核心 - 当组数等于通道数时,即为深度可分离卷积
1.7 CNN的训练与优化
1.7.1 权重初始化
- Xavier/Glorot初始化:根据输入输出维度调整初始化范围
$$W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_{in}+n_{out}}}, \frac{\sqrt{6}}{\sqrt{n_{in}+n_{out}}}\right]$$
- He初始化:专为ReLU设计
$$W \sim N(0, \sqrt{2/n_{in}})$$
1.7.2 学习率调度
- 阶梯衰减(Step decay) - 指数衰减 - 余弦退火(Cosine annealing) - 学习率预热(Warmup)
1.7.3 正则化策略
- L2权重衰减 - Dropout - 数据增强 - 标签平滑 - 早停
1.8 CNN的应用领域
1.8.1 图像分类 - ImageNet分类 - 医学影像诊断 - 卫星图像分析
1.8.2 目标检测 - R-CNN系列(R-CNN、Fast R-CNN、Faster R-CNN) - YOLO系列(YOLOv1-v8) - SSD、RetinaNet
1.8.3 语义分割 - FCN(全卷积网络) - U-Net(医学图像分割) - DeepLab系列 - PSPNet
1.8.4 实例分割 - Mask R-CNN - PANet - YOLACT
1.8.5 其他应用 - 人脸识别(FaceNet、ArcFace) - 姿态估计 - 图像超分辨率(SRCNN、ESRGAN) - 风格迁移 - 图像生成(GAN、Diffusion Models)
1.9 CNN的局限性与发展趋势
局限性: 1. 缺乏全局建模能力(局部感受野限制) 2. 对旋转、尺度变化鲁棒性有限 3. 需要大量标注数据 4. 难以处理非网格数据
发展趋势: 1. Vision Transformer(ViT):用注意力机制替代卷积 2. ConvNeXt:结合CNN与Transformer的优点 3. 神经架构搜索(NAS):自动设计网络结构 4. 轻量化设计:MobileNet、ShuffleNet、EfficientNet-Lite 5. 自监督学习:减少标注依赖
2. 例题分析
例题1:卷积层参数计算
题目:计算以下卷积层的参数量: - 输入特征图:$64 \times 64 \times 3$(3通道彩色图像) - 卷积核大小:$5 \times 5$ - 输出通道数:64 - 使用偏置项
分析过程:
卷积层的参数包括权重和偏置两部分。
权重参数: 每个输出通道需要一个卷积核,每个卷积核的尺寸为$k \times k \times C_{in}$
权重参数总数 = 输出通道数 $\times$ 卷积核大小 $$= C_{out} \times k \times k \times C_{in}$$ $$= 64 \times 5 \times 5 \times 3$$ $$= 64 \times 75$$ $$= 4800$$
偏置参数: 每个输出通道有一个偏置值 偏置参数总数 = 输出通道数 = 64
总参数量: $$4800 + 64 = 4864$$
对比全连接层: 如果将输入展平为$64 \times 64 \times 3 = 12288$维向量,输出64维,则全连接层参数为: $$12288 \times 64 + 64 = 786496$$
卷积层参数(4864)仅为全连接层的0.6%,体现了卷积的参数效率。
输出特征图尺寸: 假设使用same填充($P=2$)和步长$S=1$: $$H_{out} = \left\lfloor \frac{64 + 2 \times 2 - 5}{1} \right\rfloor + 1 = 64$$
输出特征图尺寸为$64 \times 64 \times 64$。
例题2:感受野计算
题目:计算以下网络的感受野(从输入到最后一层卷积层):
| 层 | 类型 | 核大小 | 步长 |
| — | —— | ——– | —— |
| 1 | 卷积 | 3×3 | 1 |
| 2 | 池化 | 2×2 | 2 |
| 3 | 卷积 | 3×3 | 1 |
| 4 | 池化 | 2×2 | 2 |
| 5 | 卷积 | 3×3 | 1 |
分析过程:
感受野的计算采用递推方式。令第$l$层的感受野为$RF_l$。
初始条件: 第0层(输入)的感受野:$RF_0 = 1$(每个像素对应自身)
递推公式: $$RF_l = RF_{l-1} + (k_l - 1) \times \prod_{i=1}^{l-1} s_i$$
其中$\prod_{i=1}^{l-1} s_i$表示前$l-1$层累积步长。
逐层计算:
层1(卷积,k=3,s=1): 累积步长(前0层):1 $$RF_1 = 1 + (3-1) \times 1 = 3$$
层2(池化,k=2,s=2): 累积步长(前1层):1 $$RF_2 = 3 + (2-1) \times 1 = 4$$ 当前累积步长:$1 \times 2 = 2$
层3(卷积,k=3,s=1): 累积步长(前2层):2 $$RF_3 = 4 + (3-1) \times 2 = 4 + 4 = 8$$
层4(池化,k=2,s=2): 累积步长(前3层):2 $$RF_4 = 8 + (2-1) \times 2 = 10$$ 当前累积步长:$2 \times 2 = 4$
层5(卷积,k=3,s=1): 累积步长(前4层):4 $$RF_5 = 10 + (3-1) \times 4 = 10 + 8 = 18$$
结论:该网络最后一层的感受野为$18 \times 18$。
验证:这是一个典型的VGG风格网络块,经过两次下采样(2×2池化)和两个3×3卷积,感受野相对较小。这也是为什么深层网络需要堆叠更多层来捕获更大范围的上下文信息。
例题3:残差连接分析
题目:分析ResNet中残差块的设计原理。考虑一个两层的残差块: $$y = F(x, \{W_1, W_2\}) + x$$ 其中$F = W_2 \cdot \text{ReLU}(W_1 \cdot x)$。讨论: (1) 为什么残差学习比直接学习更容易? (2) 如果$F(x)$和$x$维度不同,应如何处理? (3) 推导残差块的反向传播梯度。
分析过程:
(1) 残差学习的优势
假设我们希望学习恒等映射$H(x) = x$。
直接学习:网络需要学习$H(x) = x$,即权重满足$W_2 \cdot \text{ReLU}(W_1 \cdot x) = x$,这是一个复杂的非线性约束。
残差学习:令$F(x) = 0$,即学习残差为零。此时网络只需将所有权重置零即可实现恒等映射。这是优化过程中的一个“捷径”。
更深层的理论解释: - 残差函数$F(x)$通常比原始映射$H(x)$更接近零,具有更小的数值范围 - 这缓解了深层网络的梯度消失问题 - 实验表明,添加残差连接后,深层网络(100+层)可以比浅层网络训练得更好
(2) 维度不匹配的处理
当输入$x$和残差$F(x)$维度不同时,需要进行维度匹配:
方法A:投影捷径(Projection Shortcut) 使用$1 \times 1$卷积进行线性投影: $$y = F(x, \{W_i\}) + W_s \cdot x$$ 其中$W_s$是投影矩阵。
方法B:填充捷径(Padding Shortcut) 使用零填充增加通道数,不进行额外参数学习。
方法C:池化调整 当空间维度变化时,使用步长为2的卷积或池化进行下采样。
实际应用中,ResNet-50及以上使用投影捷径进行维度变化,同维时使用恒等连接。
(3) 梯度推导
前向传播: $$y = F(x) + x = W_2 \cdot \text{ReLU}(W_1 \cdot x) + x$$
假设损失函数为$L$,根据链式法则:
对$x$的梯度: $$\frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x} = \frac{\partial L}{\partial y} \cdot \left(\frac{\partial F}{\partial x} + 1\right)$$
展开: $$\frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} + \frac{\partial L}{\partial y} \cdot \frac{\partial F}{\partial x}$$
关键观察:梯度由两部分组成: - 第一部分$\frac{\partial L}{\partial y}$直接传递梯度(捷径) - 第二部分通过残差路径传递
这意味着即使$\frac{\partial F}{\partial x}$很小,梯度仍能通过恒等连接有效传播,缓解了梯度消失问题。
3. 训练题
一、选择题
1. 卷积神经网络中,权值共享的主要目的是:
A. 增加模型容量 B. 减少参数量 C. 提高计算速度 D. 增加非线性
2. 对于$7 \times 7$的输入,使用$3 \times 3$卷积核、步长2、无填充,输出尺寸为:
A. $5 \times 5$ B. $4 \times 4$ C. $3 \times 3$ D. $2 \times 2$
3. ResNet中解决深层网络训练困难的关键技术是:
A. 批归一化 B. 残差连接 C. Dropout D. 数据增强
4. 空洞卷积(Dilated Convolution)的主要优势是:
A. 减少计算量 B. 扩大感受野 C. 增加参数量 D. 提高精度
5. 在VGGNet中,使用两个$3 \times 3$卷积替代一个$5 \times 5$卷积的好处不包括:
A. 参数量减少 B. 非线性增加 C. 感受野不变 D. 计算量增加
二、填空题
6. 卷积层输出尺寸计算公式:$H_{out} = \lfloor \frac{H_{in} + 2P - K}{S} \rfloor + $。
7. 在GoogLeNet的Inception模块中,$1 \times 1$卷积的主要作用是和。
8. 深度可分离卷积包括卷积和卷积两个步骤。
9. AlexNet使用激活函数和正则化技术来防止过拟合。
10. 全局平均池化(GAP)将特征图池化为的尺寸。
三、计算题
11. 计算一个卷积层的参数量:输入通道256,输出通道512,卷积核$3 \times 3$,使用偏置。
12. 输入图像$224 \times 224$,经过三个连续的$3 \times 3$卷积(步长1,same填充),计算最终感受野大小。
13. 比较标准卷积和深度可分离卷积的计算量:输入$64 \times 64 \times 128$,输出通道256,卷积核$3 \times 3$。
4. 答案与解析
一、选择题答案:
1. 答案:B
解析:权值共享使同一个卷积核在输入的不同位置使用相同参数,大幅减少参数量。
2. 答案:C
解析:$H_{out} = \lfloor \frac{7 + 0 - 3}{2} \rfloor + 1 = \lfloor 2 \rfloor + 1 = 3$
3. 答案:B
解析:残差连接(Skip Connection)是ResNet的核心创新,允许梯度直接传播,解决深层网络的退化问题。
4. 答案:B
解析:空洞卷积在卷积核中插入空洞,可以在不增加参数的情况下扩大感受野。
5. 答案:D
解析:两个$3 \times 3$卷积参数量为$2 \times 3 \times 3 = 18$,一个$5 \times 5$为25,参数量减少而非增加。
二、填空题答案:
6. 答案:1
解析:标准卷积输出尺寸公式。
7. 答案:降维(或减少通道数);通道混合(或特征融合)
解析:$1 \times 1$卷积在Inception中用于减少计算量和混合不同通道的信息。
8. 答案:深度(Depthwise);逐点(Pointwise)
解析:深度可分离卷积先对每个通道单独卷积,再用$1 \times 1$卷积混合通道。
9. 答案:ReLU;Dropout
解析:AlexNet首次在大规模CNN中使用ReLU和Dropout。
10. 答案:$1 \times 1$(或1×1)
解析:全局平均池化对整个特征图取平均,输出单个值。
三、计算题答案:
11. 解答:
权重参数 = $C_{out} \times k \times k \times C_{in}$
$= 512 \times 3 \times 3 \times 256$
$= 512 \times 9 \times 256$
$= 1179648$
偏置参数 = 512
总参数量 = $1179648 + 512 = 1180160$(约118万)
12. 解答:
逐层计算感受野: - 初始:$RF_0 = 1$ - 第一层:$RF_1 = 1 + (3-1) \times 1 = 3$ - 第二层:$RF_2 = 3 + (3-1) \times 1 = 5$ - 第三层:$RF_3 = 5 + (3-1) \times 1 = 7$ 最终感受野为$7 \times 7$。 验证:三个$3 \times 3$卷积的堆叠等价于一个$7 \times 7$卷积的感受野。
13. 解答:
- *标准卷积计算量: 输出尺寸:$64 \times 64$,输出通道256 每个输出点的计算:$3 \times 3 \times 128$次乘加 总计算量 = $64 \times 64 \times 256 \times 3 \times 3 \times 128$ $= 4096 \times 256 \times 9 \times 128$ $= 1207959552$(约12亿次乘加) 深度可分离卷积计算量**:
深度卷积:$64 \times 64 \times 128 \times 3 \times 3 = 4718592$
逐点卷积:$64 \times 64 \times 128 \times 256 = 134217728$ 总计算量 = $138936320$(约1.39亿次) 深度可分离卷积计算量约为标准卷积的11.5%,显著降低了计算开销。