7.1. 从全连接层到卷积
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 Colab 中打开 Notebook
在 SageMaker Studio Lab 中打开 Notebook

到目前为止,我们一直在处理表格数据,我们所讨论过的模型是合适的选择。所谓表格数据,是指数据由对应于样本的行和对应于特征的列组成。对于表格数据,我们可能会预见到我们所寻找的模式可能涉及特征之间的相互作用,但我们事先并不知道这些特征是如何相互作用的。

有时,我们确实缺乏知识来指导构建更精巧的架构。在这种情况下,多层感知机(MLP)可能是我们能做的最好的选择。然而,对于高维感知数据,这种无结构的网络可能会变得难以驾驭。

例如,让我们回到我们一直在用的区分猫和狗的例子。假设我们在数据收集方面做得非常彻底,收集了一个带标注的百万像素照片的数据集。这意味着网络的每个输入都有100万个维度。即使是激进地将隐藏维度减少到1000个,也需要一个由 \(10^6 \times 10^3 = 10^9\) 个参数组成的全连接层。除非我们有很多GPU、分布式优化的才能和非凡的耐心,否则学习这个网络的参数可能会变得不可行。

细心的读者可能会反对这个论点,理由是百万像素的分辨率可能不是必需的。然而,虽然我们或许可以用十万像素来解决问题,但我们大小为1000的隐藏层严重低估了学习良好图像表示所需的隐藏单元数量,因此一个实用的系统仍然需要数十亿个参数。此外,通过拟合如此多的参数来学习一个分类器可能需要收集一个巨大的数据集。然而,今天人类和计算机都能够很好地区分猫和狗,这似乎与这些直觉相矛盾。这是因为图像表现出丰富的结构,可以被人类和机器学习模型利用。卷积神经网络(CNNs)是机器学习为利用自然图像中一些已知结构而采用的一种创新方法。

7.1.1. 不变性

想象一下,我们想在一张图片中检测一个物体。无论我们使用什么方法来识别物体,都不应该过分关注物体在图像中的精确位置,这似乎是合理的。理想情况下,我们的系统应该利用这一知识。猪通常不会飞,飞机通常不会游泳。尽管如此,如果一只猪出现在图像的顶部,我们仍然应该能认出它。我们可以从儿童游戏“威利在哪里”(该游戏本身也启发了许多现实生活中的模仿,如 图 7.1.1 所示)中获得一些灵感。这个游戏由许多充满活动的混乱场景组成。威利出现在每个场景的某个地方,通常潜伏在某个不太可能的位置。读者的目标是找到他。尽管他有独特的服装,但这可能出奇地困难,因为有大量的干扰物。然而,威利长什么样 并不取决于 威利在哪里。我们可以用一个威利检测器扫描图像,该检测器可以为每个图像块打分,表示该块包含威利的概率。事实上,许多物体检测和分割算法都基于这种方法 (Long et al., 2015)。CNNs将这种空间不变性的思想系统化,利用它来用更少的参数学习有用的表示。

../_images/waldo-football.jpg

图 7.1.1 你能找到威利吗(图片由 William Murphy (Infomatique) 提供)?

现在我们可以通过列举一些期望来使这些直觉更加具体,以指导我们设计一个适合计算机视觉的神经网络架构。

  1. 在最开始的几层,我们的网络应该对相同的图像块做出类似的响应,无论它出现在图像的哪个位置。这个原则被称为平移不变性(或平移等变性)。

  2. 网络的最早几层应该关注局部区域,而不考虑远处区域的图像内容。这是局部性原则。最终,这些局部表示可以被聚合起来,对整个图像进行预测。

  3. 随着网络的深入,更深层次的层应该能够捕捉到图像的更长距离的特征,这与自然界中更高级别的视觉系统类似。

让我们看看这如何转化为数学。

7.1.2. 约束多层感知机

首先,我们可以考虑一个以二维图像 \(\mathbf{X}\) 为输入,其直接的隐藏表示 \(\mathbf{H}\) 也同样表示为矩阵(在代码中它们是二维张量)的多层感知机,其中 \(\mathbf{X}\)\(\mathbf{H}\) 具有相同的形状。让我们仔细思考一下。我们现在想象不仅输入,而且隐藏表示也具有空间结构。

