2025-08-09 李沐深度学习12——卷积神经网络基础
文章目录
- 1 从全连接层到卷积层
- 1.1 全连接层(MLP)处理图像的困境
- 1.2 图像处理中的两个核心原则
- 1.3 从全连接层到卷积层的推导
- 1.3.1 全连接层的重新表示
- 1.3.2 应用平移不变性原则
- 1.3.3 应用局部性原则
- 1.4 小结
- 2 卷积层
- 2.1 卷积层介绍
- 2.1.1 二维交叉相关(二维卷积)操作
- 2.1.2 二维卷积层(2D Convolutional Layer)
- 2.1.3 卷积核的作用与示例
- 2.1.4 交叉相关与卷积的异同
- 2.1.5 多维卷积
- 2.1.6 小结
- 2.2 填充和步幅
- 2.2.1 填充(Padding)
- 2.2.2 步幅(Stride)
- 2.2.3 小结
- 2.3 多输入输出通道
- 2.3.1 多输入通道
- 2.3.2 多输出通道
- 2.3.3 1×1 卷积层
- 2.3.4 小结
- 3 池化层
- 3.1 为什么需要池化层?
- 3.2 池化层的工作原理
- 3.3 池化层的超参数与特性
- 3.4 总结
1 从全连接层到卷积层
1.1 全连接层(MLP)处理图像的困境
在使用全连接层(MLP)处理图像时,会遇到一个严重的问题:参数量爆炸。
- 例子:一张1200万像素(12 MP)的RGB图像,共有 12×106×3=3.6×107 个元素。
- 如果使用一个单隐藏层MLP,隐藏层大小为100,则权重参数量为 100×3.6×107=3.6×109(36亿)。
- 这36亿个参数需要占用约14GB的存储空间,这对普通设备是巨大的负担,也远超世界上猫狗的总数,意味着模型学习的不是通用特征,而是过度记忆了数据。
这种庞大的参数量使得MLP无法有效地处理大型图像,因此我们需要寻找更好的解决方案。

1.2 图像处理中的两个核心原则
解决MLP困境的关键在于理解图像数据与众不同的两个特性:
- 平移不变性 (Translation Invariance):
- 图像中的某个物体(如一只猫)在图像的不同位置出现时,其识别模式(特征)应该是一致的。
- 用于识别该物体的分类器(权重)不应随着物体位置的改变而改变。
- 简而言之,无论物体在左上角还是右下角,我们都应该用相同的“模式识别器”去寻找它。
- 局部性 (Locality):
- 要识别图像中的某个特征(例如一只眼睛),我们只需要关注该特征周围一小块区域的像素信息,而不需要看到整张图像的所有像素。
- 每个输出像素的值,只应该依赖于输入图像中其附近区域的像素。

1.3 从全连接层到卷积层的推导
卷积层可以被视为一种特殊的、带有限制的全连接层,其设计正是为了遵循上述两个原则。
1.3.1 全连接层的重新表示
-
全连接层通常将图像展平为一维向量,但为了引入空间信息,我们可以将输入和输出都视为矩阵。
-
输入图像 XXX 的维度为 (Hin,Win)(Hin,Win)(Hin,Win),输出 HHH 的维度为 (Hout,Wout)(Hout,Wout)(Hout,Wout)。
-
权重 WWW 变为一个四维张量,连接输入高宽到输出高宽。
-
输出 HijH_{ij}Hij 的计算公式可以表示为:
Hij=∑k,lWijklXklH_{ij}=\sum_{k,l}W_{ijkl}X_{kl} Hij=k,l∑WijklXkl -
为了方便后续推导,可以对权重 $W $的索引进行重新排列,得到新的权重 VVV:
Vijab=Wij(i+a)(j+b)V_{ijab}=W_{ij(i+a)(j+b)} Vijab=Wij(i+a)(j+b) -
那么输出 HijH_{ij}Hij 就可以表示为:
Hij=∑a,bVijabX(i+a)(j+b)H_{ij}=\sum_{a,b}V_{ijab}X_{(i+a)(j+b)} Hij=a,b∑VijabX(i+a)(j+b)

