卷积神经网络,简称 CNN,是一种先寻找小的局部模式,再把它们组合成更大模式的神经网络。在图像中,前面的层通常会检测边缘或角点,中间层会检测纹理或局部部件,更深的层则利用这些信号来支持最终预测。

它的关键思想是权重共享。CNN 不会为每个像素位置分别学习一套独立权重,而是在许多位置重复使用同一个小滤波器。这样相比直接对原始图像使用全连接层,计算代价要低得多,也更容易在不同位置检测到同一种模式。

卷积神经网络做了什么

在全连接层中,每个输出都可以同时依赖所有输入值。CNN 的结构更强。它使用小卷积核,通常也叫滤波器,每次只看一个局部区域。

对于单通道输入 xx 和一个 k×kk \times k 的卷积核 KK,一个输出元素可以写成

yi,j=m=0k1n=0k1Km,nxi+m,j+n.y_{i,j} = \sum_{m=0}^{k-1} \sum_{n=0}^{k-1} K_{m,n} x_{i+m,j+n}.

这就是卷积层背后的“局部加权求和”思想。在很多机器学习库中,实际实现的操作严格来说是互相关,而不是数学上翻转卷积核后的卷积,但实际直觉是一样的:卷积核在输入上扫描,并生成一张特征图。

特征图会告诉你,学习到的模式在哪些位置出现得更强。

为什么共享滤波器有帮助

如果同样的垂直边缘出现在图像左上角,或者出现在图像中心,我们通常都希望模型能识别出来。CNN 通过在不同位置复用同一组滤波器参数来实现这一点。

这会带来两个实际效果:

  • 与直接作用于原始图像的全连接层相比,它减少了需要学习的参数数量。
  • 它鼓励网络去检测反复出现的局部模式,而不是死记某一个固定位置。

这种复用正是 CNN 在图像任务中表现有效的原因之一。

一个基础 CNN 架构长什么样

一个基础 CNN 通常遵循这样的模式:

  1. 卷积层
  2. 激活函数,如 ReLU
  3. 可选的池化或下采样
  4. 更多卷积模块
  5. 最终预测层

前面的层通常捕捉简单的局部结构。更深的层会把这些响应组合成更大、也更贴合任务的特征。

池化不是必须的,但如果使用了池化,它会缩小空间维度,让后续层在更紧凑的表示上工作。一个常见例子是最大池化,它会保留每个小区域中的最大值。

如果步幅是 11、填充是 00,那么一个 n×nn \times n 的输入经过一个 k×kk \times k 的卷积核后,会得到一个 (nk+1)×(nk+1)(n-k+1) \times (n-k+1) 的输出。检查例题是否合理时,这个尺寸规则很有用。

例题:CNN 的特征图是如何生成的

看下面这个 4×44 \times 4 输入图像:

X=[3300330000330033]X = \begin{bmatrix} 3 & 3 & 0 & 0 \\ 3 & 3 & 0 & 0 \\ 0 & 0 & 3 & 3 \\ 0 & 0 & 3 & 3 \end{bmatrix}

使用这个 2×22 \times 2 卷积核:

K=[1111]K = \begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix}

假设步幅为 11,且不做填充。因为输入是 4×44 \times 4,卷积核是 2×22 \times 2,所以输出一定是 3×33 \times 3。由于卷积核中的每个元素都等于 11,每个输出值就是对应一个 2×22 \times 2 区域内元素的总和。

左上角的输出值是

y1,1=3(1)+3(1)+3(1)+3(1)=12.y_{1,1} = 3(1) + 3(1) + 3(1) + 3(1) = 12.

向右移动一步后的区域是

[3030],\begin{bmatrix} 3 & 0 \\ 3 & 0 \end{bmatrix},

所以

y1,2=3+0+3+0=6.y_{1,2} = 3 + 0 + 3 + 0 = 6.

把所有合法位置都算完,就得到

Y=[12606660612].Y = \begin{bmatrix} 12 & 6 & 0 \\ 6 & 6 & 6 \\ 0 & 6 & 12 \end{bmatrix}.

这个输出就是特征图。较大的数值表示卷积核在这些位置找到了更强的匹配。在这里,当出现完整的 2×22 \times 2 亮块时,滤波器的响应最强。

如果现在再应用 ReLU,由于所有元素本来就都是非负的,所以结果不会变化。如果接着使用步幅为 112×22 \times 2 最大池化,池化后的输出会变成

[126612].\begin{bmatrix} 12 & 6 \\ 6 & 12 \end{bmatrix}.

这不会创造新信息。它只是保留附近最强的响应,并缩小空间网格。

这个例子很简单,但它清楚展示了核心机制:一个滤波器滑动、计算局部加权和,并生成一张显示模式出现位置的图。

CNN 在训练过程中学到了什么

上面的卷积核是手动选的,但在真实的 CNN 中,滤波器的数值是从数据中学出来的。训练会不断调整这些数值,让得到的特征图对任务更有用。

如果任务是图像分类,网络会学习有助于区分类别的滤波器。如果任务是分割或检测,后面的层则会针对这些输出进行训练。基本机制是一样的:前向传播、损失、反向传播、参数更新。

学习 CNN 时的常见错误

以为 CNN 就等于“图像分类器”

图像是最标准的例子,但 CNN 的本质其实是局部结构和共享滤波器。只要相邻数值之间的关系重要,这个思想就不只适用于图像。

认为池化总是必需的

它很常见,但并不普遍。有些架构会用带步幅的卷积来减小空间尺寸,还有一些架构会更长时间保留更多空间细节。

忽略步幅和填充

特征图的大小取决于这些选择。如果你改变步幅或填充,不仅会改变输出的形状,也会改变每个单元能看到哪些局部邻域。

把这一层只当成一个公式

卷积公式当然重要,但架构本身也同样重要。CNN 之所以有效,是因为卷积、激活、层的堆叠和训练是一起发挥作用的。

卷积神经网络在什么时候有用

CNN 被广泛用于计算机视觉任务,例如图像分类、目标检测和图像分割。在一些局部模式有意义的信号处理和序列场景中,它们也会出现。

当输入具有明显的网格结构或有序邻域结构时,CNN 尤其有用。如果这种条件很弱,那么其他架构可能更合适。

一个更容易理解 CNN 的思维模型

可以把 CNN 看成一种模式检测器:它从小模式开始,随着层数加深,逐渐形成更抽象的表示。某一层会问:“这个小模式是否出现在这里?” 后面的层则会问:“这些更简单的模式能否组合成更有意义的东西?”

这就是为什么理解 CNN 时,关注特征图往往比只盯着“卷积”这个词更有效。

自己试一试

保持输入不变,但把卷积核改成

[1111].\begin{bmatrix} 1 & -1 \\ 1 & -1 \end{bmatrix}.

重新计算特征图,看看哪些区域现在会产生较大的正响应或负响应。这个小改动会让你更清楚地看到,不同滤波器是如何检测不同模式的。

需要解题帮助?

上传你的问题,几秒钟内获得经过验证的分步解答。

打开 GPAI Solver →