深度学习课程学习报告week2_卷积神经网络(CNN)基础
why conv
- 痛点:在处理高分辨率图像时,传统的多层感知机(MLP)由于缺乏对空间结构的先验假设,全连接层会导致参数量呈爆炸式增长(例如百万像素图像经过千维隐藏层会产生10910^9109级别的参数量)。这使得模型极难训练且容易过拟合。
- 解法:卷积神经网络(CNN)利用自然图像中普遍存在的结构特征(平移不变性和局部性),通过设定特定的归纳偏置(Inductive Bias),在保持特征提取能力的同时,将网络参数量降低数个数量级。
- 平移不变性(Translation Invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。在数学物理层面上,这意味着特征提取器的权重在整个空间维度上是共享的,不再随绝对坐标的变化而改变。
- 局部性(Locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,可以聚合这些局部特征,以在整个图像级别进行预测。这意味着每次特征提取仅在有限大小的感受野(Receptive Field)内进行计算。
从多层感知机(MLP)到CNN
将 MLP 演化为 CNN,本质上是依次应用上述两大原则对权重张量进行约束的过程。
1. 基础全连接层表示
假设输入图像X\mathbf{X}X和隐藏层特征H\mathbf{H}H均为二维张量。对于隐藏层位置(i,j)(i, j)(i,j)的输出,其全连接形式的加权和可以表示为(其中W\mathsf{W}W为四阶权重张量,U\mathbf{U}U为偏置):
[H]i,j=[U]i,j+∑k∑l[W]i,j,k,l[X]k,l [\mathbf{H}]_{i, j} = [\mathbf{U}]_{i, j} + \sum_k \sum_l[\mathsf{W}]_{i, j, k, l} [\mathbf{X}]_{k, l}[H]i,j=[U]i,j+k∑l∑[W]i,j,k,l[X]k,l
为方便推导,重新索引下标令k=i+ak = i+ak=i+a和l=j+bl = j+bl=j+b,将其转换为中心坐标加偏移量(a,b)(a, b)(a,b)的形式:
[H]i,j=[U]i,j+∑a∑b[V]i,j,a,b[X]i+a,j+b [\mathbf{H}]_{i, j} = [\mathbf{U}]_{i, j} + \sum_a \sum_b [\mathsf{V}]_{i, j, a, b} [\mathbf{X}]_{i+a, j+b}[H]i,j=[U]i,j+a∑b∑[V]i,j,a,b[X]i+a,j+b
2. 引入“平移不变性”约束
由于特征提取不依赖于绝对位置(i,j)(i, j)(i,j),权重张量V\mathsf{V}V和偏置U\mathbf{U}U中的iii和jjj维度可以被消去。偏置退化为常数uuu,权重退化为二维滤波器矩阵V\mathbf{V}V。此时,全连接层转化为了二维互相关(通常称为卷积)操作:
[H]i,j=u+∑a∑b[V]a,b[X]i+a,j+b [\mathbf{H}]_{i, j} = u + \sum_a\sum_b [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b}[H]i,j=u+a∑b∑[V]a,b[X]i+a,j+b
3. 引入“局部性”约束
为了只关注局部信息,我们限定偏移量(a,b)(a, b)(a,b)的范围在一个极小的窗口内,即设置阈值Δ\DeltaΔ。当∣a∣>Δ|a| > \Delta∣a∣>Δ或∣b∣>Δ|b| > \Delta∣b∣>Δ时,权重[V]a,b=0[\mathbf{V}]_{a, b} = 0[V]a,b=0。最终得到卷积层(Convolutional Layer)的严格数学定义:
[H]i,j=u+∑a=−ΔΔ∑b=−ΔΔ[V]a,b[X]i+a,j+b [\mathbf{H}]_{i, j} = u + \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b}[H]i,j=u+a=−Δ∑Δb=−Δ∑Δ[V]a,b[X]i+a,j+b
补充:多通道(Channels)扩展
由于真实图像(如RGB)及深层特征图均为三维张量(通道数、高、宽),卷积层需进一步向通道维度扩展。设ccc为输入通道,ddd为输出通道,完整的卷积运算为:
[H]i,j,d=∑a=−ΔΔ∑b=−ΔΔ∑c[V]a,b,c,d[X]i+a,j+b,c [\mathsf{H}]_{i,j,d} = \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} \sum_c [\mathsf{V}]_{a, b, c, d} [\mathsf{X}]_{i+a, j+b, c}[H]i,j,d=a=−Δ∑Δb=−Δ∑Δc∑[V]a,b,c,d[X]i+a,j+b,c
图像卷积
互相关运算
- 是什么:严格来说,深度学习中绝大多数“卷积层”执行的其实是互相关运算(cross-correlation),而不是数学上严格意义的卷积运算。
- 怎么算:
- 过程:设定一个二维的卷积窗口(即卷积核大小,如2×22 \times 22×2)。该窗口从输入张量的左上角开始,依次从左到右、从上到下滑动。
- 局部计算:在窗口滑动的每一个位置,将窗口内的输入子张量与卷积核张量进行按元素相乘并求和,得到一个单一的标量值,这就是该位置的输出。
- 输出维度变化:如果没有进行边界填充(Padding),由于卷积核需要完全贴合在输入张量内部滑动,输出的尺寸会略小于输入。具体公式为:(nh−kh+1)×(nw−kw+1)(n_h-k_h+1) \times (n_w-k_w+1)(nh−kh+1)×(nw−kw+1)。
卷积层
卷积层对输入和卷积核权重进行互相关运算,并在添加标量偏置之后产生输出。所以,卷积层中的两个被训练的参数是卷积核权重(Weight)和标量偏置(Bias)。
卷积核
- 如何学习:
- 虽然我们可以通过先验知识手工设计特定的卷积核(例如用
[1, -1]的核去检测图像中水平相邻像素的差异,从而检测垂直边缘),但在实际的深层网络中,手动设计是不现实的。 - 现代深度学习通过反向传播算法自动学习卷积核。过程为:随机初始化卷积核张量→\rightarrow→执行前向互相关运算得到预测输出→\rightarrow→比较输出与真实目标的平方误差(Loss)→\rightarrow→对卷积核权重求导计算梯度→\rightarrow→使用梯度下降等优化算法更新权重。最终网络会自行学习到最适合当前任务的特征提取器。
- 虽然我们可以通过先验知识手工设计特定的卷积核(例如用
互相关与卷积
- 如何相互变换:在数学中,要得到严格的“卷积”运算输出,需要将二维卷积核张量进行水平翻转和垂直翻转(相当于旋转180度),然后再对输入张量执行“互相关”运算。
- 为什么深度学习不区分:由于卷积核本身是从数据中随机初始化并学习得到的,不论网络底层使用的是严格卷积还是互相关,优化算法最终学到的权重本质上是等价的(只是相差一个翻转)。为了术语的统一和计算实现的便捷,深度学习社区通常直接将“互相关运算”称为“卷积”。
特征映射和感受野
- 特征映射 (Feature Map):卷积层的输出张量通常被称为特征映射,因为它代表了将上一层的输入在空间维度上提取特征后的新表示。
- 感受野 (Receptive Field):对于某一层特征映射上的任意一个元素xxx,其“感受野”是指:在前向传播中,所有能够影响到xxx计算结果的原始输入区域。
- 维度关系:
- 在单层卷积中,xxx的感受野大小等于卷积核的大小(例如2×22 \times 22×2输出的 1 个像素,来源于输入层的2×22 \times 22×2个像素)。
- 当网络变得更深(即多个卷积层叠加)时,感受野的维度会快速扩张。深层特征图上的一个像素,其感受野可能覆盖原始图像上一大块极其广阔的区域。这解释了为什么深层网络能够捕捉到更加宏观和全局的图像特征。
填充与步幅
填充
为什么需要填充?
- 防止边缘信息丢失:在互相关运算中,图像内部的像素会被卷积核多次重复扫描参与计算,而边缘像素只会被扫描极少数次(甚至只有一次)。这导致图像边缘的特征在传递过程中逐渐被边缘化甚至丢失。
- 控制特征图的空间分辨率:在不进行填充的情况下,每次卷积操作都会导致输出尺寸减小(由n×nn \times nn×n变为(n−k+1)×(n−k+1)(n-k+1) \times (n-k+1)(n−k+1)×(n−k+1))。对于一个极深的网络,如果不加干预,特征图的分辨率会迅速缩减为1×11 \times 11×1,这极大地限制了网络的层数和深度。
怎么填(举例)
填充通常是在输入矩阵的四周添加值为 0 的额外行和列(即零填充)。假设我们在高度上填充php_hph行(上下各ph/2p_h/2ph/2),在宽度上填充pwp_wpw列(左右各pw/2p_w/2pw/2),输出尺寸公式更新为:
Output=(n+p−k+1) \text{Output} = (n + p - k + 1)Output=(n+p−k+1)
- 举例说明:
假设输入X\mathbf{X}X形状为3×33 \times 33×3,卷积核K\mathbf{K}K形状为3×33 \times 33×3。- 不加填充 (p=0p=0p=0):输出尺寸为(3−3+1)×(3−3+1)=1×1(3 - 3 + 1) \times (3 - 3 + 1) = 1 \times 1(3−3+1)×(3−3+1)=1×1。
- 四周各填充 1 行/列 (p=2p=2p=2):输入变相地扩展成了5×55 \times 55×5。此时输出尺寸为(3+2−3+1)×(3+2−3+1)=3×3(3 + 2 - 3 + 1) \times (3 + 2 - 3 + 1) = 3 \times 3(3+2−3+1)×(3+2−3+1)=3×3。通过这种方式,我们成功保持了特征图的尺寸与输入完全一致。
当满足以下三个条件时:
- 卷积核大小为奇数(设k=2m+1k = 2m + 1k=2m+1);
- 所有边填充相同(即上下左右各填充p=mp = mp=m行/列,总填充量为2m2m2m);
- 输入与输出尺寸相同(根据公式n+2m−(2m+1)+1=nn + 2m - (2m+1) + 1 = nn+2m−(2m+1)+1=n刚好成立)。
这意味着,在进行计算时,卷积核的几何中心在输入矩阵上的坐标移动轨迹,与输出矩阵的索引是完全重合的。因此,输出特征图上的每一个点Y[i,j]Y[i, j]Y[i,j],其对应感受野的绝对中心恰好就是输入图上的X[i,j]X[i, j]X[i,j]。这在语义上提供了极高的空间位置对齐性,对于目标检测中的边界框定位、图像分割以及视觉追踪任务中保持目标的绝对坐标一致性至关重要。
步幅
步幅是指卷积核每次在输入矩阵上滑动的行数和列数。默认步幅为 1。当步幅s>1s > 1s>1时,卷积窗口会跳过中间的像素进行采样。
- 举例说明:
假设输入尺寸为7×77 \times 77×7,卷积核大小为3×33 \times 33×3,不加填充(p=0p=0p=0)。- 步幅s=1s=1s=1:卷积核每次向右移动 1 列。输出大小为7−31+1=5×5\frac{7 - 3}{1} + 1 = 5 \times 517−3+1=5×5。
- 步幅s=2s=2s=2:卷积核每次向右直接跳过 1 列(移动 2 列,从第1列直接跳到第3列、第5列)。输出大小为⌊7−32⌋+1=3×3\lfloor\frac{7 - 3}{2}\rfloor + 1 = 3 \times 3⌊27−3⌋+1=3×3。
为什么要用不同的步幅?
- 成倍降低计算量与内存开销:当处理高分辨率的输入(如百万级像素图像)时,若步幅始终为 1,特征图下降速度极慢,会导致后续层产生海量的特征图和极高的计算负载。增大步幅可以瞬间对特征图进行空间上的稀疏抽样,大幅提高前向与反向传播的效率。
- 快速扩大感受野(Receptive Field):大步幅意味着底层的神经元能够以更快的速度跳跃扫描,使得更浅的层就能覆盖和捕捉到原始输入中更宏观、更大尺度的全局语义特征,这对于需要兼顾实时响应和全局视野的系统非常高效。
- 空间降采样(Downsampling):在很多现代网络架构中,大步幅的卷积常用来替代传统的池化层(Pooling),在提取特征的同时实现空间维度的缩减。