1.3.2 应用平移不变性原则
-
平移不变性要求,无论输出像素 (i,j)(i,j)(i,j) 在哪里,其计算所使用的权重 VVV 都不应该改变。
-
这意味着权重 VVV 不应该依赖于输出坐标 iii 和 jjj,即 VijabV_{ijab}Vijab 应该简化为 VabV_{ab}Vab。
-
限制:Vijab=VabV_{ijab}=V_{ab}Vijab=Vab。
-
将此限制应用到公式中,得到:
Hij=∑a,bVabX(i+a)(j+b)H_{ij}=\sum_{a,b}V_{ab}X_{(i+a)(j+b)} Hij=a,b∑VabX(i+a)(j+b)
这就是二维卷积(或更严谨地说是二维交叉相关)的计算方式。这个限制大大减少了模型的参数数量,因为所有位置都共享同一组权重(称为卷积核或滤波器)。

1.3.3 应用局部性原则
-
平移不变性解决了参数共享问题,但仍然需要遍历所有输入像素。局部性原则进一步缩小了计算范围。
-
局部性要求计算输出 HijH_{ij}Hij 时,只关注输入像素 XXX 中 (i,j)(i,j)(i,j) 附近区域的值。
-
限制:当 ∣a∣>Δ|a|>\Delta∣a∣>Δ 或 ∣b∣>Δ|b|>\Delta∣b∣>Δ 时,Vab=0V_{ab}=0Vab=0。
-
这意味着卷积核 VVV 的大小是有限的,其非零元素只存在于一个以 (0,0)(0,0)(0,0) 为中心的小窗口内,窗口大小为 (2Δ+1,2Δ+1)(2\Delta+1,2\Delta+1)(2Δ+1,2Δ+1)。
-
将此限制应用到公式中,求和范围从遍历所有 a,ba,ba,b 变为一个有限的窗口内:
Hij=∑a=−ΔΔ∑b=−ΔΔVabX(i+a)(j+b)H_{ij}=\sum_{a=-\Delta}^\Delta\sum_{b=-\Delta}^\Delta V_{ab}X_{(i+a)(j+b)} Hij=a=−Δ∑Δb=−Δ∑ΔVabX(i+a)(j+b)
这便是我们最终得到的卷积层的计算公式。它将全连接层中巨大的权重矩阵,通过平移不变性和局部性的限制,压缩成一个参数量极小的卷积核。

1.4 小结
卷积层可以被看作是全连接层的一个特例。它通过应用两个关键原则实现了参数量的急剧缩减:
- 平移不变性:通过参数共享,使得卷积核在图像的不同位置上滑动时,使用的权重是相同的。这极大地减少了模型参数。
- 局部性:通过设定有限的感受野(即卷积核的大小),使得每个输出像素只依赖于输入图像中的一小块局部区域。
2 卷积层
2.1 卷积层介绍
2.1.1 二维交叉相关(二维卷积)操作
李沐老师首先通过一个动画示例详细解释了二维交叉相关(通常也称为二维卷积)的具体计算过程。
- 输入:一个 3×3 的矩阵。
- 卷积核(Kernel):一个 2×2 的矩阵。这个核矩阵就是我们所说的权重 WWW。
- 计算过程:
- 将卷积核覆盖在输入矩阵的左上角 2×2 区域。
- 将卷积核的每个元素与其覆盖的输入矩阵对应位置的元素相乘,然后将这4个乘积相加,得到输出矩阵的第一个元素。
- 将卷积核向右移动一格,重复上述乘加操作,得到输出矩阵的第二个元素。
- 当卷积核移动到最右侧后,向下移动一格,再次从左往右进行滑动,计算得到剩余的输出元素。

