277 lines
11 KiB
Markdown
277 lines
11 KiB
Markdown
---
|
||
title: 2-CNN-卷积神经网络
|
||
draft: false
|
||
tags:
|
||
- CNN
|
||
- 卷积神经网络
|
||
- 深度学习
|
||
- 基础模型
|
||
---
|
||
# 卷积神经网络 (CNN) 深度理解笔记
|
||
|
||
## 一、概述
|
||
|
||
卷积神经网络(Convolutional Neural Networks, CNN)是一种专门处理具有网格结构数据(如图像)的深度学习模型。其核心思想是利用**局部连接(Local Connectivity)**和**权重共享(Weight Sharing)**,极大地减少了全连接网络中的参数量。
|
||
|
||
CNN 可以被理解为一个特征提取器与分类器的组合:通过多层卷积算子学习输入信号 $x$ 的层级空间特征(从边缘到形状,再到物体部分),最终映射到任务目标空间。
|
||
|
||
**与 MLP 的关键区别**:
|
||
|
||
| 维度 | MLP(全连接) | CNN(卷积) |
|
||
|------|--------------|-------------|
|
||
| 连接方式 | 所有神经元相互连接 | 局部空间连接 |
|
||
| 权重结构 | 稠密矩阵 | 稀疏的循环卷积 |
|
||
| 参数数量 | $O(n_{in} \times n_{out})$ | $O(k^2 \times C_{out})$ |
|
||
| 特性 | 无空间先验 | 平移等变性 |
|
||
|
||
---
|
||
## 二、卷积算子与特征提取
|
||
|
||
### 一、卷积层的正向传播
|
||
|
||
#### 1. 张量维度定义
|
||
|
||
给定输入张量 $\mathcal{X} \in \mathbb{R}^{C \times H \times W}$ 和卷积核 $\mathcal{K} \in \mathbb{R}^{C \times k \times k}$:
|
||
- $C$:输入通道数(Channel),例如 RGB 图像 $C=3$
|
||
- $H, W$:输入特征图的高和宽
|
||
- $k$:卷积核的 spatial 尺寸(通常 $k=3$ 或 $k=5$)
|
||
|
||
**输出特征图** $\mathcal{Y} \in \mathbb{R}^{C_{out} \times H_{out} \times W_{out}}$,其中 $C_{out}$ 是输出通道数(即卷积核的个数)。
|
||
|
||
#### 2. 卷积运算的数学定义
|
||
|
||
输出特征图的一个像素点 $y_{c', i,j}$ 的计算公式为:
|
||
|
||
$$y_{c', i,j} = \sigma \left( \sum_{c=1}^{C} \sum_{m=1}^{k} \sum_{n=1}^{k} w_{c', c, m,n} \cdot x_{c, i+m-1, j+n-1} + b_{c'} \right)$$
|
||
|
||
其中:
|
||
- $c'$:输出通道索引(对应第 $c'$ 个卷积核)
|
||
- $c$:输入通道索引
|
||
- $w_{c', c, m,n}$:第 $c'$ 个卷积核在第 $c$ 个通道上的 $(m,n)$ 位置权重
|
||
- $b_{c'}$:第 $c'$ 个卷积核的偏置
|
||
|
||
**直观理解**:每个输出通道 $c'$ 是由 $C$ 个输入通道与对应的 $C$ 个卷积核子模块分别卷积后求和得到的。这 $C$ 个卷积核子模块组成一个完整的 $C \times k \times k$ 的 3D 卷积核。
|
||
|
||
#### 3. 多卷积核与多通道的关系
|
||
|
||
如果有 $C_{out}$ 个卷积核,则输出有 $C_{out}$ 个通道:
|
||
|
||
$$\mathcal{Y}_{c', :, :} = \text{Conv}(\mathcal{X}, \mathcal{K}_{c'}) + b_{c'}, \quad c' = 1, \dots, C_{out}$$
|
||
|
||
**记忆点**:卷积层的参数量 $= C_{out} \times C \times k \times k + C_{out}$(偏置)
|
||
|
||
#### 4. 输出维度计算(几何约束)
|
||
|
||
假设输入尺寸为 $I$,卷积核大小为 $K$,填充(Padding)为 $P$,步长(Stride)为 $S$,则输出尺寸 $O$ 满足:
|
||
|
||
$$O = \left\lfloor \frac{I - K + 2P}{S} \right\rfloor + 1$$
|
||
|
||
**特例速记**:
|
||
- **Valid 卷积**(无Padding,$P=0$):$O = \left\lfloor \frac{I - K}{S} \right\rfloor + 1$
|
||
- **Same 卷积**(输出等于输入):当 $S=1$ 时,$P = \frac{K-1}{2}$
|
||
- **Max Pooling**($S=K$):$O = \frac{I - K}{S} + 1 = \frac{I}{K} + 1$
|
||
|
||
#### 5. 参数共享的数学意义
|
||
|
||
在全连接层中,若输入输出均为 $N$ 维,权重矩阵维度为 $N \times N$。而在卷积层中,由于同一个卷积核在整个输入上滑动,参数量仅取决于卷积核的大小 $K \times K$,这在数学上等效于**循环矩阵(Circulant Matrix)**的稀疏化约束,使得模型具有**平移不变性(Translation Invariance)**。
|
||
|
||
**平移不变性的直观理解**:无论一只猫出现在图像的左上角还是右下角,同一个卷积核都能检测到"猫"的特征,因为卷积核在整张图上共享权重。
|
||
|
||
---
|
||
|
||
### 二、数学推导 - 卷积层的反向传播
|
||
|
||
为了让模型学习到最优特征,我们需要通过损失函数 $L$ 对卷积核参数 $W$ 求导。这是理解 CNN 学习逻辑的核心。
|
||
|
||
#### 1. 已知量与目标
|
||
|
||
假设当前层的输出为 $Y$,下一层传回的梯度(误差项)为 $\delta = \frac{\partial L}{\partial Y}$。我们需要求:
|
||
|
||
- 对权重 $W$ 的梯度:用于更新参数。
|
||
|
||
- 对输入 $X$ 的梯度:用于继续向上传递误差。
|
||
|
||
#### 2. 权重梯度的推导
|
||
|
||
**逐元素推导**(适合理解原理):
|
||
|
||
根据链式法则,损失函数对卷积核中某个位置 $w_{m,n}$ 的导数为:
|
||
|
||
$$\frac{\partial L}{\partial w_{m,n}} = \sum_{i} \sum_{j} \frac{\partial L}{\partial y_{i,j}} \frac{\partial y_{i,j}}{\partial w_{m,n}}$$
|
||
|
||
由前向传播公式可知 $\frac{\partial y_{i,j}}{\partial w_{m,n}} = x_{i+m-1, j+n-1}$,带入得:
|
||
|
||
$$\frac{\partial L}{\partial w_{m,n}} = \sum_{i} \sum_{j} \delta_{i,j} \cdot x_{i+m-1, j+n-1}$$
|
||
|
||
**用卷积表达**:这个求和恰好是输入 $X$ 与误差 $\delta$ 的互相关运算:
|
||
|
||
$$\frac{\partial L}{\partial W} = X \star \delta$$
|
||
|
||
其中 $\star$ 表示互相关(Cross-Correlation)。
|
||
|
||
**结论**:权重的梯度等价于**输入特征 $X$ 与输出梯度 $\delta$ 的互相关**。
|
||
|
||
#### 3. 误差项(对输入 $X$)的传递
|
||
|
||
为了将误差传给前一层,需计算 $\frac{\partial L}{\partial x_{i,j}}$:
|
||
|
||
$$\frac{\partial L}{\partial x_{i,j}} = \sum_{m} \sum_{n} \frac{\partial L}{\partial y_{i-m+1, j-n+1}} \frac{\partial y_{i-m+1, j-n+1}}{\partial x_{i,j}}$$
|
||
|
||
经过索引转换,可以证明:
|
||
|
||
$$\frac{\partial L}{\partial X} = \delta \ast \text{rot180}(W)$$
|
||
|
||
其中 $\text{rot180}(W)$ 表示将卷积核旋转 180 度。这意味着**反向传播本质上也是一个卷积过程**。
|
||
|
||
#### 4. Im2Col 矩阵化实现(工程视角)
|
||
|
||
在 GPU 上高效实现卷积反向传播,需要将卷积转化为矩阵乘法(Im2Col 方法):
|
||
|
||
1. **将输入张量展开为矩阵**:
|
||
- 将每个滑动窗口($k \times k$ 区域)展平为一行
|
||
- 输入 $\mathcal{X} \in \mathbb{R}^{C \times H \times W}$ 被展开为矩阵 $X_{col} \in \mathbb{R}^{(H_{out} \times W_{out}) \times (C \cdot k^2)}$
|
||
|
||
2. **将卷积核展开为矩阵**:
|
||
- 每个卷积核的 $C \times k \times k$ 参数展平为一行
|
||
- $K_{col} \in \mathbb{R}^{(C_{out}) \times (C \cdot k^2)}$
|
||
|
||
3. **前向传播**:$Y_{col} = X_{col} \cdot K_{col}^T$
|
||
|
||
4. **反向传播**:
|
||
- 权重梯度:$\frac{\partial L}{\partial K_{col}} = \delta_{col}^T \cdot X_{col}$
|
||
- 输入梯度:$\frac{\partial L}{\partial X_{col}} = \delta_{col} \cdot K_{col}$,然后恢复为 $\mathcal{X}$ 的形状
|
||
|
||
**物理意义**:Im2Col 将局部运算转化为全局矩阵运算,从而可以充分利用 GPU 的矩阵乘法加速单元。
|
||
|
||
---
|
||
|
||
### 三、下采样(Pooling)与感受野
|
||
|
||
#### 1. 池化层(Pooling)
|
||
|
||
池化层通过非线性映射(Max 或 Average)实现空间维度的压缩。
|
||
|
||
- **Max Pooling:** $y = \max(x_{i...i+k, j...j+k})$
|
||
|
||
- **作用:** 增加特征对微小形变的鲁棒性,减少计算量,并强制模型学习更全局的抽象特征。
|
||
|
||
|
||
#### 2. 感受野(Receptive Field, RF)
|
||
|
||
感受野决定了输出特征图中一个点能“看到”输入图像多大的区域。
|
||
|
||
对于第 $l$ 层,其感受野 $RF_l$ 的递推公式为:
|
||
|
||
$$RF_l = RF_{l-1} + (k_l - 1) \cdot \prod_{i=1}^{l-1} S_i$$
|
||
|
||
其中 $k_l$ 为当前层核大小,$S_i$ 为前几层的步长。
|
||
|
||
**直观理解:** 随着层数加深,感受野呈线性/指数级扩大,使得网络能从局部的像素点逐步演化为对整个物体的理解。
|
||
|
||
---
|
||
### 四、训练链路全流程详析
|
||
|
||
在训练模式下,CNN 遵循“前向传播 (FP) -> 计算损失 -> 反向传播 (BP) -> 参数更新”的闭环过程。
|
||
|
||
### 1. 前向传播链路(Forward Pass)
|
||
|
||
数据在网络中的流动可以抽象为算子的顺序嵌套:
|
||
|
||
1. **输入层 (Input)**:原始图像数据 $x_0$ 进入网络。
|
||
|
||
2. **卷积运算 ($Z_l = W_l * A_{l-1} + b_l$)**:
|
||
|
||
- 利用卷积核对输入进行局部加权求和。
|
||
|
||
- **作用**:提取空间局部特征(如纹理、颜色梯度)。
|
||
|
||
3. **激活层 ($A_l = \sigma(Z_l)$)**:
|
||
|
||
- 通常使用 **ReLU**,将卷积后的线性结果进行非线性映射。
|
||
|
||
- **数学性质**:$f(x) = \max(0, x)$。它解决了梯度消失问题并带来了神经网络的稀疏性。
|
||
|
||
4. **池化层 (Pooling)**:
|
||
|
||
- 执行下采样(如 Max Pooling),在保留核心特征的同时减小特征图尺寸。
|
||
|
||
5. **全连接层 (FC Layer)**:
|
||
|
||
- 将最后一层卷积得到的特征图“压平”(Flatten)为一维向量。
|
||
|
||
- 通过矩阵乘法 $y = W_{fc}a + b$ 将高维特征映射到类别分数空间。
|
||
|
||
6. **输出与 Loss 计算**:
|
||
|
||
- 经过 **Softmax** 函数将分数转化为概率分布 $p$。
|
||
|
||
- 使用 **交叉熵损失 (Cross-Entropy Loss)** 计算预测值与真实标签 $y_{true}$ 的距离:
|
||
|
||
$L = -\sum y_{true} \log(p)$
|
||
|
||
|
||
---
|
||
|
||
### 2. 反向传播链路(Backward Pass)
|
||
|
||
训练的核心是利用**链式法则**计算损失函数 $L$ 对每一层参数的梯度。
|
||
|
||
#### A. 误差项的传递(从后往前)
|
||
|
||
首先计算输出层的梯度 $\delta_{out} = \frac{\partial L}{\partial Z_{last}}$。
|
||
|
||
- **FC 层梯度**:标准的矩阵转置相乘,将误差分配给每个神经元。
|
||
|
||
- **池化层反传**:
|
||
|
||
- **Max Pooling**:误差只传递回前向传播时贡献最大值(Max)的那个位置,其余位置梯度为 0(这被称为“梯度掩码”)。
|
||
|
||
- **Average Pooling**:误差平均分配回该池化窗口内的所有像素。
|
||
|
||
|
||
#### B. 卷积层权重梯度计算
|
||
|
||
这是更新卷积核的关键步骤。如第二部分所述,第 $l$ 层权重的梯度满足:
|
||
|
||
$$\frac{\partial L}{\partial W_l} = A_{l-1} \ast \delta_l$$
|
||
|
||
这意味着:**卷积核的更新方向,取决于上一层的激活值与当前层误差项的相关性。**
|
||
|
||

|
||
|
||
|
||
#### C. 梯度传播至前一层
|
||
|
||
为了让更浅的层得到更新,误差项必须穿过当前的卷积核:
|
||
|
||
$$\delta_{l-1} = (\delta_l \ast \text{rot180}(W_l)) \odot \sigma'(Z_{l-1})$$
|
||
|
||
其中 $\odot$ 是 Hadamard 积(逐元素相乘),$\sigma'$ 是激活函数的导数。
|
||
|
||
---
|
||
|
||
### 3. 参数更新(Optimizer)
|
||
|
||
在得到梯度 $\frac{\partial L}{\partial W}$ 后,使用优化算法(如 SGD, Adam)对权重进行修正:
|
||
|
||
$$W_{new} = W_{old} - \eta \cdot \frac{\partial L}{\partial W}$$
|
||
|
||
其中 $\eta$ 是学习率。
|
||
|
||
**训练链路总结:**
|
||
|
||
- **前向**:通过卷积核的**平移**提取局部特征,通过池化进行**特征聚合**,最终实现降维分类。
|
||
|
||
- **后向**:误差项通过卷积核的**翻转卷积**逆向回传,权重通过**误差与激发的互相关**实现自我进化。
|
||
|
||
---
|
||
|
||
## 三、总结
|
||
|
||
CNN 的强大在于其精心设计的归纳偏置(Inductive Bias):
|
||
|
||
1. **局部性:** 认为相关信息存在于相邻像素间。
|
||
|
||
2. **平移等变性:** 无论特征出现在图像何处,相同的卷积核都能捕捉到它。
|
||
|
||
3. **层次化:** 通过堆叠卷积层,将复杂的非线性特征分解为简单的空间变换,这与人类视觉皮层(V1 到 V4 区域)的处理逻辑高度相似。 |