卷积神经网络(CNN)¶
CNN 是处理空间数据(图像、视频)的核心架构。它模仿人类视觉系统,通过局部感受野和权值共享,高效提取层次化的空间特征。
1. 核心思想:为什么不用全连接?¶
假设输入是一张 \(224 \times 224 \times 3\) 的彩色图片,展平后有 \(224 \times 224 \times 3 = 150528\) 个像素。如果用全连接层连接到 1000 个神经元,仅第一层就需要 1.5 亿个参数——这既浪费算力,又极易过拟合。
CNN 的两个核心设计解决了这个问题:
| 设计 | 含义 | 效果 |
|---|---|---|
| 局部连接 | 每个神经元只看输入的一小块区域(感受野) | 大幅减少参数 |
| 权值共享 | 同一个卷积核在整张图上滑动,共享参数 | 进一步减少参数,且能检测任意位置的特征 |
直觉理解
全连接网络像是让每个人独立审阅整份文件;CNN 像是用一个放大镜在文件上滑动扫描——放大镜的参数是固定的,但它能在每个位置发现相同类型的模式。
2. 卷积操作¶
基本原理¶
卷积操作的核心是一个小矩阵——卷积核(Kernel / Filter),在输入特征图上滑动,每到一个位置就做逐元素相乘再求和:
示例:3×3 卷积核
输出的每个值 = 对应区域与卷积核逐元素相乘后求和。关键超参数¶
| 参数 | 含义 | 影响 |
|---|---|---|
| 卷积核大小 | 感受野的尺寸(如 \(3 \times 3\)、\(5 \times 5\)) | 越大看到的范围越广,参数也越多 |
| 步长(Stride) | 卷积核每次移动的像素数 | 步长越大,输出尺寸越小 |
| 填充(Padding) | 在输入边缘补零 | 控制输出尺寸,常用 "same" 保持不变 |
| 卷积核数量 | 使用多少个不同的卷积核 | 每个核提取一种特征,决定输出的通道数 |
输出尺寸公式¶
其中 \(H_{\text{in}}\) 是输入尺寸,\(P\) 是 padding,\(K\) 是卷积核大小,\(S\) 是步长。
多通道卷积¶
实际图像有多个通道(RGB 3 通道),卷积核也必须有相同的通道数。一个 \(3 \times 3\) 的卷积核作用于 3 通道输入,实际参数量是 \(3 \times 3 \times 3 = 27\)(加上 1 个偏置 = 28)。
多个卷积核产生多个输出通道(特征图),每个特征图检测一种不同的模式:
3. 池化层(Pooling)¶
池化层的作用是压缩空间尺寸,减少计算量,同时增强特征的平移不变性。
最大池化(Max Pooling)¶
在每个窗口内取最大值:
平均池化(Average Pooling)¶
取窗口内的平均值。常用于网络最后一层(Global Average Pooling),将整个特征图压缩为一个值。
| 池化方式 | 特点 | 使用场景 |
|---|---|---|
| Max Pooling | 保留最显著的特征 | 中间层,常见于经典 CNN |
| Average Pooling | 保留整体信息 | 最后一层(GAP),替代全连接层 |
| Global Average Pooling | 整个特征图取均值 | 现代网络(ResNet 等)的分类头 |
4. CNN 的标准架构¶
一个典型的 CNN 由以下模块堆叠而成:
graph LR
A[输入图像] --> B[卷积层+ReLU]
B --> C[卷积层+ReLU]
C --> D[池化层]
D --> E[卷积层+ReLU]
E --> F[卷积层+ReLU]
F --> G[池化层]
G --> H[全连接层]
H --> I[Softmax 输出]
规律:
- 空间尺寸逐渐减小(通过池化或 stride > 1 的卷积)
- 通道数逐渐增加(越深的层提取越抽象的特征,需要更多通道)
- 最后用全连接层或 GAP 做分类
5. 经典 CNN 架构演进¶
LeNet-5(1998)¶
CNN 的开山之作,由 Yann LeCun 提出,用于手写数字识别。
- 只有 5 层,约 6 万参数
- 证明了 CNN 在视觉任务上的有效性
AlexNet(2012)⭐¶
深度学习的"文艺复兴"——在 ImageNet 竞赛上以巨大优势夺冠,开启了深度学习时代。
关键创新:
- 使用 ReLU 替代 Sigmoid(训练速度快 6 倍)
- 使用 Dropout 防过拟合
- 数据增强(翻转、裁剪、色彩抖动)
- GPU 并行训练
VGGNet(2014)¶
核心理念:用多个 3×3 小卷积核堆叠代替大卷积核。
为什么 3×3 更好?
两个 \(3 \times 3\) 卷积的感受野等于一个 \(5 \times 5\) 的卷积,但参数量只有 \(2 \times 3^2 = 18\) vs \(5^2 = 25\),而且中间多了一次非线性激活,表达能力更强。
VGG-16/19 结构清晰,但参数量巨大(1.38 亿),主要集中在全连接层。
GoogLeNet / Inception(2014)¶
引入了 Inception 模块:同时使用 \(1 \times 1\)、\(3 \times 3\)、\(5 \times 5\) 卷积和池化,再拼接输出。让网络自己学习应该用哪种尺度的卷积核。
\(1 \times 1\) 卷积的妙用:
- 跨通道信息融合
- 降维:减少通道数,从而大幅减少后续层的计算量
ResNet(2015)⭐⭐¶
深度学习史上最重要的架构之一。解决了一个关键问题:网络越深,训练误差反而越高(退化问题)。
残差连接(Residual Connection / Skip Connection)¶
graph LR
X[输入 x] --> F[卷积层 F]
F --> ADD((+))
X -->|跳跃连接| ADD
ADD --> Y[输出 y = F<->x + x]
为什么残差连接有效?
- 梯度高速公路:梯度可以通过跳跃连接直接回传,不经过中间层,缓解梯度消失
- 学习残差更容易:网络只需要学 \(\mathcal{F}(\mathbf{x}) = \mathbf{y} - \mathbf{x}\)(差值),比直接学 \(\mathbf{y}\) 更简单
- 恒等映射兜底:最差情况下 \(\mathcal{F} = 0\),输出就是输入,网络不会因为加深而变差
ResNet 成功训练了 152 层甚至 1000+ 层的网络,残差连接也成为了现代深度网络的标配。
6. 1×1 卷积的深入理解¶
\(1 \times 1\) 卷积看起来不直观(只看一个像素?),但它在现代 CNN 中非常重要:
| 作用 | 说明 |
|---|---|
| 跨通道信息融合 | 将不同通道的信息线性组合 |
| 升维 / 降维 | 改变通道数而不改变空间尺寸,控制计算量 |
| 增加非线性 | 后接 ReLU,相当于在通道维度增加了一层非线性变换 |
\(1 \times 1\) 卷积本质上等价于对每个空间位置做一次全连接:
7. CNN 可视化:网络到底学到了什么?¶
通过可视化不同层的特征图,可以直观理解 CNN 的层次化特征提取:
| 层级 | 学到的特征 | 类比 |
|---|---|---|
| 浅层(Conv1-2) | 边缘、颜色、纹理 | 看到"线条"和"色块" |
| 中层(Conv3-4) | 局部形状、纹理组合 | 看到"眼睛"、"轮子" |
| 深层(Conv5+) | 高级语义、物体部件 | 看到"人脸"、"汽车" |
迁移学习的基础
浅层特征(边缘、纹理)是通用的,不同任务都能复用;深层特征与具体任务相关。这就是为什么预训练模型可以迁移到新任务——冻结浅层,只微调深层即可。
8. 现代 CNN 的设计趋势¶
| 趋势 | 代表 | 说明 |
|---|---|---|
| 更深 | ResNet、DenseNet | 残差/密集连接让超深网络成为可能 |
| 更轻量 | MobileNet、ShuffleNet | 深度可分离卷积,适合移动端 |
| 自动搜索 | NAS、EfficientNet | 用算法自动搜索最优架构 |
| 与 Attention 融合 | ViT、ConvNeXt | CNN + Transformer 混合架构 |
深度可分离卷积(Depthwise Separable Convolution)¶
MobileNet 的核心:将标准卷积分解为两步,大幅降低计算量。
标准卷积 参数量:\(K \times K \times C_{\text{in}} \times C_{\text{out}}\)
深度可分离卷积:
- 逐通道卷积(Depthwise):每个输入通道独立用一个 \(K \times K\) 卷积核 → 参数 \(K \times K \times C_{\text{in}}\)
- 逐点卷积(Pointwise):用 \(1 \times 1\) 卷积跨通道融合 → 参数 \(C_{\text{in}} \times C_{\text{out}}\)
计算量压缩比:\(\frac{1}{C_{\text{out}}} + \frac{1}{K^2}\),对于 \(K=3, C_{\text{out}}=256\),约为标准卷积的 1/8 ~ 1/9。