chap6 卷积神经网络(1)

本章教材地址, 本章课程视频

在前面的章节中,我们遇到过图像数据。 这种数据的每个样本都由一个二维像素网格组成, 每个像素可能是一个或者多个数值,取决于是黑白还是彩色图像。 到目前为止,我们处理这类结构丰富的数据的方式还不够有效。 我们仅仅通过将图像数据展平成一维向量而忽略了每个图像的空间结构信息,再将数据送入一个全连接的多层感知机中。 因为这些网络特征元素的顺序是不变的,因此最优的结果是利用先验知识,即利用相近像素之间的相互关联性,从图像数据中学习得到有效的模型。

本章介绍的卷积神经网络(convolutional neural network,CNN)是一类强大的、为处理图像数据而设计的神经网络。 基于卷积神经网络结构的模型在计算机视觉领域中已经占主导地位,当今几乎所有的图像识别、对象检测或语义分割相关的学术竞赛和商业应用都以这种方法为基础。

现代卷积神经网络的设计得益于生物学、群论和一系列的补充实验。 卷积神经网络需要的参数少于全连接结构的网络,而且卷积也很容易用 GPU 并行计算。 因此卷积神经网络除了能够高效地采样从而获得精确的模型,还能够高效地计算。 久而久之,从业人员更能多地应用卷积神经网络,即使在通常使用循环神经网络的一维序列结构任务上(例如音频、文本和时间序列分析),卷积神经网络也越来越受欢迎。 通过对卷积神经网络一些巧妙的调整,也使它们在图结构数据和推荐系统中发挥作用。

在本章的开始,我们将介绍构成所有卷积网络主干的基本元素。 这包括卷积层本身、填充(padding)和步幅(stride)的基本细节、用于在相邻区域的汇聚层(pooling)、在每一层中多通道(channel)的使用,以及有关现代卷积网络架构的仔细讨论。 在本章的最后,我们将介绍一个完整的、可运行的LeNet模型:这是第一个成功应用的卷积神经网络,比现代深度学习兴起时间还要早。 在下一章中,我们将深入研究一些流行的、相对较新的卷积神经网络架构的完整实现,这些网络架构涵盖了现代从业者通常使用的大多数经典技术。

从全连接层到卷积

适合于计算机视觉的神经网络结构有以下两个原则:

  1. 平移不变性(translation invariance):不管检测对象出现在图像中的哪个位置,神经网络的前面几层应该对相同的图像区域具有相似的反应,即为“平移不变性”。

    不管目标在图片的什么位置,都不影响目标的识别。

  2. 局部性(locality):神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系,这就是“局部性”原则。最终,在后续神经网络,整个图像级别上可以集成这些局部特征用于预测。

    识别的目标是图的一个部分。

限制多层感知机

首先,多层感知机的输入是二维图像X\mathbf{X},其隐藏表示 H\mathbf{H} 在数学上是一个矩阵,在代码中表示为二维张量。
其中 X\mathbf{X}H\mathbf{H} 具有相同的形状。
为了方便理解,我们可以认为,无论是输入还是隐藏表示都拥有空间结构。

使用 [X]i,j[\mathbf{X}]_{i, j}[H]i,j[\mathbf{H}]_{i, j} 分别表示输入图像和隐藏表示中位置(ii, jj)处的像素。

为了使每个隐藏神经元都能接收到每个输入像素的信息,我们将参数从权重矩阵(如同我们先前在多层感知机中所做的那样)替换为四阶权重张量 W\mathsf{W}。假设 U\mathbf{U} 包含偏置参数,我们可以将全连接层形式化地表示为

[H]i,j=[U]i,j+kl[W]i,j,k,l[X]k,l=[U]i,j+ab[V]i,j,a,b[X]i+a,j+b.\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}

其中,从 W\mathsf{W}V\mathsf{V} 的转换只是形式上的转换,因为在这两个四阶张量的元素之间存在一一对应的关系。我们只需重新索引下标 (k,l)(k, l),使 k=i+ak = i+al=j+bl = j+b, 由此可得 [V]i,j,a,b=[W]i,j,i+a,j+b[\mathsf{V}]_{i, j, a, b} = [\mathsf{W}]_{i, j, i+a, j+b}

索引 aabb 通过在正偏移和负偏移之间移动覆盖了整个图像。

对于隐藏表示中任意给定位置(ii, jj)处的像素值[H]i,j[\mathbf{H}]_{i, j},可以通过在 xx 中以 (i,j)(i, j) 为中心对像素进行加权求和得到,加权使用的权重为 [V]i,j,a,b[\mathsf{V}]_{i, j, a, b}