这个滑动操作体现了卷积的两个核心思想:
- 平移不变性:卷积核在滑动过程中保持不变,对图像不同位置应用相同的模式识别器。
- 局部性:每个输出像素仅由输入图像中一个局部小窗口的像素计算得到。
2.1.2 二维卷积层(2D Convolutional Layer)
从神经网络的角度看,一个二维卷积层由以下部分构成:
- 输入:一个 NH×NWN_H×N_WNH×NW 的矩阵,代表输入图像。
- 卷积核:一个 KH×KWK_H×K_WKH×KW 的矩阵,是可学习的参数。
- 偏差(Bias):一个可学习的标量参数 bbb。
- 运算:输出 Y=X⋆W+bY=X⋆W+bY=X⋆W+b,其中 ⋆⋆⋆ 表示二维交叉相关操作。
- 输出大小:输出矩阵的尺寸会变小。
- 高度:NH−KH+1N_H−K_H+1NH−KH+1
- 宽度:NW−KW+1N_W−K_W+1NW−KW+1
- 这是因为当卷积核移动到输入矩阵边缘时,如果无法完全覆盖一个完整的核大小区域,则停止计算。

2.1.3 卷积核的作用与示例
不同的卷积核参数可以实现不同的图像处理效果,这些效果在神经网络中可以被网络自动学习。
- 边缘检测:一个中心值较大、周围值为负的卷积核,可以突出图像的边缘。
- 锐化:某个特定核可以增强图像的细节,使其看起来更清晰。
- 高斯模糊:一个所有值都为正、中心值稍大的核,可以对图像进行平滑处理。
在训练过程中,神经网络会根据任务(如图像分类)自动学习出最合适的卷积核参数,以提取最有用的特征。

2.1.4 交叉相关与卷积的异同
在数学上,交叉相关和卷积的定义略有不同,卷积在计算时对核矩阵进行了一个翻转操作(即带有负号),而交叉相关则没有。
- 卷积:Yij=∑a,bWabX(i−a)(j−b)Y_{ij}=\sum_{a,b}W_{ab}X_{(i-a)(j-b)}Yij=∑a,bWabX(i−a)(j−b)
- 交叉相关:Yij=∑a,bWabX(i+a)(j+b)Y_{ij}=\sum_{a,b}W_{ab}X_{(i+a)(j+b)}Yij=∑a,bWabX(i+a)(j+b)
然而,在神经网络的实际应用中,两者没有本质区别。这是因为卷积核中的参数是可学习的。如果使用交叉相关学到了一组参数 W,那么使用卷积学到的参数就是 W 的翻转版本,但最终都能达到相同的效果。因此,深度学习社区通常将交叉相关操作也习惯性地称为“卷积”。

2.1.5 多维卷积
卷积操作不仅限于二维图像,也可以应用于其他维度的数据:
- 一维卷积(1D Conv):常用于处理序列数据,如文本、语音或时间序列数据。
- 三维卷积(3D Conv):常用于处理具有三个空间维度的数据,如视频(空间 + 时间维度)或医学影像(三维CT或MRI扫描)。

2.1.6 小结
卷积层的核心是交叉相关运算。它将输入数据与一个可学习的卷积核进行滑动相乘求和,并加上一个可学习的偏差。
- 可学习参数:卷积核和偏差。
- 超参数:卷积核的大小,它控制了感受野的大小,决定了模型在提取局部特征时的范围。
卷积层通过参数共享(平移不变性)和局部连接(局部性)这两个核心设计,成功解决了全连接层参数量巨大的问题,使得深度学习能够高效地处理大规模图像数据。卷积核的大小与输入图像的大小无关,因此模型能够处理任意大小的输入图像。

