11 KiB
title, draft, tags
| title | draft | tags | ||||
|---|---|---|---|---|---|---|
| 2-CNN-卷积神经网络 | false |
|
卷积神经网络 (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 方法):
-
将输入张量展开为矩阵:
- 将每个滑动窗口(
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)}
- 将每个滑动窗口(
-
将卷积核展开为矩阵:
- 每个卷积核的
C \times k \times k参数展平为一行 K_{col} \in \mathbb{R}^{(C_{out}) \times (C \cdot k^2)}
- 每个卷积核的
-
前向传播:
Y_{col} = X_{col} \cdot K_{col}^T -
反向传播:
- 权重梯度:
\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)
数据在网络中的流动可以抽象为算子的顺序嵌套:
-
输入层 (Input):原始图像数据
x_0进入网络。 -
卷积运算 (
Z_l = W_l * A_{l-1} + b_l):-
利用卷积核对输入进行局部加权求和。
-
作用:提取空间局部特征(如纹理、颜色梯度)。
-
-
激活层 (
A_l = \sigma(Z_l)):-
通常使用 ReLU,将卷积后的线性结果进行非线性映射。
-
数学性质:$f(x) = \max(0, x)$。它解决了梯度消失问题并带来了神经网络的稀疏性。
-
-
池化层 (Pooling):
- 执行下采样(如 Max Pooling),在保留核心特征的同时减小特征图尺寸。
-
全连接层 (FC Layer):
-
将最后一层卷积得到的特征图“压平”(Flatten)为一维向量。
-
通过矩阵乘法
y = W_{fc}a + b将高维特征映射到类别分数空间。
-
-
输出与 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):
-
局部性: 认为相关信息存在于相邻像素间。
-
平移等变性: 无论特征出现在图像何处,相同的卷积核都能捕捉到它。
-
层次化: 通过堆叠卷积层,将复杂的非线性特征分解为简单的空间变换,这与人类视觉皮层(V1 到 V4 区域)的处理逻辑高度相似。