机器学习及人工智能发展史




 

深度学习综述

一年多以前为了交作业, 写了这篇综述,如今有时间,刚开通了博客,遂放上来分享给大家,干货没有多少,只是快速介绍机器学习的相关历史。

 

姓名:陈xx


指导教师:xxx

科目:机器学习

日期:2016年11月07日

 

 



 


目录

1 绪论...2

2 深度学习原理...4

2.1人脑视觉机理...4

2.2 关于特征...4

2.3深度学习原理...5

3 开发平台...8

4 典型应用...12

5 总结...19

【参考文献】...20

 


 

1 绪论

ArtificialIntelligence,也就是人工智能,就像长生不老和星际漫游一样,是人类最美好的梦想之一。虽然计算机技术已经取得了长足的进步,但是到目前为止,还没有一台电脑能产生“自我”的意识。是的,在人类和大量现成数据的帮助下,电脑可以表现的十分强大,但是离开了这两者,它甚至都不能分辨一个狗和一个猫。

图灵在 1950 年的论文里,提出图灵试验的设想,即,隔墙对话,你将不知道与你谈话的,是人还是电脑。这无疑给计算机,尤其是人工智能,预设了一个很高的期望值。但是半个世纪过去了,人工智能的进展,远远没有达到图灵试验的标准。这不仅让多年翘首以待的人们,心灰意冷,认为人工智能是忽悠,相关领域是“伪科学”。

但是自 2006 年以来,机器学习领域,取得了突破性的进展。图灵试验,至少不是那么可望而不可及了。至于技术手段,不仅仅依赖于云计算对大数据的并行处理能力,而且依赖于算法。这个算法就是,Deep Learning。借助于 Deep Learning 算法,人类终于找到了如何处理“抽象概念”这个亘古难题的方法。

深度学习的概念源于人工神经网络的研究,含多隐层的多层感知器 (MLP)就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示(属性类别或特征),以发现数据的分布式特征表示。BP 算法作为传统训练多层网络的典型算法,实际上对于仅含几层网络,该训练方法就已很不理想。深度结构(涉及多个非线性处理单元层)非凸目标代价函数中普遍存在的局部最小是训练困难的主要来源。

神经网络的历史最早可以追溯到上世纪的40年代,在20世纪80年末期,Rumelhart、Hinton和Williams在《自然》(Nature)上发表了用于人工神经网络的BP(Back-Propagation,反向传播)算法,掀起了一阵机器学习的浪潮,但是由于各种原因,神经网络被许多学者放弃。多伦多大学Hinton 等人基于深信度网(DBN)提出非监督贪心逐层训练算法,为解决深层结构相关的优化难题带来希望,随后提出多层自动编码器深层结构。此外 Lecun 等人提出的卷积神经网络(CNNs)是第一个真正多层结构学习算法,它利用空间相对关系减少参数数目以提高 BP 训练性能。此外深度学习还出现许多变形结构如去噪自动编码器、DCN、sum-product等。

当前多数分类、回归等学习方法为浅层结构算法,其局限性在于有限样本和计算单元情况下对复杂函数的表示能力有限,针对复杂分类问题其泛化能力受到一定制约。深度学习可通过学习一种深层非线性网络结构,实现复杂函数逼近,表征输入数据分布式表示,并展现了强大的从少数样本集中学习数据集本质特征的能力。2012年6月, Google 被披露出 Google Brain 计划,这个项目由斯坦福大学的机器学习教授 Andrew Ng 和在大规模计算机系统方面的世界顶尖专家 Jeff Dean 共同主导,用16000个CPU Core的并行计算平台训练一种称为“深度神经网络”(DNN,Deep Neural Networks)的机器学习模型,在语音识别和图像识别等领域获得了巨大的成功。百度在2013年1月高调宣布成立百度研究院,其中第一个便是深度学习研究所(IDL,Institute of Deep Learning)。

为什么拥有大数据的互联网公司争相投入大量资源研发深度学习技术。那什么是Deep Learning?为什么有Deep Learning?它是怎么来的?又能干什么呢?目前存在哪些困难呢?这些问题的简答都需要先来了解下机器学习的背景。