\([\mathbf{X}]_{i, j}\)\([\mathbf{H}]_{i, j}\) 分别表示输入图像和隐藏表示中位置 \((i,j)\) 处的像素。因此,为了让每个隐藏单元都从每个输入像素接收输入,我们将从使用权重矩阵(如我们之前在MLP中所做的那样)切换到将我们的参数表示为四阶权重张量 \(\mathsf{W}\)。假设 \(\mathbf{U}\) 包含偏置,我们可以正式地将全连接层表示为

(7.1.1)\[\begin{split}\begin{aligned} \left[\mathbf{H}\right]_{i, j} &= [\mathbf{U}]_{i, j} + \sum_k \sum_l[\mathsf{W}]_{i, j, k, l} [\mathbf{X}]_{k, l}\\ &= [\mathbf{U}]_{i, j} + \sum_a \sum_b [\mathsf{V}]_{i, j, a, b} [\mathbf{X}]_{i+a, j+b}.\end{aligned}\end{split}\]

\(\mathsf{W}\)\(\mathsf{V}\) 的切换目前完全是形式上的,因为这两个四阶张量中的系数存在一一对应的关系。我们只是重新索引下标 \((k, l)\),使得 \(k = i+a\)\(l = j+b\)。换句话说,我们设置 \([\mathsf{V}]_{i, j, a, b} = [\mathsf{W}]_{i, j, i+a, j+b}\)。索引 \(a\)\(b\) 遍历正负偏移量,覆盖整个图像。对于隐藏表示 \([\mathbf{H}]_{i, j}\) 中的任何给定位置 (\(i\), \(j\)),我们通过对 \(x\) 中以 \((i, j)\) 为中心的像素进行加权求和来计算其值,权重为 \([\mathsf{V}]_{i, j, a, b}\)。在继续之前,让我们考虑一下这种参数化下单个层所需的总参数数量:一个 \(1000 \times 1000\) 的图像(1百万像素)被映射到一个 \(1000 \times 1000\) 的隐藏表示。这需要 \(10^{12}\) 个参数,远远超出了当前计算机的处理能力。

7.1.2.1. 平移不变性

现在让我们引用上面建立的第一个原则:平移不变性 (Zhang et al., 1988)。这意味着输入 \(\mathbf{X}\) 的平移应该只导致隐藏表示 \(\mathbf{H}\) 的平移。这只有在 \(\mathsf{V}\)\(\mathbf{U}\) 实际上不依赖于 \((i, j)\) 的情况下才可能实现。因此,我们有 \([\mathsf{V}]_{i, j, a, b} = [\mathbf{V}]_{a, b}\) 并且 \(\mathbf{U}\) 是一个常数,比如 \(u\)。结果,我们可以简化 \(\mathbf{H}\) 的定义

(7.1.2)\[[\mathbf{H}]_{i, j} = u + \sum_a\sum_b [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b}.\]

这是一个卷积!我们实际上是用系数 \([\mathbf{V}]_{a, b}\) 来加权位置 \((i, j)\) 附近的像素 \((i+a, j+b)\),从而得到值 \([\mathbf{H}]_{i, j}\)。请注意,\([\mathbf{V}]_{a, b}\)\([\mathsf{V}]_{i, j, a, b}\) 需要的系数要少得多,因为它不再依赖于图像内的位置。因此,所需的参数数量不再是 \(10^{12}\),而是一个更合理的 \(4 \times 10^6\):我们仍然有对 \(a, b \in (-1000, 1000)\) 的依赖。简而言之,我们取得了显著的进步。时延神经网络(TDNNs)是利用这一思想的最早例子之一 (Waibel et al., 1989)

7.1.2.2. 局部性

现在让我们引用第二个原则:局部性。如上所述,我们认为我们不需要从位置 \((i, j)\) 看得很远,就能收集到评估 \([\mathbf{H}]_{i, j}\) 处情况的相关信息。这意味着在某个范围 \(|a|> \Delta\)\(|b| > \Delta\) 之外,我们应该设置 \([\mathbf{V}]_{a, b} = 0\)。等价地,我们可以将 \([\mathbf{H}]_{i, j}\) 重写为

