CNN 卷积神经网络(上):卷积与池化

卷积与池化是一种无限强的先验

Posted by Xiaosheng on May 19, 2017

本文内容摘取自 《Deep Learning》,部分内容有修改。

卷积网络(convolutional network),也叫做卷积神经网络(con-volutional neural network, CNN),是一种专门用来处理具有类似网格结构数据的神经网络。例如时间序列数据(可以认为是在时间轴上有规律地采样形成的一维网格)和图像数据(可以看作是二维的像素网格)。卷积网络在诸多应用领域都表现优异。

“卷积神经网络”一词表明该网络使用了卷积(convolution)这种数学运算。卷积是一种特殊的线性运算。卷积网络是指那些至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。

1. 卷积运算

卷积是什么

卷积是对两个实变函数的一种数学运算,下面以一个例子进行说明。

假设我们使用激光传感器定位一艘飞船的位置,传感器可以输出飞船在时刻 $t$ 的位置 $x(t)$($x$ 和 $t$ 都是实值)。现在假设传感器受到一定程度的噪声干扰,为了得到飞船位置的低噪声估计,我们需要对得到的测量结果进行平均。显然,时间上越近的测量结果越相关,所以我们采用一种加权平均的方法,对于最近的测量结果赋予更高的权重。我们可以采用一个加权函数 $w(a)$ 来实现,其中 $a$ 表示测量结果距当前时刻的时间间隔。如果我们对任意时刻都采用这种加权平均的操作,就得到了一个新的对于飞船位置的平滑估计函数 $s$:

这种运算就叫做卷积(convolution),卷积运算通常用星号表示:

对我们这个例子来说,$w$ 必须是一个有效的概率密度函数,并且在参数为负值时,$w$ 的取值必须为 $0$,否则它会预测到未来。但这些限制仅仅是对我们这个例子来说。通常,卷积被定义在满足上述积分式的任意函数上,并且也可能被用于加权平均以外的目的。

在卷积网络的术语中,卷积的第一个参数(函数 $x$)通常叫做输入(input),第二个参数(函数 $w$)叫做核函数(kernel function),输出被称作特征映射(feature map)

一般我们在处理数据时,时间会被离散化,即传感器会定期地反馈数据。这样,时刻 $t$ 只能取整数值。假设 $x$ 和 $w$ 都定义在整数时刻 $t$ 上,就可以定义离散形式的卷积:

机器学习中的卷积

在机器学习的应用中,输入通常是多维数组的数据,而核通常是由学习算法优化得到的多维数组的参数。我们通常假设在存储了数值的有限点集以外,卷积函数的值都为零,因而我们可以通过对有限个数组元素的求和来计算卷积。卷积运算通常会在多个维度上进行,例如,如果把一张二维的图像 $I$ 作为输入,我们也许也想要使用一个二维的核 $K$:

卷积是可交换的(commutative),我们可以等价地写作:

卷积运算的可交换性是因为我们将核相对输入进行了翻转(flip),从 $m$ 增大的角度来看,输入的索引在增大,但是核的索引在减小。我们将核翻转的唯一目是实现可交换性。尽管可交换性在证明时很有用,但在神经网络的应用中却不是一个重要的性质。与之不同的是,许多神经网络库会实现一个相关的函数,称为互相关函数(cross-correlation),和卷积运算几乎一样但是并没有对核进行翻转:

许多机器学习的库实现的是互相关函数但是称之为卷积,传统上把这两种运算都叫做卷积。

一个基于核翻转的卷积运算的学习算法所学得的核,是对未进行翻转的算法学得的核的翻转。单独使用卷积运算在机器学习中是很少见的,卷积经常与其他的函数一起使用,无论卷积运算是否对它的核进行了翻转,这些函数的组合通常是不可交换的。

1

上图演示了一个在 $2$ 维数据上的卷积运算(没有对核进行翻转)的例子。我们限制只对核完全处在图像中的位置进行输出,这通常被称为有效(valid)卷积。我们用画有箭头的方框来说明输出的左上角元素是如何通过对输入相应的左上角区域应用核进行卷积得到的。

离散卷积可以看作矩阵的乘法,然而,这个矩阵的一些元素被限制为必须和另外一些元素相等。例如对于单变量的离散卷积,矩阵每一行中的元素都与上一行对应位置平移一个单位的元素相同。这种矩阵叫做 Toeplitz 矩阵(Toeplitz matrix)。对于二维情况,卷积对应着一个双重分块循环矩阵(doubly block circulant matrix)

除了这些元素相等的限制以外,卷积通常对应着一个非常稀疏的矩阵(一个几乎所有元素都为零的矩阵)。这是因为核的大小通常要远小于输入图像的大小。

任何一个使用矩阵乘法但是并不依赖矩阵结构的特殊性质的神经网络算法,都适用于卷积运算,并且不需要对神经网络做出大的修改。

2. 卷积的动机

卷积运算通过三个重要的思想来帮助改进机器学习系统: 稀疏交互(sparse interactions)参数共享(parameter sharing)等变表示(equivariant representa-tions)。另外,卷积提供了一种处理大小可变的输入的方法。我们下面依次介绍这些思想。

稀疏交互

传统的神经网络使用矩阵乘法来建立输入与输出的连接关系,每一个输出单元与每一个输入单元都产生交互。然而,卷积网络具有稀疏交互(sparse interactions)的特征,这是通过使核的大小远小于输入的大小来达到的。

举个例子,一张图像的输入可能包含成千上万个像素点,但是我们可以通过只占用几十到上百个像素点的核来检测一些小的有意义的特征,例如图像的边缘。这意味着我们需要存储的参数更少,不仅减少了模型的存储需求,而且提高了它的统计效率。这也意味着为了得到输出我们只需要更少的计算量。

注:稀疏交互(sparse interactions),也被叫做稀疏连接(sparse connectivity)或者稀疏权重(sparse weights)。

如果有 $m$ 个输入和 $n$ 个输出,那么矩阵乘法需要 $m\times n$ 个参数并且相应算法的时间复杂度为 $O(m\times n)$。如果我们限制每一个输出拥有的连接数为 $k$,那么稀疏的连接方法只需要 $k\times n$ 个参数以及 $O(k\times n)$ 的运行时间。在实际应用中,只需保持 $k$ 比 $m$ 小几个数量级,就能在机器学习的任务中取得好的表现。

2

稀疏连接的图形化解释如上图所示。当 $s$ 是由核宽度为 $3$ 的卷积产生时,只有三个输出受到 $x$ 的影响。当 s 是由矩阵乘法产生时,连接不再稀疏,所有的输出都会受到 $x_3$ 的影响。同样地,当 $s$ 由卷积产生时,每个输出只受到三个输入的影响,而连接不再稀疏时,每个输出都会受到所有输入的影响。

在深度卷积网络中,处在网络深层的单元可能与绝大部分输入是间接交互的,如下图所示。这允许网络可以通过只描述稀疏交互的基石来高效地描述多个变量的复杂交互。

3

参数共享

参数共享(parameter sharing)是指在一个模型的多个函数中使用相同的参数。 在传统的神经网络中,当计算一层的输出时,权重矩阵的每一个元素只使用一次。而在卷积神经网络中,核的每一个元素都作用在输入的每一位置上(是否考虑边界像素取决于对边界决策的设计)。卷积运算中的参数共享保证了我们只需要学习一个参数集合,而不是对于每一位置都需要学习一个单独的参数集合。

这虽然没有改变前向传播的运行时间(仍然是 $O(k\times n)$),但它显著地把模型的存储需求降低至 $k$ 个参数,并且 $k$ 通常要比 $m$ 小很多个数量级。因为 $m$ 和 $n$ 通常有着大致相同的大小,$k$ 在实际中相对于 $m\times n$ 是很小的。因此,卷积在存储需求和统计效率方面极大地优于稠密矩阵的乘法运算。

下图演示了参数共享是如何实现的(黑色箭头表示在两个不同的模型中使用了特殊参数的连接):

4

(上)黑色箭头表示在卷积模型中对 3 元素核的中间元素的使用。因为参数共享,这个单独的参数被用于所有的输入位置。(下)这个单独的黑色箭头表示在全连接模型中对权重矩阵的中间元素的使用。这个模型没有使用参数共享,所以参数只使用了一次。

当处理多个输入位置时,一些作用在邻居像素的函数是很有用的。例如在处理图像时,在卷积网络的第一层进行图像的边缘检测是很有用的。 相同的边缘或多或少地散落在图像的各处,所以应当对整个图像进行参数共享。但在某些情况下,我们并不希望对整幅图进行参数共享。例如,在处理已经通过剪裁而使其居中的人脸图像时,我们可能想要提取不同位置上的不同特征(处理人脸上部的部分网络需要去搜寻眉毛,处理人脸下部的部分网络就需要去搜寻下巴了)。

