文章目录
定义
卷积是一种特殊的线性运算。
卷积网络是指那些至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。
什么是卷积运算
假设我们正在用激光传感器追踪一艘宇宙飞船的位置。我们的激光传感器给出一个单独的输出 x(t),表示宇宙飞船在时刻 t 的位置。x 和 t 都是实值的,这意味着我们可以在任意时刻从传感器中读出飞船的位置。
现在假设我们的传感器含有噪声。为了得到飞船位置的低噪声估计,我们对得到的测量结果进行平均。显然,时间上越近的测量结果越相关,所以我们采用一种加权平均的方法,对于最近的测量结果赋予更高的权值。我们可以采用一个加权函数 w(a) 来实现,其中 a 表示测量结果距当前时刻的时间间隔。如果我们对任意时刻都采用这种加权平均的操作,就得到了对于飞船位置的连续估计函数 s:
这种运算就叫做卷积 (convolution)。卷积运算通常用星号表示:
在我们的例子中,w 必须是一个有效的概率密度函数,否则输出就不再是一个加权均。另外,w 在参数为负值时必须为 0,否则它会涉及到未来,这不是我们能够做到的。但这些限制仅仅是对我们这个例子来说。通常,卷积被定义在满足上述积分式的任意函数上,并且也可能被用于加权平均以外的目的。
在卷积神经网络的术语中,第一个参数(在这个例子中,函数 x)叫做输 入(input),第二个参数(函数 w)叫做核函数 (kernel function)。输出有时被称作特征映射 (feature map)。
在机器学习的应用中,输入通常是高维数据数组,而核也是由算法产生的高维参数组。我们把这种高维数组叫做张量。因为输入与核的每一个元素都分开存储,我们经常假设在存储了数据的有限点集以外,这些函数的值都为零。这意味着在实际操作中,我们可以统一地把无限的求和当作对有限个数组元素的求和来用。
最后,我们有时对多个维度进行卷积运算。例如,如果把二维的图像 I 作为输入,我们也相应的需要使用二维的核 K:
卷积是可交换的 (commutative),我们可以等价地写作:
(没懂)↓
通常,下面的公式在机器学习库中更方便应用,因为它在 m 和 n 的有效范围内变化更少。
卷积运算可交换性的出现是因为我们相对输入翻转 (flip) 了核,这意味着当 m增大时,输入的索引增大,但核的索引相应的减小。翻转核的唯一目的就是为了得到可交换性。尽管可交换性在证明时很有用,但在神经网络的应用中却不是一个重要的性质。与之不同的是,许多神经网络库会实现一个相关的函数,称为互相关函数 (cross-correlation),和卷积运算几乎一样但是并不翻转核:
**
许多机器学习的库使用互相关函数但是叫它卷积。在这本书中我们遵循把两种运算都叫做卷积的这个传统,只有在用到核的翻转时才会在上下文中特别指明区别。在机器学习中,学习算法会在核合适的位置学得恰当的值,所以一个基于核翻转的卷积运算的学习算法所学得的核,是对未进行翻转的算法学得的核的翻转。单独使用卷积运算在机器学习中是很少见的,卷积经常和其他的函数一起使用,无论卷积运算是否翻转了它的核,这些函数的组合通常是不可交换的。
下面是一个 2 维卷积的例子(核没有翻转)。我们限制只对核完全处在图像中的位置输出,在一些上下文中称为 “有效’’ 卷积。我们用画有箭头的盒子来说明输出张量的左上角元素是如何通过对输入张量相应的左上角区域使用核进行卷积得到的。
积对应着一个双重块循环矩阵 (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,就能在机器学习的任务中取得好的表现。
在深度卷积网络中,处在深层的单元可能不直接地与绝大部分输入连接。
这允许网络可以通过只描述稀疏交互的基石来高效地描述多个变量的复杂交互。
参数共享 (parameter sharing) 是指在一个模型的多个函数中使用相同的参数。在传统的神经网络中,当计算一层的输出时,权值矩阵的每一个元素只使用一次,当它乘以输入的一个元素后就再也不会用到了。作为参数共享的同义词,我们可以说一个网络含有绑定的权值 (tied weights),因为用于一个输入的权值也会被绑定在其他的权值上。在卷积神经网络中,核的每一个元素都作用在输入的每一位置上(除了一些可能的边界像素,取决于对于边界的决策设计)。卷积运算中的参数共享保证了我们只需要学习一个参数集合,而不是对于每一位置都需要学习一个单独的参数集合。这虽然没有改变前向传播的时间(仍然是 O(k × n)),但它显著地把模型的存储需求降低至 k 个参数,并且 k 通常是远小于 m 的数量级。因为 m 和 n 通常规模很接近,k 在实际中相对于 m × n 是很小的。因此,卷积在存储需求和统计效率方面极大地优于稠密矩阵的乘法运算。
参数共享的实现↓,没看懂
作为前两条原则的一个实际例子,图9.6说明了稀疏连接和参数共享是如何显著地提高用于图像边缘检测的线性函数的效率的。
对于卷积,参数共享的特殊形式使得神经网络层具有对平移等变 (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) 来更进一步地调整卷积层的输出。
池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。例如,最大池化 (max pooling) 函数 (Zhou and Chellappa, 1988) 给出相邻矩形区域内的最大值。其他常用的池化函数包括相邻矩形区域内的平均值、L2 范数以及依靠据中心像素距离的加权平均函数。
不管采用什么样的池化函数,当输入作出少量平移时,池化能帮助我们的表示近似不变 (invariant)。对于平移的不变性是说当我们把输入平移一微小的量,大多数通过池化函数的输出值并不会发生改变。
局部平移不变性是一个很重要的性质,尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时。例如,当判定一张图像中是否包含人脸时,我们并不需要知道眼睛的具体像素位置,我们只需要知道有一只眼睛在脸的左边,有一只在右边就行了。但在一些其他领域,保存特征的具体位置却很重要。例如当我们想要寻找一个由两条边相交而成的拐角时,我们就需要很好地保存边的位置来判定它们是否相交。
使用池化可以看作是增加了一个无限强的先验:卷积层学得的函数必须具有对少量平移的不变性。当这个假设成立时,池化可以极大地提高网络的统计效率。
因为池化综合了全部邻居的反馈,这使得池化单元少于探测单元成为可能,我们可以通过综合池化区域的 k 个像素的统计特征而不是单个像素来实现。
在很多任务中,池化对于处理不同大小的输入具有重要作用。例如我们想对不同大小的图像进行分类时,分类层的输入必须是固定的大小,而这通常通过调整池 化区域的偏置大小来实现,这样分类层总是能接收到相同数量的统计特征而不管最初的输入大小了。例如,最终的池化层可能会输出四组综合统计特征,每组对应着图像的一个象限,而与图像的大小无关。
一些理论工作对于在不同情况下应当使用哪种池化函数给出了一些指导。动态地把特征池化在一起也是可行的,例如,通过针对特定属性的位置运行聚类算法,这种方法对于每幅图像产生一个不同的池化区域集合。另一种方法是先学习一个单独的池化结构,再应用到全部的图像中。
池化可能会使得一些利用自顶向下信息的神经网络结构变得复杂,例如玻尔兹曼机和自编码器。
上图是卷积网络用于分类的架构示例。本图中使用的具体步幅和深度并不适合实际使用;它们被设计得非常浅以适合页面。实际的卷积网络也常常涉及大量的分支,不同于这里为简单起见所使用的链式结构。(左) 处理固定大小的图像的卷积网络。在卷积层和池化层几层交替之后,卷积特征映射的张量被重新整形以展平空间维度。网络的其余部分是一个普通的前馈网络分类器,如第六章所述。(中) 处理大小可变的图像的卷积网络,但仍保持全连接的部分。该网络使用具有可变大小但是数量固定的池的池化操作,以便向网络的全连接部分提供 576 个单位的固定大小的向量。(右) 没有任何全连接权重层的卷积网络。相反,最后的卷积层为每个类输出一个特征映射。该模型可能学习每个类在每个空间位置出现的可能性的映射。将特征映射进行平均得到的单个值,提供了顶部 softmaxDRAFT 分类器的变量。
卷积与池化作为一种无限强的先验
先验概率分布 (prior probability distribution) :这是一个模型参数的概率分布,它刻画了在我们看到数据之前我们认为什么样的模型是合理的信念。
先验被认为是强或者弱取决于先验中概率密度的集中程度。弱先验具有较高的熵值,例如方差很大的高斯分布,这样的先验允许数据对于参数的改变具有或多或少的自由性。强先验具有较低的熵值,例如方差很小的高斯分布,这样的先验在决定参数最终取值时起着更加积极的作用。
一个无限强的先验对一些参数的概率置零并且要求禁止对这些参数赋值,无论数据对于这些参数的值给出了多大的支持。我们可以把卷积神经网络想成和全连接网络类似,但对于这个全连接网络的权值有一个无限强的先验。这个无限强的先验是说一个隐藏单元的权值必须和它邻居的权值相等,但在空间中改变。这个先验也要求除了那些处在隐藏单元空间连续的小的接收域以内的权值外,其余的权值都为零。总之,我们可以把卷积的使用当作是对网络中一层的参数引入了一个无限强的先验概率分布。这个先验是说该层应该学得的函数只包含局部连接关系并且对平移具有等变性。类似的,使用池化也是一个无限强的先验:每一个单元都具有对少量平移的不变性。
当然,把卷积神经网络当作一个具有无限强先验的全连接网络来实现会导致极大的计算浪费。但把卷积神经网络想成具有无限强先验的全连接网络可以帮助我们更好地洞察卷积神经网络是如何工作的。
其中一个关键的洞察是卷积和池化可能导致欠拟合。与任何其他先验类似,卷积和池化只有当先验的假设合理且正确时才有用。如果一项任务依赖于保存精确的空间信息,那么在所有的特征上使用池化将会增大训练误差。一些卷积神经网络(Szegedy et al., 2014a) 为了既获得具有较高不变性的特征又获得当平移不变性不合理时不会导致欠拟合的特征,被设计成在一些通道上使用池化而在另一些通道上不使用。当一项任务涉及到要对输入中相隔较远的信息进行合并时,那么卷积所需要的先验可能就不正确了。
另一个关键洞察是当我们比较卷积模型的统计学习表现时,只能以基准中的其他卷积模型作为比较的对象。其他不使用卷积的模型即使我们把图像中的所有像素点都置换后依然有可能进行学习。对于许多图像数据集,还有一些分别的基准,有些是针对那些具有置换不变性 (permutation invariant) 并且必须通过学习发现拓扑结构的模型,还有一些是针对设计者将空间关系的知识通过硬编码给了它们的模型。
神经网络实践中用得比较多的几种卷积函数的变体
当在神经网络的上下文中讨论卷积时,我们通常不是特指数学文献中使用的那种标准的离散卷积运算。实际应用中的函数略微有些不同。这里我们详细讨论一下这些差异,并且对神经网络中用到的函数的一些重要性质进行重点说明。
首先,当我们提到神经网络中的卷积时,我们通常是指一次特定的运算,而这种运算包含了并行地使用多个卷积。这是因为带有单个核的卷积只能提取一种类型的特征,尽管它作用在多个空间位置上。我们通常希望神经网络的一层能够在多个位置提取多种类型的特征。
另外,输入通常也不仅仅是实值的网格,而是由一系列向量值的观测数据构成的网格。例如,一幅彩色图像在每一个像素点都会有红绿蓝三种颜色的亮度。在多层的卷积神经网络中,第二层的输入是第一层的输出,通常在每个位置包含多个卷积的输出。当用于图像时,我们通常把卷积的输入输出都看作是 3 维的张量,其中一个索引用于标明不同的通道(例如红绿蓝),另外两个索引标明在每个通道上的空间坐标。软件实现通常使用批处理模式,所以它们会使用 4 维的张量,第四维索引用于标明批处理中不同的实例,但我们为简明起见这里忽略批处理索引。
因为卷积神经网络通常使用多通道的卷积,它们基于的线性运算并不保证一定是可交换的,即使使用了核翻转也是如此。这些多通道的运算只有当其中的每个运算的输出和输入具有相同的通道数时才是可交换的。
这里对所有的 l,m 和 n 进行求和是对所有(在求和式中)有效的张量索引的值进行求和。在线性代数中,向量的索引通常从1开始,这就是上述公式中-1的由来。但是像 C 或 Python 这类编程语言索引通常从 0 开始,这使得上述公式可以更加简洁。
我们有时会希望跳过核中的一些位置来降低计算的开销(相应的代价是提取特征没有先前那么好了)。我们可以把这一过程看作是对卷积函数输出的下采样(downsampling)。如果我们只想对输出的每个方向上的 s 个像素进行采样,那么我们可以定义一个下采样卷积函数 c 使得
我们把 s 称为下采样卷积的步幅 (stride)。当然也可以对每个移动方向定义不同的步幅。
(上) 在单个操作中实现的步幅为二的卷积。(下)步幅大于一个像素的卷积在数学上等价于单位步幅的卷积随后下采样。显然,涉及下采样的两步法在计算上是浪费的,因为它计算了许多将被丢弃的值。
在任何卷积神经网络的应用中都有一个重要性质,那就是能够隐含地对输入 V用零进行填充 (pad) 使得它加宽。如果没有这个性质,表示的宽度在每一层就会缩减,缩减的幅度是比核少一个像素这么多。对输入进行零填充允许我们对核的宽度和输出的大小进行独立的控制。如果没有零填充,我们就被迫面临二选一的局面,要么选择网络空间宽度的快速缩减,要么选择一个小型的核——这两种情境都会极大得限制网络的表示能力。
有三种零填充设定的情况值得注意。
第一种是无论怎样都不使用零填充的极端情况,并且卷积核只允许访问那些图像中能够完全包含整个核的位置。在 MATLAB中,这称为有效 (valid) 卷积。在这种情况下,输出的所有像素都是输入中相同数量像素的函数,这使得输出像素的表示更加规范。然而,输出的大小在每一层都会缩减。如果输入的图像宽度是 m,核的宽度是 k,那么输出的宽度就会变成 m- k + 1。**如果卷积核非常大的话缩减率会非常显著。因为缩减数大于 0,这限制了网络中能够包含的卷积层的层数。**当层数增加时,网络的空间维度最终会缩减到 1 × 1,这种情况下另外的层就不可能进行有意义的卷积了。
第二种特殊的情况是只进行足够的零填充来保持输出和输入具有相同的大小。在 MATLAB 中,这称为相同 (same) 卷积。在这种情况下,网络能够包含任意多的卷积层,只要硬件可以支持,这是因为卷积运算并没有改变相关的结构。然而,输入像素中靠近边界的部分相比于中间部分对于输出像素的影响更小。这可能会导致边界像素存在一定程度的欠表示。
这使得第三种极端情况产生了,在 MATLAB 中称为全 (full) 卷积。它进行了足够多的零填充使得像素在每个方向上恰好被访问了k次,最终输出图像的宽度为m+k-1次。在这种情况下,输出像素中靠近边界的部分相比于中间部分是更少像素的函数。这将导致学得一个在卷积特征映射的所有位置都表现不错的单核更为困难。通常零填充的最优数量(对于测试集的分类正确率)处于 “有效卷积’’ 和 “相同卷积’’ 之间的某个位置。
在一些情况下,我们并不一定真正想用卷积,而只是用一些局部连接的网络层(LeCun, 1986, 1989)。在这种情况下,我们的多层感知机对应的邻接矩阵是相同的,但每一个连接都有它自己的权重,用一个 6 维的张量 W 来表示。W 的索引分别是:输出的通道 i,输出的行 j 和列 k,输入的通道 l,输入的行偏置 m 和列偏置 n。局部连接层的线性部分可以表示为
这有时也被称为非共享卷积 (unshared convolution),因为它和带有一个小核的离散卷积运算很像,但并不横跨位置来共享参数。
当我们知道每一个特征都是一小部分空间的函数而不是整个空间的特征时,局部连接层是很有用的。例如,如果我们想要辨别一张图片是否是人脸图像时,我们只需要去寻找嘴是否在图像的下部中央部分即可。
使用那些连接被更进一步限制的卷积或者局部连接层也是有用的,例如,限制每一个输出的通道 i 仅仅是输入通道 l 的一部分的函数时。实现这种情况的一种通用方法是使输出的前 m 个通道仅仅连接到输入的前 n 个通道,输出的接下来的 m个通道仅仅连接到输入的接下来的 n 个通道,以此类推。
对少量通道间的连接进行建模允许网络使用更少的参数,这降低了存储的消耗以及提高了统计效率,并且减少了前向和反向传播所需要的计算量。这些目标的实现并没有减少隐藏单元的数目。
拼贴卷积(tiled convolution)对卷积层和局部连接层进行了折衷。这里并不是对每一个空间位置的权重集合进行学习,我们学习一组核使得当我们在空间移动时它们可以循环利用。这意味着在近邻的位置上拥有不同的过滤器,就像局部连接层一样,但是对于这些参数的存储需求仅仅会增长常数倍,这个常数就是核的集合的大小,而不是整个输出的特征映射的大小。
局部连接层与拼贴卷积层都和最大池化有一些有趣的关联:这些层的探测单元都是由不同的过滤器驱动的。如果这些过滤器能够学会探测相同隐含特征的不同变换形式,那么最大池化的单元对于学得的变换就具有不变性(如图9.9所示)。卷积层对于平移具有内置的不变性。
实现卷积神经网络时采用除卷积以外的一些其他运算通常也是必须的。为了实现学习,必须在给定输出的梯度时能够计算核的梯度。在一些简单情况下,这种运算可以通过卷积来实现,但在很多我们感兴趣的情况下,包括步幅大于1 的情况,并不具有这样的性质。
回忆一下卷积是一种线性运算,所以可以表示成矩阵乘法的形式(如果我们首先把输入张量变形为一个扁平的向量)。涉及到的矩阵是卷积核的函数。这个矩阵是稀疏的并且核的每个元素都复制给矩阵的很多个元素。这种观点能够帮助我们导出卷积神经网络需要的很多其他运算。
通过卷积定义的矩阵转置的乘法就是这样一种运算。这种运算用于通过卷积层反向传播误差的导数,所以它在训练多于一个隐藏层的卷积神经网络时是必要的。如果我们想要从隐藏层单元重构可视化单元时,同样的运算也是需要的。重构可视化单元是本书第三部分的模型广泛用到的一种运算,这些模型包括自编码器、RBM和稀疏编码等等。构建这些模型的卷积化的版本都要用到转置化卷积。就像核梯度的运算,这种输入梯度运算在某些情况下可以用卷积来实现,但在一般情况下需要用到第三种运算来实现。必须非常小心地来使这种转置运算和前向传播过程相协调。转置运算返回的输出的大小取决于三个方面:零填充的策略、前向传播运算的步幅和前向传播的输出映射的大小。在一些情况下,不同大小的输入通过前向传播过程能够得到相同大小的输出映射,所以必须明确地告知转置运算原始输入的大小。
这三种运算——卷积、从输出到权重的反向传播和从输出到输入的反向传播——对于训练任意深度的前馈卷积网络,以及训练带有(基于卷积的转置的)重构函数的卷积网络,这三种运算都足以计算它们所需的所有梯度。
一般来说,在卷积层从输入到输出的变换中我们不仅仅只用线性运算。我们一般也会在进行非线性运算前,对每个输出加入一些偏置项。这样就产生了如何在偏置项中共享参数的问题。对于局部连接层,很自然地对每个单元都给定它特有的偏置,对于拼贴卷积,也很自然地用与核一样的拼贴模式来共享参数。对于卷积层来说,通常的做法是在输出的每一个通道上都设置一个偏置,这个偏置在每个卷积映射的所有位置上共享。然而,如果输入是已知的固定大小,也可以在输出映射的每个位置学习一个单独的偏置。分离这些偏置可能会稍稍降低模型的统计效率,但同时也允许模型来校正图像中不同位置的统计差异。例如,当使用隐含的零填充时,图像边缘的探测单元接收到较少的输入,因此需要较大的偏置。
如何在多种不同维数的数据上使用卷积运算
结构化输出
卷积神经网络可以用于输出高维的结构化对象,而不仅仅是预测分类任务的类标签或回归任务的实数值。通常这个对象只是一个张量,由标准卷积层产生。例如,
经常出现的一个问题是输出平面可能比输入平面要小,如图9.13所示。
用于对图像中单个对象分类的常用结构中,网络空间维数的最大减少来源于使用大步幅的池化层。为了产生与输入大小相似的输出映射,我们可以避免把池化放在一起(Jain et al., 2007)。另一种策略是单纯地产生一张低分辨率的标签网格(Pinheiro and Collobert, 2014, 2015)。最后,原则上可以使用具有单位步幅的池化操作。
对图像逐个像素标记的一种策略是先产生图像标签的原始猜测,然后使用相邻像素之间的交互来修正该原始猜测。重复这个修正步骤数次对应于在每一步使用相同的卷积,该卷积在深层网络的最后几层之间共享权重(Jain et al., 2007)。这使得在层之间共享参数的连续的卷积层所执行的一系列运算,形成了一种特殊的循环神经网络(Pinheiro and Collobert, 2014, 2015)。图9.17给出了这样一个循环卷积网络的结构。
一旦对每个像素都进行了预测,可以使用各种方法来进一步处理这些预测,以便获得图像在区域上的分割(Briggman et al., 2009; Turaga et al., 2010; Farabet et al.,
2013)。一般的想法是假设大片相连的像素倾向于对应着相同的标签。图模型可以描
述相邻像素间的概率关系。或者,卷积网络可以被训练来最大化地近似图模型的训练目标(Ning et al., 2005; Thompson et al., 2014)。
数据类型
卷积神经网络使用的数据通常包含多个通道,每个通道是时间或空间中某一点的不同观测量。参见表9.1来了解具有不同维数和通道数的数据类型的例子。
到目前为止,我们仅讨论了训练和测试数据中的每个样例都有相同的空间维度的情况。卷积网络的一个优点是它们还可以处理具有变化的空间尺度的输入。这些类型的输入不能用传统的基于矩阵乘法的神经网络来表示。这提供了使用卷积网络的令人信服的理由,即使当计算成本和过拟合也不是主要问题时。
例如,考虑一组图像的集合,其中每个图像具有不同的高度和宽度。目前还不清楚如何用固定大小的权重矩阵对这样的输入进行建模。卷积就可以很直观的应用核依据输入的大小简单地被使用不同次,并且卷积运算的输出也相应地放缩。卷积可以被视为矩阵乘法,相同的卷积核为每种大小的输入引入了一个不同大小的双重块循环矩阵。有时,网络的输出允许和输入一样具有可变的大小,例如如果我们想要为输入的每个像素分配一个类标签。在这种情况下,不需要进一步的设计工作。在其他情况下,网络必须产生一些固定大小的输出,例如,如果我们想要为整个图像指定单个类标签。在这种情况下,我们必须进行一些额外的设计步骤,例如插入一个池化层,池化区域的大小要与输入的大小成比例,以便保持固定数量的池化输出。这种策略的一些例子可以参见图9.11。
注意,使用卷积处理可变尺寸的输入仅对具有尺寸可变的输入才有意义,因为它们包含对相同种类的事物的不同量的观察——时间上不同长度的记录,空间上不同宽度的观察等。如果输入具有可变尺寸,卷积是没有意义的,因为它可以选择性地包括不同种类的观察。例如,如果我们正在处理大学申请,并且我们的特征包括成绩和标准化测试分数,但不是每个申请人都进行了标准化测试,则使用相同的权重来对成绩特征和测试分数特征进行卷积是没有意义的。
使得卷积运算更加高效的一些方法
卷积等效于使用 Fourier变换将输入与核都转换到频域,执行两个信号的逐点相乘,并使用 Fourier逆变换转换回时域。对予某些问题大小,这可能比离散型卷积的朴素实现更快。
设计更快的执行卷积或近似卷积,而不损害模型准确性的方法,是一个活跃的研究领域。甚至仅提高前向传播效率的技术也是有用的,因为在商业环境中,通常部署网络比训练网络还要耗资源。
随机或无监督的特征
通常,卷积网络训练中最昂贵的部分是学习特征。输出层通常相对便宜,因为在通过若干层池化之后作为该层输入的特征的数量较少。当使用梯度下降执行有监督训练时,每个梯度步骤需要完整的运行前向传播和反向传播通过整个网络。减少卷积网络训练成本的一种方式是使用那些不是通过有监督方式训练的特征。
有三种基本策略不通过有监督训练而得到卷积核。其中一个是简单地随机初始化它们。另一个是手动设计它们,例如设置每个核在一个特定的方向或尺度来检测边缘。最后,可以使用无监督的标准来学习核。例如,Coates et al. (2011) 将k均值聚类算法应用于小图像块,然后使用每个学得的中心作为卷积核。第三部分描述了更多的无监督学习方法。使用无监督标准学习特征,允许它们的确定与位于网络结构顶层的分类层相分离。然后只需提取一次全部训练集的特征,构造用于最后一层的新训练集。假设最后一层类似逻辑回归或者SVM,那么学习最后一层通常是凸优化问题。
随机过滤器经常在卷积网络中表现得出乎意料得好 Jarrett et a.(2000;Saxeeta(2011; Pinto et al.(20); Cox and Pinto(2011) Saxe et al.(201)说明,由卷积和随后的池化组成的层,当赋予随机权值时,自然地变得具有频率选择和平移不变性。他们认为这提供了一种廉价的方法来选择卷积网络的结构:首先通过仅训练最后一层来评估几个卷积网络结构的性能,然后选择最好的结构并使用更昂贵的方法来训练整个网络。
一个中间方法是学习特征,但是使用一些特殊的方法,这些方法不需要在每个梯度步骤中都进行完整的前向和反向传播。与多层感知机一样,我们使用贪心逐层式预训练,独立地训练第一层,然后从第一层提取所有特征一次,然后用那些特征隔离训练第二层,以此类推。第八章描述了如何实现有监督的贪心逐层预训练,第三部分将此扩展到了无监督的范畴。卷积模型的贪心逐层预训练的经典模型是卷积深度信念网络( llee et a2,2009)。卷积网络为我们提供了相对于多层感知机更进一步采用预训练策略的机会。不是一次训练整个卷积层,我们可以训练一小块模型,就像 Coateseta.(2011)使用k均值做的那样。然后,我们可以用来自这个小块模型的参数来定义卷积层的核。这意味着使用无监督学习来训练卷积网络并且在训练的过程中完全不使用卷积是可能的。使用这种方法,我们可以训练非常大的模型,并且只在推理期间产生高计算成本( Ranzato et al,2007c; J Jarrett et al,2009b; Kavukcuoglu et al,2010; Coates et al,2013)。这种方法从2007年到2013年流行,当时标记的数据集很小,并且计算能力更有限。如今,大多数卷积网络以纯粹有监督的方式训练,在每次训练迭代中使用通过整个网络的完整的前向和反向传播。
与其他无监督预训练的方法一样,使用这种方法的一些好处仍然难以说清。无监督预训练可以提供一些相对于有监督训练的正则化,或者它可以简单地允许我们训练更大的结构,因为它的学习规则减少了计算成本。