卷积网络(convolutional network),也叫做卷积神经网络(convolutional neural network,CNN),是一种专门用来处理具有类似网格结构的数据的神经网络。例如时间序列数据(可以认为是在时间轴桑有规律地采样形成的一维网格)和图像数据(可以看做二维的像素网格)。
卷积是一种特殊的线性运算。卷积网络是指那些至少在网络的一层中使用卷积运算来替代一般矩阵乘法运算的神经网络。
在通常形式中,卷积是对两个实变函数的一种数学运算。
假设用激光传感器追踪一艘飞船的位置,激光传感器给出一个单独的输出
,表示宇宙飞船在t时刻的位置,x和t都是实值的,这意味着我们可以在任意时刻从传感器中读出飞船的位置。假设传感器受到一定程度的噪声干扰,为了得到飞船位置的低噪声估计,对得到的测量结果进行平均,显然,时间上越近的测量结果越相关,所以采用加权平均的方法,对于最近的测量结果赋予更高的权重,可以采用一个加权函数
来实现,其中a表示测量结果距当前时刻的时间间隔。如果对任意时刻都采用这种加权平均的操作,就得到一个新的对于飞船位置的平滑估计函数s:
这种运算就叫做卷积,卷积函数通常用星号表示:
w必须是一个有效的概率密度函数,否则输出就不再是一个加权平均。另外,在参数为负值时,w的取值必须为0,否则会预测到未来。
卷积被定义在满足上述积分式的任意函数上,并且也可能被用于加权平均以外的目的。
在卷积网络的术语中,卷积的第一个参数(函数x)叫做输入,第二个参数(函数w)叫做核函数,输出有时候被称作特征映射。
在本例中,激光传感器在每个瞬间反馈策略结果的想法是不切实际的,一般来讲,当使用计算机处理数据时,时间会被离散化,传感器会定期地反馈数据,所以在例子中,假设传感器每秒反馈一次测量结果是比较现实的。这样时刻t只能取整值。如果假设x和w都定义在整数时刻t上,就可以定义离散形式的卷积:
在机器学习的应用中,输入通常是多维数组的数据,而核通常是由学习算法优化得到的多维数组的参数。这些多维数组为张量。在输入与核中的每一个元素都必须明确地分开存储。通常假设在寻出了数值的有限点集以外,这些函数的值都为零,这意味着在实际操作中,可以同步对有限个数组元素的求和来实现无限求和。
经常可以一次在多个维度上进行卷积运算。例如,如果把一张二维图像I作为输入,我们也许想要使用一个二维的核K:
卷积是可交换的,可以等价地写作:
通常,下面的公式在机器学习库中实现更为简单,因为m和n的有效取值范围相对较小。
卷积运算的可交换性的出现是因为将核相对输入进行了翻转(flip),从m增大的角度来看,输入的索引在增大,但是核的索引在减小。将核翻转的唯一目的是实现可交换性。尽管可交换性在证明时很有用,但在神经网络的应用中却不是一个重要的性质。与之不同的是,许多神经网络库会实现一个相关的函数,称为互相关函数(cross-correlation),和卷积运算几乎一样但是并没有对核进行翻转:
许多机器学习的库实现的是这个互相关函数,但是称之为卷积。
在机器学习中,学习算法会在核合适的位置学得恰当的值,所以一个机遇核翻转的卷积运算的学习算法学得的核,是对未进行翻转的算法学得的核的翻转。单独使用卷积运算在机器学习中是很少见的,卷积经常与其他的函数一起使用,无论卷积运算是否对它的核进行了翻转,这些函数的组合通常是不可交换的。
离散卷积可以看作矩阵的乘法,然而,这个矩阵的一些元素被限制为必须和另外一些元素相等。例如,对单变量的离散卷积,矩阵的每一行中的元素都与上一行对应位置平移一个单元的元素相同。这种矩阵叫做Toeplitz(Toeplitz matrix)。对于二维情况,卷积对应着一个双重分块循环矩阵(doubly block circulant matrix)。除了这些元素相等的限制以外,卷积通常对应着一个非常稀疏的矩阵(一个几乎所有元素都为令的矩阵)。这是因为核的大小通常要远小于输入图像的大小。任何一个使用矩阵乘法但是并不依赖矩阵结构的特殊性质的神经网络算法,都适用于卷积运算,并且不需要对神经网络做出大修改。典型的卷积神经网络为了更有效地处理大规模输入,确实使用了专门化技巧。
卷积运算通过三个重要的思想来帮助改进机器学习系统:稀疏交互(sparse interactions)、参数共享(parameter sharing)、等变表示(equivariant representations)。另外,卷积提供了一种处理大小可变的输入的方法。
传统的神经网络使用矩阵乘法来简历输入与输出的连接关系。其中,参数矩阵的每一个单独的参数都描述了一个输入单元与一个输出单元间的交互。然而,卷积网络具有稀疏交互(也叫做稀疏连接)或者稀疏权重的特征。这是使核的大小远小于输入的大小来达到的。当处理一张图像时,输入的图像可能包含成千上万个像素点,但是我们可以通过只占用几十到上百个像素点的核来检测一些小的有意义的也正,例如图像的边缘。这意味着我们需要存储的参数更少,不仅减少了模型的存储需求,还提高了它的统计效率。这也意味着为了得到输出我们只需要更少的计算量。这些效率上的提高往往是很显著的。如果有m个输入和n个输出,那么矩阵乘法需要mxn个参数,并且相应的算法时间复杂度为
。如果我们限制每一个输出拥有的连接数为k,那么稀疏的连接方法只需
个参数以及
的运行时间。在很多实际应用中,只需保持k比m小几个数量级,就能在机器学习任务中取得好的表现。
参数共享是指在一个模型的多个函数中使用相同的参数。在传统的神经网络中,当计算一层的输出时,权重矩阵的每一个元素只使用一次,当它乘以输入的一个元素后就再也不会用到了。作为参数共享的同义词,我们可以说一个网络含有绑定的权重(tied weights),因为用于一个输入的权重也会被绑定在其他的权重上。在卷积神经网络中,核的每一个元素都作用在输入的每一个位置上(是否考虑边界像素取决于对边界决策的设计)。卷积运算中的参数共享保证了我们只需要学习一个参数集合,而不是对于每一个位置都需要学习一个单独的参数集合。这虽然没有改变前向传播的运行时间(仍然是
),但是它显著地把模型的存储需求降低至k个参数,并且k通常要比m小很多个数量级。因为m和n通常有着大致相同的大小,k在实际中相对于mxn是很小的。因此,卷积在存储需求和统计效率方面极大地优于稠密矩阵的乘法运算。
对于卷积,参数共享的特殊形式使得神经网络层具有堆平移等变的性质。如果一个函数满足了输入改变,输出也以同样的方式改变这一性质,那么它就是等变的。特别的是,如果函数
与
满足
,我们就说
对于变换g具有等变性。对于卷积来说,如果令g是输入的任意平移函数,那么卷积函数对于g具有等变性。令I表示图像在整数坐标上的亮度函数,g表示图像函数的变换函数(把一个图像函数映射到另一个图像函数的函数),使得
,其中图像函数
满足
。这个函数把I中每一个像素向右移动一个单位。如果先对I做这种变换然后进行卷积操作所得到的结果,与先对进行卷积然后在对输出使用平移函数g得到的结果是一样的。当处理时间序列数据时,这意味着通过卷积可以得到一个由输入中出现不同特征的时刻所组成的时间轴。如果我们把输入中的一个事件向后延时,在输出中仍然会有完全相同的表示,只是时间延后了。图像与此类似,卷积产生了一个二维映射来表明某些特征在输入中出现的位置。当我们移动输入中的对象,它的表示也会在输出中移动同样的量。当处理多个输入位置时,一些作用在邻居像素的函数是很有用的。例如在处理图像时,在卷积网络第一层进行图像边缘检测是很有用的。相同边缘或多或少的散落在图像的各处,所以应当对整个图像进行参数共享。
卷积对其他的一些变换并不是天然等变的,例如对图像的放缩或者旋转,需要其他一些机制来处理这些变换。
最后,一些不能被传统的由(固定大小的)矩阵乘法定义的神经网络处理的特殊数据,可能通过卷积神经网络来处理。
卷积网络中一个典型层包含三级。
在第一级中,这一层并行地计算多个卷积产生一组线性激活响应。在第二级中,每一个线性激活响应将会通过一个非线性激活函数,例如整流线性激活函数。这一级有时已被称为探测级(detector stage)。在第三极中,我们使用池化函数(pooling function)来进一步调整这一层的输出。
池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。例如:最大池化(max pooling)函数给出相邻矩形区域内的最大值。其他常用的池化函数包括相邻矩阵区域内的平均值、
范数以及基于距中心像素距离的加权平均函数。
不管采用什么样的池化函数,当输入做出少量平移时,池化能够帮助输入的表示近似不变。平移的不变性是指当我们对输入进行少量平移时,经过池化函数后的大多数输出并不会发生改变。局部平移不变性是一个很有用的性质,尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时。
使用池化可以看作增加了一个无限强的先验,这一层学得的函数必须具有对少量平移的不变性,当这个假设成立时,池化可以极大地提高网络的统计效率。
对空间区域进行池化产生了平移不变性,但当我们对分离参数的卷积的输出进行池化时,特征能够学得应该对于哪种变换具有不变性。
因为池化综合了全部邻居的反馈,使得池化单元少于探测单元成为可能,可以通过综合池化区域的k个像素的统计特征而不是单个像素来实现。
上图中的例子,提高了网络的计算效率,因为下一层少了约k倍的输入。当下一层的参数数目是关于那一层输入大小的函数时(例如当下一层是全连接的基于矩阵乘法的网络层时),这种对于输入规模的减小也可以提高统计效率并减少对于参数存储需求。
在很多分类任务中,池化对于处理不同大小的输入具有重要作用。例如我们想对不同大小的图像进行分类时,分类层的输入必须是固定的大小,而这通常通过调整池化区域的偏置大小来实现,这样分类层总是能接收到相同数量的统计特征而不管最初的输入大小了。
一些理论工作对于在不同情况下使用哪种池化函数给出了一些指导,将特征一起动态地池化也是可行的,例如,对感兴趣特征的位置运行聚类算法,这种方法对于每幅图像产生一个不同的池化区域集合。另一种方法是先学习一个单独的池化结构,在应用到全部的图像中。
先验概率分布是一个模型参数的概率分布,刻画了在看到数据之前认为什么样的模型时合理的信念。
先验被认为是强或者弱取决于先验中概率魔都的几种程度。弱先验具有较高的熵值。这样的先验允许数据对于参数的改变具有或多或少的自由性。强先验具有较低的熵值。这样的先验在决定参数最终取值时起着更加积极的作用。
一个无限强的先验需要对一些参数概率置0并且完全禁止对这些参数赋值,无论数据对于这些参数的值给出了多大的支持。
可以把卷积网络类别成全连接网络,但对于这个网络的权重有一个无限强的先验、这个无限强的先验是说一个隐藏单元的权重必须和它邻居的权重相等,在可以在空间上移动。这个先验也要求除了那些处在隐藏单元的小的空间连续的接受域内的权重意外,其余的权重都为0。这个先验说明了该层应该学得的函数只包含局部连接关系并且对平移具有等变性。使用池化也是一个无限强的先验,每一个单元都具有对少量平移的不变性。
卷积和池化可能导致欠拟合。一些卷积网络结构为了既获得较高不变性的特征又获得当平移不变性不合理时候不会导致欠拟合的特征,被设计成在一些通道上使用池化,而在另一些通道上不使用。当一项任务涉及要对输入中相隔较远的信息进行合并时,那么卷积所用的先验可能就不正确了
当我们比较卷积模型的统计学习表现时,只能以基准中的其它卷积模型作为比较的对象。其它不适用卷积的模型即使我们把图像中所有像素点都置换后依然有可能进行学习。对于许多图像数据集,后还有一些分别的基准,有些是针对那些具有置换不变性且必须通过学习发现拓扑结构的模型,还有一些是针对模型设计者将空间关系的知识植入了它们的模型。
当提到神经网络的卷积时,通常是指由多个并行卷积组成的运算。这是因为具有单个核的卷积只能提取一种类型的特征,尽管它作用在多个空间位置上。通过希望网络的每一层能够在多个位置提取多种类型的特征。
另外,输入通常也不仅仅是实值的网格,而是由一系列观测数据的向量构成的网络。在多层卷积网络中,第二层的输入是第一层的输出,通常在每个位置包含多个不同卷积的输出。当处理图像时,通常把卷积的输入输出都看作3维张量,其中一个索引用于标明不同的通道(如红、绿、蓝)另外两个索引标明在每个通道上的空间坐标。软件实现通常使用批处理模式,所以实际上会使用4维张量,第4维用于标明批处理中不同的实例。
因为卷积网络通常使用多通道的卷积,所以即使使用了核翻转,也不一定保证网络的线性运算是可交换的。只有当其中每个运算的输出和输入都有相同的通道数时,这些多通道的运算才是可交换的。
假设有一个4维的核张量K,它的每一个元素是
,表示输出中处于通道i的一个单元和输入中处于通道j的一个单元的连接强度,并且在输出单元和输入单元之间有k行l列的偏置。假定我们的输入由观测数据V组成,它的每一个元素是
,表示处在通道i第j行第k列的值,假定我们的输出Z和输入V有相同的形式,如果输出Z是通过对K和V进行卷积而不涉及核翻转K得到的,那么:
这里对所有的l、m和n进行求和是对所有的有效张量索引值进行求和。
有时候希望跳过核中的一些位置来降低计算的开销(相应的代价是提前特征没有先前那么好了)。可以把这一过长看做是对去案卷级函数输出的下采样。如果只想再输出的每个方向上每间隔s个像素进行采样,那么可以定义一个下采样卷积函数c使得:
s被称为下采样卷积的步幅,也可以对每个移动方向定义不同的步幅。
在任何卷积网络的实现中,都有一个重要的性质,那就是能够隐含地对输入V用0进行填充使得它加宽。如果没有这个性质,表示的宽度在每一层就会缩减,缩减的幅度是比核少一个像素这么。对输入进行零填充允许我们对核的宽度和输出的大小进行独立的控制。如果没有零填充,那么我们就被迫面对二选一的局面,要么选择网络空间宽度进行快速缩减,要么选择一个小型的核,这两种情景都会极大限制网络的表示能力。
有三种零填充设定的情况值得注意,第一种是无论怎么样都不使用零填充的极端情况,并且卷积核只允许访问那些图像中能够完全包含整个核的位置。在matlab中,这称为有效卷积。在这种情况下,输出的所有像素都是输入中相同像素的函数,这使得输出像素的表示更加规范,然而,输出的大小会在每一层都缩减。如果输入图像宽度为m,核宽度为k,那么输出的宽度就会变成m-k+1,如果卷积核非常大,那么缩减率会非常显著。因为缩减数大于0,限制了网络中能够包含的卷积层的层数。当层数增加时,网络的空间维度会缩减到1x1,这种情况下增加的层就不可能进行有意义的卷积了。第二种特殊情况是只进行足够的零填充来保持输出和输入有相同的大小,在MATLAB中这称为相同卷积。在这种情况下,只有硬件支持,网络就能包含任意多的卷积层,这是因为卷积运算不改变下一层的结构。然而,输入像素中靠近边界的部分相比于中间部分度输出像素的影响更小。这可能会导致边界像素存在一定程度的欠表示。这使得第三种情况产生了,在MATLAB中称为全卷积。它进行了足够多的零填充,使得每个像素在每个方向上恰好被访问了k次,最后输出图像的宽度为m+k-1。在这种情况下,输出像素中靠近边界部分比中间部分是更少像素的函数。这将导致学得一个在卷积特征映射的所有位置都表现的不错的单核更为空难。通常零填充的最优数量(对于测试集的分类正确率)处于有效卷积和相同卷积之间的某个位置。
在某些情况下,并不是真的想使用卷积,而是想用一些局部连接的网络层。在这种情况下,多层感知机对应的邻接矩阵是相同的,但每一个连接都有它自己的权重,用一个6维张量W来表示,W的索引分别是:输出的通道i,输出的行j和列k,输入的通道l,输入的行偏置m和列偏置n。局部连接层的线性部分可以表示为:
。这有时也被称为非共享卷积,因为它和具有一个小核的离散卷积运算很像,但并不横跨位置来共享参数。
当我们知道每一个特征都是一小块空间的函数并且相同的特征不会出现在所有的空间上时,局部连接层是很有用的。
使用那些了解被更进一步限制的卷积或者局部连接层也是有用的。例如,限制每一个输出的通道i仅仅是输入通道l的一部分的函数时。实现这种情况的一种通用方式使输出的前m个通道仅仅连接到输入的前n个通道,输出的接下来m个通道仅仅连接到输入的接下来n个通道。
上图中给出一个例子,对少量通道间的连接进行建模允许网络使用更少的参数,这降低了存储的消耗以及提高了统计效率,并且减少了前向和反向传播所需要的计算量。这些目标的实现并没有减少隐藏单元的数目。
平铺卷积是对卷积层和局部连接层进行了折衷,这里并不是对每一个空间位置的权重集合进行学习,我们学习一组核使得当我们在空间移动时他们可以循环利用。这意味着在近邻的位置上有不同的过滤器,就像局部连接层一样,但是对于这些参数的存储需求仅仅会增长常数倍,这个常数就是核的集合的大小,而不是整个输出的特征映射的大小。
为了用代数的方法定义平铺卷积,令K是一个6维的向量,其中的两维对应着输出映射中的不同位置。K在这里并没有对输出映射中的每一个位置使用单独的索引,输出的位置在每个方向上在t个不同的核组成的集合中进行循环。如果t等于输出的宽度,这就是局部连接层了。
这里百分号是取模运算,性质为t%t=0,(t+1)%t=1。在每一维上使用不同的t可以很容易对这个方程进行扩展。
局部连接层与平铺卷积层都和最大池化有一些有趣的关联:这些层的探测单元都是由不同的过滤器驱动的。如果这些过滤器能够学会探测相同隐含特征的不同变换形式,那么最大池化的单元对于学得的变换就具有不变性。卷积层对于平移具有内置的不变性。
实现卷积网络时,通常也需要除卷积以外的其它运算。为了实现学习,必须在给定输出的梯度时能够计算核的梯度。在一些简单的情况下,这种运算可以通过卷积来实现,但在很多我们感兴趣的情况下,包括步幅大于1的情况,并不具有这样的性质。
卷积是一种线性运算,所以可以表示成矩阵乘法的形式(如果我们首先把输入张量变形为一个扁平的向量)。其中包含的矩阵是关于卷积核的函数。这个矩阵时稀疏的,并且核的每个元素都复制给矩阵的多个元素。这种观点能够帮助我们导出实现一个卷积网络所需的很多其他运算。
通过卷积定义的矩阵转置的乘法就是这样一种运算。这种运算用于在卷积层反向传播误差的导数,所以它在训练多余一个隐藏层的卷积网络时是必要的。如果我们想要从隐藏层单元重构可视化单元时,同样的运算也是需要的。重构可视化单元时一些模型广泛用到的一种运算,这些模型包括自编码器、RBM和稀疏编码等。构建这些模型的卷积化版本都要用到转置化卷积。类似核梯度运算,这种输入梯度运算在某些情况下可以用卷积来实现,但在一般情况下需要用到第三种运算来实现。必须非常小心地来是这种转置运算和前向传播过程相协调。转置运算返回的输出的大小取决于三个方面:零填充的策略、前向传播运算的步幅以及前向传播的输出映射的大小。在一些情况下,不同大小的输入通过前向传播过程能够得到相同大小的输出映射,所以必须明确地告知转置运算原始输入的大小。
卷积、从输出到权重的反向传播和从输出到输入的反向传播,对于训练任意深度的前馈卷积网络,以及训练带有(基于卷积的转置的)重构函数的卷积网络,这三种运算都足以计算它们所需的所有梯度。
一般来说,在卷积层从输入到输出的变换中,我们不仅仅只用线性运算,一般也会在进行非线性运算前,对每个输出加入一些偏置项。这样就产生了如何在偏置项中共享参数的问题。对于局部连接层,很自然地对每个单元都给定它特有的偏置,对于平铺卷积,也很自然地用于核一样平铺模式来共享参数。对于卷积层来说,通常的做法是在输出的每一个通道上都设置一个偏置,这个偏置在每个卷积映射的所有位置上共享。然而,如果输入是已知的固定大小,也可以在输出映射的每个位置学习一个单独的偏置。分离这些偏置可能会稍稍降低模型的统计效率,但同时也允许模型来校正图像中不同位置的统计差异。
卷积神经网络可以用于输出高维的结构化对象,而不仅仅是预测分类任务的类标签或回归任务的实数值。通常这个对象只是一个张量,由标准卷积层产生。例如:模型可以产生张量S,其中
是网络的输入像素
属于类i的概率。这允许模型标记图像中的每个像素,并绘制沿着单个对象轮廓的精确掩模。
经常出现的问题是输出平面可能比输入平面要小。对于图像中单个对象分类的常用结构中,网络空间的维数最大减少来源于使用大步幅的池化层。为了产生于输入大小相似的输出映射,可以避免把池化放在一起。另一种策略是单纯地产生一张低分辨率的标签网格。最后原则上可以使用具有单位步幅的池化操作。
对图像逐个像素标记的一种策略是先产生图像标签原始猜测,然后使用相邻像素之间的交互来修正该原始猜测。重复这个修正步骤数次对应于在每一层使用相同的卷积,该卷积在深层网络的最后几层之间共享权重。这使得在层之间共享参数的连续的卷积层所执行的一系列运算,形成了一种特殊的循环神经网络。
卷积网络使用的数据通常包含多个通道,每个通道是时间上或空间中某一点的不同观测量。
卷积网络的一个优点是它们还可以处理具有可变的空间尺度的输入。这些类型的输入不能用传统的基于矩阵乘法的神经网络来表示。这为卷积网络的使用提供了令人信服的理由,即使当计算开销和过拟合都不是主要问题时。
卷积网络训练中最昂贵的部分是学习特征。输出层的计算代价通常相对不高,因为在通过若干层池化之后作为该层输入的特征数量较少。当使用梯度下降执行监督训练时,每步梯度计算需要完整地运行整个网络的前向传播和反向传播算法。减少卷积网络训练成本的一种方式是使用那些不是监督方式训练得到的特征。
有三种基本策略可以不通过监督训练而得到卷积核。其中一种是简单地随机初始化它们。另一种是手动设计它们,例如设置每个核在一个特定的方向或尺度来检测边缘。最后,可以使用无监督的标准来学习和。
随机过滤器经常在卷积网络中表现得出乎意料的好。由卷积核随后池化组成的层,当赋予随机权重时,自然地变得具有频率选择性和平移不变性。
一个中间方法是学习特征,但是使用那种不需要在每个梯度计算步骤中都进行完整的前向和反向传播的方法。
卷积网络为我们提供了相对与多层感知机更进一步采用预训练策略的机会。并非一次训练整个卷积层,可以训练一小块模型。然后,我们可以用来自这个小块模型的参数来定义卷积层的核。这意味着使用无监督学习来训练卷积网络并且在训练过程中完全不使用卷积是可能的。这意味着我们可以训练非常大的模型,并且只在推断期间产生高计算成本。