《deep learning》读书笔记9——卷积神经网络

定义

卷积是一种特殊的线性运算。
卷积网络是指那些至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。

什么是卷积运算

假设我们正在用激光传感器追踪一艘宇宙飞船的位置。我们的激光传感器给出一个单独的输出 x(t),表示宇宙飞船在时刻 t 的位置。x 和 t 都是实值的,这意味着我们可以在任意时刻从传感器中读出飞船的位置。

现在假设我们的传感器含有噪声。为了得到飞船位置的低噪声估计,我们对得到的测量结果进行平均。显然,时间上越近的测量结果越相关,所以我们采用一种加权平均的方法,对于最近的测量结果赋予更高的权值。我们可以采用一个加权函数 w(a) 来实现,其中 a 表示测量结果距当前时刻的时间间隔。如果我们对任意时刻都采用这种加权平均的操作,就得到了对于飞船位置的连续估计函数 s:
《deep learning》读书笔记9——卷积神经网络
这种运算就叫做卷积 (convolution)。卷积运算通常用星号表示:
《deep learning》读书笔记9——卷积神经网络
在我们的例子中,w 必须是一个有效的概率密度函数,否则输出就不再是一个加权均。另外,w 在参数为负值时必须为 0,否则它会涉及到未来,这不是我们能够做到的。但这些限制仅仅是对我们这个例子来说。通常,卷积被定义在满足上述积分式的任意函数上,并且也可能被用于加权平均以外的目的。

在卷积神经网络的术语中,第一个参数(在这个例子中,函数 x)叫做输 入(input),第二个参数(函数 w)叫做核函数 (kernel function)。输出有时被称作特征映射 (feature map)

在机器学习的应用中,输入通常是高维数据数组,而核也是由算法产生的高维参数组。我们把这种高维数组叫做张量。因为输入与核的每一个元素都分开存储,我们经常假设在存储了数据的有限点集以外,这些函数的值都为零。这意味着在实际操作中,我们可以统一地把无限的求和当作对有限个数组元素的求和来用。

最后,我们有时对多个维度进行卷积运算。例如,如果把二维的图像 I 作为输入,我们也相应的需要使用二维的核 K:
《deep learning》读书笔记9——卷积神经网络
卷积是可交换的 (commutative),我们可以等价地写作:
《deep learning》读书笔记9——卷积神经网络

(没懂)↓
通常,下面的公式在机器学习库中更方便应用,因为它在 m 和 n 的有效范围内变化更少。
卷积运算可交换性的出现是因为我们相对输入翻转 (flip) 了核,这意味着当 m增大时,输入的索引增大,但核的索引相应的减小。翻转核的唯一目的就是为了得到可交换性。尽管可交换性在证明时很有用,但在神经网络的应用中却不是一个重要的性质。与之不同的是,许多神经网络库会实现一个相关的函数,称为互相关函数 (cross-correlation),和卷积运算几乎一样但是并不翻转核:
《deep learning》读书笔记9——卷积神经网络
**

许多机器学习的库使用互相关函数但是叫它卷积。在这本书中我们遵循把两种运算都叫做卷积的这个传统,只有在用到核的翻转时才会在上下文中特别指明区别。在机器学习中,学习算法会在核合适的位置学得恰当的值,所以一个基于核翻转的卷积运算的学习算法所学得的核,是对未进行翻转的算法学得的核的翻转。单独使用卷积运算在机器学习中是很少见的,卷积经常和其他的函数一起使用,无论卷积运算是否翻转了它的核,这些函数的组合通常是不可交换的。

下面是一个 2 维卷积的例子(核没有翻转)。我们限制只对核完全处在图像中的位置输出,在一些上下文中称为 “有效’’ 卷积。我们用画有箭头的盒子来说明输出张量的左上角元素是如何通过对输入张量相应的左上角区域使用核进行卷积得到的。

《deep learning》读书笔记9——卷积神经网络
积对应着一个双重块循环矩阵 (doubly block circulant matrix)。除了这些元素相等的限制以外,卷积通常对应着一个非常稀疏的矩阵(几乎所有的元素都为零)。这是因为核通常要远小于输入的图像。任何一个使用矩阵乘法但是并不依赖矩阵结构的特殊性质的神经网络算法,都适用于卷积运算,并且不需要对神经网络做出大的修改。典型的卷积神经网络为了更有效地处理大规模输入,确实使用了一些专门化的技巧,但这些在理论分析方面并不是严格必要的。

在神经网络中使用卷积运算的动机

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

