深度学习是用于建立、模拟人脑进行分析学习的神经网络,并模仿人脑的机制来解释数据的一种复杂的机器学习算法,对学习过程中获得的信息对诸如文字、图像和声音等数据的解释有很大的帮助。其多层人工神经网络模型有很强的特征学习能力,深度学习模型学习得到的特征数据对原数据有更本质的代表性,这将大大便于分类和可视化问题。它的最终目标是让机器能够像人一样具有分析学习能力,能够识别文字、图像和声音等数据。
深度学习通过设计建立适量的神经元计算节点和多层运算层次结构,选择合适的输入层和输出层,通过网络的学习和调优、大规模数据进行训练,得到大量更具代表性的特征信息。从而对样本进行分类和预测,提高分类和预测的精度,建立一个从输入到输出的具有很好效果的函数关系,虽然不能100%找到输入与输出的函数关系,但是可以尽可能的逼近现实的关联关系。使用训练成功的网络模型,就可以实现我们对复杂事务处理的自动化要求。
换句话说,深度学习通过一种深层非线性网络结构,具有对输入样本数据强大的本质特征的抽取能力,学习样本数据的内在规律和表示层次。它对输入数据逐级提取从底层到高层的特征,从而建立一个从底层特征到高层语义的映射关系,实现复杂函数逼近,表征输入数据分布式表示。
相对于浅层学习,其有限样本和计算单元情况下对复杂函数的表示能力更好,针对复杂问题的泛化能力更佳。
神经网络可以拟合任何函数,不管这个函数的表达是多么的复杂,因此深度学习在拟合函数这一方面的能力十分强大、暴力和神秘。机器学习其实就是在找输入和输出之间的关系,找到一个数学函数表达式f,使机器能够准确得出结果。
在传统的机器学习中,算法的结构大多充满了逻辑,这种结构可以被人分析,最终抽象为某种流程图或者一个代数上的公式,最典型的比如决策树,具有非常高的可解释性。但是深度学习,则缺乏可解释性。一方面,我们比较难知道网络具体在做些什么;另一方面,我们很难解释神经网络在解决问题的时候,为什么要这么做,为什么有效果。这是因为深度学习的工作原理,是通过一层层神经网络,使得输入的信息在经过每一层时,都做一个数学拟合,这样每一层都提供了一个函数,然后通过这每一层的函数的叠加,深度学习网络的输出就无限逼近目标输出了。这样一种“万能近似”,很多时候是输入和输出在数值上的一种耦合,而不是真的找到了一种代数上的表达式。所以,很多时候,你的深度学习网络能很好的完成你的任务,可是你并不知道网络学习到了什么,也不知道网络为什么做出了特定的选择,这也是深度学习的一种未知的迷人,期待我们能揭开她的面纱。
人工智能的简单认识:
人工智能,简单来说就是通过一系列技术(例如无监督学习、人工生命、神经网络)构造具有一定智能行为或者模仿部分大脑思维模式的人工系统,让机器具有人类的感知、思维和情感,从而来解决在一个问题领域出现的复杂问题。
机器学习的简单认识:
机器学习主要研究如何使用计算机模拟和实现人类获取知识 (学习) 过程, 创新、重构已有的知识, 从而提升自身处理问题的能力。机器学习的最终目的是从数据中获取知识。
在目前的一些实际操作中,机器学习常常按照这个过程来进行:先给予一批数据样本,然后通过算法来学习这批数据,然后利用学习的结果来实现预测或推断之后系统的行为或者决策的方向。
简单来说:
1.深度学习是机器学习的一个分支(最重要的分支)
2.机器学习是人工智能的一个分支
深度学习的概念源于人工神经网络的研究,所以很多深度学习算法中都会包含“神经网络”这个词,比如:卷积神经网络、循环神经网络,但在这并不意味着完全等于传统神经网络,我们可以说是在传统神经网络上的升级,约等于神经网络。
引用李开复《人工智能》的解释:
假设深度学习要处理的信息是“水流”,而处理数据的深度学习网络是一个由管道和阀门组成的巨大水管网络。网络的入口是若干管道开口,网络的出口也是若干管道开口。这个水管网络有许多层,每一层由许多个可以控制水流流向与流量的调节阀。根据不同任务的需要,水管网络的层数、每层的调节阀数量可以有不同的变化组合。对复杂任务来说,调节阀的总数可以成千上万甚至更多。水管网络中,每一层的每个调节阀都通过水管与下一层的所有调节阀连接起来,组成一个从前到后,逐层完全连通的水流系统。
那么,计算机该如何使用这个庞大的水管网络来学习识字呢?
比如,当计算机看到一张写有“田”字的图片,就简单将组成这张图片的所有数字(在计算机里,图片的每个颜色点都是用“0”和“1”组成的数字来表示的)全都变成信息的水流,从入口灌进水管网络。
我们预先在水管网络的每个出口都插一块字牌,对应于每一个我们想让计算机认识的汉字。这时,因为输入的是“田”这个汉字,等水流流过整个水管网络,计算机就会跑到管道出口位置去看一看,是不是标记由“田”字的管道出口流出来的水流最多。如果是这样,就说明这个管道网络符合要求。如果不是这样,就调节水管网络里的每一个流量调节阀,让“田”字出口“流出”的水最多。
这下,计算机要忙一阵了,要调节那么多阀门!好在计算机的速度快,暴力的计算加上算法的优化,总是可以很快给出一个解决方案,调好所有阀门,让出口处的流量符合要求。
下一步,学习“申”字时,我们就用类似的方法,把每一张写有“申”字的图片变成一大堆数字组成的水流,灌进水管网络,看一看,是不是写有“申”字的那个管道出口流水最多,如果不是,我们还得再调整所有的阀门。这一次,要既保证刚才学过的“田”字不受影响,也要保证新的“申”字可以被正确处理。
如此反复进行,知道所有汉字对应的水流都可以按照期望的方式流过整个水管网络。这时,我们就说,这个水管网络是一个训练好的深度学习模型了。当大量汉字被这个管道网络处理,所有阀门都调节到位后,整套水管网络就可以用来识别汉字了。这时,我们可以把调节好的所有阀门都“焊死”,静候新的水流到来。
与训练时做的事情类似,未知的图片会被计算机转变成数据的水流,灌入训练好的水管网络。这时,计算机只要观察一下,哪个出水口流出来的水流最多,这张图片写的就是哪个字。
深度学习大致就是这么一个用人类的数学知识与计算机算法构建起来的整体架构,再结合尽可能多的训练数据以及计算机的大规模运算能力去调节内部参数,尽可能逼近问题目标的半理论、半经验的建模方式。
传统机器学习的特征提取主要依赖人工,针对特定简单任务的时候人工提取特征会简单有效,但是并不能通用。
深度学习的特征提取是机器自动提取的。有时候模型虽然能有好的表现,但是我们并不知道他的原理是什么,也是说我们常说的深度学习的可解释性很差。
(1)深度学习模型结构含有更多的层次,包含隐层节点的层数通常在5层以上,有时甚至包含多达10层以上的隐藏节点;
(2)明确强调了特征学习对于深度模型的重要性,即通过逐层特征提取,将数据样本在原空间的特征变换到一个新的特征空间来表示初始数据,这使得分类或预测问题更加容易实现。和人工设计的特征提取方法相比,利用深度模型学习得到的数据特征对大数据的丰富内在信息更有代表性。
深度学习所得到的深度网络结构包含大量的单一元素(神经元),每个神经元与大量其他神经元相连接,神经元间的连接强度(权值)在学习过程中修改并决定网络的功能。通过深度学习得到的深度网络结构符合神经网络的特征,因此深度网络就是深层次的神经网络,即深度神经网络(deep neural networks, DNN)。对神经网络而言,深度指的是网络学习得到的函数中非线性运算组合水平的数量。
优点1:学习能力强
从结果来看,深度学习的表现非常好,他的学习能力非常强。
优点2:覆盖范围广,适应性好
深度学习的神经网络层数很多,宽度很广,理论上可以映射到任意函数,所以能解决很复杂的问题。
优点3:数据驱动,上限高
深度学习高度依赖数据,数据量越大,他的表现就越好。在图像识别、面部识别、NLP 等部分任务甚至已经超过了人类的表现。同时还可以通过调参进一步提高他的上限。
优点4:可移植性好
由于深度学习的优异表现,有很多框架可以使用,例如 TensorFlow、Pytorch。这些框架可以兼容很多平台。
缺点1:计算量大,便携性差
深度学习需要大量的数据很大量的算力,所以成本很高。并且现在很多应用还不适合在移动设备上使用。目前已经有很多公司和团队在研发针对便携设备的芯片。这个问题未来会得到解决。
缺点2:硬件需求高
深度学习对算力要求很高,普通的 CPU 已经无法满足深度学习的要求。主流的算力都是使用 GPU 和 TPU,所以对于硬件的要求很高,成本也很高。
缺点3:模型设计复杂
深度学习的模型设计非常复杂,需要投入大量的人力物力和时间来开发新的算法和模型。大部分人只能使用现成的模型。
缺点4:可解释性差
由于深度学习依赖数据,并且可解释性不高。
这里只谈DNN、CNN和RNN:
内容:是层数很深的全连接网络,层数决定了神经网络对数据的刻画能力——利用每层更少的神经元拟合更加复杂的函数。
优点:更好的数据刻画能力。
缺点:参数数量膨胀(训练开销大),没有考虑数据的固有局部特征(如图像中的轮廓、边界等等)。
功能:卷积神经网络更改了神经网络的结构,不再是全连接的结构了,大量的减少了网络的参数;同时,通过参数共享进一步减少了网络参数。它考虑到了空间结构和局部特征,能够将大数据量的图片有效的降维成小数据量(并不影响结果),保留图片的特征,非常适用于图像处理领域。
优势:
基本原理:卷积层 – 主要作用是保留图片的特征;池化层 – 主要作用是把数据降维,可以有效的避免过拟合;全连接层 – 根据不同任务输出我们想要的结果。
实际应用:图片分类和检索、目标定位检测、目标分割、人脸识别
RNN是一种能有效的处理序列数据的算法。比如:文章内容、语音音频、股票价格走势。之所以他能处理序列数据,是因为在序列中前面的输入也会影响到后面的输出,相当于有了“记忆功能”。但是 RNN 存在严重的短期记忆问题,长期的数据影响很小(哪怕他是重要的信息)。于是基于 RNN 出现了 LSTM 和 GRU 等变种算法来有效保留重要信息。
在普通的全连接网络或者CNN中,每层神经元的信号只能向上传播,样本的处理在各个时刻独立,因此又称为前馈神经网络。而在RNN中,神经元的输出可以在下一个时间戳直接作用到自身;即第i层的神经元在m时刻的输入包含i-1层在该时刻的输出以及其自身在m-1时刻的输出。在此基础上发展出了长短期记忆LSTM网络。
优点:可以对时间序列上的变化建模,适用于处理语音、自然语言等领域
实际应用:文本生成、语音识别、机器翻译、生成图像描述、视频标记
1、 深度学习目前存在的问题:
(1)理论问题:深度学习在理论方面存在的困难主要有两个,第一个是关于统计学习,另一个和计算量相关。相对浅层学习模型来说,深度学习模型对非线性函数的表示能力更好。根据通用的神经网络逼近理论,对任何一个非线性函数来说,都可以由一个浅层模型和一个深度学习模型很好的表示,但相对浅层模型,深度学习模型需要较少的参数。关于深度学习训练的计算复杂度也是我们需要关心的问题,即我们需要多大参数规模和深度的神经网络模型去解决相应的问题,在对构建好的网络进行训练时,需要多少训练样本才能足以使网络满足拟合状态。另外,网络模型训练所需要消耗的计算资源很难预估,对网络的优化技术仍有待进步。由于深度学习模型的代价函数都是非凸的,这也造成理论研究方面的困难。
(2)、建模问题:在解决深层学习理论和计算困难的同时,如何构建新的分层网络模型,既能够像传统深层模型一样能够有效的抽取数据的潜在特征,又能够像支持向量机一样便于进行理论分析,另外,如何针对不同的应用问题构建合适的深层模型同样是一个很有挑战性的问题。现在用于图像和语言的深度模型都拥有相似卷积和降采样的功能模块,研究人员在声学模型方面也在进行相应的探索,能不能找到一个统一的深度模型适用于图像,语音和自然语言的处理仍需要探索。
(3)工程应用问题:在深度学习的工程应用问题上,如何利用现有的大规模并行处理计算平台进行大规模样本数据训练是各个进行深度学习研发公司首要解决的难题。由于像Hadoop这样的传统大数据处理平台的延迟过高,不适用于深度学习的频繁迭代训练过程。现在最多采用的深度网络训练技术是随机梯度下降算法。这种算法不适于在多台计算机间并行运算,即使采用GPU加速技术对深度神经网络模型进行训练也是需要花费漫长的时间。随着互联网行业的高速发展,特别是数据挖掘的需要,往往面对的是海量需要处理的数据。由于深度学习网络训练速度缓慢无法满足互联网应用的需求。
2、深度学习未来研究方向:深度学习算法在计算机视觉(图像识别、视频识别等)和语音识别中的应用,尤其是大规模数据集下的应用取得突破性的进展,但仍有以下问题值得进一步研究:
(1)无标记数据的特征学习
目前,标记数据的特征学习仍然占据主导地位,而真实世界存在着海量的无标记数据,将这些无标记数据逐一添加人工标签,显然是不现实的。所以,随着数据集和存储技术的发展,必将越来越重视对无标记数据的特征学习,以及将无标记数据进行自动添加标签技术的研究。
(2)模型规模与训练速度
训练精度之间的权衡。一般地,相同数据集下,模型规模越大,训练精度越高,训练速度会越慢。例如一些模型方法采用ReLU非线性变换、GPU运算,在保证精度的前提下,往往需要训练5~7d。虽然离线训练并不影响训练之后模型的应用,但是对于模型优化,诸如模型规模调整、超参数设置、训练时调试等问题,训练时间会严重影响其效率。故而,如何在保证一定的训练精度的前提下,提高训练速度,依然是深度学习方向研究的课题之一。
(3)理论分析
需要更好地理解深度学习及其模型,进行更加深入的理论研究。深度学习模型的训练为什么那么困难?这仍然是一个开放性问题。一个可能的答案是深度结构神经网络有许多层,每一层由多个非线性神经元组成,使得整个深度结构神经网络的非线性程度更强,减弱了基于梯度的寻优方法的有效性;另一个可能的答案是局部极值的数量和结构随着深度结构神经网络深度的增加而发生定性改变,使得训练模型变得更加困难。造成深度学习训练困难的原因究竟是由于用于深度学习模型的监督训练准则大量存在不好的局部极值,还是因为训练准则对优化算法来说过于复杂,这是值得探讨的问题。此外,对堆栈自编码网络学习中的模型是否有合适的概率解释,能否得到深度学习模型中似然函数梯度的小方差和低偏差估计,能否同时训练所有的深度结构神经网络层,除了重构误差外,是否还存在其他更合适的可供选择的误差指标来控制深度结构神经网络的训练过程,是否存在容易求解的RBM配分函数的近似函数,这些问题还有待未来研究。考虑引入退火重要性抽样来解决局部极值问题,不依赖于配分函数的学习算法也值得尝试。
目前网上关于深度学习的源代码非常多,主要的项目有:
2006年,Hinton提出了在非监督数据上建立多层神经网络的一个有效方法,具体分为两步:首先逐层构建单层神经元,这样每次都是训练一个单层网络;当所有层训练完后,使用wake-sleep算法进行调优。
将除最顶层的其他层间的权重变为双向的,这样最顶层仍然是一个单层神经网络,而其他层则变为了图模型。向上的权重用于“认知”,向下的权重用于“生成”。然后使用wake-sleep算法调整所有的权重。让认知和生成达成一致,也就是保证生成的最顶层表示能够尽可能正确的复原底层的节点。比如顶层的一个节点表示人脸,那么所有人脸的图像应该激活这个节点,并且这个结果向下生成的图像应该能够表现为一个大概的人脸图像。wake-sleep算法分为醒( wake)和睡(sleep)两个部分。
wake阶段:认知过程,通过外界的特征和向上的权重产生每一层的抽象表示,并且使用梯度下降修改层间的下行权重。
sleep阶段:生成过程,通过顶层表示和向下权重,生成底层的状态,同时修改层间向上的权重。
对于深度神经网络很难训练达到最优的问题,可以采用逐层训练方法解决,将上层训练好的结果作为下层训练过程中的初始化参数。
就是从底层开始,一层一层地往顶层训练。采用无标定数据(有标定数据也可)分层训练各层参数,这一步可以看作是一个无监督训练过程,这也是和传统神经网络区别最大的部分,可以看作是特征学习过程。具体的,先用无标定数据训练第一层,训练时先学习第一层的参数,这层可以看作是得到一个使得输出和输入差别最小的三层神经网络的隐层,由于模型容量的限制以及稀疏性约束,使得得到的模型能够学习到数据本身的结构,从而得到比输入更具有表示能力的特征;在学习得到n-l层后,将n-l层的输出作为第n层的输入,训练第n层,由此分别得到各层的参数。
就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调。基于第一步得到的各层参数进一步优调整个多层模型的参数,这一步是一个有监督训练过程。第一步类似神经网络的随机初始化初值过程,由于第一步不是随机初始化,而是通过学习输入数据的结构得到的,因而这个初值更接近全局最优,从而能够取得更好的效果。所以深度学习的良好效果在很大程度上归功于第一步的特征学习的过程。
参考: