版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
深度学习算法的研究与实现-背景介绍人工智能很久以来就是人类最美好的梦想之一。虽然计算机技术已经取得了长足的进步,但是到目前为止,还没有一台电脑能产生“自我”的意识。图灵在1950年的论文里,提出图灵试验的设想,即,隔墙对话,你将不知道与你谈话的,是人还是电脑。这无疑给计算机,尤其是人工智能,预设了一个很高的期望值。但是半个世纪过去了,人工智能的进展,远远没有达到图灵试验的标准。这不仅让多年翘首以待的人们,心灰意冷,认为人工智能是忽悠,相关领域是“伪科学”。自2006年以来,在机器学习领域,取得了突破性的进展。图灵试验,至少不是那么可望而不可及了。至于技术手段,不仅仅依赖于云计算对大数据的并行处理能力,而且依赖于算法。这个算法就是深度学习,借助于DeepLearning算法,人类终于找到了如何处理“抽象概念”这个亘古难题的方法,下面本文详细介绍一下机器学习的发展背景。人工智能概念图机器学习是一门专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能的学科。机器能否像人类一样能具有学习能力呢?1959年美国的塞缪尔(Samuel)设计了一个下棋程序,这个程序具有学习能力,它可以在不断的对弈中改善自己的棋艺。4年后,这个程序战胜了设计者本人。又过了3年,这个程序战胜了美国一个保持8年之久的常胜不败的冠军。这个程序向人们展示了机器学习的能力。机器学习虽然发展了几十年,但还是存在很多没有良好解决的问题,目前我们通过机器学习去解决问题的思路大致如下:通过传感器(例如CMOS)来获得数据预处理、特征提取、特征选择推理、预测或者识别最后一个部分,也就是机器学习的部分,绝大部分的工作是在这方面做的,存在很多的和研究。而中间的三部分,概括起来就是特征表达。良好的特征表达,对最终算法的准确性起了非常关键的作用,而且系统主要的计算和测试工作都耗在这一大部分。但这块实际中一般都是人工完成的,靠人工提取特征。机器学习在发展的过程中出现了不少强大的特征,具有大小、尺度和旋转等的不变性以及可区分性。例如SIFT是局部图像特征描述子研究领域一项里程碑式的工作。由于SIFT对尺度、旋转以及一定视角和光照变化等图像变化都具有不变性,并且SIFT具有很强的可区分性,的确让很多问题的解决变为可能,但它也不是万能的。然而,手工地选取特征是一件非常费力的方法,能不能选取好很大程度上靠经验和运气,而且它的调节需要大量的时间。既然手工选取特征不太好,那么能不能自动地学习一些特征呢?答案是能,深度学习就是用来干这个事情的,这也就是深度学习提出的背景。研究过程与发展现状研究过程浅层学习和深度学习浅层学习是机器学习的第一次浪潮。20世纪80年代末期,用于人工神经网络的反向传播算法的发明,给机器学习带来了希望,掀起了基于统计模型的机器学习热潮。这个热潮一直持续到今天。人们发现,利用BP算法可以让一个人工神经网络模型从大量训练样本中学习统计规律,从而对未知事件做预测。这种基于统计的机器学习方法比起过去基于人工规则的系统,在很多方面显出优越性。这个时候的人工神经网络,虽也被称作多层感知机,但实际是种只含有一层隐含层节点的浅层模型。20世纪90年代,各种各样的浅层机器学习模型相继被提出,例如支撑向量机、Boosting、最大熵方法等。这些模型的结构基本上可以看成带有一层隐层节点(如SVM、Boosting),或没有隐层节点。这些模型无论是在理论分析还是应用中都获得了巨大的成功。相比之下,由于理论分析的难度大,训练方法又需要很多经验和技巧,这个时期浅层人工神经网络反而相对沉寂。深度学习是机器学习的第二次浪潮。2006年,加拿大多伦多大学教授、机器学习领域的泰斗GeoffreyHinton和他的学生在Science上发表了一篇文章,开启了深度学习在学术界和工业界的浪潮。这篇文章有两个主要观点:1)多隐层的人工神经网络具有优异的特征学习能力,学习得到的特征对数据有更本质的刻画,从而有利于可视化或分类;2)深度神经网络在训练上的难度,可以通过“逐层初始化”来有效克服,在这篇文章中,逐层初始化是通过无监督学习实现的。当前多数分类、回归等学习方法为浅层结构算法,其局限性在于有限样本和计算单元情况下对复杂函数的表示能力有限,针对复杂分类问题其泛化能力受到一定制约。深度学习可通过学习一种深层非线性网络结构,实现复杂函数逼近,表征输入数据分布式表示,并展现了强大的从少数样本集中学习数据集本质特征的能力。深度学习的实质,是通过构建具有多隐层的机器学习模型和海量的训练数据,来学习更有用的特征,从而最终提升分类或预测的准确性。因此,“深度模型”是手段,“特征学习”是目的。区别于传统的浅层学习,深度学习的不同在于:1)强调了模型结构的深度,通常有5层、6层,甚至10多层的隐层节点;2)明确突出了特征学习的重要性,也就是说,通过逐层特征变换,将样本在原空间的特征表示变换到一个新特征空间,从而使分类或预测更加容易。与人工规则构造特征的方法相比,利用大数据来学习特征,更能够刻画数据的丰富内在信息。深度学习与人工神经网络深度学习是机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。深度学习是无监督学习的一种。深度学习的概念源于人工神经网络的研究。含多隐层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。深度学习本身算是机器学习的一个分支,简单可以理解为神经网络的发展。大约二三十年前,神经网络曾经是机器学习领域特别火热的一个方向,但是后来确慢慢淡出了,原因包括以下几个方面:1)比较容易过拟合,参数比较难调,而且需要不少技巧和经验;2)训练速度比较慢,在层次比较少(小于等于3)的情况下效果并不比其它方法更优;所以中间有大约20多年的时间,神经网络被关注很少,这段时间基本上是SVM和Boosting算法的天下。但是,一个痴心的老先生Hinton,他坚持了下来,并最终提成了一个实际可行的深度学习框架。深度学习与传统的神经网络之间有相同的地方也有很多不同。二者的相同在于深度学习采用了神经网络相似的分层结构,系统由包括输入层、隐层(多层)、输出层组成的多层网络,只有相邻层节点之间有连接,同一层以及跨层节点之间相互无连接,每一层可以看作是一个Logistic回归模型;这种分层结构,是比较接近人类大脑的结构的。而为了克服神经网络训练中的问题,深度学习采用了与神经网络很不同的训练机制。传统神经网络中,采用的是反向传播的方式进行,简单来讲就是采用迭代的算法来训练整个网络,随机设定初值,计算当前网络的输出,然后根据当前输出和标签之间的差去改变前面各层的参数,直到收敛(整体是一个梯度下降法)。而深度学习整体上是一个逐层的训练机制。这样做的原因是因为,如果采用反向传播的机制,对于一个深度网络(7层以上),残差传播到最前面的层已经变得太小,出现所谓的梯度扩散。发展现状由于深度学习能够很好地解决一些复杂问题,近年来许多研究人员对其进行了深入研究,出现了许多有关深度学习研究的新进展。下面分别从初始化方法、网络层数和激活函数的选择、模型结构、学习算法和实际应用这四个方面对近几年深度学习研究的新进展进行介绍。初始化方法、网络层数和激活函数的选择研究人员试图搞清网络初始值的设定与学习结果之间的关系。Erhan等人在轨迹可视化研究中指出即使从相近的值开始训练深度结构神经网络,不同的初始值也会学习到不同的局部极值,同时发现用无监督预训练初始化模型的参数学习得到的极值与随机初始化学习得到的极值差异比较大,用无监督预训练初始化模型的参数学习得到的模型具有更好的泛化误差。Bengio与Krueger等人指出用特定的方法设定训练样例的初始分布和排列顺序可以产生更好的训练结果,用特定的方法初始化参数,使其与均匀采样得到的参数不同,会对梯度下降算法训练的结果产生很大的影响。Glorot等人指出通过设定一组初始权值使得每一层深度结构神经网络的Ja-cobian矩阵的奇异值接近于1,在很大程度上减小了监督深度结构神经网络和有预训练过程设定初值的深度结构神经网络之间的学习结果差异。另外,用于深度学习的学习算法通常包含许多超参数,文献[2]给出了这些超参数的选择指导性意见,推荐一些常用的超参数,尤其适用于基于反向传播的学习算法和基于梯度的优化算法中;并讨论了如何解决有许多可调超参数的问题,描述了实际用于有效训练常用的大型深度结构神经网络的超参数的影响因素,指出深度学习训练中存在的困难。选择不同的网络隐层数和不同的非线性激活函数会对学习结果产生不同的影响。Glorot研究了隐层非线性映射关系的选择和网络的深度相互影响的问题,讨论了随机初始化的标准梯度下降算法用于深度结构神经网络学习得到不好的学习性能的原因。Glorot观察不同非线性激活函数对学习结果的影响,得到LogisticS型激活单元的均值会驱使顶层和隐层进入饱和,因而LogisticS型激活单元不适合用随机初始化梯度算法学习深度结构神经网络;并据此提出了标准梯度下降算法的一种新的初始化方案来得到更快的收敛速度,为理解深度结构神经网络使用和不使用无监督预训练的性能差异作出了新的贡献。Bengio从理论上说明深度学习结构的表示能力随着神经网络深度的增加以指数的形式增加,但是这种增加的额外表示能力会引起相应局部极值数量的增加,使得在其中寻找最优值变得困难。模型结构DBN的结构及其变种采用二值可见单元和隐单元RBM作为结构单元的DBN,在MNIST等数据集上表现出很好的性能。近几年,具有连续值单元的RBM,如mcRBM、mPoT模型和spike-and-slabRBM等已经成功应用。Spike-and-slabRBM中Spike表示以0为中心的离散概率分布,slab表示在连续域上的稠密均匀分布,可以用吉布斯采样对spike-and-slabRBM进行有效推断,得到优越的学习性能。和积网络深度学习最主要的困难是配分函数的学习,如何选择深度结构神经网络的结构使得配分函数更容易计算是一个很困难的问题。Poon等人提出一种新的深度模型结构,和积网络(SPN),引入多层隐单元表示配分函数,使得配分函数更容易计算。SPN是有根节点的有向无环图,图中的叶节点为变量,中间节点执行和运算与积运算,连接节点的边带有权值,它们在Caltech-101和Olivetti两个数据集上进行实验证明了SPN的性能优于DBN和最近邻方法。卷积神经网络文献[4]研究了用生成式子抽样单元组成的卷积神经网络,在MNIST数字识别任务和Caltech-101目标分类基准任务上进行实验,显示出非常好的学习性能。Huang等人提出一种新的卷积学习模型,即局部卷积RBM,利用对象类中的总体结构学习特征,不假定图像具有平稳特征,在实际人脸数据集上进行实验,得到性能很好的实验结果。学习算法深度费希尔映射方法Wong等人提出一种新的特征提取方法,正则化深度费希尔映射(RDFM)方法,学习从样本空间到特征空间的显式映射,根据Fisher准则用深度结构神经网络提高特征的区分度。深度结构神经网络具有深度非局部学习结构,从更少的样本中学习变化很大的数据集中的特征,显示出比核方法更强的特征识别能力,同时RDFM方法的学习过程由于引入正则化因子,解决了学习能力过强带来的过拟合问题。在各种类型的数据集上进行实验,得到的结果说明了在深度学习微调阶段运用无监督正则化的必要性。非线性变换方法该变换方法使得多层感知器(MLP)网络的每个隐神经元的输出具有零输出和平均值上的零斜率,使学习MLP变得更容易。将学习整个输入输出映射函数的线性部分和非线性部分尽可能分开,用Shortcut权值建立线性映射模型,令Fisher信息阵接近对角阵,使得标准梯度接近自然梯度。通过实验证明非线性变换方法的有效性,该变换使得基本随机梯度学习与当前的学习算法在速度上不相上下,并有助于找到泛化性能更好的分类器。用这种非线性变换方法实现的深度无监督自编码模型进行图像分类和学习图像的低维表示的实验,说明这些变换有助于学习深度至少达到五个隐层的深度结构神经网络,证明了变换的有效性,提高了基本随机梯度学习算法的速度,有助于找到泛化性更好的分类器。稀疏编码对称机算法Ranzato等人提出一种新的有效的无监督学习算法,稀疏编码对称机(SESM),能够在无须归一化的情况下有效产生稀疏表示。SESM的损失函数是重构误差和稀疏罚函数的加权总和,基于该损失函数比较和选择不同的无监督学习机,提出一种迭代在线学习算法,并在理论和实验上将SESM与RBM和PCA进行比较,在手写体数字识别MNIST数据集和实际图像数据集上进行实验,表明该方法的优越性。迁移学习算法在许多常见学习场景中训练和测试数据集中的类标签不同,必须保证训练和测试数据集中的相似性进行迁移学习。Mesnil等人研究了用于无监督迁移学习场景中学习表示的不同种类模型结构,将多个不同结构的层堆栈使用无监督学习算法用于五个学习任务,并研究了用于少量已标记训练样本的简单线性分类器堆栈深度结构学习算法。Bengio研究了无监督迁移学习问题,讨论了无监督预训练有用的原因,如何在迁移学习场景中利用无监督预训练,以及在什么情况下需要注意从不同数据分布得到的样例上的预测问题。学习率自适应方法学习率自适应方法可用于提高深度结构神经网络训练的收敛性并且去除超参数中的学习率参数,包括全局学习率、层次学习率、神经元学习率和参数学习率等。最近研究人员提出了一些新的学习率自适应方法,如Duchi等人提出的自适应梯度方法和Schaul等人提出的学习率自适应方法;Hinton提出了收缩学习率方法使得平均权值更新在权值大小的1/1000数量级上;LeRoux等人提出自然梯度的对角低秩在线近似方法,并说明该算法在一些学习场景中能加速训练过程深度学习基本原理深度学习的基本思想假设我们有一个系统S,它有N层(S1,…,SN),它的输入是I,输出是O,如果输出O等于输入I,即输入I经过这个系统变化之后没有任何的信息损失,保持了不变,这意味着输入I经过每一层Si都没有任何的信息损失,即在任何一层Si,它都是原有信息(即输入I)的另外一种表示。我们需要自动地学习特征,假设我们有一堆输入I(如一堆图像或者文本),假设我们设计了一个系统S(有N层),我们通过调整系统中参数,使得它的输出仍然是输入I,那么我们就可以自动地获取得到输入I的一系列层次特征。对于深度学习来说,其思想就是对堆叠多个层,也就是说这一层的输出作为下一层的输入。通过这种方式,就可以实现对输入信息进行分级表达了。另外,前面是假设输出严格地等于输入,这个限制太严格,我们可以略微地放松这个限制,例如我们只要使得输入与输出的差别尽可能地小即可,这个放松会导致另外一类不同的DeepLearning方法。深度学习训练过程如果对所有层同时训练,时间复杂度会太高;如果每次训练一层,偏差就会逐层传递。这会面临跟上面监督学习中相反的问题,会严重欠拟合(因为深度网络的神经元和参数太多了)。2006年,Hinton提出了在非监督数据上建立多层神经网络的一个有效方法,简单的说,分为两步,一是每次训练一层网络,二是调优,使原始表示X向上生成的高级表示R和该高级表示R向下生成的X’尽可能一致。方法是:1)首先逐层构建单层神经元,这样每次都是训练一个单层网络。2)当所有层训练完后,Hinton使用Wake-Sleep算法进行调优。将除最顶层的其它层间的权重变为双向的,这样最顶层仍然是一个单层神经网络,而其它层则变为了图模型。向上的权重用于“认知”,向下的权重用于“生成”。然后使用Wake-Sleep算法调整所有的权重。让认知和生成达成一致,也就是保证生成的最顶层表示能够尽可能正确的复原底层的结点。比如顶层的一个结点表示人脸,那么所有人脸的图像应该激活这个结点,并且这个结果向下生成的图像应该能够表现为一个大概的人脸图像。DeepLearning训练过程具体如下:1)使用自下上升非监督学习(就是从底层开始,一层一层的往顶层训练):采用无标定数据(有标定数据也可)分层训练各层参数,这一步可以看作是一个无监督训练过程,是和传统神经网络区别最大的部分(这个过程可以看作是特征学习过程):体的,先用无标定数据训练第一层,训练时先学习第一层的参数(这一层可以看作是得到一个使得输出和输入差别最小的三层神经网络的隐层),由于模型容量的限制以及稀疏性约束,使得得到的模型能够学习到数据本身的结构,从而得到比输入更具有表示能力的特征;在学习得到第N-1层后,将N-1层的输出作为第N层的输入,训练第N层,由此分别得到各层的参数;2)自顶向下的监督学习(就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调):基于第一步得到的各层参数进一步调整个多层模型的参数,这一步是一个有监督训练过程;第一步类似神经网络的随机初始化初值过程,由于深度学习的第一步不是随机初始化,而是通过学习输入数据的结构得到的,因而这个初值更接近全局最优,从而能够取得更好的效果;所以深度学习效果好很大程度上归功于第一步的特征学习过程。自动编码机深度学习最简单的一种方法是利用人工神经网络的特点,人工神经网络(ANN)本身就是具有层次结构的系统,如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层中的权重。自然地,我们就得到了输入I的几种不同表示(每一层代表一种表示),这些表示就是特征。自动编码器就是一种尽可能复现输入信号的神经网络。为了实现这种复现,自动编码器就必须捕捉可以代表输入数据的最重要的因素,就像PCA那样,找到可以代表原信息的主要成分。具体过程简单的说明如下:1)给定无标签数据,用非监督学习学习特征:在我们之前的神经网络中,如第一个图,我们输入的样本是有标签的,即(input,target),这样我们根据当前输出和target(label)之间的差去改变前面各层的参数,直到收敛。但现在我们只有无标签数据,也就是右边的图。那么这个误差怎么得到呢?如上图,我们将input输入一个encoder编码器,就会得到一个code,这个code也就是输入的一个表示,那么我们怎么知道这个code表示的就是input呢?我们加一个decoder解码器,这时候decoder就会输出一个信息,那么如果输出的这个信息和一开始的输入信号input是很像的(理想情况下就是一样的),那很明显,我们就有理由相信这个code是靠谱的。所以,我们就通过调整encoder和decoder的参数,使得重构误差最小,这时候我们就得到了输入input信号的第一个表示了,也就是编码code了。因为是无标签数据,所以误差的来源就是直接重构后与原输入相比得到。2)通过编码器产生特征,然后训练下一层。这样逐层训练:那上面我们就得到第一层的code,我们的重构误差最小让我们相信这个code就是原输入信号的良好表达了,或者牵强点说,它和原信号是一模一样的(表达不一样,反映的是一个东西)。那第二层和第一层的训练方式就没有差别了,我们将第一层输出的code当成第二层的输入信号,同样最小化重构误差,就会得到第二层的参数,并且得到第二层输入的code,也就是原输入信息的第二个表达了。其他层就同样的方法炮制就行了(训练这一层,前面层的参数都是固定的,并且他们的decoder已经没用了,都不需要了)。3)有监督微调:经过上面的方法,我们就可以得到很多层了。至于需要多少层(或者深度需要多少,这个目前本身就没有一个科学的评价方法)需要自己试验调了。每一层都会得到原始输入的不同的表达。当然了,我们觉得它是越抽象越好了,就像人的视觉系统一样。到这里,这个AutoEncoder还不能用来分类数据,因为它还没有学习如何去连结一个输入和一个类。它只是学会了如何去重构或者复现它的输入而已。或者说,它只是学习获得了一个可以良好代表输入的特征,这个特征可以最大程度上代表原输入信号。那么,为了实现分类,我们就可以在AutoEncoder的最顶的编码层添加一个分类器(例如罗杰斯特回归、SVM等),然后通过标准的多层神经网络的监督训练方法(梯度下降法)去训练。也就是说,这时候,我们需要将最后层的特征code输入到最后的分类器,通过有标签样本,通过监督学习进行微调,这也分两种,一个是只调整分类器(黑色部分):另一种:通过有标签样本,微调整个系统:(如果有足够多的数据,这个是最好的。end-to-endlearning端对端学习)一旦监督训练完成,这个网络就可以用来分类了。神经网络的最顶层可以作为一个线性分类器,然后我们可以用一个更好性能的分类器去取代它。在研究中可以发现,如果在原有的特征中加入这些自动学习得到的特征可以大大提高精确度,甚至在分类问题中比目前最好的分类算法效果还要好!卷积神经网络卷积神经网络(CNN)是人工神经网络的一种,已成为当前语音分析和图像识别领域的研究热点。它的权值共享网络结构使之更类似于生物神经网络,降低了网络模型的复杂度,减少了权值的数量。该优点在网络的输入是多维图像时表现的更为明显,使图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建过程。卷积网络是为识别二维形状而特殊设计的一个多层感知器,这种网络结构对平移、比例缩放、倾斜或者共他形式的变形具有高度不变性。CNNs是受早期的延时神经网络(TDNN)的影响。延时神经网络通过在时间维度上共享权值降低学习复杂度,适用于语音和时间序列信号的处理。CNNs是第一个真正成功训练多层网络结构的学习算法。它利用空间关系减少需要学习的参数数目以提高一般前向BP算法的训练性能。CNNs作为一个深度学习架构提出是为了最小化数据的预处理要求。在CNN中,图像的一小部分(局部感受区域)作为层级结构的最低层的输入,信息再依次传输到不同的层,每层通过一个数字滤波器去获得观测数据的最显著的特征。这个方法能够获取对平移、缩放和旋转不变的观测数据的显著特征,因为图像的局部感受区域允许神经元或者处理单元可以访问到最基础的特征,例如定向边缘或者角点。卷积神经网络的结构卷积神经网络是一个多层的神经网络,每层由多个二维平面组成,而每个平面由多个独立神经元组成。卷积神经网络示意图输入图像通过和三个可训练的滤波器和可加偏置进行卷积,卷积后在C1层产生三个特征映射图,然后特征映射图中每组的四个像素再进行求和,加权值,加偏置,通过一个Sigmoid函数得到三个S2层的特征映射图。这些映射图再进过滤波得到C3层。这个层级结构再和S2一样产生S4。最终,这些像素值被光栅化,并连接成一个向量输入到传统的神经网络,得到输出。一般地,C层为特征提取层,每个神经元的输入与前一层的局部感受野相连,并提取该局部的特征,一旦该局部特征被提取后,它与其他特征间的位置关系也随之确定下来;S层是特征映射层,网络的每个计算层由多个特征映射组成,每个特征映射为一个平面,平面上所有神经元的权值相等。特征映射结构采用影响函数核小的sigmoid函数作为卷积网络的激活函数,使得特征映射具有位移不变性。此外,由于一个映射面上的神经元共享权值,因而减少了网络自由参数的个数,降低了网络参数选择的复杂度。卷积神经网络中的每一个特征提取层(C-层)都紧跟着一个用来求局部平均与二次提取的计算层(S-层),这种特有的两次特征提取结构使网络在识别时对输入样本有较高的畸变容忍能力。参数减少与权值共享CNN一个牛逼的地方就在于通过感受野和权值共享减少了神经网络需要训练的参数的个数。卷积神经网络减少参数示意图如图5-2左,如果我们有1000x1000像素的图像,有1百万个隐层神经元,那么他们全连接的话(每个隐层神经元都连接图像的每一个像素点),就有1012个连接,也就是1012个权值参数。然而图像的空间联系是局部的,就像人是通过一个局部的感受野去感受外界图像一样,每一个神经元都不需要对全局图像做感受,每个神经元只感受局部的图像区域,然后在更高层,将这些感受不同局部的神经元综合起来就可以得到全局的信息了。这样,我们就可以减少连接的数目,也就是减少神经网络需要训练的权值参数的个数了。如图5-2右:假如局部感受野是10x10,隐层每个感受野只需要和这10x10的局部图像相连接,所以1百万个隐层神经元就只有一亿个连接,即108个参数。比原来减少了四个数量级,这样训练起来就没那么费力了。我们知道,隐含层的每一个神经元都连接10x10个图像区域,也就是说每一个神经元存在10x10=100个连接权值参数。那如果我们每个神经元这100个参数是相同的呢?也就是说每个神经元用的是同一个卷积核去卷积图像。这样我们就只有100个参数了,这就是权值共享,那问题就是这样做靠谱吗?假如一种滤波器,也就是一种卷积核就是提出图像的一种特征,例如某个方向的边缘。那么我们需要提取不同的特征,怎么办,加多几种滤波器不就行了吗?对了。所以假设我们加到100种滤波器,每种滤波器的参数不一样,表示它提出输入图像的不同特征,例如不同的边缘。这样每种滤波器去卷积图像就得到对图像的不同特征的放映,我们称之为FeatureMap。所以100种卷积核就有100个FeatureMap。这100个FeatureMap就组成了一层神经元。这时这一层有1万个参数。卷积神经网络权值共享示意图需要注意的一点是,上面的讨论都没有考虑每个神经元的偏置部分。所以权值个数需要加1。这个也是同一种滤波器共享的。卷积神经网络总结总之,卷积网络的核心思想是将:局部感受野、权值共享(或者权值复制)以及时间或空间亚采样这三种结构思想结合起来获得了某种程度的位移、尺度、形变不变性。CNNs中这种层间联系和空域信息的紧密关系,使其适于图像处理和理解。而且,其在自动提取图像的显著特征方面还表现出了比较优的性能。在一些例子当中,Gabor滤波器已经被使用在一个初始化预处理的步骤中,以达到模拟人类视觉系统对视觉刺激的响应。在目前大部分的工作中,研究者将CNNs应用到了多种机器学习问题中,包括人脸识别,文档分析和语言检测等。为了达到寻找视频中帧与帧之间的相干性的目的,目前CNNs通过一个时间相干性去训练,但这个不是CNNs特有的。应用领域语音识别语音识别系统长期以来,描述每个建模单元的统计概率模型时候,大都是采用的混合高斯模型(GMM)。这种模型由于估计简单,适合海量数据训练,同时有成熟的区分度训练技术支持,长期以来,一直在语音识别应用中占有垄断性地位。但是这种混合高斯模型本质上是一种浅层网络建模,不能够充分描述特征的状态空间分布。另外,GMM建模的特征维数一般是几十维,不能充分描述特征之间的相关性。最后GMM建模本质上是一种似然概率建模,虽然区分度训练能够模拟一些模式类之间的区分性,但是能力有限。微软研究院的语音识别专家Li和Dong从2009开始和深度学习专家Hinton合作。2011微软基于深度神经网络的语音识别研究取得成果,彻底改变了语音识别原有的技术框架。采用深度神经网络后,可以充分描述特征之间的相关性,可以把连续多帧的语音特征并在一起,构成一个高维特征。最终的深度神经网络可以采用高维特征训练来模拟的。由于深度神经网络采用模拟人脑的多层结果,可以逐级地进行信息特征抽取,最终形成适合模式分类的较理想特征。这种多层结构和人脑处理语音图像信息的时候,是有很大的相似性的。深度神经网络的建模技术,在实际线上服务时,能够无缝地和传统的语音识别技术相结合,在不引起任何系统额外耗费情况下大幅度地提升了语音识别系统的识别率。其在线的使用方法具体如下:在实际解码过程中,声学模型仍然是采用传统的HMM模型,语音模型仍然是采用传统的统计语言模型,解码器仍然是采用传统的动态WFST解码器。但是在声学模型的输出分布计算时,完全用神经网络的输出后验概率除以一个先验概率来代替传统HMM模型中的GMM的输出似然概率。百度实践中发现,采用DNN进行声音建模的语音识别系统的相比于传统的GMM语音识别系统而言,相对误识别率能降低25%。最终在2012年11月的时候,上线了第一款基于DNN的语音搜索系统,成为最早采用DNN技术进行商业语音服务的公司之一。国际上谷歌也采用了深度神经网络进行声音建模,和百度一起是最早的突破深度神经网络工业化应用的企业之一。但是谷歌产品中采用的深度神经网络有4~5层,而百度采用的深度神经网络多达9层。这种结构差异的核心其实是百度更好的解决了深度神经网络在线计算的技术难题,从而百度线上产品可以采用更复杂的网络模型。这将对于未来拓展海量语料的DNN模型训练有更大的优势。图像识别图像是深度学习最早尝试的应用领域。早在1989,Lecun(现纽约大学教授)和他的同事们就发表了卷积神经网络(CNN)的工作。CNN是一种带有卷积结构的深度神经网络,通常至少有2个非线性可训练的卷积层、2个非线性的固定卷积层(又叫PoolingLayer)和1个全连接层,一共至少5个隐含层。CNN的结构受到著名的Hubel-Wiesel生物视觉模型的启发,尤其是模拟视觉皮层V1和V2层中simplecell和complexcell的行为。在很长时间里,CNN虽然在小规模的问题上,比如说手写数字,取得当时世界最好结果,但一直没有取得巨大成功。这主要原因是CNN在大规模图像上效果不好,比如像素很多的自然图片内容理解,所以没有得到计算机视觉领域的足够重视。这个情况一直持续到2012年10月,Hinton和他的两个学生在著名的ImageNet问题上用更深的CNN取得世界最好结果,使得图像识别大踏步前进。在Hinton的模型里,输入就是图像的像素,没有用到任何的人工特征。这个惊人的结果为什么在之前没有发生?原因当然包括算法的提升,比如Dropout等防止过拟合技术,但最重要的是GPU带来的计算能力提升和更多的训练数据。百度在2012将深度学习技术成功应用于自然图像OCR识别和人脸识别等问题,并推出相应的桌面和移动搜索产品,在2013,深度学习模型被成功应用于一般图片的识别和理解。从百度的经验来看,深度学习应用于图像识别不但大大提升了准确性,而且避免了人工特征抽取的时间消耗,从而大大提高了在线计算效率。可以很有把握地说,从现在开始,深度学习将取代人工特征+机器学习的方法而逐渐成为主流图像识别方法。自然语言处理除了语音和图像,深度学习的另一个应用领域问题自然语言处理(NLP)。经过几十年的发展,基于统计的模型已经成为NLP的主流,但是作为统计方法之一的人工神经网络在NLP领域几乎没有受到重视。加拿大蒙特利尔大学教授Bengio等于2003提出用embedding的方法将词映射到一个矢量表示空间,然后用非线性神经网络来表示N-Gram模型。世界上最早的深度学习用于NLP的研究工作诞生于NECLabsAmerica,其研究员Collobert和Weston从2008开始采用embedding和多层一维卷积的结构,用于4个典型NLP问题。值得注意的是,他们将同一个模型用于不同任务,都能取得与StateOfTheArt相当的准确率。最近以来,斯坦福大学教授Manning等人在深度学习用于NLP的工作也值得关注。总的来说,深度学习在NLP上取得的进展没有在语音图像上那么令人影响深刻。一个很有意思的悖论是:相比于声音和图像,语言是唯一的非自然信号,是完全由人类大脑产生和处理的符号系统,但是模仿人脑结构的人工神经网络确似乎在处理自然语言上没有显现明显优势?我们相信深度学习在NLP方面有很大的探索空间。从2006图像深度学习成为学术界热门课题到2012年10月Hinton在ImageNet上的重大突破,经历了6年时间,我们需要有足够耐心。搜索广告CTR预估搜索广告是搜索引擎的主要变现方式,而按点击付费(CPC)又是其中被最广泛应用的计费模式。在CPC模式下,预估的CTR越准确,点击率就会越高,收益就越大。通常,搜索广告的CTR是通过机器学习模型预估得到。提高CTR的准确性,是提升搜索公司、广告主、搜索用户三方利益的最佳途径。传统上,谷歌、百度等搜索引擎公司以LogisticRegression(LR)作为预估模型。而从2012开始,百度开始意识到模型的结构对广告CTR预估的重要性:使用扁平结构的LR严重限制了模型学习与抽象特征的能力。为了突破这样的限制,百度尝试将DNN作用于搜索广告,而这其中最大的挑战在于当前的计算能力还无法接受1011级别的原始广告特征作为输入。作为解决,在百度的DNN系统里,特征数从1011数量级被降到了103,从而能被DNN正常的学习。这套深度学习系统已于2013年5月开始服务于百度搜索广告系统,每天为数亿网民使用。DNN在搜索广告系统中的应用还远远没到成熟,其中DNN与迁移学习的结合将可能是一个令人振奋的方向。使用DNN,未来的搜索广告将可能借助网页搜索的结果优化特征的学习与提取;亦可能通过DNN将不同的产品线联系起来,使得不同的变现产品不管数据多少,都能互相优化。我们认为未来的DNN一定会在搜索广告中起到更重要的作用。深度学习实战演练实验坏境的搭建深度学习平台目前主要有三个最经常使用的开源深度学习平台,本文做了一个简单的介绍:Caffe:源自加州伯克利分校的Caffe被广泛应用,包括Pinterest这样的web大户。与TensorFlow一样,Caffe也是由C++开发,Caffe也是Google今年早些时候发布的DeepDream项目(可以识别猫的人工智能神经网络)的基础。Theano:2008年诞生于蒙特利尔理工学院,Theano派生出了大量深度学习Python软件包,最著名的包括Blocks和Keras。Torch:诞生已经有十年之久,但是真正起势得益于去年Facebook开源了大量Torch的深度学习模块和扩展。Torch另外一个特殊之处是采用了不怎么流行的编程语言Lua(该语言曾被用来开发视频游戏)。本次试验,我采用了比较广泛使用的Caffe深度学习平台。接下来,我主要介绍Caffe的环境搭建方法。安装依赖库首先,我在/BVLC/caffe下载了Caffe的源代码,为了能够顺利的进行编译,首先我们需要安装一下依赖库。libatlas-base-devlibprotobuf-devlibleveldb-devlibsnappy-devlibopencv-devlibboost-all-devlibhdf5-serial-devlibgflags-devlibgoogle-glog-devliblmdb-devprotobuf-compilerpython-numpypython3-numpypython-scipypython3-scipy在Ubutun中,我们只需要使用sudoapt-getinstallPACKAGE_NAME即可完成对上述所有依赖库的安装。在安装完依赖库后,我们就可以开始安装Caffe了。安装Caffe在完成了依赖库的安装之后,我们就可以开始Caffe的安装了。为此,我们首先要准备一个Makefile.Config文件。事实上,Caffe已经为我们准备好了一个Makefile.Config.Example文件,只要将该文件重命名并进行相应的修改即可开始进行编译。由于本次实验的机器中没有支持CUDA的显卡,因此我们需要在Makefile.Config文件中将CPU_ONLY选项置为1,然后即可开始编译。我们只要在终端中输入命令makeall即可开始编译。在Caffe成功编译完成后,我们输入指令makepycaffe来编译python接口模块,当然如果你的系统中没有python的话需要先安装python。 在上述所有编译指令完成后,其实Caffe就已经安装好了,在你的目录中会生成build/tools文件夹,里面的Caffe可执行文件就是以后用来训练深度神经网络的工具。接下来,我们可以进行简单的测试,测试Caffe是否可以正常工作,只需要在终端中输入maketestmakeruntest即可进行Caffe的正确性测试。如果最后的结果显示PASSED则说明Caffe已经安装完毕。实验概述本文主要完成一个手写数字体识别的深度学习测试,数据来源于网上的MNIST数据库,数据库一共拥有6万个用于训练的手写数字(带标签),同时还拥有1万个用于识别的手写数字字符,部分手写体数字的效果如下图所示。MNIST手写体本文首先在/exdb/mnist/上下载MNIST手写字符集,并得到四个文件,分别是两个图片数据文件以及两个标签文件。接下来,按照MNIST的数据格式,书写Python程序读取程序图片,并生成符合Caffe的LMDB格式数据集。接下来,本文参考已有的深度网络模型,书写模型文件。最后,本文编写求解参数文件,调用Caffe可执行文件对深度网络进行训练,并得到最终的测试结果。本文实验中所采用的环境如下:操作系统(OS)Ubuntu14.04CPUIntel(R)Core(TM)i5-4217CPU@3.80GHz运行内存大小(RAM)4.00GB实验过程生成指定的数据格式文件为了使用Caffe深度学习平台,我们首先需要将得到的数据集转化为Caffe可以使用的LMDB格式,其具体过程如下。首先在下载的MNIST文件中提取所有的图片源文件,主要使用的是Python编程。本文将所有的训练用手写数字放在train文件夹,测试用放在了val文件夹。并利用Python产生了两个TAG文件,主要用来指示图片的标签。例如上图所示,它代表8.jpg的标签为1,也就是说8.jpg图片中显示的手写数字应该是1。在上述文件全部准备好之后,我们可以调用Caffe提供的数据格式转换工具convert_imageset能完成标准数据集的生成。本文写了一个批处理文件完成了数据集的生成,其效果如下。编写深度网络模型文件按照当前文献的说法,卷积神经网络对手写字符的识别具有较好的效果,我按照标准的Caffe模型编写格式,参考网上的教程,编写了一个深度网络模型。首先定义一个训练输入data层,指定其数据路径,数据文件格式,等参数,代码书写如下:layer{name:"mnist"type:"Data"top:"data"top:"label"include{phase:TRAIN}transform_param{scale:0.00390625}data_param{source:"/home/dong/dl2/hand_write_train/"batch_size:64backend:LMDB}}同理,定义一个测试输入data层用来对训练的网络进行测试。接下来,定义一层卷积神经网络,指定其类型为Convolution层,学习速率,其他参数保持默认。layer{name:"conv1"//卷积神经网络的第一层,卷积层type:"Convolution"//这层操作为卷积bottom:"data"//这一层的前一层是data层top:"conv1"param{lr_mult:1}param{lr_mult:2}convolution_param{num_output:20//定义输出特征图个数kernel_size:5//定义卷积核大小stride:1weight_filler{type:"xavier"}bias_filler{type:"constant"}}}在此之后,定义一层池化层,第二层卷积神经网络层,第二层池化层,以及两个内积层,具体的模型代码见附录。编写网络求解文件和Makefile一样,网络求解文件是由模板的,根据自己的需要进行修改即可。一个典型的模板如下。net:"path/to/your/net"//定义网络结构文件,也就是我们上一步编写的文件test_iter:100test_interval:500//每隔500次用测试数据,做一次验证base_lr:0.01//学习速率momentum:0.9//动量参数weight_decay:0.0005//权重衰减系数lr_policy:"inv"//梯度下降的相关优化策略gamma:0.0001power:0.75display:100max_iter:10000//最大迭代次数snapshot:5000//每迭代5000次,保存一次结果snapshot_prefix:"examples/mnist/lenet"//保存结果路径solver_mode:GPU//训练硬件设备选择GPU还是CPU编写完以上所有的文件就可以使用Caffe进行网络的训练了,只要在终端中输入:~/caffe-master/build/tools/caffetrain--solver=/home/dong/dpln/lenet_totxt即可开始训练,训练过程中会得到大量的迭代结果,在每500次迭代,系统会自动调用测试数据集进行一次准确度的测试,如下是在本次试验中得到的结果:可以看到系统迭代到9000次的时候进行了一次测试验证,识别正确率高达99.1%,这主要得益于卷积神经网络的特性。实验结果当终端提示OptimizationDone的时候,表示深度学习完毕,并会返回在给定测试数据集中的结果,本文得到的结果如下:当系统迭代了1万次以后,优化完成,最终的识别进度为99.06%,可见深度学习能自动提取手写体数字的特征,进行学习,并最后识别。
总结本文介绍了深度学习的背景,对深度学习的研究过程以及发展现状进行了概括,同时介绍了其基本原理以及应用领域。其次,通过Caffe深度学习平台进行了手写数字字符的识别的小项目。我了解到了深度学习的基本过程以及基本方法。例如如何搭建深度学习平台,如何生成数据集,编写简单的深度学习网络并最后调用Caffe进行训练和测试。在上述步骤之中,我认为最重要的就是如何编写深度学习网络,这个很大程度上决定了你模型的可用性,这需要你对不同深度网络模型的特点了然于胸,才能写出最适合特定问题的深度学习网络,本文在编写MNIST深度学习网络的时候参考了较多的网上资料,论文中也说到卷积神经网络比较适合手写数字体的识别。实验结果显示,在经历了1万次迭代后,卷积神经网络构成的深度学习网络对手写数字字体可以达到99%以上的识别,显示出深度学习强大的识别能力。
参考文献SarikayaR,HintonGE,DeorasA.Applicationofdeepbeliefnetworksfornaturallanguageunderstanding[J].IEEETransactionsonAudio,SpeechandLanguageProcessing,2014,22(4):778-784BENGIOY.Practicalrecommendationsforgradient-basedtrainingofdeeparchitectures[M]NeuralNetworks:TricksoftheTrade.Ber-lin:Springer-Verlag,2012:437-478.FischerA,IgelC.TrainingrestrictedBoltzmannmachines:anintroduction[J],PatternRecognition,2014,47(1):25-39LEEH,GROSSER,RANGANATHR,etal.Convolutionaldeepbeliefnetworksforscalableunsupervisedlearningofhierarchicalrepresentations[C],Procofthe26thInternationalConferenceonMa-chineLearning.NewYork:ACMPress,2009:609-616.HintonGE,OsinderoS,TehYW.Afastlearningalgorithmfordeepbeliefnets[J],NeuralComputation,2006,18(7):1527-1554.胡侯立,深度学习算法的原理及应用[J],信息技术,2015(2):176-177岳永鹏,深度无监督学习算法研究[D],西南石油大学硕士学位论文,2015,6:3-5刘建伟等,深度学习研究进展[J],计算机应用研究,2014,4(7):1925-1927张建明等,深度学习的研究与发展[J],江苏大学学报,2015,3(2):195-196/zouxy09/article/details/8775360//hjimce/article/details/48933813//hjimce/article/details/48781693/
附录(源代码)读取MNIST数据文件Python程序importnumpyasnpfromscipy.miscimportimsaveimportstruct#imsave('meelo.jpg',x)f=open('./train-images-idx3-ubyte','rb')filedata=f.read()#filesize=f.tell()f.close()data=bytearray(filedata)num=60000row=28col=28x=np.random.random((28,28))#printxcur=16foriinrange(0,num): forrinrange(0,row): forcinrange(0,col): v=data[cur] cur+=1 x[r][c]=v imsave('./train/'+str(i)+'.jpg',x)f=open('./t10k-images-idx3-ubyte','rb')filedata=f.read()#filesize=f.tell()f.close()data=bytearray(filedata)num=10000row=28col=28x=np.random.random((28,28))#printxcur=16foriinrange(0,num): forrinrange(0,row): forcinrange(0,col): v=data[cur] cur+=1 x[r][c]=v imsave('./val/t'+str(i)+'.jpg',x)f=open('./train-labels-idx1-ubyte','rb')filedata=f.read()#filesize=f.tell()f.close()data=bytearray(filedata)num=60000cur=8ttag=open('train.txt','w')foriinrange(0,num): v=data[cur] cur+=1 ttag.write(str(i)+'.jpg'+''+str(v)+'\n')ttag.close()f=open('./t10k-labels-idx1-ubyte','rb')filedata=f.read()#filesize=f.tell()f.close()data=bytearray(filedata)num=10000cur=8ttag2=open('val.txt','w')foriinrange(0,num): v=data[cur] cur+=1 ttag2.write('t'+str(i)+'.jpg'+''+str(v)+'\n')ttag2.close()深度网络定义文件name:"LeNet"layer{name:"mnist"type:"Data"top:"data"top:"label"include{phase:TRAIN}transform_param{scale:0.00390625}data_param{source:"/home/dong/dl2/hand_write_train/"batch_size:64backend:LMDB}}layer{name:"mnist"type:"Data"top:"data"top:"label"include{phase:TEST}transform_param{scale:0.00390625}data_param{source:"/home/dong/dl2/hand_write_val/"batch_size:100backend:LMDB}}layer{name:"conv1"type:"Convolution"bottom:"data"top:"conv1"param{lr_mult:1}param{lr_mult:2}convolution_param{num_output:20kernel_size:5stride:1weight_filler{type:"xavier"}bias_filler{type:"constant"}}}layer{name:"pool1"type:"Pooling"bottom:"conv1"top:"pool1"pooling_param{pool:MAXkernel_size:2stride:2}}layer{name:"conv2"type:"Convolution"bottom:"pool1"top:"conv2"param{lr_mult:1}param{lr_mult:2}convolution_param{num_output:50kernel_size:5stride:1weight_filler{type:"xavier"}bias_filler{type:"constant"}}}layer{name:"pool2"type:"Pooling"bottom:"conv2"top:"pool2"pooling_param{pool:MAXkernel_size:2stride:2}}layer{name:"ip1"type:"InnerProduct"bottom:"pool2"top:"ip1"param{lr_mult:1}param{lr_mult:2}inner_product_param{num_output:500weight_filler{type:"xavier"}bias_filler{type:"constant"}}}layer{name:"relu1"type:"ReLU"bottom:"ip1"top:"ip1"}layer{name:"ip2"type:"InnerProduct"bottom:"ip1"top:"ip2"param{lr_mult:1}param{lr_mult:2}inner_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025届徐州市中考二模生物试题含解析
- 广西壮族自治区河池市罗城仫佬族自治县2025届中考联考生物试卷含解析
- 小学数学奥数题型解析与教学建议
- 幼儿园安全管理制度(三篇)
- 其它作用-课件
- 2025年易燃易爆物品装运安全管理制度(2篇)
- 外联主管的具体职责描述模版(2篇)
- 交通公路管制革新指导方案样本(2篇)
- 《RI常用解剖》课件
- 桥梁施工安全强制性规定范文(2篇)
- 零碳智慧园区解决方案
- 2025年林权抵押合同范本
- 服务推广合同协议(2025年)
- 2024年北师大版四年级数学上学期学业水平测试 期末卷(含答案)
- 2024年高考物理一轮复习讲义(新人教版):第七章动量守恒定律
- 浙江省宁波市慈溪市2023-2024学年高三上学期语文期末测试试卷
- 草学类专业生涯发展展示
- 法理学课件马工程
- 《玉米种植技术》课件
- 第47届世界技能大赛江苏省选拔赛计算机软件测试项目技术工作文件
- 2023年湖北省公务员录用考试《行测》答案解析
评论
0/150
提交评论