一个例子

作为前两条原则的一个实际例子,下图说明了稀疏连接和参数共享是如何显著提高线性函数在一张图像上进行边缘检测的效率的。右边的图像是通过先获得原始图像中的每个像素,然后减去左边相邻像素的值而形成的(给出了输入图像中所有垂直方向上的边缘的强度)。两个图像的高度均为 $280$ 个像素。输入图像的宽度为 $320$ 个像素,而输出图像的宽度为 $319$ 个像素。

5

这个变换可以通过包含两个元素的卷积核来描述,使用卷积需要 $319 \times 280 \times 3 = 267, 960$ 次浮点运算(每个输出像素需要两次乘法和一次加法)。为了用矩阵乘法描述相同的变换,需要一个包含 $320 \times 280 \times 319 \times 280$ 个或者说超过 $80$ 亿个元素的矩阵,这使得卷积对于表示这种变换更有效 $40$ 亿倍。直接运行矩阵乘法的算法将执行超过 $160$ 亿次浮点运算,这使得卷积在计算上大约有 $60,000$ 倍的效率。当然,矩阵的大多数元素将为零。如果我们只存储矩阵的非零元,则矩阵乘法和卷积都需要相同数量的浮点运算来计算。矩阵仍然需要包含 $2 \times 319 \times 280 = 178, 640$ 个元素。将小的局部区域上的相同线性变换应用到整个输入上,卷积是描述这种变换的极其有效的方法。

等变表示

对于卷积,参数共享的特殊形式使得神经网络层具有对平移等变(equivariance)的性质。

如果一个函数满足输入改变,输出也以同样的方式改变这一性质,我们就说它是等变(equivariant)的。特别地,如果函数 $f(x)$ 与 $g(x)$ 满足 $f(g(x)) = g(f(x))$, 我们就说 $f(x)$ 对于变换 $g$ 具有等变性。

对于卷积来说,如果令 $g$ 是输入的任意平移函数,那么卷积函数对于 $g$ 具有等变性。

举个例子,令 $I$ 表示图像在整数坐标上的亮度函数,$g$ 表示图像函数的变换函数(把一个图像函数映射到另一个图像函数的函数)使得 $I’ = g(I)$,其中图像函数 $I’$ 满足 $I’(x, y) = I(x − 1, y)$。这个函数把 $I$ 中的每个像素向右移动一个单位。如果我们先对 $I$ 进行这种变换然后进行卷积操作所得到的结果,与先对 $I$ 进行卷积然后再对输出使用平移函数 $g$ 得到的结果是一样的。

当处理时间序列数据时,这意味着通过卷积可以得到一个由输入中出现不同特征的时刻所组成的时间轴。如果我们把输入中的一个事件向后延时,在输出中仍然会有完全相同的表示,只是时间延后了。图像与之类似,卷积产生了一个 $2$ 维映射来表明某些特征在输入中出现的位置。如果我们移动输入中的对象,它的表示也会在输出中移动同样的量。

卷积对其他的一些变换并不是天然等变的,例如对于图像的放缩或者旋转变换, 需要其他的一些机制来处理这些变换。

最后,一些不能被传统的由(固定大小的)矩阵乘法定义的神经网络处理的特殊数据,可能通过卷积神经网络来处理。

3. 池化

池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。 例如,最大池化(max pooling)函数给出相邻矩形区域内的最大值。其他常用的池化函数包括相邻矩形区域内的平均值、$L^2$ 范数以及基于距中心像素距离的加权平均函数。

平移不变性

不管采用什么样的池化函数,当输入作出少量平移时,池化能够使大多数输出不会发生改变,这被称为“平移不变性”。

6

上面的两张图都展示了卷积层中间输出的视图,下面一行显示非线性的输入,上面一行显示最大池化的输出,每个池的宽度为三个像素并且池化区域的步幅为一个像素。两图网络的视图相同,不过对输入右移了一个像素。下面一行的所有值都发生了改变,但上面一行只有一半的值发生了改变,这是因为最大池化单元只对周围的最大值比较敏感,而不是对精确的位置。