2.2 填充和步幅
在卷积神经网络中,除了卷积核的大小之外,填充和步幅是另外两个重要的超参数,它们共同控制着卷积层的输出形状。
2.2.1 填充(Padding)
a) 为什么需要填充?
如果不使用填充,每经过一次卷积操作,输出图像的尺寸都会缩小。
- 计算公式:输入尺寸 NH×NWN_H×N_WNH×NW,卷积核尺寸 KH×KWK_H×K_WKH×KW,输出尺寸为 (NH−KH+1)×(NW−KW+1)(N_H−K_H+1)×(N_W−K_W+1)(NH−KH+1)×(NW−KW+1)。
- 问题:如果输入图像尺寸本身就不大(例如 32×32),使用几层卷积后,输出尺寸会变得非常小,甚至无法继续使用卷积。这限制了神经网络的深度。
填充就是为了解决这个问题而设计的。

b) 什么是填充?
填充是指在输入图像的边界周围添加额外的行和列,通常用 0 来填充。
-
目的:增加输入图像的尺寸,从而使卷积后的输出尺寸保持不变或变得更大。
-
效果:通过在边缘添加像素,卷积核在滑动时可以覆盖更多位置,使得输出尺寸不会随着层数的增加而迅速减小。
-
新的输出尺寸计算公式:
NH′=NH−KH+PH+1NW′=NW−KW+PW+1N_{H}^{\prime}=N_{H}-K_{H}+P_{H}+1\\N_{W}^{\prime}=N_{W}-K_{W}+P_{W}+1 NH′=NH−KH+PH+1NW′=NW−KW+PW+1
其中,PHP_HPH 和 PWP_WPW 分别是高和宽的填充量。

c) 常用填充策略
为了保持输入和输出的尺寸一致,通常会选择填充量 PH=KH−1P_H=K_H−1PH=KH−1 和 PW=KW−1P_W=K_W−1PW=KW−1。
- 当卷积核的边长为奇数时,例如 K×KK×KK×K,我们通常会选择在上下左右各填充 (K−1)/2(K−1)/2(K−1)/2 行/列,以确保输出尺寸与输入相同。
- 如果卷积核的边长为偶数,通常会在一侧多填充一行/列,这在实践中影响不大。

2.2.2 步幅(Stride)
当输入图像尺寸较大时(例如 224×224),如果我们想快速缩小特征图的尺寸,仅通过卷积操作需要非常多的层数,这会增加模型的计算复杂性。

步幅可以解决这个问题,它允许我们成倍地减小输出尺寸。
步幅是指卷积核在滑动时,每次移动的行数和列数。默认步幅为 1。

-
目的:通过控制滑动步长,成倍地减少输出特征图的尺寸,从而显著降低计算量。
-
效果:步幅越大,输出尺寸越小。
-
新的输出尺寸计算公式:
NH′=⌊NH−KH+PHSH⌋+1NW′=⌊NW−KW+PWSW⌋+1N_{H}^{\prime}=\lfloor\frac{N_{H}-K_{H}+P_{H}}{S_{H}}\rfloor+1\\N_{W}^{\prime}=\lfloor\frac{N_{W}-K_{W}+P_{W}}{S_{W}}\rfloor+1 NH′=⌊SHNH−KH+PH⌋+1NW′=⌊SWNW−KW+PW⌋+1
其中,SHS_HSH 和 SWS_WSW 分别是高和宽的步幅。⌊⋅⌋⌊⋅⌋⌊⋅⌋ 表示向下取整。 -
常见用法:通常我们选择步幅为 2,这样可以将特征图的尺寸减半,常用于实现下采样(Downsampling)。

2.2.3 小结
填充和步幅都是卷积层的超参数,与卷积核大小一起,共同控制着神经网络中特征图的尺寸变化。通过灵活设置这些超参数,我们可以构建出不同结构、不同深度的卷积神经网络,以适应各种复杂的视觉任务。
超参数 | 功能 | 目的 | 效果 |
---|---|---|---|
填充(Padding) | 在输入边缘添加额外的行/列 | 解决因卷积导致输出尺寸减小的问题,允许构建更深的神经网络。 | 使得输出尺寸保持不变或增加。 |
步幅(Stride) | 控制卷积核的滑动步长 | 解决大尺寸输入计算量大的问题,快速减小输出尺寸。 | 使得输出尺寸成倍减小。 |

