深度神经网络是机器学习(ML,MachineLearning)领域中一种技术。在监督学习中,以前的多层神经网络的问题是容易陷入局部极值点。
如果训练样本足够充分覆盖未来的样本,那么学到的多层权重可以很好的用来预测新的测试样本。
但是很多任务难以得到足够多的标记样本,在这种情况下,简单的模型,比如线性回归或者决策树往往能得到比多层神经网络更好的结果(更好的泛化性,更差的训练误差)。
扩展资料:非监督学习中,以往没有有效的方法构造多层网络。多层神经网络的顶层是底层特征的高级表示,比如底层是像素点,上一层的结点可能表示横线,三角。而顶层可能有一个结点表示人脸。
一个成功的算法应该能让生成的顶层特征最大化的代表底层的样例。如果对所有层同时训练,时间复杂度会太高;如果每次训练一层,偏差就会逐层传递。这会面临跟上面监督学习中相反的问题,会严重欠拟合。
谷歌人工智能写作项目:小发猫
深度学习与神经网络关系2017-01-10最近开始学习深度学习,基本上都是zouxy09博主的文章,写的蛮好,很全面,也会根据自己的思路,做下删减,细化两张图片分别通过两个神经网络,神经网络 图片。
五、DeepLearning的基本思想假设我们有一个系统S,它有n层(S1,…Sn),它的输入是I,输出是O,形象地表示为:I=>S1=>S2=>…..=>Sn=>O,如果输出O等于输入I,即输入I经过这个系统变化之后没有任何的信息损失(呵呵,大牛说,这是不可能的。
信息论中有个“信息逐层丢失”的说法(信息处理不等式),设处理a信息得到b,再对b处理得到c,那么可以证明:a和c的互信息不会超过a和b的互信息。这表明信息处理不会增加信息,大部分处理会丢失信息。
当然了,如果丢掉的是没用的信息那多好啊),保持了不变,这意味着输入I经过每一层Si都没有任何的信息损失,即在任何一层Si,它都是原有信息(即输入I)的另外一种表示。
现在回到我们的主题DeepLearning,我们需要自动地学习特征,假设我们有一堆输入I(如一堆图像或者文本),假设我们设计了一个系统S(有n层),我们通过调整系统中参数,使得它的输出仍然是输入I,那么我们就可以自动地获取得到输入I的一系列层次特征,即S1,…,Sn。
对于深度学习来说,其思想就是对堆叠多个层,也就是说这一层的输出作为下一层的输入。通过这种方式,就可以实现对输入信息进行分级表达了。
另外,前面是假设输出严格地等于输入,这个限制太严格,我们可以略微地放松这个限制,例如我们只要使得输入与输出的差别尽可能地小即可,这个放松会导致另外一类不同的DeepLearning方法。
上述就是DeepLearning的基本思想。六、浅层学习(ShallowLearning)和深度学习(DeepLearning)浅层学习是机器学习的第一次浪潮。
20世纪80年代末期,用于人工神经网络的反向传播算法(也叫BackPropagation算法或者BP算法)的发明,给机器学习带来了希望,掀起了基于统计模型的机器学习热潮。这个热潮一直持续到今天。
人们发现,利用BP算法可以让一个人工神经网络模型从大量训练样本中学习统计规律,从而对未知事件做预测。这种基于统计的机器学习方法比起过去基于人工规则的系统,在很多方面显出优越性。
这个时候的人工神经网络,虽也被称作多层感知机(Multi-layerPerceptron),但实际是种只含有一层隐层节点的浅层模型。
20世纪90年代,各种各样的浅层机器学习模型相继被提出,例如支撑向量机(SVM,SupportVectorMachines)、Boosting、最大熵方法(如LR,LogisticRegression)等。
这些模型的结构基本上可以看成带有一层隐层节点(如SVM、Boosting),或没有隐层节点(如LR)。这些模型无论是在理论分析还是应用中都获得了巨大的成功。
相比之下,由于理论分析的难度大,训练方法又需要很多经验和技巧,这个时期浅层人工神经网络反而相对沉寂。深度学习是机器学习的第二次浪潮。
2006年,加拿大多伦多大学教授、机器学习领域的泰斗GeoffreyHinton和他的学生RuslanSalakhutdinov在《科学》上发表了一篇文章,开启了深度学习在学术界和工业界的浪潮。
这篇文章有两个主要观点:1)多隐层的人工神经网络具有优异的特征学习能力,学习得到的特征对数据有更本质的刻画,从而有利于可视化或分类;2)深度神经网络在训练上的难度,可以通过“逐层初始化”(layer-wisepre-training)来有效克服,在这篇文章中,逐层初始化是通过无监督学习实现的。
当前多数分类、回归等学习方法为浅层结构算法,其局限性在于有限样本和计算单元情况下对复杂函数的表示能力有限,针对复杂分类问题其泛化能力受到一定制约。
深度学习可通过学习一种深层非线性网络结构,实现复杂函数逼近,表征输入数据分布式表示,并展现了强大的从少数样本集中学习数据集本质特征的能力。
(多层的好处是可以用较少的参数表示复杂的函数)深度学习的实质,是通过构建具有很多隐层的机器学习模型和海量的训练数据,来学习更有用的特征,从而最终提升分类或预测的准确性。
因此,“深度模型”是手段,“特征学习”是目的。
区别于传统的浅层学习,深度学习的不同在于:1)强调了模型结构的深度,通常有5层、6层,甚至10多层的隐层节点;2)明确突出了特征学习的重要性,也就是说,通过逐层特征变换,将样本在原空间的特征表示变换到一个新特征空间,从而使分类或预测更加容易。
与人工规则构造特征的方法相比,利用大数据来学习特征,更能够刻画数据的丰富内在信息。
七、Deeplearning与NeuralNetwork深度学习是机器学习研究中的一个新的领域,其动机在于建立、模拟人脑进行分析学习的神经网络,它模仿人脑的机制来解释数据,例如图像,声音和文本。
深度学习是无监督学习的一种。深度学习的概念源于人工神经网络的研究。含多隐层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。
Deeplearning本身算是machinelearning的一个分支,简单可以理解为neuralnetwork的发展。
大约二三十年前,neuralnetwork曾经是ML领域特别火热的一个方向,但是后来确慢慢淡出了,原因包括以下几个方面:1)比较容易过拟合,参数比较难tune,而且需要不少trick;2)训练速度比较慢,在层次比较少(小于等于3)的情况下效果并不比其它方法更优;所以中间有大约20多年的时间,神经网络被关注很少,这段时间基本上是SVM和boosting算法的天下。
但是,一个痴心的老先生Hinton,他坚持了下来,并最终(和其它人一起Bengio、Yann.lecun等)提成了一个实际可行的deeplearning框架。
Deeplearning与传统的神经网络之间有相同的地方也有很多不同。
二者的相同在于deeplearning采用了神经网络相似的分层结构,系统由包括输入层、隐层(多层)、输出层组成的多层网络,只有相邻层节点之间有连接,同一层以及跨层节点之间相互无连接,每一层可以看作是一个logisticregression模型;这种分层结构,是比较接近人类大脑的结构的。
而为了克服神经网络训练中的问题,DL采用了与神经网络很不同的训练机制。
传统神经网络(这里作者主要指前向神经网络)中,采用的是backpropagation的方式进行,简单来讲就是采用迭代的算法来训练整个网络,随机设定初值,计算当前网络的输出,然后根据当前输出和label之间的差去改变前面各层的参数,直到收敛(整体是一个梯度下降法)。
而deeplearning整体上是一个layer-wise的训练机制。
这样做的原因是因为,如果采用backpropagation的机制,对于一个deepnetwork(7层以上),残差传播到最前面的层已经变得太小,出现所谓的gradientdiffusion(梯度扩散)。
这个问题我们接下来讨论。
八、Deeplearning训练过程8.1、传统神经网络的训练方法为什么不能用在深度神经网络BP算法作为传统训练多层网络的典型算法,实际上对仅含几层网络,该训练方法就已经很不理想。
深度结构(涉及多个非线性处理单元层)非凸目标代价函数中普遍存在的局部最小是训练困难的主要来源。
BP算法存在的问题:(1)梯度越来越稀疏:从顶层越往下,误差校正信号越来越小;(2)收敛到局部最小值:尤其是从远离最优区域开始的时候(随机值初始化会导致这种情况的发生);(3)一般,我们只能用有标签的数据来训练:但大部分的数据是没标签的,而大脑可以从没有标签的的数据中学习;8.2、deeplearning训练过程如果对所有层同时训练,时间复杂度会太高;如果每次训练一层,偏差就会逐层传递。
这会面临跟上面监督学习中相反的问题,会严重欠拟合(因为深度网络的神经元和参数太多了)。
2006年,hinton提出了在非监督数据上建立多层神经网络的一个有效方法,简单的说,分为两步,一是每次训练一层网络,二是调优,使原始表示x向上生成的高级表示r和该高级表示r向下生成的x'尽可能一致。
方法是:1)首先逐层构建单层神经元,这样每次都是训练一个单层网络。2)当所有层训练完后,Hinton使用wake-sleep算法进行调优。
将除最顶层的其它层间的权重变为双向的,这样最顶层仍然是一个单层神经网络,而其它层则变为了图模型。向上的权重用于“认知”,向下的权重用于“生成”。然后使用Wake-Sleep算法调整所有的权重。
让认知和生成达成一致,也就是保证生成的最顶层表示能够尽可能正确的复原底层的结点。
比如顶层的一个结点表示人脸,那么所有人脸的图像应该激活这个结点,并且这个结果向下生成的图像应该能够表现为一个大概的人脸图像。Wake-Sleep算法分为醒(wake)和睡(sleep)两个部分。
1)wake阶段:认知过程,通过外界的特征和向上的权重(认知权重)产生每一层的抽象表示(结点状态),并且使用梯度下降修改层间的下行权重(生成权重)。
也就是“如果现实跟我想象的不一样,改变我的权重使得我想象的东西就是这样的”。2)sleep阶段:生成过程,通过顶层表示(醒时学得的概念)和向下权重,生成底层的状态,同时修改层间向上的权重。
也就是“如果梦中的景象不是我脑中的相应概念,改变我的认知权重使得这种景象在我看来就是这个概念”。
deeplearning训练过程具体如下:1)使用自下上升非监督学习(就是从底层开始,一层一层的往顶层训练):采用无标定数据(有标定数据也可)分层训练各层参数,这一步可以看作是一个无监督训练过程,是和传统神经网络区别最大的部分(这个过程可以看作是featurelearning过程):具体的,先用无标定数据训练第一层,训练时先学习第一层的参数(这一层可以看作是得到一个使得输出和输入差别最小的三层神经网络的隐层),由于模型capacity的限制以及稀疏性约束,使得得到的模型能够学习到数据本身的结构,从而得到比输入更具有表示能力的特征;在学习得到第n-1层后,将n-1层的输出作为第n层的输入,训练第n层,由此分别得到各层的参数;2)自顶向下的监督学习(就是通过带标签的数据去训练,误差自顶向下传输,对网络进行微调):基于第一步得到的各层参数进一步fine-tune整个多层模型的参数,这一步是一个有监督训练过程;第一步类似神经网络的随机初始化初值过程,由于DL的第一步不是随机初始化,而是通过学习输入数据的结构得到的,因而这个初值更接近全局最优,从而能够取得更好的效果;所以deeplearning效果好很大程度上归功于第一步的featurelearning过程。
因为逻辑回归可以看成是一个简化的单层神经网络。虽然理论上神经网络具备逼近任意函数的能力,但是实际上很难通过训练让一个单层网络拥有这样的能力。
所以一般神经网络至少2层,随着层数的增加,分类效果也会有一定的上升。
目前,业界有一种错误的较为普遍的意识,即“深度学习最终可能会淘汰掉其他所有机器学习算法”。
这种意识的产生主要是因为,当下深度学习在计算机视觉、自然语言处理领域的应用远超过传统的机器学习方法,并且媒体对深度学习进行了大肆夸大的报道。
深度学习,作为目前最热的机器学习方法,但并不意味着是机器学习的终点。
起码目前存在以下问题:1.深度学习模型需要大量的训练数据,才能展现出神奇的效果,但现实生活中往往会遇到小样本问题,此时深度学习方法无法入手,传统的机器学习方法就可以处理;2.有些领域,采用传统的简单的机器学习方法,可以很好地解决了,没必要非得用复杂的深度学习方法;3.深度学习的思想,来源于人脑的启发,但绝不是人脑的模拟,举个例子,给一个三四岁的小孩看一辆自行车之后,再见到哪怕外观完全不同的自行车,小孩也十有八九能做出那是一辆自行车的判断,也就是说,人类的学习过程往往不需要大规模的训练数据,而现在的深度学习方法显然不是对人脑的模拟。
深度学习大佬YoshuaBengio在Quora上回答一个类似的问题时,有一段话讲得特别好,这里引用一下,以回答上述问题:ScienceisNOTabattle,itisacollaboration.Weallbuildoneachother'sideas.Scienceisanactoflove,notwar.Loveforthebeautyintheworldthatsurroundsusandlovetoshareandbuildsomethingtogether.Thatmakesscienceahighlysatisfyingactivity,emotionallyspeaking!这段话的大致意思是,科学不是战争而是合作,任何学科的发展从来都不是一条路走到黑,而是同行之间互相学习、互相借鉴、博采众长、相得益彰,站在巨人的肩膀上不断前行。
机器学习的研究也是一样,你死我活那是邪教,开放包容才是正道。结合机器学习2000年以来的发展,再来看Bengio的这段话,深有感触。
进入21世纪,纵观机器学习发展历程,研究热点可以简单总结为2000-2006年的流形学习、2006年-2011年的稀疏学习、2012年至今的深度学习。未来哪种机器学习算法会成为热点呢?
深度学习三大巨头之一吴恩达曾表示,“在继深度学习之后,迁移学习将引领下一波机器学习技术”。但最终机器学习的下一个热点是什么,谁又能说得准呢。
编辑于2017-12-2729918条评论分享收藏感谢收起阿里云云栖社区用户标识1已认证的官方帐号39人赞同了该回答人工智能并不是一个新的术语,它已经有几十年的历史了,大约从80年代初开始,计算机科学家们开始设计可以学习和模仿人类行为的算法。
在算法方面,最重要的算法是神经网络,由于过拟合而不是很成功(模型太强大,但数据不足)。尽管如此,在一些更具体的任务中,使用数据来适应功能的想法已经取得了显着的成功,并且这也构成了当今机器学习的基础。
在模仿方面,人工智能专注于图像识别,语音识别和自然语言处理。人工智能专家们花费了大量的时间来创建诸如边缘检测,颜色配置文件,N-gram,语法树等。不过,这些进步还不足以达到我们的需求。
传统的机器学习:机器学习(ML)技术在预测中发挥了重要的作用,ML经历了多代的发展,形成了具有丰富的模型结构,例如:1.线性回归。2.逻辑回归。3.决策树。4.支持向量机。5.贝叶斯模型。
6.正则化模型。7.模型集成(ensemble)。8.神经网络。这些预测模型中的每一个都基于特定的算法结构,参数都是可调的。
训练预测模型涉及以下步骤:1. 选择一个模型结构(例如逻辑回归,随机森林等)。2. 用训练数据(输入和输出)输入模型。3. 学习算法将输出最优模型(即具有使训练错误最小化的特定参数的模型)。
每种模式都有自己的特点,在一些任务中表现不错,但在其他方面表现不佳。但总的来说,我们可以把它们分成低功耗(简单)模型和高功耗(复杂)模型。选择不同的模型是一个非常棘手的问题。
由于以下原因,使用低功率/简单模型是优于使用高功率/复杂模型:在我们拥有强大的处理能力之前,训练高功率模型将需要很长的时间。
在我们拥有大量数据之前,训练高功率模型会导致过度拟合问题(因为高功率模型具有丰富的参数并且可以适应广泛的数据形状,所以我们最终可能训练一个适合于特定到当前的训练数据,而不是推广到足以对未来的数据做好预测)。
然而,选择一个低功率的模型会遇到所谓的“欠拟合”的问题,模型结构太简单,如果它复杂,就无法适应训练数据。
(想象一下,基础数据有一个二次方关系:y=5*x^2;你无法适应线性回归:y=a*x+b,不管我们选择什么样的a和b。
为了缓解“不适合的问题”,数据科学家通常会运用他们的“领域知识”来提出“输入特征”,这与输出关系更为直接。
(例如,返回二次关系y=5*square(x),如果创建了一个特征z=x^2,则可以拟合线性回归:y=a*z+b,通过选择a=5和b=0)。
机器学习的主要障碍是特征工程这个步骤,这需要领域专家在进入训练过程之前就要找到非常重要的特征。特征工程步骤是要靠手动完成的,而且需要大量领域专业知识,因此它成为当今大多数机器学习任务的主要瓶颈。
换句话说,如果我们没有足够的处理能力和足够的数据,那么我们必须使用低功耗/更简单的模型,这就需要我们花费大量的时间和精力来创建合适的输入特征。这是大多数数据科学家今天花时间去做的地方。
神经网络的回归:在大数据时代,云计算和大规模并行处理基础架构的共同发展,使得机器处理能力在二十一世纪初得到了极大的提升。我们不再局限于低功耗/简单的模型。
例如,当今最流行的两种主流机器学习模型是随机森林和梯度提升树。尽管如此,两者都非常强大,并且提供了非线性模型拟合的训练数据,但数据科学家仍然需要仔细地创建特征以获得良好的性能。
与此同时,计算机科学家重新使用神经网络的许多层来完成这些人类模仿的任务。这给DNN(深度神经网络)带来了新的生机,并在图像分类和语音识别任务方面提供了重大突破。
DNN的主要区别在于,你可以将原始信号(例如RGB像素值)直接输入DNN,而不需要创建任何域特定的输入功能。
通过多层神经元(这就是为什么它被称为“深度”神经网络),DNN可以“自动”通过每一层产生适当的特征,最后提供一个非常好的预测。这极大地消除了寻找“特征工程”的麻烦,这是数据科学家们最喜欢看到的。
DNN也演变成许多不同的网络拓扑结构,所以有CNN(卷积神经网络),RNN(递归神经网络),LSTM(长期短期记忆),GAN(生成敌对网络),转移学习,注意模型(attentionmodel)所有的这些被统称为深度学习(DeepLearning),它正在引起整个机器学习界的关注。
强化学习:另一个关键组成部分是关于如何模仿一个人(或动物)的学习,设想感知/行为/奖励循环的非常自然的动物行为。一个人或者一个动物首先会通过感知他或者她所处的状态来了解环境。
在此基础上,他或者她会选择一个“动作”,将他或者她带到另一个“状态”。那么他或她将获得“奖励”,循环重复,直到他或她消失。这种学习方式(称为强化学习)与传统监督机器学习的曲线拟合方法有很大不同。
尤其是,强化学习学习得非常快,因为每一个新的反馈(例如执行一个行动并获得奖励)都被立即发送到影响随后的决定。
强化学习也提供了预测和优化的平滑整合,因为它在采取不同的行动时保持当前状态的信念和可能的转换概率,然后做出决定哪些行动可以导致最佳结果。
深度学习+强化学习=AI与经典的ML技术相比,DL提供了一个更强大的预测模型,通常可以产生良好的预测结果。与经典优化模型相比,强化学习提供了更快的学习机制,并且更适应环境的变化。
机器学习vs深度学习在深度探讨machinelearning和datascience的联系之前,这里简要地讨论一下machinelearning和deeplearning。
machinelearning是一套算法,来训练数据集做预测或者采取行动以使得系统最优化。
举例来说,supervisedclassificationalgorithms被用来根据历史数据将想要贷款的客户分成预期好的和预期差的(goodorbadprospects)。
对于给定的任务(比如监督聚类),需要的技术多种多样:naiveBayes、SVM、neuralnets、ensembles、associationrules、decisiontrees、logisticregression,或者是很多技术的组合。
所有这些都是数据科学的子集。当这些算法自动化后,比如无人驾驶飞机或者无人驾驶汽车,这就叫AI了,或者说的具体一点,deeplearning。
如果采集的数据来自传感器并且通过互联网传播,那么这就是机器学习或数据科学或深度学习应用于物联网了。有些人对深度学习有不同的定义,他们认为深度学习是更深层次的神经网络(一种机器学习的技术)。
AI(ArtificialIntelligence)是创建于20世纪60年代的计算机科学的一个子领域,是关于解决那些对人类来讲非常容易但是对计算机而言很难的任务。
值得一提的是,所谓的strongAI可能可以做所有人类可以做的事情(可能除了纯粹的物理问题)。
这是相当广泛的,包括各种各样的事情,比如做计划,在世界上到处溜达,识别物体和声音,说话,翻译,社交或者商业交易,还有创造性工作(比如写诗画画)等等。
NLP(Naturallanguageprocessing)只是AI要处理的语言部分,尤其是写。
Machinelearning是这样的一种情况:给出一些可以被以离散形式描述的AI问题(比如从一系列动作中选出对的那个),然后给定一堆外部世界的信息,在不需要程序员手动写程序的情况下选出那个“正确的”行为。
通常情况需要借助外界的一些过程来判断这个动作对不对。在数学上,这就是函数:你给一些输入,然后你想要他处理一下得到正确的输出,所以整个问题就简化为用一些自动的方式建立这种数学函数模型。
和AI区分一下:如果我写了一段特别机智的程序有着人类的行为,那这就可以是AI,但是除非它的参量都是自动从数据中学会的,否则就不是机器学习。Deeplearning是当下非常流行的机器学习的一种。
它包含一种特殊的数学模型,可以想成是一种特定类型的简单块的组合(或者说是块的功能的组合),这些块可以进行调整来更好的预测最终结果。
深度学习具体都会学神经网络、BP反向传播算法、TensorFlow深度学习工具等。
而神经网络需要学习的有:从生物神经元到人工神经元激活函数Relu、Tanh、Sigmoid透过神经网络拓扑理解逻辑回归分类透过神经网络拓扑理解Softmax回归分类透过神经网络隐藏层理解升维降维剖析隐藏层激活函数必须是非线性的原因神经网络在sklearn模块中的使用水泥强度预测案例及绘制神经网络拓扑BP反向传播算法需要学习的有:BP反向传播目的链式求导法则BP反向传播推导不同激活函数在反向传播应用不同损失函数在反向传播应用Python实现神经网络实战案例TensorFlow深度学习工具设计到:TF安装(包含CUDA和cudnn安装)TF实现多元线性回归之解析解求解TF实现多元线性回归之梯度下降求解TF预测california房价案例TF实现Softmax回归Softmax分类MNIST手写数字识别项目案例TF框架模型的保存和加载8)TF实现DNN多层神经网络9)DNN分类MNIST手写数字识别项目案例10)Tensorboard模块可视化这些就是深度学习涉及到的一些知识,一般来说深入理解神经网络算法及其优化算法,掌握TensorFlow开发流程,通过实现神经网络完成回归和分类任务。
TensorFlow框架学好了,其它深度学习框架比如Keras、PyTorch掌握起来易如反掌。另外可以进行一些实战,这样才更熟练。
。
这个线性回归程序没有隐藏层是一个单层神经网络,隐藏层是在多层感知机中引入的,并且一般要在隐藏层中使用ReLU函数作为激活函数,否则,虽然引入隐藏层,仍然等价于一个单层神经网络.下面是一种激活函数ReLU(见图),它只保留正数元素,负数元素清零.。
深度学习之损失函数与激活函数的选择在深度神经网络(DNN)反向传播算法(BP)中,我们对DNN的前向反向传播算法的使用做了总结。其中使用的损失函数是均方差,而激活函数是Sigmoid。
实际上DNN可以使用的损失函数和激活函数不少。这些损失函数和激活函数如何选择呢?以下是本文的内容。MSE损失+Sigmoid激活函数的问题先来看看均方差+Sigmoid的组合有什么问题。
回顾下Sigmoid激活函数的表达式为:函数图像如下:从图上可以看出,对于Sigmoid,当z的取值越来越大后,函数曲线变得越来越平缓,意味着此时的导数σ′(z)也越来越小。
同样的,当z的取值越来越小时,也有这个问题。仅仅在z取值为0附近时,导数σ′(z)的取值较大。在均方差+Sigmoid的反向传播算法中,每一层向前递推都要乘以σ′(z),得到梯度变化值。
Sigmoid的这个曲线意味着在大多数时候,我们的梯度变化值很小,导致我们的W,b更新到极值的速度较慢,也就是我们的算法收敛速度较慢。那么有什么什么办法可以改进呢?
交叉熵损失+Sigmoid改进收敛速度Sigmoid的函数特性导致反向传播算法收敛速度慢的问题,那么如何改进呢?换掉Sigmoid?这当然是一种选择。
另一种常见的选择是用交叉熵损失函数来代替均方差损失函数。每个样本的交叉熵损失函数的形式:其中,?为向量内积。
这个形式其实很熟悉,在逻辑回归原理小结中其实我们就用到了类似的形式,只是当时我们是用最大似然估计推导出来的,而这个损失函数的学名叫交叉熵。
使用了交叉熵损失函数,就能解决Sigmoid函数导数变化大多数时候反向传播算法慢的问题吗?我们来看看当使用交叉熵时,我们输出层δL的梯度情况。
对比一下均方差损失函数时在δL梯度使用交叉熵,得到的的δl梯度表达式没有了σ′(z),梯度为预测值和真实值的差距,这样求得的Wl,bl的梯度也不包含σ′(z),因此避免了反向传播收敛速度慢的问题。
通常情况下,如果我们使用了sigmoid激活函数,交叉熵损失函数肯定比均方差损失函数好用。
对数似然损失+softmax进行分类输出在前面我们都假设输出是连续可导的值,但是如果是分类问题,那么输出是一个个的类别,那我们怎么用DNN来解决这个问题呢?
DNN分类模型要求是输出层神经元输出的值在0到1之间,同时所有输出值之和为1。很明显,现有的普通DNN是无法满足这个要求的。但是我们只需要对现有的全连接DNN稍作改良,即可用于解决分类问题。
在现有的DNN模型中,我们可以将输出层第i个神经元的激活函数定义为如下形式:这个方法很简洁漂亮,仅仅只需要将输出层的激活函数从Sigmoid之类的函数转变为上式的激活函数即可。
上式这个激活函数就是我们的softmax激活函数。它在分类问题中有广泛的应用。将DNN用于分类问题,在输出层用softmax激活函数也是最常见的了。
对于用于分类的softmax激活函数,对应的损失函数一般都是用对数似然函数,即:其中yk的取值为0或者1,如果某一训练样本的输出为第i类。则yi=1,其余的j≠i都有yj=0。
由于每个样本只属于一个类别,所以这个对数似然函数可以简化为:可见损失函数只和真实类别对应的输出有关,这样假设真实类别是第i类,则其他不属于第i类序号对应的神经元的梯度导数直接为0。
对于真实类别第i类,它的WiL对应的梯度计算为:可见,梯度计算也很简洁,也没有第一节说的训练速度慢的问题。
当softmax输出层的反向传播计算完以后,后面的普通DNN层的反向传播计算和之前讲的普通DNN没有区别。梯度爆炸or消失与ReLU学习DNN,大家一定听说过梯度爆炸和梯度消失两个词。
尤其是梯度消失,是限制DNN与深度学习的一个关键障碍,目前也没有完全攻克。什么是梯度爆炸和梯度消失呢?
简单理解,就是在反向传播的算法过程中,由于我们使用了是矩阵求导的链式法则,有一大串连乘,如果连乘的数字在每层都是小于1的,则梯度越往前乘越小,导致梯度消失,而如果连乘的数字在每层都是大于1的,则梯度越往前乘越大,导致梯度爆炸。
比如如下的梯度计算:如果不巧我们的样本导致每一层的梯度都小于1,则随着反向传播算法的进行,我们的δl会随着层数越来越小,甚至接近越0,导致梯度几乎消失,进而导致前面的隐藏层的W,b参数随着迭代的进行,几乎没有大的改变,更谈不上收敛了。
这个问题目前没有完美的解决办法。而对于梯度爆炸,则一般可以通过调整我们DNN模型中的初始化参数得以解决。
对于无法完美解决的梯度消失问题,一个可能部分解决梯度消失问题的办法是使用ReLU(RectifiedLinearUnit)激活函数,ReLU在卷积神经网络CNN中得到了广泛的应用,在CNN中梯度消失似乎不再是问题。
那么它是什么样子呢?其实很简单,比我们前面提到的所有激活函数都简单,表达式为:也就是说大于等于0则不变,小于0则激活后为0。
其他激活函数DNN常用的激活函数还有:tanh这个是sigmoid的变种,表达式为:tanh激活函数和sigmoid激活函数的关系为:tanh和sigmoid对比主要的特点是它的输出落在了[-1,1],这样输出可以进行标准化。
同时tanh的曲线在较大时变得平坦的幅度没有sigmoid那么大,这样求梯度变化值有一些优势。当然,要说tanh一定比sigmoid好倒不一定,还是要具体问题具体分析。
softplus这个其实就是sigmoid函数的原函数,表达式为:它的导数就是sigmoid函数。softplus的函数图像和ReLU有些类似。它出现的比ReLU早,可以视为ReLU的鼻祖。
PReLU从名字就可以看出它是ReLU的变种,特点是如果未激活值小于0,不是简单粗暴的直接变为0,而是进行一定幅度的缩小。如下图。
小结上面我们对DNN损失函数和激活函数做了详细的讨论,重要的点有:1)如果使用sigmoid激活函数,则交叉熵损失函数一般肯定比均方差损失函数好;2)如果是DNN用于分类,则一般在输出层使用softmax激活函数和对数似然损失函数;3)ReLU激活函数对梯度消失问题有一定程度的解决,尤其是在CNN模型中。