卷积神经网络 (CNN) 详解
目录
1. 基本概念
1.1 为什么需要 CNN
全连接网络处理图像时面临两个核心问题:
- 参数爆炸:一张 224×224×3 的图像,第一层 1000 个神经元就需要 1.5 亿个参数
- 空间信息丢失:全连接层将图像展平为一维向量,破坏了像素间的空间结构
CNN 通过局部连接和权重共享两大设计原则解决了这些问题。
1.2 核心思想
- 局部感受野(Local Receptive Field):每个神经元只连接输入的一个局部区域
- 权重共享(Weight Sharing):同一卷积核在输入的所有位置共享参数
- 平移等变性(Translation Equivariance):输入平移,输出也相应平移
2. 核心组件
2.1 卷积层(Convolutional Layer)
二维卷积运算:
\[(I * K)_{i,j} = \sum_{m=0}^{k_h-1}\sum_{n=0}^{k_w-1} I_{i+m, j+n} \cdot K_{m,n}\]输出尺寸计算:
\[H_{out} = \left\lfloor\frac{H_{in} + 2P - k_h}{S}\right\rfloor + 1\]其中:
- $H_{in}$:输入高度
- $k_h$:卷积核高度
- $P$:填充(Padding)
- $S$:步长(Stride)
参数数量:$k_h \times k_w \times C_{in} \times C_{out} + C_{out}$(包含偏置)
计算量 (FLOPs):$H_{out} \times W_{out} \times k_h \times k_w \times C_{in} \times C_{out}$
2.2 池化层(Pooling Layer)
| 类型 | 操作 | 特点 |
|---|---|---|
| Max Pooling | 取局部区域最大值 | 保留纹理信息,默认选择 |
| Average Pooling | 取局部区域平均值 | 保留背景信息 |
| Global Average Pooling | 全局平均池化 | 替代全连接层,减少过拟合 |
作用:
- 降采样,减少计算量
- 增大感受野
- 提供局部平移不变性
2.3 激活函数
| 激活函数 | 公式 | 特点 |
|---|---|---|
| ReLU | $f(x) = \max(0, x)$ | 简单高效,缓解梯度消失 |
| Leaky ReLU | $f(x) = \max(0.01x, x)$ | 解决 ReLU 的 “Dead Neuron” 问题 |
| GELU | $f(x) = x \cdot \Phi(x)$ | 现代架构首选,平滑近似 |
| SiLU/Swish | $f(x) = x \cdot \sigma(x)$ | EfficientNet 中使用 |
2.4 全连接层(Fully Connected Layer)
通常放在 CNN 末端,用于分类或回归输出。现代架构(ResNet 等)倾向于用 Global Average Pooling 替代。
3. 经典架构演进
3.1 LeNet-5 (1998)
Input(32×32) → Conv(5×5, 6) → AvgPool(2×2) → Conv(5×5, 16) → AvgPool(2×2)
→ FC(120) → FC(84) → FC(10)
贡献:开创了 CNN 的基本范式(卷积 → 池化 → 全连接)
3.2 AlexNet (2012)
Input(224×224×3) → Conv(11×11, 96) → MaxPool → Conv(5×5, 256) → MaxPool
→ Conv(3×3, 384) → Conv(3×3, 384) → Conv(3×3, 256) → MaxPool
→ FC(4096) → FC(4096) → FC(1000)
关键贡献:
- 首次使用 ReLU 激活函数,加速训练
- 使用 Dropout(0.5)防止过拟合
- 数据增强(随机裁剪、水平翻转)
- 双 GPU 并行训练
3.3 VGG (2014)
设计哲学:使用小卷积核(3×3)堆叠替代大卷积核,在相同感受野下减少参数。
- 两个 3×3 卷积的感受野 = 一个 5×5 卷积
- 三个 3×3 卷积的感受野 = 一个 7×7 卷积
VGG16 结构:
2×Conv(3×3, 64) → MaxPool
2×Conv(3×3, 128) → MaxPool
3×Conv(3×3, 256) → MaxPool
3×Conv(3×3, 512) → MaxPool
3×Conv(3×3, 512) → MaxPool
FC(4096) → FC(4096) → FC(1000)
3.4 GoogLeNet / Inception (2014)
Inception Module:在同一层并行使用不同大小的卷积核(1×1, 3×3, 5×5)和池化,然后拼接。
1×1 卷积的降维作用:在 3×3 和 5×5 卷积前使用 1×1 卷积减少通道数,大幅降低计算量。
Inception v3 的改进:
- 将大卷积核分解为小卷积核(5×5 → 两个 3×3)
- 进一步分解为 n×1 + 1×n 非对称卷积
- 使用 Batch Normalization
- 使用 Label Smoothing
3.5 ResNet (2015) — 里程碑
核心问题:随着网络加深,训练误差反而升高(退化问题,不是过拟合)。
残差学习:
\[\mathbf{y} = \mathcal{F}(\mathbf{x}, \{W_i\}) + \mathbf{x}\]其中 $\mathcal{F}$ 是残差函数,$\mathbf{x}$ 是恒等映射(shortcut connection)。
两种残差块:
- BasicBlock:两个 3×3 卷积,用于 ResNet-18/34
- Bottleneck:1×1 → 3×3 → 1×1,首尾 1×1 分别压缩和恢复通道,用于 ResNet-50/101/152
ResNet-50 结构:
Conv(7×7, 64) → MaxPool
[3× Bottleneck(64→256)] × 3
[4× Bottleneck(128→512)] × 4
[6× Bottleneck(256→1024)] × 6
[3× Bottleneck(512→2048)] × 3
AvgPool → FC(1000)
为什么 ResNet 有效:
- 残差连接使梯度可以通过 shortcut 直接传播,解决了深层网络的梯度消失
- 恒等映射使网络至少不会比浅层网络更差
- 等效于浅层网络和深层网络的集成(Unraveled View)
3.6 DenseNet (2017)
密集连接:每一层都接收前面所有层的特征图:
\[x_l = H_l([x_0, x_1, \ldots, x_{l-1}])\]优点:特征复用、梯度流动更好、参数量更少。缺点是显存占用大。
3.7 SENet (2018) — 通道注意力
Squeeze-and-Excitation Block:
- Squeeze:Global Average Pooling → 通道描述符
- Excitation:两个 FC 层 → 通道权重
- Scale:将权重乘回原特征图
3.8 EfficientNet (2019) — 模型缩放
核心思想:同时缩放深度、宽度和分辨率,而非只调整一个维度。
\[\text{depth: } d = \alpha^\phi, \quad \text{width: } w = \beta^\phi, \quad \text{resolution: } r = \gamma^\phi\]约束条件:$\alpha \cdot \beta^2 \cdot \gamma^2 \approx 2$,$\phi$ 控制总缩放量。
EfficientNet-B0 的 MBConv Block:
- 深度可分离卷积 + SE 模块
- 使用 Swish 激活函数
- 使用 DropConnect 正则化
3.9 ConvNeXt (2022) — 现代化 CNN
ConvNeXt 借鉴 Vision Transformer 的设计理念”现代化”了 ResNet:
| 改进 | 说明 |
|---|---|
| 训练策略优化 | 使用 AdamW、更长的训练周期、更强的数据增强 |
| 阶段比例调整 | 从 (3,4,6,3) 改为 (3,3,9,3) |
| Patchify Stem | 用 4×4 stride 4 的卷积替代 7×7 stride 2 |
| 深度可分离卷积 | 用分组卷积替代传统卷积 |
| 倒置瓶颈 | 将 ResNet bottleneck 的宽-窄-宽改为窄-宽-窄 |
| 更大的卷积核 | 将 3×3 改为 7×7 |
| 更少的归一化 | 只用 LayerNorm 替代 BatchNorm |
4. 现代设计原则
4.1 卷积核选择
- 堆叠小卷积核(3×3)替代大卷积核,减少参数
- 1×1 卷积用于通道变换和降维
- 深度可分离卷积(Depthwise + Pointwise)大幅减少计算量
4.2 深度可分离卷积
将标准卷积分解为两步:
标准卷积:$k_h \times k_w \times C_{in} \times C_{out}$
深度可分离卷积:
- Depthwise Conv:$k_h \times k_w \times C_{in}$(每个通道独立卷积)
- Pointwise Conv:$1 \times 1 \times C_{in} \times C_{out}$(1×1 卷积混合通道)
计算量比值:$\frac{1}{C_{out}} + \frac{1}{k_h \times k_w}$
4.3 归一化层选择
| 归一化 | 归一化维度 | 适用场景 |
|---|---|---|
| BatchNorm | (N, H, W) | CNN 标配,小 batch 不稳定 |
| LayerNorm | (C, H, W) | Transformer 标配 |
| GroupNorm | 分组通道 | 小 batch 训练,分割任务 |
| InstanceNorm | 单通道 | 风格迁移 |
4.4 感受野计算
\[RF_l = RF_{l-1} + (k_l - 1) \times \prod_{i=1}^{l-1} S_i\]其中 $RF_l$ 是第 $l$ 层的感受野,$k_l$ 是卷积核大小,$S_i$ 是第 $i$ 层的步长。
5. CNN 在 CV 中的应用
5.1 图像分类
- 基准网络:ResNet, EfficientNet, ConvNeXt
- 常用数据集:ImageNet-1K (1.28M), ImageNet-21K (14M)
5.2 目标检测
- Two-Stage:Faster R-CNN, Mask R-CNN
- One-Stage:YOLO, SSD, RetinaNet
- Anchor-Free:CenterNet, FCOS
- 常用 Backbone:ResNet + FPN
5.3 语义分割
- FCN:全卷积网络,首个端到端分割网络
- U-Net:编码器-解码器 + 跳跃连接,医学图像标配
- DeepLab 系列:空洞卷积 + ASPP
- SegFormer:Transformer + CNN 混合
5.4 实例分割
- Mask R-CNN:在 Faster R-CNN 上加分割分支
- YOLACT:实时实例分割
6. 参考文献
[1] LeCun, Y., et al. Gradient-Based Learning Applied to Document Recognition. Proceedings of the IEEE, 1998.
[2] Krizhevsky, A., et al. ImageNet Classification with Deep Convolutional Neural Networks. NeurIPS, 2012.
[3] Simonyan, K. & Zisserman, A. Very Deep Convolutional Networks for Large-Scale Image Recognition. ICLR, 2015.
[4] Szegedy, C., et al. Going Deeper with Convolutions. CVPR, 2015.
[5] He, K., et al. Deep Residual Learning for Image Recognition. CVPR, 2016.
[6] Huang, G., et al. Densely Connected Convolutional Networks. CVPR, 2017.
[7] Hu, J., et al. Squeeze-and-Excitation Networks. CVPR, 2018.
[8] Tan, M. & Le, Q. V. EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks. ICML, 2019.
[9] Liu, Z., et al. A ConvNet for the 2020s. CVPR, 2022.
[10] Howard, A. G., et al. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications. arXiv:1704.04861, 2017.
留下评论