机器学习(Machine Learning)是一门专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能的学科。机器能否像人类一样能具有学习能力呢?1959年美国的塞缪尔(Samuel)设计了一个下棋程序,这个程序具有学习能力,它可以在不断的对弈中改善自己的棋艺。4年后,这个程序战胜了设计者本人。又过了3年,这个程序战胜了美国一个保持8年之久的常胜不败的冠军。而近期阿尔法GO,也战胜了李世石,再一次向人们展示了机器学习的能力。

机器学习虽然发展了几十年,但还是存在很多没有很好解决的问题,例如视觉问题、语言交流、基因表达等等。一般来说我们处理这类问题的思路是预处理、特征提取选择、推理预测或者识别。而预测或者识别,正是机器学习的部分。而中间特征表达的部分,对最终算法的准确性起到了非常关键的作用。系统中大部分的计算和测试工作都消耗在这部分,但是这一部分通常靠人工提取。

虽然截止现在出现了很多优秀的特征,但是人工提取特征也不是万能的。为了用机器自动的学习一些特征,深度学习(Deep Learning出现了。近几十年以来,认知神经科学、生物学等等学科的发展,让我们对自己这个神秘的而又神奇的大脑不再那么的陌生。也给人工智能的发展推波助澜。

2 深度学习原理

2.1人脑视觉机理

1958 年,DavidHubel 和TorstenWiesel 在 JohnHopkins University, 发现了一种被称为“方向选择性细胞(OrientationSelective Cell)”的神经元细胞。当瞳孔发现了眼前的物体的边缘,而且这个边缘指向某个方向时,这种神经元细胞就会活跃。

这个发现激发了人们对于神经系统的进一步思考。神经-中枢-大脑的工作过程,或许是一个不断迭代、不断抽象的过程。

这里的关键词有两个,一个是抽象,一个是迭代。从原始信号,做低级抽象,逐渐向高级抽象迭代。人类的逻辑思维,经常使用高度抽象的概念。

这个生理学的发现,促成了计算机人工智能,在四十年后的突破性发展。总的来说,人的视觉系统的信息处理是分层级的。或许你已经注意到了,这里的关键词就是分层。而Deep Learning的Deep就是表示存在的层比较深,远大于浅层学习的层数上限,并具有良好的继承性。而这也就是特征的表达,每个层级都有独特的特征,因此特征的理解对我们也是至关重要的。

2.2 关于特征

特征是机器学习系统的基础,对最终模型的影响,毋庸置疑。如果数据特征被很好的提取,一般来说线性模型就能达到满意的精度。通常我们对特征需要考虑如下几个因素。

1)、特征表示的粒度:即特征在什么层次的选取才能具有一定的实际意义,并能够提供有效的信息。例如,对于图片的来说,像素级的特征,不具有任何识别信息,并不具有区分度。而如果特征的选取具有了结构性,即将特征放在图片的一个个小区域上,我们就能够区分图片的不同。也就是说,我们选择的特征表示的粒度较为合适。

2)、初级(浅层)特征的表示:我们已经知道,像素级的特征并没有什么实际价值,所以如何选取合适的特征将是我们研究是一个重点。根据线性代数的矩阵的特征,我们选择一个的正交矩阵(在这里称之为edge)组作为特征,通过改变权重来表示所有的信息,这个正交矩阵组就是初级特征。而且经过研究发现,不仅图像可以通过这样的方式来表示,声音也可以被正交分解。这一算法过程由Bruno Olshausen和 David Field 发明,称作稀疏编码(Sparse Coding)。该算法结果与 David Hubel 和Torsten Wiesel 的生理发现,不谋而合。

3)、结构性特征表示:小块的基本图形可以由基本的edge构成,而更复杂的更结构化的择需要更高层次的特征来表示,逐层递进,高层的表达由底层的表达组合而成,即所谓的基(basis)。

4)、特征的数目:特征的增多,意味着参考信息的增多,准确性会提高,但是泛化能力会变弱,计算会更复杂,而训练集在每个特征上会更稀疏,所以并不是特征越多越好。

