Files
Notes/机器学习/深度学习模型/1-基础模型/2-CNN-卷积神经网络.md
2026-05-16 17:16:51 +08:00

277 lines
11 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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$$
这意味着:**卷积核的更新方向,取决于上一层的激活值与当前层误差项的相关性。**
![backpropagation in convolutional neural networkAI 生成](https://encrypted-tbn0.gstatic.com/licensed-image?q=tbn:ANd9GcSYqQrODTM8pmYgHkuRpW-WWAO0CbvA5m2BJLrqDvRjRgaS7PhqSccaiX_W0u47j05kBqInJQ_UDpsYHROixJZc47wk1jihq1N6EYh3IarsQz0Bjx0)
#### 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 区域)的处理逻辑高度相似。