传统的神经网络使用矩阵乘法来建立输入与输出的连接关系。其中,参数矩阵的每一个独立的参数都描述了每一个输入单元与每一个输出单元间的交互。这意味着每一个输出单元与每一个输入单元都产生交互。然而,卷积神经网络具 有稀疏交互 (sparse interactions)(也叫做稀疏连接 (sparse connectivity) 或者稀疏权重 (sparse weights))的特征。这通过使得核的规模远小于输入的规模来实现。举个例子,当进行图像处理时,输入的图像可能包含百万个像素点,但是我们可以通过只占用几十到上百个像素点的核来探测一些小的有意义的特征,例如图像的边缘。这意味着我们需要存储的参数更少,不仅减少了模型的存储需求,而且提高了它的统计效率。这也意味着为了得到输出我们只需要更少的计算量。这些效率上的提高往往是很显著的。如果有 m 个输入和 n 个输出,那么矩阵乘法需要 m × n 个参数并且相应算法的时间复杂度为 O(m × n)(对于每一个例子)。如果我们限制每一个输出拥有的连接数为 k,那么稀疏的连接方法只需要 k × n 个参数以及 O(k × n) 的运行时间。在很多应用方面,只需保持 k 的数量级远小于 m,就能在机器学习的任务中取得好的表现。

《deep learning》读书笔记9——卷积神经网络
《deep learning》读书笔记9——卷积神经网络在深度卷积网络中,处在深层的单元可能不直接地与绝大部分输入连接。
《deep learning》读书笔记9——卷积神经网络这允许网络可以通过只描述稀疏交互的基石来高效地描述多个变量的复杂交互。

参数共享 (parameter sharing) 是指在一个模型的多个函数中使用相同的参数。在传统的神经网络中,当计算一层的输出时,权值矩阵的每一个元素只使用一次,当它乘以输入的一个元素后就再也不会用到了。作为参数共享的同义词,我们可以说一个网络含有绑定的权值 (tied weights),因为用于一个输入的权值也会被绑定在其他的权值上。在卷积神经网络中,核的每一个元素都作用在输入的每一位置上(除了一些可能的边界像素,取决于对于边界的决策设计)。卷积运算中的参数共享保证了我们只需要学习一个参数集合,而不是对于每一位置都需要学习一个单独的参数集合。这虽然没有改变前向传播的时间(仍然是 O(k × n)),但它显著地把模型的存储需求降低至 k 个参数,并且 k 通常是远小于 m 的数量级。因为 m 和 n 通常规模很接近,k 在实际中相对于 m × n 是很小的。因此,卷积在存储需求和统计效率方面极大地优于稠密矩阵的乘法运算。

参数共享的实现↓,没看懂
《deep learning》读书笔记9——卷积神经网络

作为前两条原则的一个实际例子,图9.6说明了稀疏连接和参数共享是如何显著地提高用于图像边缘检测的线性函数的效率的。
《deep learning》读书笔记9——卷积神经网络
对于卷积,参数共享的特殊形式使得神经网络层具有对平移等变 (equivariance)的性质。如果一个函数满足输入改变,输出也以同样的方式改变这一性质,我们就说它是等变 (equivariant) 的。特别地,如果函数 f(x) 与 g(x) 满足 f(g(x)) = g(f(x)),我们就说 f(x) 对于变换 g 具有等变性。对于卷积来说,如果令 g 是输入的任意平移函数,那么卷积函数对于 g 具有等变性。

举个例子,令 I 表示图像的明亮度函数(取值为整数),g 表示图像函数的变换函数(把一个图像函数映射到另一个图像函数的函数)使得 I′ = g(I),其中 I′(x, y) = I(x 1, y)。这个函数把 I 中的每个像素向右移动一格。如果我们先对 I 进行这种变换然后进行卷积操作所得到的结果,与先对 I 进行卷积然后再对输出使用平移函数 g 得到的结果是一样的。当处理时间序列数据时,卷积产生一条用来表明输入中出现不同特征的某种时间轴。如果我们把输入中的一个事件向后延时,在输出中也会有完全相同的表示,只是时间延时了。图像与之类似,卷积产生了一个 2 维映射来表明某种属性在输入的什么位置出现了。如果我们移动输入中的对象,它的表示也会在输出中移动同样的量。当处理多个输
入位置时,一些作用在邻居像素的函数是很有用的。例如在处理图像时,在卷积神经网络的第一层进行图像的边缘检测是很有用的相同的边缘或多或少地散落在图
像的各处,所以应当对整个图像进行参数共享
。**但在某些情况下,我们并不希望对
整幅图进行参数共享。**例如当我们在处理人脸图像(图像已经被剪裁成人脸在中心)
时,我们可能会希望在不同的部位探测出不同的特征(处理人脸上部的网络需要去
搜寻眉毛,处理人脸下部的网络就需要去搜寻下巴了)。卷积对其他的一些变换并不是天然等变的,例如对于图像尺度或者角度的变换,需要其他的一些机制来处理这些变换。最后,一些不能被传统的由(固定大小的)矩阵乘法定义的神经网络处理的特殊数据,可能通过卷积神经网络来处理。