(7.1.3)\[[\mathbf{H}]_{i, j} = u + \sum_{a = -\Delta}^{\Delta} \sum_{b = -\Delta}^{\Delta} [\mathbf{V}]_{a, b} [\mathbf{X}]_{i+a, j+b}.\]

这将参数数量从 \(4 \times 10^6\) 减少到 \(4 \Delta^2\),其中 \(\Delta\) 通常小于 \(10\)。因此,我们将参数数量又减少了四个数量级。请注意,(7.1.3) 简而言之,就是一个所谓的卷积层卷积神经网络(CNNs)是包含卷积层的特殊神经网络家族。在深度学习研究社区中,\(\mathbf{V}\) 被称为卷积核滤波器,或者简称层的权重,它们是可学习的参数。

虽然以前我们可能需要数十亿个参数来表示图像处理网络中的一个单层,但现在我们通常只需要几百个,而且不改变输入或隐藏表示的维度。为这种参数的大幅减少所付出的代价是,我们的特征现在是平移不变的,并且我们的层在确定每个隐藏激活值时只能包含局部信息。所有的学习都依赖于施加归纳偏置。当这种偏置与现实相符时,我们得到样本高效的模型,能够很好地泛化到未见过的数据。但当然,如果这些偏置与现实不符,例如,如果图像结果不是平移不变的,我们的模型甚至可能难以拟合我们的训练数据。

参数的急剧减少使我们达到了最后一个期望,即更深的层应该表示图像更大、更复杂的方面。这可以通过重复地交织非线性和卷积层来实现。

7.1.3. 卷积

让我们简要回顾一下为什么 (7.1.3) 被称为卷积。在数学中,两个函数 (Rudin, 1973)(比如 \(f, g: \mathbb{R}^d \to \mathbb{R}\))之间的卷积定义为

(7.1.4)\[(f * g)(\mathbf{x}) = \int f(\mathbf{z}) g(\mathbf{x}-\mathbf{z}) d\mathbf{z}.\]

也就是说,我们测量 \(f\)\(g\) 在一个函数被“翻转”并平移 \(\mathbf{x}\) 时的重叠部分。当我们处理离散对象时,积分就变成了求和。例如,对于来自平方可和无限维向量集合(索引范围为 \(\mathbb{Z}\))的向量,我们得到以下定义

(7.1.5)\[(f * g)(i) = \sum_a f(a) g(i-a).\]

对于二维张量,我们有相应的求和,其中 \(f\) 的索引为 \((a, b)\)\(g\) 的索引为 \((i-a, j-b)\)

(7.1.6)\[(f * g)(i, j) = \sum_a\sum_b f(a, b) g(i-a, j-b).\]

这看起来与 (7.1.3) 相似,但有一个主要区别。我们使用的是差值而不是 \((i+a, j+b)\)。不过请注意,这种区别主要是形式上的,因为我们总可以在 (7.1.3)(7.1.6) 之间匹配符号。我们在 (7.1.3) 中的原始定义更准确地描述了互相关。我们将在下一节中回到这个问题。

7.1.4. 通道

回到我们的威利检测器,让我们看看这是什么样子的。卷积层选择给定大小的窗口,并根据滤波器 \(\mathsf{V}\) 对强度进行加权,如 图 7.1.2 所示。我们的目标可能是学习一个模型,使得无论“威利度”最高的地方,我们都应该在隐藏层表示中找到一个峰值。

../_images/waldo-mask.jpg

图 7.1.2 检测威利(图片由 William Murphy (Infomatique) 提供)。

这种方法只有一个问题。到目前为止,我们一直幸福地忽略了图像是由三个通道组成的:红、绿、蓝。总而言之,图像不是二维物体,而是三阶张量,由高度、宽度和通道来表征,例如,形状为 \(1024 \times 1024 \times 3\) 像素。虽然前两个轴涉及空间关系,但第三个轴可以看作是为每个像素位置分配一个多维表示。因此,我们将 \(\mathsf{X}\) 索引为 \([\mathsf{X}]_{i, j, k}\)。卷积滤波器必须相应地调整。我们现在有 \([\mathsf{V}]_{a,b,c}\),而不是 \([\mathbf{V}]_{a,b}\)

