深度学习中的卷积网络简介

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengbingchun/article/details/79977843

        卷积网络(convolutional network)也叫做卷积神经网络(convolutional neural network, CNN),是一种专门用来处理具有类似网格结构的数据的神经网络。例如时间序列数据(可以认为是在时间轴上有规律地采样形成的一维网格)和图像数据(可以看作是二维的像素网格)。卷积网络在诸多应用领域都表现优异。”卷积神经网络”一词表明该网络使用了卷积(convolution)这种数学运算。卷积是一种特殊的线性运算。卷积网络是指那些至少在网络的一层中使用卷积运算来替代一般的矩阵乘法运算的神经网络。

        通常来说,卷积神经网络中用到的卷积运算和其他领域(例如工程领域以及纯数学领域)中的定义并不完全一致。卷积网络是神经科学原理影响深度学习的典型代表。

        1. 卷积运算

        在通常形式中,卷积是对两个实变函数的一种数学运算。卷积运算通常用星号表示。在卷积网络的术语中,卷积的第一个参数通常叫做输入,第二个参数叫做核函数。输出有时被称作特征映射(feature map)。在机器学习的应用中,输入通常是多维数组的数据,而核通常是由学习算法优化得到的多维数组的参数。我们把这些多维数组叫做张量。因为在输入与核中的每一个元素都必须明确地分开存储,我们通常假设在存储了数值的有限点集以外,这些函数的值都为零。这意味着在实际操作中,我们可以通过对有限个数组元素的求和来实现无限求和。我们经常一次在多个维度上进行卷积运算。卷积是可交换的(commutative)。

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

       许多机器学习的库实现的是互相关函数但是称之为卷积。在机器学习中,学习算法会在核合适的位置学得恰当的值,所以一个基于核翻转的卷积运算的学习算法所学得的核,是对未进行翻转的算法学得的核的翻转。单独使用卷积运算在机器学习中是很少见的,卷积经常与其它的函数一起使用,无论卷积运算是否对它的核进行了翻转,这些函数的组合通常是不可交换的。我们限制只对核完全处在图像中的位置进行输出,在一些上下文中称为”有效”卷积。

        2. 动机

        卷积运算通过三个重要的思想来帮助改进机器学习系统:稀疏交互(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)是指在一个模型的多个函数中使用相同的参数。在传统的神经网络中,当计算一层的输出时,权重矩阵的每一个元素只使用一次,当它乘以输入的一个元素后就再也不会用到了。作为参数共享的同义词,我们可以说一个网络含有绑定的权重(tiedweights),因为用于一个输入的权重也会被绑定在其他的权重上。在卷积神经网络中,核的每一个元素都作用在输入的每一位置上(是否考虑边界像素取决于对边界决策的设计)。卷积运算中的参数共享保证了我们只需要学习一个参数集合,而不是对于每一位置都需要学习一个单独的参数集合。这虽然没有改变前向传播的运行时间(仍然是O(k*n)),但它显著地把模型的存储需求降低至k个参数,并且k通常要比m小很多个数量级。因为m和n通常有着大致相同的大小,k在实际中相对于m*n 是很小的。因此,卷积在存储需求和统计效率方面极大地优于稠密矩阵的乘法运算。

        对于卷积,参数共享的特殊形式使得神经网络层具有对平移等变(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. 池化

        卷积网络中一个典型层包含三级。在第一级中,这一层并行地计算多个卷积产生一组线性激活响应。在第二级中,每一个线性激活响应将会通过一个非线性的激活函数,例如整流线性激活函数。这一级有时也被称为探测级(detector stage)。在第三级中,我们使用池化函数(pooling function)来进一步调整这一层的输出

        池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。例如, 最大池化(max pooling)函数给出相邻矩形区域内的最大值。其他常用的池化函数包括相邻矩形区域内的平均值、L2范数以及基于据中心像素距离的加权平均函数。不管采用什么样的池化函数,当输入作出少量平移时,池化能够帮助输入的表示近似不变(invariant)对于平移的不变性是指当我们对输入进行少量平移时,经过池化函数后的大多数输出并不会发生改变。局部平移不变性是一个很有用的性质,尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时。例如,当判定一张图像中是否包含人脸时,我们并不需要知道眼睛的精确像素位置,我们只需要知道有一只眼睛在脸的左边,有一只在右边就行了。但在一些其他领域,保存特征的具体位置却很重要。例如当我们想要寻找一个由两条边相交而成的拐角时,我们就需要很好地保存边的位置来判定它们是否相交。

        使用池化可以看作是增加了一个无限强的先验:这一层学得的函数必须具有对少量平移的不变性。当这个假设成立时,池化可以极大地提高网络的统计效率。因为池化综合了全部邻居的反馈,这使得池化单元少于探测单元成为可能,我们可以通过综合池化区域的k个像素的统计特征而不是单个像素来实现。

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

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

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

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

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

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

        5. 基本卷积函数的变体

        当在神经网络的上下文中讨论卷积时,我们通常不是特指数学文献中使用的那种标准的离散卷积运算。实际应用中的函数略有不同。

        首先,当我们提到神经网络中的卷积时,我们通常是指由多个并行卷积组成的运算。这是因为具有单个核的卷积只能提取一种类型的特征,尽管它作用在多个空间位置上。我们通常希望网络的每一层能够在多个位置提取多种类型的特征。

        另外,输入通常也不仅仅是实值的网格,而是由一系列观测数据的向量构成的网格。例如,一幅彩色图像在每一个像素点都会有红绿蓝三种颜色的亮度。在多层的卷积网络中,第二层的输入是第一层的输出,通常在每个位置包含多个不同卷积的输出。当处理图像时,我们通常把卷积的输入输出都看作是3维的张量,其中一个索引用于标明不同的通道(例如红绿蓝),另外两个索引标明在每个通道上的空间坐标。软件实现通常使用批处理模式,所以实际上会使用4维的张量,第四维索引用于标明批处理中不同的实例。

        因为卷积网络通常使用多通道的卷积,所以即使使用了核翻转,也不一定保证网络的线性运算是可交换的。只有当其中的每个运算的输出和输入具有相同的通道数时,这些多通道的运算才是可交换的。

        我们有时会希望跳过核中的一些位置来降低计算的开销(相应的代价是提取特征没有先前那么好了)。我们可以把这一过程看作是对全卷积函数输出的下采样(downsampling)。如果我们只想在输出的每个方向上每间隔s个像素进行采样。我们把s称为下采样卷积的步幅(stride)。当然也可以对每个移动方向定义不同的步幅

        在任何卷积网络的实现中都有一个重要性质,那就是能够隐含地对输入V用零进行填充(pad)使得它加宽。如果没有这个性质,表示的宽度在每一层就会缩减,缩减的幅度是比核少一个像素这么多。对输入进行零填充允许我们对核的宽度和输出的大小进行独立的控制。如果没有零填充,我们就被迫面临二选一的局面,要么选择网络空间宽度的快速缩减,要么选择一个小型的核----这两种情境都会极大得限制网络的表示能力。

        有三种零填充设定的情况值得注意。第一种是无论怎样都不使用零填充的极端情况,并且卷积核只允许访问那些图像中能够完全包含整个核的位置。在MATLAB的术语中,这称为有效(valid)卷积。在这种情况下,输出的所有像素都是输入中相同数量像素的函数,这使得输出像素的表示更加规范。然而,输出的大小在每一层都会缩减。如果输入的图像宽度是m,核的宽度是k,那么输出的宽度就会变成m-k+1。如果卷积核非常大的话缩减率会非常显著。因为缩减数大于0,这限制了网络中能够包含的卷积层的层数。当层数增加时,网络的空间维度最终会缩减到1*1,这种情况下增加的层就不可能进行有意义的卷积了。第二种特殊的情况是只进行足够的零填充来保持输出和输入具有相同的大小。在MATLAB的术语中,这称为相同(same)卷积。在这种情况下,只要硬件支持,网络就能包含任意多的卷积层,这是因为卷积运算不改变下一层的结构。然而,输入像素中靠近边界的部分相比于中间部分对于输出像素的影响更小。这可能会导致边界像素存在一定程度的欠表示。这使得第三种极端情况产生了,在MATLAB中称为全(full)卷积。它进行了足够多的零填充使得每个像素在每个方向上恰好被访问了k次,最终输出图像的宽度为m+k -1。在这种情况下,输出像素中靠近边界的部分相比于中间部分是更少像素的函数。这将导致学得一个在卷积特征映射的所有位置都表现不错的单核更为困难。通常零填充的最优数量(对于测试集的分类正确率)处于”有效卷积”和”相同卷积”之间的某个位置。

        在一些情况下,我们并不是真的想使用卷积,而是想用一些局部连接的网络层。在这种情况下,我们的多层感知机对应的邻接矩阵是相同的,但每一个连接都有它自己的权重。这有时也被称为非共享卷积(unsharedconvolution),因为它和具有一个小核的离散卷积运算很像,但并不横跨位置来共享参数。当我们知道每一个特征都是一小块空间的函数并且相同的特征不会出现在所有的空间上时,局部连接层是很有用的。例如,如果我们想要辨别一张图片是否是人脸图像时,我们只需要去寻找嘴是否在图像下半部分即可。

        平铺卷积(tiled convolution)对卷积层和局部连接层进行了折衷。这里并不是对每一个空间位置的权重集合进行学习,我们学习一组核使得当我们在空间移动时它们可以循环利用。这意味着在近邻的位置上拥有不同的过滤器,就像局部连接层一样,但是对于这些参数的存储需求仅仅会增长常数倍,这个常数就是核的集合的大小,而不是整个输出的特征映射的大小。

        这三种运算----卷积、从输出到权重的反向传播和从输出到输入的反向传播----对于训练任意深度的前馈卷积网络,以及训练带有(基于卷积的转置的)重构函数的卷积网络,这三种运算都足以计算它们所需的所有梯度。对于完全一般的多维、多样例情况下的公式,完整的推导可以参考Goodfellow。

        一般来说,在卷积层从输入到输出的变换中我们不仅仅只用线性运算。我们一般也会在进行非线性运算前,对每个输出加入一些偏置项。这样就产生了如何在偏置项中共享参数的问题。对于局部连接层,很自然地对每个单元都给定它特有的偏置,对于平铺卷积,也很自然地用与核一样的平铺模式来共享参数。对于卷积层来说,通常的做法是在输出的每一个通道上都设置一个偏置,这个偏置在每个卷积映射的所有位置上共享。然而,如果输入是已知的固定大小,也可以在输出映射的每个位置学习一个单独的偏置。分离这些偏置可能会稍稍降低模型的统计效率,但同时也允许模型来校正图像中不同位置的统计差异。例如,当使用隐含的零填充时,图像边缘的探测单元接收到较少的输入,因此需要较大的偏置

        6. 结构化输出:卷积神经网络可以用于输出高维的结构化对象,而不仅仅是预测分类任务的类标签或回归任务的实数值。通常这个对象只是一个张量,由标准卷积层产生。

        7. 数据类型:卷积网络使用的数据通常包含多个通道,每个通道是时间上或空间中某一点的不同观测量。

        注意,使用卷积处理可变尺寸的输入,仅对输入是因为包含对同种事物的不同量的观察(时间上不同长度的记录,空间上不同宽度的观察等)而导致的尺寸变化这种情况才有意义。如果输入是因为它可以选择性地包括不同种类的观察而具有可变尺寸,使用卷积是不合理的。例如,如果我们正在处理大学申请,并且我们的特征包括成绩等级和标准化测试分数,但不是每个申请人都进行了标准化测试,则使用相同的权重来对成绩特征和测试分数特征进行卷积是没有意义的。

        8. 高效的卷积算法

        9. 随机或无监督的特征

        通常,卷积网络训练中最昂贵的部分是学习特征。输出层的计算代价通常相对不高,因为在通过若干层池化之后作为该层输入的特征的数量较少。当使用梯度下降执行监督训练时,每步梯度计算需要完整地运行整个网络的前向传播和反向传播。减少卷积网络训练成本的一种方式是使用那些不是由监督方式训练得到的特征。

        有三种基本策略可以不通过监督训练而得到卷积核。其中一种是简单地随机初始化它们。另一种是手动设计它们,例如设置每个核在一个特定的方向或尺度来检测边缘。最后,可以使用无监督的标准来学习核。使用无监督的标准来学习特征,使得它们能够与位于网络结构顶层的分类层相互独立地确定。然后只需提取一次全部训练集的特征,构造用于最后一层的新训练集。

        随机过滤器经常在卷积网络中表现得出乎意料得好。Saxe说明,由卷积和随后的池化组成的层,当赋予随机权重时,自然地变得具有频率选择性和平移不变性。他们认为这提供了一种廉价的方法来选择卷积网络的结构:首先通过仅训练最后一层来评估几个卷积网络结构的性能,然后选择最好的结构并使用更昂贵的方法来训练整个网络。

        一个中间方法是学习特征,但是使用那种不需要在每个梯度计算步骤中都进行完整的前向和反向传播的方法。与多层感知机一样,我们使用贪心逐层预训练,单独训练第一层,然后一次性地从第一层提取所有特征,之后用那些特征单独训练第二层,以此类推。大多数卷积网络以纯粹监督的方式训练,在每次训练迭代中使用通过整个网络的完整的前向和反向传播。

        10.  卷积网络的神经科学基础

        11. 卷积网络与深度学习的历史

        以上内容摘自: 《深度学习中文版》

        GitHub: https://github.com/fengbingchun/NN_Test 

阅读更多

没有更多推荐了,返回首页