局部平移不变性是一个很有用的性质,尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时。例如,当判定一张图像中是否包含人脸时,我们并不需要知道眼睛的精确像素位置,我们只需要知道有一只眼睛在脸的左边,有一只在右边就行了。但在一些其他领域,保存特征的具体位置却很重要。例如当我们想要寻找一个由两条边相交而成的拐角时,我们就需要很好地保存边的位置来判定它们是否相交。

使用池化可以看作是增加了一个无限强的先验:这一层学得的函数必须具有对少量平移的不变性。当这个假设成立时,池化可以极大地提高网络的统计效率。

当我们使用分离的参数学得多个特征,再使用池化单元进行池化,可以学得对输入的某些变换的不变性。下图展示了用三个学得的过滤器和一个最大池化单元可以学得对旋转变换的不变性。

7

这三个过滤器旨在匹配稍微不同方向的 $5$,当输入中出现 $5$ 时,相应的过滤器会匹配它并且在探测单元中引起大的激活。然后,无论哪个探测单元被激活,最大池化单元都具有大的激活。上图中两个不同的输入导致两个不同的探测单元被激活,然而对池化单元的影响大致相同。这个原则在 $\text{maxout}$ 网络和其他卷积网络中更有影响。

空间位置上的最大池化对于平移是天然不变的;这种多通道方法只在学习其他变换时是必要的。

减少单元数量

因为池化综合了全部邻居的反馈,这使得池化单元少于探测单元成为可能,我们可以通过综合池化区域的 $k$ 个像素的统计特征而不是单个像素来实现。下图是一个带有降采样的池化的例子:

8

这里我们使用最大池化,池的宽度为三并且池之间的步幅为二。这使得表示的大小减少了一半,减轻了下一层的计算和统计负担。注意到最右边的池化区域尺寸较小, 但如果我们不想忽略一些探测单元的话就必须包含这个区域。

这种方法提高了网络的计算效率, 因为下一层少了约 $k$ 倍的输入。 当下一层的参数数目是关于那一层输入大小的函数时(例如当下一层是全连接的基于矩阵乘法的网络层时),这种对于输入规模的减小也可以提高统计效率并且减少对 于参数的存储需求。

处理不同大小的输入

在很多任务中,池化对于处理不同大小的输入具有重要作用。例如我们想对不同大小的图像进行分类时,分类层的输入必须是固定的大小,而这通常通过调整池化区域的偏置大小来实现,这样分类层总是能接收到相同数量的统计特征而不管最初的输入大小了。例如,最终的池化层可能会输出四组综合统计特征,每组对应着图像的一个象限,而与图像的大小无关。

4. 卷积与池化作为一种无限强的先验

先验概率分布(prior probability distribution)是一个模型参数的概率分布,它刻画了在我们看到数据之前我们认为什么样的模型是合理的信念。

先验被认为是强或者弱取决于先验中概率密度的集中程度。弱先验具有较高的熵值,允许数据对于参数的改变具有或多或少的自由性。强先验具有较低的熵值,这样的先验在决定参数最终取值时起着更加积极的作用。一个无限强的先验需要对一些参数的概率置零并且完全禁止对这些参数赋值, 无论数据对于这些参数的值给出了多大的支持。

我们可以把卷积网络类比成全连接网络,但对于这个全连接网络的权重有一个无限强的先验:一个隐藏单元的权重必须和它邻居的权重相同,但可以在空间上移动。这个先验也要求除了那些处在隐藏单元的小的空间连续的接受域内的权重以外,其余的权重都为零。总之,我们可以把卷积的使用当作是对网络中一层的参数引入了一个无限强的先验概率分布,这个先验说明了该层应该学得的函数只包含局部连接关系并且对平移具有等变性。类似的,使用池化也是一个无限强的先验:每一个单元都具有对少量平移的不变性。

注意,卷积和池化可能导致欠拟合。与任何其他先验类似,卷积和池化只有当先验的假设合理且正确时才有用。如果一项任务依赖于保存精确的空间信息, 那么在所有的特征上使用池化将会增大训练误差。一些卷积网络结构为了既获得具有较高不变性的特征又获得当平移不变性不合理时不会导致欠拟合的特征,被设计成在一些通道上使用池化而在另一些通道上不使用。当一项任务涉及到要对输入中相隔较远的信息进行合并时,那么卷积所利用的先验可能就不正确了。

本文内容摘取自 《Deep Learning》,部分内容有修改。