人工智能及识别技术ComputerKnowledgeandTechnology电脑知识第12卷第29期(2016年10月)基于卷积神经网络的人脸识别王嘉鑫,邹科文,陈义明(湖南农业大学信息科学技术学院,湖南长沙410128)摘要:为了了解为何卷积神经网络相比于其他神经网络有更好的特征学习能力,文章对卷积神经网络的近几年发展趋势以及基本结构进行介绍。进行了对于全连接的前向传播以及后向传播的推导,该推导用于阐述神经元的权值更新以及学习率。对卷积神经网络的调参以及参数的解析,阐述了如何对参数训练进行调整来使得小数据集有更好的识别率。关键词:深度学习;卷积神经网络;人脸识别;全连接推导;参数训练中图分类号:TP18文献标识码:A文章编号:1009-3044(2016)29-0187-04深度学习是2006年机器学习领域的泰斗,加拿大多伦多大学的G.E.Hinton教授[1-2]最先提出的理论,他和他的学生R.R.Salakhutdinov在science上发表了一篇论文[1]。这篇论文主要有两个观点:1)多隐层的人工神经网络拥有更为优势的特征学习能力,学习获得的特征对数据本身的描述更为清晰,使得可视化或分类更为有效;2)深度神经网络(DeepNeuralNetworks,DNN)所产生的在训练上的难点,可以通过“逐层初始化”(layer-wisepre-training)来有效进行解决,而逐层初始化使用的是无监督学习进行实现的。2012年6月,《纽约时报》展露了GoogleBrain项目,该项目是由斯坦福大学机器学习教授AndrewNg和大规模计算机系统的世界顶尖专家JeffDean共同主导,利用16000个CPUCore的并行计算平台来训练“深度神经网络”的机器学习模型,在图像识别和语音识别等的领域都获得了巨大的成功。2013年1月,在百度年会上,百度创始人兼CEO李彦宏宣布成立百度研究院InstituteofDeepLearning(IDL),第一个重点研究的方向就是深度学习。2013年4月,《MITTechnologyReview(麻省理工学院技术评论)》杂志将深度学习列为2013年十大突破性技术(BreakthroughTechnology)之首。深度神经网络是一种逐层贪婪无监督的学习方法,这是一种思想,需要依赖具体的模型去实现。常见的深度学习模型有受限玻尔兹曼机(RestrictedBoltzmannMachine,RBM)、深度信念网络[2](DeepBeliefNetworks,DBN)、堆栈式自动编码器(StackedAuto-encoder,SAE)[3]和卷积神经网络(ConvolutionalNeuralNet⁃works,CNN)[4-5]。1卷积神经网络卷积神经网络是一种包含卷积层的神经网络,20世纪60年代,Hubel和Wiesel在研究猫的脑皮层中,用于局部敏感和方向选择的神经元时,发现其特殊的网络结构可以有效降低反馈神经网络的复杂性。受研究的启发,模型模仿视皮层的简单细胞和复杂细胞交互处理视觉信息的过程,简单细胞负责响应获得不同方向的边缘信息,而复杂细胞则负责累积相近简单细胞来输出结果,这个结构被称为Hubel-Wiesel结构[6]。CNN包含多个Hubel-Wiesek结构阶段,每个阶段一般都包含模拟简单细胞卷积操作和模拟复杂细胞池化操作。CNN主要用来获取位移、所放以及其他形式旋转不变的二维图像数据的显著特征,因为图像的局部感知区域允许神经元或者处理单元访问到最底部基础特征。由于CNN特征的检测层通过训练数据来学习,避开了显式的特征抽取,而是在隐式地训练数据中学习;由于同一个特征映射面上,神经元权值相同。因此神经网络进行并行学习,这是卷积神经网络的一个优点。卷积神经网络在语音识别和图像处理方面有得天独厚的优势,是由于它的局部感知和权值共享结构使其更接近现实世界的生物神经网络,权值共享结构降低了神经网络的复杂性,这可以避免进行数据重建时,特征提取与分类过程的复杂度。2卷积神经网络的基本结构以卷积神经网络进行的人脸识别为例的CNN结构,如图1,不包括输入层,该网络有7层组成,其中包括3层卷积层、2层采样层、1层全连接层和1层输出层。图1中第一个卷积层有6个特征映射,每个特征映射都是28×28神经元阵列,每个神经元负责把5×5的区域使用卷积滤波器提取局部里的特征。下面介绍卷积层的局部感知域、权值共享以及采样层的池化操作。图1卷积神经网络用于人脸识别收稿日期:2016-08-25基金项目:湖南农业大学大学生创新性实验计划项目(XCX16090)作者简介:王嘉鑫(1993—),男,福建泉州人,本科,研究方向为java和机器学习;邹科文(1996—),男,湖南娄底人,本科,研究方向为java和机器学习;陈义明(1969—),男,湖南益阳人,副教授,博士,研究方向为人工智能。E-mail:eduf@dnzs.net.cn电脑知识Vol.12,No.29,October2016187DOI10.14004/j.cnki.ckt.2016.38132016-12-0109:32:03人工智能及识别技术ComputerKnowledgeandTechnology电脑知识第12卷第29期(2016年10月)2.1局部感知域局部感知域(localreceptivefields),普通神经网络会把输入层和隐含层直接进行全连接的设计,从整幅图像来计算相对较小的图像的特征是可行的,但是,如果是更大的图像,这将会非常耗时。卷积层是解决这类问题的一种简便的方法是输入单元和隐含单元间进行限制,使得每个隐含单元连接输入单元的一部分。对于输入图像,每个隐含单元可以连接输入图像的一小部分相邻区域。2.2权值共享权值共享(sharedweights)是一种节省训练开销的策略。输入层是32×32的人脸灰度图像矩阵,输出是其识别的结果,CNN复合了多个“卷积层”和采样层对输入的图像矩阵进项处理,而后在全连接层进行实现与输出目标矩阵之间的映射。每个卷积层和采样层都包含着多个特征映射(featuremap),每一个特征映射一个“平面”,平面由多个神经元构成,通过一种卷积的滤波器用来提取输入的一种特征。如图2,输入图是7×7×3的矩阵,使用的过滤器是3×3×3,卷积的步长为2,每个进行卷积的矩阵是3×3×3,分别平移,通过过滤器后计算获得3×3×3的输出图。图2卷积的滤波器示例2.3池化池化(pooling)也称下采样(down-samples),其目的是为减少特征映射,当在面临计算量非常大的时候,一个拥有过多特征输入的分类器不易形成,并且容易过拟合。由于卷积后的特征是一种静态属性,所以可能在两个不同图像区域的特征极可能一样,因此,描述大图像的时候可以对不同位置特征使用聚合统计。相对于卷积运算,池化常用的运算一般有:最大池化(MaxPooling)、均值池化(MeanPooling)、高斯池化和可训练池化。最常见的池化规模2×2,步长为2,如图3所示,输入的每个2×2进行下采样。每个MAX操作对四个数操作后分别获得一个值,池化操作的结果是使其深度大小不变。图3最大池化示例3全连接的反向传播算法推导在经典的CNN中,一般前几层都是卷积和下采样交替,在靠近输出层时的最后一些层,是全连接的一维网络。这时候,将所有二维的特征映射转化为全连接的一维网络输入。在准备将最终二维特征映射输入到一维网络中的时候,最简便的方法就是把所有输出的特征映射变成一个长的输入向量连接起来,便是全连接的作用。在此之前,参考了一些经典的反向传播算法[7]。3.1前向传播在下面的推导公式里,前向传播(FeedforwardPass)采用的是平方误差代价函数。讨论的是多类问题[9],一共有c类,N个训练样本。EN=12∑n=1N∑k=1c(tnk-ynk)2tnk表示的第n个样本的标签对应的第k维。ynk表示第n个样本对应的第k个输出。对于多类问题,只有在输入对应类的输出节点时,输出才为正,其他类的位或者结点为零或者负数,这个问题主要取决于输出层的激活函数,sigmoid为0,tanh就是-1。由于在全部的训练集误差表示的是每个训练样本误差的总和,所以先考虑对一个样本的反向传播(BackpropagationPass)。因此对于第n个样本的误差,可以表示为:En=12∑k=1c(tnk-ynk)2=12||tn-yn||22传统的全连接层中,需要根据BP规则来计算代价函数E对于网络的每个权值的偏导数。公式里用|来对应当前层,因此当前层的输出可以表示为:xe=f()ue,withue=Wexe-1+be输出激活函数f().可以有许多种,但是一般是sigmoid函数和双曲线正切函数这两种。sigmoid是将输出压缩成[0,1],因此在输出平均值时通常是趋于0[8]。所以如果将训练数据进行归一化成零均值与方差为1,那么可以在梯度下降的时候增加收敛性。双曲线正切函数对于归一化数据集也是不错的选择。3.2反向传播反向传播回来的误差,可以用来当做每个神经元的基的灵敏度(sensitivities),也就是误差对基bias的变化率,定义如下:∂E∂b=∂E∂u∂u∂b=δ因为∂u∂b=1,所以∂E∂b=∂E∂u=δ,可以说明,bias基的灵敏度∂E∂b=δ和误差E对一个结点的所有输入u的偏导∂E∂u是相等的。这个导数可以让高层误差通过反向传播到达底层。反向传播用的如下关系公式:δe=(We+1)Tδe+1оf'()ue“о”代表的是每个元素相乘。对于输出层神经元的灵敏度各不一样:188人工智能及识别技术ComputerKnowledgeandTechnology电脑知识第12卷第29期(2016年10月)δL=f'()uLо()yn-tn最后,对所有神经元使用delta(即δ)规则进行更新。具体说,就是得到给定的神经元的输入,而后用这个神经元的delte进行缩放。用向量形式表示就是对于第L层,误差对该层组合为矩阵的每个权值的导数是该层的输入(上一层的输出)与该层的灵敏度(把该层的每个神经元的δ组合成向量形式)的叉乘。然后用获得的偏导数乘以负学习率得到该层神经元的权值更新:∂E∂We=xe-1()δeT∆We=-η∂E∂We相对于bias基,其更新表达式一样。相对于每一个权值(W)ij,都会有相对应的特定的学习率ηij。4卷积神经网络的参数训练本文卷积神经网络的训练是基于Python、矩阵计算numpy、开发工具theano和图像库PIL开发,采用的CNN模型类似LeNet5的模型,使用的数据库是纽约大学一个较小的人脸数据库OlivettiFaces,由40个人,每人10张共400张图片构成,每张图片灰度级为8位,每个像素其灰度大小在0-255之间。实验实现人脸识别功能时,模型的误差降低到了5%以下。4.1样本分类在运行CNN算法之前,需要用PIL先把图片转化成数组,然后进行图片的分类。一般我们会将原始数据分成三类,训练数据(training_set)、验证数据(validation_set)()、测试数据(test⁃ing_set),样本数量分别为320、40和40,它们的label为0~39,对应的是40个人。4.2基本构件的准备要组建CNN模型,必须先定义LeNetConvPoolLayer(卷积+子采样层)、InnerProductLayer(隐含层)、LogisticRegression(输出层)这三种layer。本文训练的实现模型使用的是LeNet5,有两个卷积层,每个卷积层后面跟着一个子采样层,代码中将卷积层和子采样层结合在一起,在卷积后的输出直接作为子采样层的