此外,就像我们的输入由三阶张量组成一样,将我们的隐藏表示也构造成三阶张量 \(\mathsf{H}\) 也是一个好主意。换句话说,我们不仅希望每个空间位置对应一个单一的隐藏表示,我们还希望每个空间位置对应一个完整的隐藏表示向量。我们可以将隐藏表示看作是由多个二维网格堆叠在一起组成的。与输入一样,这些有时被称为通道。它们有时也被称为特征图,因为每个特征图都为后续层提供了一组空间化的学习特征。直观地,你可以想象在靠近输入的较低层,一些通道可能专门用于识别边缘,而另一些则可能识别纹理。

为了支持输入(\(\mathsf{X}\))和隐藏表示(\(\mathsf{H}\))中的多个通道,我们可以在 \(\mathsf{V}\) 中添加第四个坐标:\([\mathsf{V}]_{a, b, c, d}\)。把所有东西放在一起,我们得到

(7.1.7)\[[\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},\]

其中 \(d\) 索引隐藏表示 \(\mathsf{H}\) 中的输出通道。后续的卷积层将接收一个三阶张量 \(\mathsf{H}\) 作为输入。我们采用 (7.1.7) 作为多通道卷积层的定义,因为它具有通用性,其中 \(\mathsf{V}\) 是该层的核或滤波器。

我们还有许多操作需要处理。例如,我们需要弄清楚如何将所有的隐藏表示组合成一个单一的输出,例如,图像中任何地方是否有威利。我们还需要决定如何高效地进行计算,如何组合多个层,选择合适的激活函数,以及如何做出合理的设计选择以产生在实践中有效的网络。我们将在本章的其余部分讨论这些问题。

7.1.5. 总结与讨论

在本节中,我们从第一性原理推导出了卷积神经网络的结构。虽然不清楚这是否是发明CNNs的路径,但知道当将合理的原则应用于图像处理和计算机视觉算法应如何操作时,至少在较低层面上,它们是正确的选择,这是令人满意的。特别是,图像中的平移不变性意味着图像的所有块都将以相同的方式处理。局部性意味着只使用一小部分像素邻域来计算相应的隐藏表示。最早提及CNNs的参考文献之一是新认知机(Neocognitron) (Fukushima, 1982)

我们在推理中遇到的第二个原则是如何在不限制函数类别表达能力的情况下减少参数数量,至少,当模型上的某些假设成立时。我们看到了由于这种限制而带来的复杂性的急剧降低,将计算上和统计上不可行的问题转变为可处理的模型。

添加通道使我们能够带回一些因局部性和平移不变性对卷积核施加限制而丢失的复杂性。请注意,添加除红、绿、蓝之外的通道是很自然的。许多卫星图像,特别是用于农业和气象学的图像,有几十到几百个通道,生成高光谱图像。它们报告了许多不同波长的数据。在下文中,我们将看到如何有效地使用卷积来操作它们所操作的图像的维度,如何从基于位置的表示转向基于通道的表示,以及如何有效地处理大量类别。

7.1.6. 练习

  1. 假设卷积核的大小为 \(\Delta = 0\)。证明在这种情况下,卷积核为每组通道独立地实现了一个多层感知机。这引出了网络中的网络(Network in Network)架构 (Lin et al., 2013)

  2. 音频数据通常表示为一维序列。

    1. 你可能在什么时候希望对音频施加局部性和平移不变性?

    2. 推导音频的卷积操作。

    3. 你能用与计算机视觉相同的工具来处理音频吗?提示:使用频谱图。

  3. 为什么平移不变性最终可能不是一个好主意?举一个例子。

  4. 你认为卷积层也可能适用于文本数据吗?你可能会在语言上遇到哪些问题?

  5. 当一个物体位于图像边界时,卷积会发生什么?

  6. 证明卷积是对称的,即 \(f * g = g * f\)

讨论