几乎所有的卷积神经网络都会用到的操作池化

卷积神经网络的卷积层通常包含三级(如图9.7所示)。在第一级中,卷积层并行地进行多个卷积运算来产生一组线性**函数。在第二级中,非线性的**函数如整流线性单元函数等作用在第一级中的每一个线性输出上。这一级有时也被称为探测级 (detector stage)。在第三级中,我们使用池化函数 (pooling function) 来更进一步地调整卷积层的输出。
《deep learning》读书笔记9——卷积神经网络池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。例如,最大池化 (max pooling) 函数 (Zhou and Chellappa, 1988) 给出相邻矩形区域内的最大值。其他常用的池化函数包括相邻矩形区域内的平均值、L2 范数以及依靠据中心像素距离的加权平均函数。

不管采用什么样的池化函数,当输入作出少量平移时,池化能帮助我们的表示近似不变 (invariant)。对于平移的不变性是说当我们把输入平移一微小的量,大多数通过池化函数的输出值并不会发生改变。

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

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

因为池化综合了全部邻居的反馈,这使得池化单元少于探测单元成为可能,我们可以通过综合池化区域的 k 个像素的统计特征而不是单个像素来实现。
《deep learning》读书笔记9——卷积神经网络
在很多任务中,池化对于处理不同大小的输入具有重要作用。例如我们想对不同大小的图像进行分类时,分类层的输入必须是固定的大小,而这通常通过调整池 化区域的偏置大小来实现,这样分类层总是能接收到相同数量的统计特征而不管最初的输入大小了。例如,最终的池化层可能会输出四组综合统计特征,每组对应着图像的一个象限,而与图像的大小无关。

一些理论工作对于在不同情况下应当使用哪种池化函数给出了一些指导。动态地把特征池化在一起也是可行的,例如,通过针对特定属性的位置运行聚类算法,这种方法对于每幅图像产生一个不同的池化区域集合。另一种方法是先学习一个单独的池化结构,再应用到全部的图像中。

池化可能会使得一些利用自顶向下信息的神经网络结构变得复杂,例如玻尔兹曼机和自编码器。

《deep learning》读书笔记9——卷积神经网络
上图是卷积网络用于分类的架构示例。本图中使用的具体步幅和深度并不适合实际使用;它们被设计得非常浅以适合页面。实际的卷积网络也常常涉及大量的分支,不同于这里为简单起见所使用的链式结构。(左) 处理固定大小的图像的卷积网络。在卷积层和池化层几层交替之后,卷积特征映射的张量被重新整形以展平空间维度。网络的其余部分是一个普通的前馈网络分类器,如第六章所述。(中) 处理大小可变的图像的卷积网络,但仍保持全连接的部分。该网络使用具有可变大小但是数量固定的池的池化操作,以便向网络的全连接部分提供 576 个单位的固定大小的向量。(右) 没有任何全连接权重层的卷积网络。相反,最后的卷积层为每个类输出一个特征映射。该模型可能学习每个类在每个空间位置出现的可能性的映射。将特征映射进行平均得到的单个值,提供了顶部 softmaxDRAFT 分类器的变量。

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

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

先验被认为是强或者弱取决于先验中概率密度的集中程度。弱先验具有较高的熵值,例如方差很大的高斯分布,这样的先验允许数据对于参数的改变具有或多或少的*性强先验具有较低的熵值,例如方差很小的高斯分布,这样的先验在决定参数最终取值时起着更加积极的作用

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

当然,把卷积神经网络当作一个具有无限强先验的全连接网络来实现会导致极大的计算浪费。但把卷积神经网络想成具有无限强先验的全连接网络可以帮助我们更好地洞察卷积神经网络是如何工作的。

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

另一个关键洞察是当我们比较卷积模型的统计学习表现时,只能以基准中的其他卷积模型作为比较的对象。其他不使用卷积的模型即使我们把图像中的所有像素点都置换后依然有可能进行学习。对于许多图像数据集,还有一些分别的基准,有些是针对那些具有置换不变性 (permutation invariant) 并且必须通过学习发现拓扑结构的模型,还有一些是针对设计者将空间关系的知识通过硬编码给了它们的模型。

神经网络实践中用得比较多的几种卷积函数的变体

如何在多种不同维数的数据上使用卷积运算

使得卷积运算更加高效的一些方法