还剩7页未读,继续阅读
文本内容:
卷积神经网络ConvolutionalNeuralNetworks(CNN)
一、什么是卷积首先回顾一下,数字图像处理中我们用卷积模板和原始图像的像素卷积过程如下Step
1、先将模板旋转180度(又称折叠)Step
2、然后让模板依次和原始图像重叠,并且计算重叠部分的数值乘积之和以2D为例先对模板K做折叠,然后依次覆盖图像I,并且计算重叠部分的数值乘积之和依次进行到最后,会多出一圈,得到最后的卷积结果卷积的意义(图像处理而言);对图像使用不同的卷积模板,对图像做不同的处理比如平滑模板可以使图像模糊,并且可以减少噪声、锐化模板可以使图像的轮廓变得清晰
2、卷积网络的结构
2.1从BP网络到卷积网络回想一下BP神经网络BP网络每一层节点是一个线性的一维排列状态,层与层的网络节点之间是全连接的这样设想一下,如果BP网络中层与层之间的节点连接不再是全连接,而是局部连接的这样,就是一种最简单的一维卷积网络如果我们把上述这个思路扩展到二维,这就是我们在大多数参考资料上看到的卷积神经网络具体参看下图图1全连接的2D网络(BP网络)图2局部连接的2D网络(卷积网络)现在我们考虑单隐层结构,上图左全连接网络如果我们有1000x1000像素的图像,有1百万个隐层神经元,每个隐层神经元都连接图像的每一个像素点,就有1000x1000x_____00=10^12个连接,也就是10^12个权值参数上图右局部连接网络,每一个节点与上层节点同位置附近10x10的窗口相连接,则1百万个隐层神经元就只有100w乘以100,即10^8个参数其权值连接个数比原来减少了四个数量级因此,卷积网络降低了网络模型的复杂度,减少了权值的数量该优点在网络的输入是__图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程
2.2卷积网络的结构卷积神经网络是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个__神经元组成卷积神经网络中的每一个特征提取层(C-层)都紧跟着一个用来求局部平均与二次提取的下采样层(S-层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力图3经典的卷积神经网络结构图原始图像的大小决定了输入向量的尺寸,隐层由C-层(特征提取层)和S-层(下采样层)组成,每层均包含多个平面C1层神经元提取图像的局部特征,因此每个神经元都与前一层的局部__野(也就是局部输入窗口)相连C1层中各平面(由神经元构成)提取图像中不同的局部特征,如边缘特征,上下左右方向特征等,C1层中的输入是有由上一层局部窗口的数值和连接的权值的加权和(也就是卷积,后面会具体解释___是卷积),然后通过一个激活函数(如sigmoid函数,反正切函数)得到C1层的输出,接下来S2层是下采样层,简单来书,由4个点下采样为1个点,也就是4个数的加权平均换句话说,就是我们把2*2的像素缩小成为一个像素,某种意义上来说可以认识是图像处理中的模糊然后按照这个C—S的结构继续构成隐层,当然这些隐层的连接都是局部相连的同时有人会问了,例如S2和C3层具体要怎么连接呢,___会从6张变成16张特征图呢C3层的特征图是由S2层图像的__野和对应权值的卷积后,通过随机的组合而形成的,也就意味着S2层和C3层并不像C1层和S2层那样是一一对应的但当我们__野的大小和图像一样时,我们经过特征提取后就变成一个像素了,这里我们开始使用全连接(这样才能完整的把特征保留)
2.3___给这种局部连接命名为卷积网络 卷积网络第一个特点是连接权值远远小于BP网络的权值卷积神经网络另外一个特性是权值共享这样一来就更进一步减少了对网络权值的训练(毕竟权值是共享的,也就意味着有一些全是是相同的)权值共享是指同__面层的神经元权值相同如何理解呢!看下图2,假设红色的点和黑色的点是C1层第一个特征图的2个不同神经元,__窗口的大小是5*5的(意味着有25个连接),这2个神经元连接的权值是共享的(相同的)这样一来,C1层中的每个神经元的输入值,都有由原始图像和这个相同的连接权值的加权和构成的,想想看,这个过程是不是和卷积的过程很像呢!没错,就是由这个得名的同时这样一来,我们需要训练的权值就更少了,因为有很多都是相同的还没理解的话,接着看 C1层是一个卷积层(也就是上面说的特征提取层),由6个特征图Feature__p构成特征图中每个神经元与输入中5*5的邻域相连特征图的大小为28*28C1层有156个可训练参数(每个滤波器5*5=25个unit参数和一个bias[偏置]参数,一共6个滤波器,共5*5+1*6=156个参数),共156*28*28=122304个连接 S2层是一个下采样层,有6个14*14的特征图特征图中的每个单元与C1中相对应特征图的2*2邻域相连接S2层每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置结果通过sigmoid函数计算每个单元的2*2__野并不重叠,因此S2中每个特征图的大小是C1中特征图大小的1/4(行和列各1/2)S2层有12个可训练参数和5880个连接
三、卷积网络的训练我们想想卷积网络到底有什么那些参数需要训练呢第
一、卷积层中的卷积模板的权值第
二、下采样层的2个参数(每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置),第
三、学__征的组合(例如S2到C3的组合方式)
3.1我们先回顾一下BP的反向传播算法
3.
1.
1、FeedforwardPass前向传播 在下面的推导中,我们采用平方误差代价函数我们讨论的是多类问题,共c类,共N个训练样本 这里表示第n个样本对应的标签的第k维表示第n个样本对应的网络输出的第k个输出对于多类问题,输出一般__为“one-of-c”的形式,也就是只有该输入对应的类的输出节点输出为正,其他类的位或者节点为0或者负数,这个取决于你输出层的激活函数sigmoid就是0,tanh就是-
1. 因为在全部训练集上的误差只是每个训练样本的误差的总和,所以这里我们先考虑对于一个样本的BP对于第n个样本的误差,表示为 传统的全连接神经网络中,我们需要根据BP规则计算代价函数E关于网络每一个权值的偏导数我们用l来表示当前层,那么当前层的输出可以表示为 输出激活函数f.可以有很多种,一般是sigmoid函数或者双曲线正切函数sigmoid将输出压缩到
[01],所以最后的输出平均值一般趋于0 所以如果将我们的训练数据归一化为零均值和方差为1,可以在梯度下降的过程中增加收敛性对于归一化的数据集来说,双曲线正切函数也是不错的选择
3.
1.
2、BackpropagationPass反向传播 反向传播回来的误差可以看做是每个神经元的基的灵敏度sensitivities(灵敏度的意思就是我们的基b变化多少,误差会变化多少,也就是误差对基的变化率,也就是导数了),定义如下(第二个等号是根据求导的链式法则得到的) 因为∂u/∂b=1,所以∂E/∂b=∂E/∂u=δ,也就是说bias基的灵敏度∂E/∂b=δ和误差E对一个节点全部输入u的导数∂E/∂u是相等的这个导数就是让高层误差反向传播到底层的神来之笔反向传播就是用下面这条关系式(下面这条式子表达的就是第l层的灵敏度,就是) 公式
(1) 这里的“◦”表示每个元素相乘输出层的神经元的灵敏度是不一样的 最后,对每个神经元运用delta(即δ)规则进行权值更新具体来说就是,对一个给定的神经元,得到它的输入,然后用这个神经元的delta(即δ)来进行缩放用向量的形式表述就是,对于第l层,误差对于该层每一个权值(组合为矩阵)的导数是该层的输入(等于上一层的输出)与该层的灵敏度(该层每个神经元的δ组合成一个向量的形式)的叉乘然后得到的偏导数乘以一个负学习率就是该层的神经元的权值的更新了 公式
(2) 对于bias基的更新表达式差不多实际上,对于每一个权值Wij都有一个特定的学习率ηIj
3.2卷积神经网络
3.
2.
1、ConvolutionLayers 卷积层 我们现在__网络中卷积层的BP更新在一个卷积层,上一层的特征__ps被一个可学习的卷积核进行卷积,然后通过一个激活函数,就可以得到输出特征__p每一个输出__p可能是组合卷积多个输入__ps的值 这里Mj表示选择的输入__ps的__,那么到底选择哪些输入__ps呢?有选择一对的或者三个的但下面我们会讨论如何去自动选择需要组合的特征__ps每一个输出__p会给一个额外的偏置b,但是对于一个特定的输出__p,卷积每个输入__ps的卷积核是不一样的也就是说,如果输出特征__pj和输出特征__pk都是从输入__pi中卷积求和得到,那么对应的卷积核是不一样的ComputingtheGra___nts梯度计算 我们假定每个卷积层l都会接一个下采样层l+1 对于BP来说,根据上文我们知道,要想求得层l的每个神经元对应的权值的权值更新,就需要先求层l的每一个神经节点的灵敏度δ(也就是权值更新的公式
(2))为了求这个灵敏度我们就需要先对下一层的节点(连接到当前层l的感兴趣节点的第l+1层的节点)的灵敏度求和(得到δl+1),然后乘以这些连接对应的权值(连接第l层感兴趣节点和第l+1层节点的权值)W再乘以当前层l的该神经元节点的输入u的激活函数f的导数值(也就是那个灵敏度反向传播的公式
(1)的δl的求解),这样就可以得到当前层l每个神经节点对应的灵敏度δl了 然而,因为下采样的存在,采样层的一个像素(神经元节点)对应的灵敏度δ对应于卷积层(上一层)的输出__p的一块像素(采样窗口大小)因此,层l中的一个__p的每个节点只与l+1层中相应__p的一个节点连接 为了有效计算层l的灵敏度,我们需要上采样upsample 这个下采样downsample层对应的灵敏度__p(特征__p中每个像素对应一个灵敏度,所以也组成一个__p),这样才使得这个灵敏度__p大小与卷积层的__p大小一致,然后再将层l的__p的激活值的偏导数与从第l+1层的上采样得到的灵敏度__p逐元素相乘(也就是公式
(1)) 在下采样层__p的权值都取一个相同值β,而且是一个常数所以我们只需要将上一个步骤得到的结果乘以一个β就可以完成第l层灵敏度δ的计算 我们可以对卷积层中每一个特征__pj重复相同的计算过程但很明显需要匹配相应的子采样层的__p(参考公式
(1)) up.表示一个上采样操作如果下采样的采样因子是n的话,它简单的将每个像素水平和垂直方向上拷贝n次这样就可以恢复原来的大小了实际上,这个函数可以用Kronecker乘积来实现 好,到这里,对于一个给定的__p,我们就可以计算得到其灵敏度__p了然后我们就可以通过简单的对层l中的灵敏度__p中所有节点进行求和快速的计算bias基的梯度了 公式
(3) 最后,对卷积核的权值的梯度就可以用BP算法来计算了(公式
(2))另外,很多连接的权值是共享的,因此,对于一个给定的权值,我们需要对所有与该权值有__(权值共享的连接)的连接对该点求梯度,然后对这些梯度进行求和,就像上面对bias基的梯度计算一样 这里,是中的在卷积的时候与逐元素相乘的patch,输出卷积__p的uv位置的值是由上一层的uv位置的patch与卷积核k_ij逐元素相乘的结果 咋一看,好像我们需要煞费苦心地记住输出__p(和对应的灵敏度__p)每个像素对应于输入__p的哪个patch但实际上,在__tlab中,可以通过一个代码就实现对于上面的公式,可以用__tlab的卷积函数来实现 我们先对delta灵敏度__p进行旋转,这样就可以进行互相关计算,而不是卷积(在卷积的数学定义中,特征矩阵(卷积核)在传递给conv2时需要先翻转(flipped)一下也就是颠倒下特征矩阵的行和列)然后把输出反旋转回来,这样我们在前向传播进行卷积的时候,卷积核才是我们想要的方向
3.
2.
2、Sub-samplingLayers 子采样层 对于子采样层来说,有N个输入__ps,就有N个输出__ps,只是每个输出__p都变小了 down.表示一个下采样函数典型的操作一般是对输入图像的不同nxn的块的所有像素进行求和这样输出图像在两个维度上都缩小了n倍每个输出__p都对应一个属于自己的乘性偏置β和一个加性偏置b ComputingtheGra___nts 梯度计算 这里最困难的是计算灵敏度__p一旦我们得到这个了,那我们唯一需要更新的偏置参数β和b就可以轻而易举了(公式
(3))如果下一个卷积层与这个子采样层是全连接的,那么就可以通过BP来计算子采样层的灵敏度__ps 我们需要计算卷积核的梯度,所以我们必须找到输入__p中哪个patch对应输出__p的哪个像素这里,就是必须找到当前层的灵敏度__p中哪个patch对应与下一层的灵敏度__p的给定像素,这样才可以利用公式
(1)那样的δ递推,也就是灵敏度反向传播回来另外,需要乘以输入patch与输出像素之间连接的权值,这个权值实际上就是卷积核的权值(已旋转的) 在这之前,我们需要先将核旋转一下,让卷积函数可以实施互相关计算另外,我们需要对卷积边界进行处理,但在__tlab里面,就比较容易处理__tlab中全卷积会对缺少的输入像素补0 到这里,我们就可以对b和β计算梯度了首先,加性基b的计算和上面卷积层的一样,对灵敏度__p中所有元素加起来就可以了 而对于乘性偏置β,因为涉及到了在前向传播过程中下采样__p的计算,所以我们最好在前向的过程中保存好这些__ps,这样在反向的计算中就不用重新计算了我们定义这样,对β的梯度就可以用下面的方式计算
3.
2.
3、LearningCombinationsofFeature__ps 学__征__p的组合 大部分时候,通过卷积多个输入__ps,然后再对这些卷积值求和得到一个输出__p,这样的效果往往是比较好的在一些文献中,一般是人工选择哪些输入__ps去组合得到一个输出__p但我们这里尝试去让CNN在训练的过程中学习这些组合,也就是让网络自己学习挑选哪些输入__ps来计算得到输出__p才是最好的我们用αij表示在得到第j个输出__p的其中第i个输入__p的权值或者贡献这样,第j个输出__p可以表示为 需要满足约束 这些对变量αij的约束可以通过将变量αij表示为一个组无约束的隐含权值cij的soft__x函数来加强(因为soft__x的因变量是自变量的指数函数,他们的变化率会不同) 因为对于一个固定的j来说,每组权值cij都是和其他组的权值__的,所以为了方面描述,我们把下标j去掉,只考虑一个__p的更新,其他__p的更新是一样的过程,只是__p的索引j不同而已 Soft__x函数的导数表示为 这里的δ是Kroneckerdelta对于误差对于第l层变量αi的导数为 最后就可以通过链式规则去求得代价函数关于权值ci的偏导数了。