2.3 多输入输出通道
通道数是卷积神经网络中一个非常重要的超参数,它决定了输入和输出数据的深度。
2.3.1 多输入通道
图像通常由多个颜色通道组成,例如 RGB 图像有红(R)、绿(G)、**蓝(B)**三个通道。处理这类多通道输入时,卷积操作需要做相应调整。

-
输入表示:一个多通道输入是一个三维张量,形状为 (Cin,H,W)(C_{in},H,W)(Cin,H,W),其中 CinC_{in}Cin 是输入通道数。
-
卷积核:每个输入通道都对应一个独立的二维卷积核。因此,整个卷积核张量的形状为 (Cin,KH,KW)(C_{in},K_H,K_W)(Cin,KH,KW)。
-
计算过程:
- 将每个输入通道与其对应的二维卷积核进行卷积操作。
- 将所有通道的卷积结果按元素相加(element-wise summation)。
- 最终得到一个单通道的输出。
总结:多输入通道的卷积,本质上是将每个通道独立卷积,然后将结果相加,得到一个单一的输出通道。

2.3.2 多输出通道
在实际应用中,我们希望卷积层能识别多种不同的模式,而不仅仅是得到一个单通道的输出。因此,我们引入了多输出通道。
-
输出表示:一个多通道输出也是一个三维张量,形状为 (Cout,H′,W′)(C_{out},H',W')(Cout,H′,W′),其中 CoutC_{out}Cout 是输出通道数。
-
卷积核:为了得到 CoutC_{out}Cout 个输出通道,我们需要准备 CoutC_{out}Cout 组卷积核。每组卷积核都是一个三维张量,形状为 (Cin,KH,KW)(C_{in},K_H,K_W)(Cin,KH,KW)。因此,整个卷积核张量的形状变为四维:(Cout,Cin,KH,KW)(C_{out},C_{in},K_H,K_W)(Cout,Cin,KH,KW)。
-
计算过程:
- 对每个输出通道,我们都用它对应的三维卷积核组与输入张量进行卷积。
- 这一操作会产生一个单一的二维特征图,即一个输出通道。
- 将所有输出通道的结果堆叠起来,就得到了多输出通道的输出张量。
总结:每个输出通道都由其独立的一组三维卷积核计算得到,这些卷积核与所有输入通道进行卷积,然后求和。不同的输出通道可以被视为识别不同的特征模式(例如,一个通道识别水平边缘,另一个识别垂直边缘)。

2.3.3 1×1 卷积层
1×1 卷积核的高和宽都为 1,它是一个非常特殊的卷积层。
- 功能:1×1 卷积层不考虑空间信息,因为它每次只查看一个像素点。它的主要作用是融合通道信息。
- 原理:对于输入图像的每个像素点,其所有输入通道上的值都会被当作一个向量。1×1 卷积操作将这个向量与卷积核进行矩阵乘法,得到一个新的通道向量。
- 等价性:1×1 卷积层等价于在每个像素点上应用一个全连接层(MLP),将输入通道数映射到输出通道数。它在不改变特征图空间尺寸的情况下,调整了特征通道的数量和组合方式。