了解了以上的内容我们就可以开始了解深度学习的原理了。

2.3深度学习原理

假设我们有一个系统S,它有n层(S1,…,Sn),它的输入是I,输出是O,形象地表示为: I=>S1=>S2=>…=>Sn => O,如果输出O等于输入I,即输入I经过这个系统变化之后没有任何的信息损失,保持了不变,这意味着输入I经过每一层Si都没有任何的信息损失,即在任何一层Si,它都是原有信息(即输入I)的另外一种表示。现在继续说Deep Learning,我们需要计算机自动地学习特征,假设我们有一堆输入I(如一堆图像或者文本),假设我们设计了一个系统S(有n层),我们通过调整系统中参数,使得它的输出仍然是输入I,那么我们就可以自动地获取得到输入I的一系列层次特征,即S1,…,Sn。

对于深度学习来说,其思想就是对堆叠多个层,也就是说这一层的输出作为下一层的输入。通过这种方式,就可以实现对输入信息进行分级表达了。

另外,前面是假设输出严格地等于输入,这个限制太严格,我们可以略微地放松这个限制,例如我们只要使得输入与输出的差别尽可能地小即可,这个放松会导致另外一类不同的Deep Learning方法。上述就是Deep Learning的基本思想。

提到深度学习(Deep Learning)我们就不得不说浅层学习。

20世纪80年代末期,用于人工神经网络的后向传播算法(也叫Back Propagation算法或者BP算法)的发明,给机器学习带来了希望,掀起了基于统计模型的机器学习热潮。这个热潮一直持续到今天。人们发现,利用BP算法可以让一个人工神经网络模型从大量训练样本中学习统计规律,从而对未知事件做预测。这种基于统计的机器学习方法比起过去基于人工规则的系统,在很多方面显出优越性。这个时候的人工神经网络,虽也被称作多层感知器(Multi-layer Perceptron),但实际是种只含有一层隐层节点的浅层模型。

20世纪90年代,各种各样的浅层机器学习模型相继被提出,例如支撑向量机(SVM,Support Vector Machines)、 Boosting、最大熵方法(如LR,LogisticRegression)等。这些模型的结构基本上可以看成带有一层隐层节点(如SVM、Boosting),或没有隐层节点(如LR)。这些模型无论是在理论分析还是应用中都获得了巨大的成功。相比之下,由于理论分析的难度大,训练方法又需要很多经验和技巧,这个时期浅层人工神经网络反而相对沉寂。

这是机器学习的第一次浪潮。

2006年,加拿大多伦多大学教授、机器学习领域的泰斗Geoffrey Hinton和他的学生Ruslan Salakhutdinov在《科学》上发表了一篇文章,开启了深度学习在学术界和工业界的浪潮。这篇文章有两个主要观点:1)多隐层的人工神经网络具有优异的特征学习能力,学习得到的特征对数据有更本质的刻画,从而有利于可视化或分类;2)深度神经网络在训练上的难度,可以通过“逐层初始化”(layer-wise pre-training)来有效克服,在这篇文章中,逐层初始化是通过无监督学习实现的。

当前多数分类、回归等学习方法为浅层结构算法,其局限性在于有限样本和计算单元情况下对复杂函数的表示能力有限,针对复杂分类问题其泛化能力受到一定制约。深度学习可通过学习一种深层非线性网络结构,实现复杂函数逼近,表征输入数据分布式表示,并展现了强大的从少数样本集中学习数据集本质特征的能力。

深度学习的实质,是通过构建具有很多隐层的机器学习模型和海量的训练数据,来学习更有用的特征,从而最终提升分类或预测的准确性。区别于传统的浅层学习,深度学习的不同在于:1)强调了模型结构的深度,通常有5层、6层,甚至更多层的隐藏节点;2)明确突出了特征学习的重要性,也就是说,通过逐层特征变换,将样本在原空间的特征表示变换到一个新特征空间,从而使分类或预测更加容易。与人工规则构造特征的方法相比,利用大数据来学习特征,更能够刻画数据的丰富内在信息。

