--- 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 network,AI 生成](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 区域)的处理逻辑高度相似。