2.3.4 小结
虽然卷积层的计算量巨大,但其参数量相对较小,这使其能够利用大量数据进行深度训练。多输入/输出通道的设计使得网络能够从多个维度提取和组合特征,从底层的简单纹理(边缘)到高层的复杂模式(猫头、眼睛)。
-
输入:三维张量,形状为 (Cin,H,W)(C_{in},H,W)(Cin,H,W)。
-
权重(卷积核):四维张量,形状为 (Cout,Cin,KH,KW)(C_{out},C_{in},K_H,K_W)(Cout,Cin,KH,KW)。
-
偏差(Bias):一个一维向量,长度为 CoutC_{out}Cout。
-
输出:三维张量,形状为 (Cout,H′,W′)(C_{out},H',W')(Cout,H′,W′)。输出的高度和宽度 H′,W′H',W'H′,W′ 由卷积核大小、填充和步幅决定。
-
计算复杂度:一个卷积层的浮点运算量约为 Cin×Cout×KH×KW×H′×W′C_{in}×C_{out}×K_H×K_W×H'×W'Cin×Cout×KH×KW×H′×W′。这个值可能非常大,因此卷积层是计算量密集型操作。
-
模型大小:模型需要存储的参数主要是卷积核和偏差,数量为 (Cout×Cin×KH×KW)+Cout(C_{out}×C_{in}×K_H×K_W)+C_{out}(Cout×Cin×KH×KW)+Cout。相比全连接层,这个参数量相对较小。

3 池化层
池化层是卷积神经网络中一个非常重要的组件,其核心作用在于缓解卷积层对位置的敏感性,并实现特征的下采样(Downsampling)。
3.1 为什么需要池化层?
- 问题:卷积层对输入的位置非常敏感。例如,在进行边缘检测时,如果边缘稍微偏移一个像素,卷积层的输出可能会从一个较大的值变为零。
- 原因:在实际的图像中,物体的细微移动、拍摄时的抖动或光线变化都会导致像素位置的微小变化,而我们希望网络能够容忍这种变化。
- 解决方案:池化层通过对局部区域进行汇总,使得网络对输入数据的微小平移具有平移不变性(Translation Invariance)。

3.2 池化层的工作原理
池化层与卷积层一样,也是通过滑动窗口来工作的。但它不涉及任何可学习的参数,而是对窗口内的值进行某种固定操作。

-
二维最大池化层(2D Max Pooling):
- 操作:在滑动窗口覆盖的区域内,取最大的那个值作为输出。
- 效果:它能够提取出局部区域中最强的信号,同时保留了重要的特征信息。
- 平移不变性:如果输入图像中的特征(例如一个亮像素)在窗口内发生了微小偏移,最大池化层的输出仍然是这个亮像素的值,从而使得输出结果保持稳定。
-
二维平均池化层(2D Average Pooling):
- 操作:在滑动窗口覆盖的区域内,取所有值的平均值作为输出。
- 效果:它提供了一种更平滑、更柔和的特征表示,对噪声的鲁棒性更强。
3.3 池化层的超参数与特性
池化层具有与卷积层相似的超参数,但也有其独特之处:
- 超参数:
- 窗口大小(Window Size):控制池化操作的局部区域大小。
- 填充(Padding):在输入边缘添加额外的行和列,以控制输出尺寸。
- 步幅(Stride):控制窗口滑动的步长,用于快速减小输出尺寸。
- 主要特性:
- 无可学习参数:池化层没有可学习的权重或偏差,因为它只是进行一个固定的统计操作(取最大值或平均值),因此它不会增加模型的复杂性或参数量。
- 通道独立操作:池化层对每个输入通道进行独立操作,然后直接输出。它不会融合不同通道的信息。因此,输入通道数总是等于输出通道数。这种设计将通道融合的任务留给了卷积层。

3.4 总结
总而言之,池化层通常紧随卷积层之后,通过牺牲一些空间分辨率来换取特征的平移不变性,并有效减少了后续层的计算量。
特性 | 池化层(Pooling Layer) | 卷积层(Convolutional Layer) |
---|---|---|
主要目的 | 缓解位置敏感性,实现下采样。 | 提取和学习局部特征。 |
可学习参数 | 无 | 有(卷积核和偏差) |
通道融合 | 否,输入通道数 = 输出通道数。 | 是,可以改变通道数,融合不同通道信息。 |
计算方式 | 对窗口内进行固定操作(如取最大值、平均值)。 | 将窗口内的值与卷积核进行相乘求和。 |