平移不变性

现在引用上述的第一个原则:平移不变性。
这意味着检测对象在输入 X\mathbf{X} 中的平移,应该仅仅导致隐藏表示 H\mathbf{H} 中的平移。也就是说, V\mathsf{V}U\mathbf{U} 实际上不依赖于 (i,j)(i, j) 的值,即 [V]i,j,a,b=[V]a,b[\mathsf{V}]_{i, j, a, b} = [\mathbf{V}]_{a, b}。并且 U\mathbf{U} 是一个常数,比如 uu。因此,我们可以简化 H\mathbf{H} 定义为:

[H]i,j=u+ab[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}.

这就是 卷积 (convolution)。我们是在使用系数 [V]a,b[\mathbf{V}]_{a, b} 对位置 (i,j)(i, j) 附近的像素 (i+a,j+b)(i+a, j+b) 进行加权得到[H]i,j[\mathbf{H}]_{i, j}

显著的进步:[V]a,b[\mathbf{V}]_{a, b} 的系数比 [V]i,j,a,b[\mathsf{V}]_{i, j, a, b} 少很多,因为前者不再依赖于图像中的位置,进而模型复杂度大大降低。

局部性

现在引用上述的第二个原则:局部性。

  • 评估 [H]i,j[\mathbf{H}]_{i, j} 时,我们不应该用远离 X(i,j)X_{(i, j)} 的参数
  • 解决方案:在 a>Δ|a|> \Deltab>Δ|b| > \Delta 的范围之外,我们可以设置 [V]a,b=0[\mathbf{V}]_{a, b} = 0

因此,我们可以将 [H]i,j[\mathbf{H}]_{i, j} 重写为

[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}.

:eqlabel:eq_conv-layer

简而言之, :eqref:eq_conv-layer 是一个 卷积层 (convolutional layer),而卷积神经网络是包含卷积层的一类特殊的神经网络。

  • 在深度学习研究社区中, V\mathbf{V} 被称为 卷积核 (convolution kernel) 或者 滤波器 (filter),它仅仅是可学习的一个层的权重。
    当图像处理的局部区域很小时,卷积神经网络与多层感知机的训练差异可能是巨大的:以前,多层感知机可能需要数十亿个参数来表示网络中的一层,而现在卷积神经网络通常只需要几百个参数,而且不需要改变输入或隐藏表示的维数。

  • 参数大幅减少的代价:我们的特征现在是平移不变的,并且当确定每个隐藏激活的值时,每一层只能包含局部的信息。

以上所有的权重学习都将依赖于归纳偏置。当这种偏置与现实相符时,我们就能得到样本有效的模型,并且这些模型能很好地泛化到未知数据中。
但如果这偏置与现实不符时,比如当图像不满足平移不变时,我们的模型可能难以拟合我们的训练数据。

总结

  • 对全连接层使用 平移不变性局部性 得到卷积层。

卷积

在进一步讨论之前,我们先简要回顾一下为什么上面的操作被称为卷积。在数学中,两个函数(比如 f,g:RdRf, g: \mathbb{R}^d \to \mathbb{R})之间的“卷积”被定义为

(fg)(x)=f(z)g(xz)dz.(f * g)(\mathbf{x}) = \int f(\mathbf{z}) g(\mathbf{x}-\mathbf{z}) d\mathbf{z}.

也就是说,卷积是测量 ffgg 之间(把其中一个函数“翻转”并移位 x\mathbf{x} 时)的重叠。
当我们有离散对象时,积分就变成求和。例如:对于由索引为Z\mathbb{Z}的、平方可和的、无限维向量集合中抽取的向量,我们得到以下定义:

(fg)(i)=af(a)g(ia).(f * g)(i) = \sum_a f(a) g(i-a).

对于二维张量,则为 ff 的索引 (a,b)(a, b)gg 的索引 (ia,jb)(i-a, j-b) 上的对应和:

(fg)(i,j)=abf(a,b)g(ia,jb).(f * g)(i, j) = \sum_a\sum_b f(a, b) g(i-a, j-b).

:eqlabel:eq_2d-conv-discrete

这看起来类似于 :eqref:eq_conv-layer,但有一个主要区别:这里不是使用 (i+a,j+b)(i+a, j+b) ,而是使用差值。然而,这种区别主要是装饰性的,因为我们总是可以匹配 :eqref:eq_conv-layer 和 :eqref:eq_2d-conv-discrete 之间的符号。