卷积神经网络,简称 CNN,是一种先寻找小的局部模式,再把它们组合成更大模式的神经网络。在图像中,前面的层通常会检测边缘或角点,中间层会检测纹理或局部部件,更深的层则利用这些信号来支持最终预测。
它的关键思想是权重共享。CNN 不会为每个像素位置分别学习一套独立权重,而是在许多位置重复使用同一个小滤波器。这样相比直接对原始图像使用全连接层,计算代价要低得多,也更容易在不同位置检测到同一种模式。
卷积神经网络做了什么
在全连接层中,每个输出都可以同时依赖所有输入值。CNN 的结构更强。它使用小卷积核,通常也叫滤波器,每次只看一个局部区域。
对于单通道输入 和一个 的卷积核 ,一个输出元素可以写成
这就是卷积层背后的“局部加权求和”思想。在很多机器学习库中,实际实现的操作严格来说是互相关,而不是数学上翻转卷积核后的卷积,但实际直觉是一样的:卷积核在输入上扫描,并生成一张特征图。
特征图会告诉你,学习到的模式在哪些位置出现得更强。
为什么共享滤波器有帮助
如果同样的垂直边缘出现在图像左上角,或者出现在图像中心,我们通常都希望模型能识别出来。CNN 通过在不同位置复用同一组滤波器参数来实现这一点。
这会带来两个实际效果:
- 与直接作用于原始图像的全连接层相比,它减少了需要学习的参数数量。
- 它鼓励网络去检测反复出现的局部模式,而不是死记某一个固定位置。
这种复用正是 CNN 在图像任务中表现有效的原因之一。
一个基础 CNN 架构长什么样
一个基础 CNN 通常遵循这样的模式:
- 卷积层
- 激活函数,如 ReLU
- 可选的池化或下采样
- 更多卷积模块
- 最终预测层
前面的层通常捕捉简单的局部结构。更深的层会把这些响应组合成更大、也更贴合任务的特征。
池化不是必须的,但如果使用了池化,它会缩小空间维度,让后续层在更紧凑的表示上工作。一个常见例子是最大池化,它会保留每个小区域中的最大值。
如果步幅是 、填充是 ,那么一个 的输入经过一个 的卷积核后,会得到一个 的输出。检查例题是否合理时,这个尺寸规则很有用。
例题:CNN 的特征图是如何生成的
看下面这个 输入图像:
使用这个 卷积核:
假设步幅为 ,且不做填充。因为输入是 ,卷积核是 ,所以输出一定是 。由于卷积核中的每个元素都等于 ,每个输出值就是对应一个 区域内元素的总和。
左上角的输出值是
向右移动一步后的区域是
所以
把所有合法位置都算完,就得到
这个输出就是特征图。较大的数值表示卷积核在这些位置找到了更强的匹配。在这里,当出现完整的 亮块时,滤波器的响应最强。
如果现在再应用 ReLU,由于所有元素本来就都是非负的,所以结果不会变化。如果接着使用步幅为 的 最大池化,池化后的输出会变成
这不会创造新信息。它只是保留附近最强的响应,并缩小空间网格。
这个例子很简单,但它清楚展示了核心机制:一个滤波器滑动、计算局部加权和,并生成一张显示模式出现位置的图。
CNN 在训练过程中学到了什么
上面的卷积核是手动选的,但在真实的 CNN 中,滤波器的数值是从数据中学出来的。训练会不断调整这些数值,让得到的特征图对任务更有用。
如果任务是图像分类,网络会学习有助于区分类别的滤波器。如果任务是分割或检测,后面的层则会针对这些输出进行训练。基本机制是一样的:前向传播、损失、反向传播、参数更新。
学习 CNN 时的常见错误
以为 CNN 就等于“图像分类器”
图像是最标准的例子,但 CNN 的本质其实是局部结构和共享滤波器。只要相邻数值之间的关系重要,这个思想就不只适用于图像。
认为池化总是必需的
它很常见,但并不普遍。有些架构会用带步幅的卷积来减小空间尺寸,还有一些架构会更长时间保留更多空间细节。
忽略步幅和填充
特征图的大小取决于这些选择。如果你改变步幅或填充,不仅会改变输出的形状,也会改变每个单元能看到哪些局部邻域。
把这一层只当成一个公式
卷积公式当然重要,但架构本身也同样重要。CNN 之所以有效,是因为卷积、激活、层的堆叠和训练是一起发挥作用的。
卷积神经网络在什么时候有用
CNN 被广泛用于计算机视觉任务,例如图像分类、目标检测和图像分割。在一些局部模式有意义的信号处理和序列场景中,它们也会出现。
当输入具有明显的网格结构或有序邻域结构时,CNN 尤其有用。如果这种条件很弱,那么其他架构可能更合适。
一个更容易理解 CNN 的思维模型
可以把 CNN 看成一种模式检测器:它从小模式开始,随着层数加深,逐渐形成更抽象的表示。某一层会问:“这个小模式是否出现在这里?” 后面的层则会问:“这些更简单的模式能否组合成更有意义的东西?”
这就是为什么理解 CNN 时,关注特征图往往比只盯着“卷积”这个词更有效。
自己试一试
保持输入不变,但把卷积核改成
重新计算特征图,看看哪些区域现在会产生较大的正响应或负响应。这个小改动会让你更清楚地看到,不同滤波器是如何检测不同模式的。