BP算法作为传统训练多层网络的典型算法,实际上对仅含几层网络,该训练方法就已经很不理想。深度结构(涉及多个非线性处理单元层)非凸目标代价函数中普遍存在的局部最小是训练困难的主要来源。

BP算法存在的问题:

(1)梯度越来越稀疏:从顶层越往下,误差校正信号越来越小;

(2)收敛到局部最小值:尤其是从远离最优区域开始的时候(随机值初始化会导致这种情况的发生);

(3)一般,我们只能用有标签的数据来训练:但大部分的数据是没标签的,而大脑可以从没有标签的的数据中学习。

deep learning训练过程不同于BP神经网络算法,区别如下:

1)使用自下上升非监督学习(就是从底层开始,一层一层的往顶层训练):

采用无标定数据(有标定数据也可)分层训练各层参数,这一步可以看作是一个无监督训练过程,是和传统神经网络区别最大的部分(这个过程可以看作是feature learning过程):

具体的,先用无标定数据训练第一层,训练时先学习第一层的参数(这一层可以看作是得到一个使得输出和输入差别最小的三层神经网络的隐层),由于模型capacity的限制以及稀疏性约束,使得得到的模型能够学习到数据本身的结构,从而得到比输入更具有表示能力的特征;在学习得到第n-1层后,将n-1层的输出作为第n层的输入,训练第n层,由此分别得到各层的参数;

2)自顶向下的监督学习(就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调):

基于第一步得到的各层参数进一步fine-tune整个多层模型的参数,这一步是一个有监督训练过程;第一步类似神经网络的随机初始化初值过程,由于DL的第一步不是随机初始化,而是通过学习输入数据的结构得到的,因而这个初值更接近全局最优,从而能够取得更好的效果;所以deep learning效果好很大程度上归功于第一步的feature learning过程。

深度学习(Deep Learning)经常用到的模型或者算法有这样集中:自动编码器(AutoEncoder)、稀疏自动编码器(Sparse AutoEncoder)、降噪自动编码器(Denoising AutoEncoders)、稀疏编码(Sparse Coding)、限制波尔兹曼机(Restricted Boltzmann Machine (RBM))、深信度网络(Deep BeliefNetworks)、卷积神经网络(Convolutional Neural Networks)。

接下来我们总结深度学习具体是怎么工作的:

1、首先逐层构建单层神经元,这样每次都是训练一个单层网络。

2、当所有层训练完后,hinton使用wake-sleep算法进行调优。将除最顶层的其它层间的权重变为双向的,这样最顶层仍然是一个单层神经网络,而其它层则变为了图模型。向上的权重用于”认知“,向下的权重用于”生成“。然后使用Wake-Sleep算法调整所有的权重。让认知和生成达成一致,也就是保证生成的最顶层表示能够尽可能正确的复原底层的结点。比如顶层的一个结点表示人脸,那么所有人脸的图像应该激活这个结点,并且这个结果向下生成的图像应该能够表现为一个大概的人脸图像。Wake-Sleep算法分为醒(wake)和睡(sleep)两个部分。

2.1,wake阶段,认知过程,通过外界的特征和向上的权重(认知权重)产生每一层的抽象表示(结点状态),并且使用梯度下降修改层间的下行权重(生成权重)。也就是“如果现实跟我想像的不一样,改变我的权重使得我想像的东西就是这样的“。

2.2,sleep阶段,生成过程,通过顶层表示(醒时学得的概念)和向下权重,生成底层的状态,同时修改层间向上的权重。也就是“如果梦中的景象不是我脑中的相应概念,改变我的认知权重使得这种景象在我看来就是这个概念“。

 

3 开发平台

一、Caffe。源自加州伯克利分校的Caffe被广泛应用,包括Pinterest这样的web大户。与TensorFlow一样,Caffe也是由C++开发,Caffe也是Google今年早些时候发布的DeepDream项目的基础。

二、Theano。2008年诞生于蒙特利尔理工学院,Theano派生出了大量深度学习Python软件包,最著名的包括Blocks和Keras。

三、Torch。Torch诞生已经有十年之久,但是真正起势得益于去年Facebook开源了大量Torch的深度学习模块和扩展。Torch另外一个特殊之处是采用了不怎么流行的编程语言Lua(该语言曾被用来开发视频游戏)。

除了以上三个比较成熟知名的项目,还有很多有特色的深度学习开源框架也值得关注:

四、Brainstorm。来自瑞士人工智能实验室IDSIA的一个非常发展前景很不错的深度学习软件包,Brainstorm能够处理上百层的超级深度神经网络——所谓的公路网络Highway Networks。

五、Chainer。来自一个日本的深度学习创业公司Preferred Networks,今年6月发布的一个Python框架。Chainer的设计基于define by run原则,也就是说,该网络在运行中动态定义,而不是在启动时定义,这里有Chainer的详细文档。

六、Deeplearning4j。 顾名思义,Deeplearning4j是”for Java”的深度学习框架,也是首个商用级别的深度学习开源库。Deeplearning4j由创业公司Skymind于2014年6月发布,使用 Deeplearning4j的不乏埃森哲、雪弗兰、博斯咨询和IBM等明星企业。DeepLearning4j是一个面向生产环境和商业应用的高成熟度深度学习开源库,可与Hadoop和Spark集成,即插即用,方便开发者在APP中快速集成深度学习功能,可应用于以下深度学习领域:

人脸/图像识别

语音搜索

语音转文字(Speech to text)

垃圾信息过滤(异常侦测)

电商欺诈侦测

七、Marvin。是普林斯顿大学视觉工作组新推出的C++框架。该团队还提供了一个文件用于将Caffe模型转化成语Marvin兼容的模式。

八、ConvNetJS。这是斯坦福大学博士生AndrejKarpathy开发浏览器插件,基于万能的JavaScript可以在你的游览器中训练神经网络。Karpathy还写了一个ConvNetJS的入门教程,以及一个简洁的浏览器演示项目。

九、MXNet。出自CXXNet、Minerva、Purine等项目的开发者之手,主要用C++编写。MXNet强调提高内存使用的效率,甚至能在智能手机上运行诸如图像识别等任务。

十、Neon。由创业公司NervanaSystems于今年五月开源,在某些基准测试中,由Python和Sass开发的Neon的测试成绩甚至要优于Caffeine、Torch和谷歌的TensorFlow。

在这里我们着重介绍caffe框架:

Caffe是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的贾扬清,他目前在Google工作。

Caffe是纯粹的C++/CUDA架构,支持命令行、Python和MATLAB接口;可以在CPU和GPU直接无缝切换:

Caffe::set_mode(Caffe::GPU);

Caffe的优势

1.     上手快:模型与相应优化都是以文本形式而非代码形式给出。

Caffe给出了模型的定义、最优化设置以及预训练的权重,方便立即上手。

2.     速度快:能够运行最棒的模型与海量的数据。

Caffe与cuDNN结合使用,测试AlexNet模型,在K40上处理每张图片只需要1.17ms.

3.     模块化:方便扩展到新的任务和设置上。

可以使用Caffe提供的各层类型来定义自己的模型。

4.     开放性:公开的代码和参考模型用于再现。

5.     社区好:可以通过BSD-2参与开发与讨论。

Caffe的网络定义

Caffe中的网络都是有向无环图的集合,可以直接定义:

name:"dummy-net"

layers {name: "data" …}

layers {name: "conv" …}

layers {name: "pool" …}

layers {name: "loss" …}

数据及其导数以blobs的形式在层间流动。

Caffe的各层定义

Caffe层的定义由2部分组成:层属性与层参数,例如

name:"conv1"

type:CONVOLUTION

bottom:"data"

top:"conv1"

convolution_param{

num_output:20

kernel_size:5

stride:1

weight_filler{

type:"xavier"

}

}

这段配置文件的前4行是层属性,定义了层名称、层类型以及层连接结构(输入blob和输出blob);而后半部分是各种层参数。

Blob

Blob是用以存储数据的4维数组,例如

对于数据:Number*Channel*Height*Width

对于卷积权重:Output*Input*Height*Width

对于卷积偏置:Output*1*1*1

训练网络

网络参数的定义也非常方便,可以随意设置相应参数。

甚至调用GPU运算只需要写一句话:

solver_mode:GPU

 

 

 

 

 

4 典型应用

给图像混乱程度打分的简单例子

用一个给图像混乱程度打分的简单例子来说明如何使用Caffe和EuclideanLossLayer进行回归。

生成基于Ising模型的数据

这里采用统计物理里非常经典的Ising模型的模拟来生成图片,Ising模型可能是统计物理里被人研究最多的模型之一,不过这篇不是讲物理,就略过细节,总之基于这个模型的模拟可以生成如下的图片:

图片中第一个字段是编号,第二个字段对应的分数可以大致认为是图片的有序程度,范围0~1,而这个例子要做的事情就是用一个CNN学习图片的有序程度并预测。

生成图片的Python脚本源于MonteCarlo Simulation of the Ising Model using Python,基于Metropolis算法对Ising模型的模拟,做了一些并行和随机生成图片的修改,在每次模拟的时候随机取一个时间(1e3到1e7之间)点输出到图片,代码如下:

import os

import sys

import datetime

 

frommultiprocessing import Process

 

import numpy asnp

from matplotlibimport pyplot

 

LATTICE_SIZE =100

SAMPLE_SIZE =12000

STEP_ORDER_RANGE= [3, 7]

SAMPLE_FOLDER ='samples'

 

#----------------------------------------------------------------------#

#   Check periodic boundary conditions

#----------------------------------------------------------------------#

def bc(i):

    if i+1 > LATTICE_SIZE-1:

        return 0

    if i-1 < 0:

        return LATTICE_SIZE - 1

    else:

        return i

 

#----------------------------------------------------------------------#

#   Calculate internal energy

#----------------------------------------------------------------------#

defenergy(system, N, M):

    return -1 * system[N,M] * (system[bc(N-1),M] \

                               + system[bc(N+1),M] \

                               + system[N,bc(M-1)] \

                               + system[N,bc(M+1)])

 

#----------------------------------------------------------------------#

#   Build the system

#----------------------------------------------------------------------#

defbuild_system():

    system = np.random.random_integers(0, 1,(LATTICE_SIZE, LATTICE_SIZE))

    system[system==0] = - 1

 

    return system

 

#----------------------------------------------------------------------#

#   The Main monte carlo loop

#----------------------------------------------------------------------#

def main(T,index):

 

    score = np.random.random()

    order =score*(STEP_ORDER_RANGE[1]-STEP_ORDER_RANGE[0]) + STEP_ORDER_RANGE[0]

    stop = np.int(np.round(np.power(10.0,order)))

    print('Running sample: {}, stop @{}'.format(index, stop))

    sys.stdout.flush()

 

    system = build_system()

 

    for step in range(stop):

        M = np.random.randint(0, LATTICE_SIZE)

        N = np.random.randint(0, LATTICE_SIZE)

 

        E = -2. * energy(system, N, M)

 

        if E <= 0.:

            system[N,M] *= -1

        elif np.exp(-1./T*E) >np.random.rand():

            system[N,M] *= -1

 

        #if step % 100000 == 0:

        #   print('.'),

        #   sys.stdout.flush()

 

    filename = '{}/'.format(SAMPLE_FOLDER) +'{:0>5d}'.format(index) + '_{}.jpg'.format(score)

    pyplot.imsave(filename, system,cmap='gray')

    print('Saved to {}!\n'.format(filename))

    sys.stdout.flush()

 

#----------------------------------------------------------------------#

#   Run the menu for the monte carlo simulation

#----------------------------------------------------------------------#

 

defrun_main(index, length):

    np.random.seed(datetime.datetime.now().microsecond)

    for i in xrange(index, index+length):

        main(0.1, i)

 

def run():

 

    cmd = 'mkdir -p {}'.format(SAMPLE_FOLDER)

    os.system(cmd)

 

    n_processes = 8

    length = int(SAMPLE_SIZE/n_processes)

    processes = [Process(target=run_main,args=(x, length)) for x in np.arange(n_processes)*length]

 

    for p in processes:

        p.start()

   

    for p in processes:

        p.join()

 

if __name__ =='__main__':

    run()

在这个例子中一共随机生成了12000张100x100的灰度图片,命名的规则是[编号]_[有序程度].jpg。至于有序程度为什么用0~1之间的随机数而不是模拟的时间步数,是因为虽说理论上三层神经网络就能逼近任意函数,不过具体到实际训练中还是应该对数据进行预处理,尤其是当目标函数是L2 norm的形式时,如果能保持数据分布均匀,模型的收敛性和可靠性都会提高,范围0到1之间是为了方便最后一层Sigmoid输出对比,同时也方便估算模型误差。还有一点需要注意是,因为图片本身就是模特卡罗模拟产生的,所以即使是同样的有序度的图片,其实看上去不管是主观还是客观的有序程度都是有差别的。

还要提一句的是。。我用Ising的模拟作为例子只是因为很喜欢这个模型,其实用随机相位的反傅里叶变换然后二值化就能得到几乎没什么差别的图像,有序程度就是截止频率,并且更快更简单。

生成训练/验证/测试集

把Ising模拟生成的12000张图片划分为三部分:1w作为训练数据;1k作为验证集;剩下1k作为测试集。

生成HDF5文件

lmdb虽然又快又省空间,可是Caffe默认的生成lmdb的工具(convert_imageset)不支持浮点类型的数据,虽然caffe.proto里Datum的定义似乎是支持的,不过相应的代码改动还是比较麻烦。相比起来HDF又慢又占空间,但简单好用,如果不是海量数据,还是个不错的选择,这里用HDF来存储用于回归训练和验证的数据。

需要注意的是Caffe中HDF的DataLayer不支持transform,所以数据存储前就提前进行了减去均值的步骤。保存为gen_hdf.py,依次运行命令生成训练集和验证集。

训练

用一个简单的小网络训练这个基于回归的模型:

其中回归部分由EuclideanLossLayer中比较最后一层的输出和train.txt/val.txt中的分数差并作为目标函数实现。需要提一句的是基于实数值的回归问题,对于方差这种目标函数,SGD的性能和稳定性一般来说都不是很好,Caffe文档里也有提到过这点。

 

测试

随便训了10000个iteration,开始收敛。

测试结果如下图:

可以看到第一层的卷积核成功学到了高频和低频的成分,这也是这个例子中判断有序程度的关键,其实就是高频的图像就混乱,低频的就相对有序一些。

随便拿一些别的图片试试:

定性看效果良好。

5 总结

深度学习解决了机器学习中后向算法的隐层较少的问题,对复杂问题提出了一个更好的线性解决方向。对于特征的提取,只需要让计算机通过深度学习算法进行分析,弱化了人为分析提取特征的环节。面对复杂问题,不需要掌握高深的数学基础也能对模型特征有一个很好的把握。但是深度学习算法的层数,也影响了算法的性能,在实时性要求交高的领域,仍有很多差距。


 

【参考文献】

[1]韩小虎,徐鹏,韩森森. 深度学习理论综述[J]. 计算机时代,2016,06:107-110.

[2]赵冬斌,邵坤,朱圆恒,李栋,陈亚冉,王海涛,刘德荣,周彤,王成红. 深度强化学习综述:兼论计算机围棋的发展[J]. 控制理论与应用,2016,06:701-717.

[3]尹宝才,王文通,王立春. 深度学习研究综述[J]. 北京工业大学学报,2015,01:48-59.

[4]孙志军,薛磊,许阳明,王正. 深度学习研究综述[J]. 计算机应用研究,2012,08:2806-2810.

[5] DeepLearning(深度学习)学习笔记整理系列http://blog.csdn.net/zouxy09/article/details/8775360/

[6]十个值得一试的开源深度学习框架https://www.oschina.net/news/68074/ten-worth-a-try-open-deep-learning-framework

[7] Caffe——清晰高效的深度学习(DeepLearning)框架http://www.tuicool.com/articles/z2YBrm

[8] 利用Caffe做回归(regression)http://www.cnblogs.com/frombeijingwithlove/p/5314042.html

 

 

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值