2017-09-11 10:20:10 shangfan0930 阅读数 8055
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39685 人正在学习 去看看 唐宇迪
作者:Jacky Yang
链接:https://www.zhihu.com/question/26006703/answer/129209540
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

关于深度学习,网上的资料很多,不过貌似大部分都不太适合初学者。 这里有几个原因:1.深度学习确实需要一定的数学基础。如果不用深入浅出地方法讲,有些读者就会有畏难的情绪,因而容易过早地放弃。2.中国人或美国人写的书籍或文章,普遍比较难一些。我不太清楚为什么,不过确实是这样子的。

深度学习,确实需要一定的数学基础,但真的那么难么?这个,还真没有。不信?听我来给你侃侃。看完,你也会觉得没那么难了。

本文是针对初学者,高手可以无视,有不对的地方,还请多多批评指正。

这里,先推荐一篇非常不错的文章:《1天搞懂深度学习》,300多页的ppt,台湾李宏毅教授写的,非常棒。不夸张地说,是我看过最系统,也最通俗易懂的,关于深度学习的文章。

要说先准备什么,私以为,其实只需要知道导数和相关的函数概念就可以了。高等数学也没学过?很好,我就是想让文科生也能看懂,您只需要学过初中数学就可以了。

其实不必有畏难的情绪,个人很推崇李书福的精神,在一次电视采访中,李书福说:谁说中国人不能造汽车?造汽车有啥难的,不就是四个轮子加两排沙发嘛。当然,他这个结论有失偏颇,不过精神可嘉。

导数是什么,无非就是变化率呗,王小二今年卖了100头猪,去年卖了90头,前年卖了80头。。。变化率或者增长率是什么?每年增长10头猪,多简单。这里需要注意有个时间变量---年。王小二卖猪的增长率是10头/年,也就是说,导数是10.函数y=f(x)=10x+30,这里我们假设王小二第一年卖了30头,以后每年增长10头,x代表时间(年),y代表猪的头数。当然,这是增长率固定的情形,现实生活中,很多时候,变化量也不是固定的,也就是说增长率也不是恒定的。比如,函数可能是这样: y=f(x)=5x²+30,这里x和y依然代表的是时间和头数,不过增长率变了,怎么算这个增长率,我们回头再讲。或者你干脆记住几个求导的公式也可以。

深度学习还有一个重要的数学概念:偏导数,偏导数的偏怎么理解?偏头疼的偏,还是我不让你导,你偏要导?都不是,我们还以王小二卖猪为例,刚才我们讲到,x变量是时间(年),可是卖出去的猪,不光跟时间有关啊,随着业务的增长,王小二不仅扩大了养猪场,还雇了很多员工一起养猪。所以方程式又变了:y=f(x)=5x₁²+8x₂ + 35x₃ +30这里x₂代表面积,x₃代表员工数,当然x₁还是时间。上面我们讲了,导数其实就是变化率,那么偏导数是什么?偏导数无非就是多个变量的时候,针对某个变量的变化率呗。在上面的公式里,如果针对x₃求偏导数,也就是说,员工对于猪的增长率贡献有多大,或者说,随着(每个)员工的增长,猪增加了多少,这里等于35---每增加一个员工,就多卖出去35头猪. 计算偏导数的时候,其他变量都可以看成常量,这点很重要,常量的变化率为0,所以导数为0,所以就剩对35x₃ 求导数,等于35. 对于x₂求偏导,也是类似的。求偏导我们用一个符号 表示:比如 y/ x₃ 就表示y对 x₃求偏导。

废话半天,这些跟深度学习到底有啥关系?有关系,我们知道,深度学习是采用神经网络,用于解决线性不可分的问题。关于这一点,我们回头再讨论,大家也可以网上搜一下相关的文章。我这里主要讲讲数学与深度学习的关系。先给大家看几张图:

<img src="https://pic3.zhimg.com/v2-91704850c698cbe0cdfd0af76d328ebe_b.png" data-rawwidth="631" data-rawheight="488" class="origin_image zh-lightbox-thumb" width="631" data-original="https://pic3.zhimg.com/v2-91704850c698cbe0cdfd0af76d328ebe_r.png">

图1. 所谓深度学习,就是具有很多个隐层的神经网络。

<img src="https://pic4.zhimg.com/v2-7875411304340d5accd6d800be9f933b_b.jpg" data-rawwidth="432" data-rawheight="576" class="origin_image zh-lightbox-thumb" width="432" data-original="https://pic4.zhimg.com/v2-7875411304340d5accd6d800be9f933b_r.jpg">

图2.单输出的时候,怎么求偏导数

<img src="https://pic2.zhimg.com/v2-c52b1fcdd42c3ac413120b56e40a8619_b.jpg" data-rawwidth="432" data-rawheight="576" class="origin_image zh-lightbox-thumb" width="432" data-original="https://pic2.zhimg.com/v2-c52b1fcdd42c3ac413120b56e40a8619_r.jpg">

图3.多输出的时候,怎么求偏导数。后面两张图是日语的,这是日本人写的关于深度学习的书。感觉写的不错,把图盗来用一下。所谓入力层,出力层,中间层,分别对应于中文的:输入层,输出层,和隐层。

大家不要被这几张图吓着,其实很简单的。干脆再举一个例子,就以撩妹为例。男女恋爱我们大致可以分为三个阶段:1.初恋期。相当于深度学习的输入层。别人吸引你,肯定是有很多因素,比如:身高,身材,脸蛋,学历,性格等等,这些都是输入层的参数,对每个人来说权重可能都不一样。2.热恋期。我们就让它对应于隐层吧。这个期间,双方各种磨合,柴米油盐酱醋茶。3.稳定期。对应于输出层,是否合适,就看磨合得咋样了。

大家都知道,磨合很重要,怎么磨合呢?就是不断学习训练和修正的过程嘛!比如女朋友喜欢草莓蛋糕,你买了蓝莓的,她的反馈是negative,你下次就别买了蓝莓,改草莓了。------------------------------------------------------------------------------------------------看完这个,有些小伙可能要开始对自己女友调参了。有点不放心,所以补充一下。撩妹和深度学习一样,既要防止欠拟合,也要防止过拟合。所谓欠拟合,对深度学习而言,就是训练得不够,数据不足,就好比,你撩妹经验不足,需要多学着点,送花当然是最基本的了,还需要提高其他方面,比如,提高自身说话的幽默感等,因为本文重点并不是撩妹,所以就不展开讲了。这里需要提一点,欠拟合固然不好,但过拟合就更不合适了。过拟合跟欠拟合相反,一方面,如果过拟合,她会觉得你有陈冠希老师的潜质,更重要的是,每个人情况不一样,就像深度学习一样,训练集效果很好,但测试集不行!就撩妹而言,她会觉得你受前任(训练集)影响很大,这是大忌!如果给她这个映象,你以后有的烦了,切记切记!------------------------------------------------------------------------------------------------

深度学习也是一个不断磨合的过程,刚开始定义一个标准参数(这些是经验值。就好比情人节和生日必须送花一样),然后不断地修正,得出图1每个节点间的权重。为什么要这样磨合?试想一下,我们假设深度学习是一个小孩,我们怎么教他看图识字?肯定得先把图片给他看,并且告诉他正确的答案,需要很多图片,不断地教他,训练他,这个训练的过程,其实就类似于求解神经网络权重的过程。以后测试的时候,你只要给他图片,他就知道图里面有什么了。

所以训练集,其实就是给小孩看的,带有正确答案的图片,对于深度学习而言,训练集就是用来求解神经网络的权重的,最后形成模型;而测试集,就是用来验证模型的准确度的。

对于已经训练好的模型,如下图所示,权重(w1,w2...)都已知。

<img src="https://pic1.zhimg.com/v2-8521e1fa289e08dbbab5aa63b6527bd4_b.png" data-rawwidth="940" data-rawheight="736" class="origin_image zh-lightbox-thumb" width="940" data-original="https://pic1.zhimg.com/v2-8521e1fa289e08dbbab5aa63b6527bd4_r.png">https://pic1.zhimg.com/v2-8521e1fa289e08dbbab5aa63b6527bd4_r.png

图4

<img src="https://pic4.zhimg.com/v2-ef5ad0d06a316f762f0625b2468e2f43_b.png" data-rawwidth="776" data-rawheight="174" class="origin_image zh-lightbox-thumb" width="776" data-original="https://pic4.zhimg.com/v2-ef5ad0d06a316f762f0625b2468e2f43_r.png">

图5

我们知道,像上面这样,从左至右容易算出来。但反过来呢,我们上面讲到,测试集有图片,也有预期的正确答案,要反过来求w1,w2......,怎么办?

绕了半天,终于该求偏导出场了。目前的情况是:

1.我们假定一个神经网络已经定义好,比如有多少层,都什么类型,每层有多少个节点,激活函数(后面讲)用什么等。这个没办法,刚开始得有一个初始设置(大部分框架都需要define-and-run,也有部分是define-by-run)。你喜欢一个美女,她也不是刚从娘胎里出来的,也是带有各种默认设置的。至于怎么调教,那就得求偏导。

2.我们已知正确答案,比如图2和3里的r,训练的时候,是从左至右计算,得出的结果为y,r与y一般来说是不一样的。那么他们之间的差距,就是图2和3里的E。这个差距怎么算?当然,直接相减是一个办法,尤其是对于只有一个输出的情况,比如图2; 但很多时候,其实像图3里的那样,那么这个差距,一般可以这样算,当然,还可以有其他的评估办法,只是函数不同而已,作用是类似的:

<img src="https://pic4.zhimg.com/v2-e5ddd26d65aa04ed82f2a51fc8212427_b.png" data-rawwidth="484" data-rawheight="102" class="origin_image zh-lightbox-thumb" width="484" data-original="https://pic4.zhimg.com/v2-e5ddd26d65aa04ed82f2a51fc8212427_r.png">

不得不说,理想跟现实还是有差距的,我们当然是希望差距越小越好,怎么才能让差距越来越小呢?得调整参数呗,因为输入(图像)确定的情况下,只有调整参数才能改变输出的值。怎么调整,怎么磨合?刚才我们讲到,每个参数都有一个默认值,我们就对每个参数加上一定的数值∆,然后看看结果如何?如果参数调大,差距也变大,你懂的,那就得减小∆,因为我们的目标是要让差距变小;反之亦然。所以为了把参数调整到最佳,我们需要了解误差对每个参数的变化率,这不就是求误差对于该参数的偏导数嘛。

关键是怎么求偏导。图2和图3分别给了推导的方法,其实很简单,从右至左挨个求偏导就可以。相邻层的求偏导其实很简单,因为是线性的,所以偏导数其实就是参数本身嘛,就跟求解x₃的偏导类似。然后把各个偏导相乘就可以了。

这里有两个点:

这里有两个点:一个是激活函数,这主要是为了让整个网络具有非线性特征,因为我们前面也提到了,很多情况下,线性函数没办法对输入进行适当的分类(很多情况下识别主要是做分类),那么就要让网络学出来一个非线性函数,这里就需要激活函数,因为它本身就是非线性的,所以让整个网络也具有非线性特征。另外,激活函数也让每个节点的输出值在一个可控的范围内,这样计算也方便。

貌似这样解释还是很不通俗,其实还可以用撩妹来打比方;女生都不喜欢白开水一样的日子,因为这是线性的,生活中当然需要一些浪漫情怀了,这个激活函数嘛,我感觉类似于生活中的小浪漫,小惊喜,是不是?相处的每个阶段,需要时不时激活一下,制造点小浪漫,小惊喜,比如;一般女生见了可爱的小杯子,瓷器之类都迈不开步子,那就在她生日的时候送一个特别样式,要让她感动得想哭。前面讲到男人要幽默,这是为了让她笑;适当的时候还要让她激动得哭。一哭一笑,多整几个回合,她就离不开你了。因为你的非线性特征太强了。

当然,过犹不及,小惊喜也不是越多越好,但完全没有就成白开水了。就好比每个layer都可以加激活函数,当然,不见得每层都要加激活函数,但完全没有,那是不行的。

由于激活函数的存在,所以在求偏导的时候,也要把它算进去,激活函数,一般用sigmoid,也可以用Relu等。激活函数的求导其实也非常简单:

<img src="https://pic2.zhimg.com/v2-a9311523c35a3558844d1edc22cee9ed_b.jpg" data-rawwidth="257" data-rawheight="159" class="content_image" width="257">

求导: f'(x)=f(x)*[1-f(x)]这个方面,有时间可以翻看一下高数,没时间,直接记住就行了。至于Relu,那就更简单了,就是f(x) 当x<0的时候y等于0,其他时候,y等于x。当然,你也可以定义你自己的Relu函数,比如x大于等于0的时候,y等于0.01x,也可以。

另一个是学习系数,为什么叫学习系数?刚才我们上面讲到∆增量,到底每次增加多少合适?是不是等同于偏导数(变化率)?经验告诉我们,需要乘以一个百分比,这个就是学习系数,而且,随着训练的深入,这个系数是可以变的。

当然,还有一些很重要的基本知识,比如SGD(随机梯度下降),mini batch 和 epoch(用于训练集的选择),限于篇幅,以后再侃吧。其实参考李宏毅的那篇文章就可以了。

这篇拙文,算是对我另一个回答的补充吧:深度学习入门必看的书和论文?有哪些必备的技能需学习? - jacky yang 的回答

其实上面描述的,主要是关于怎么调整参数,属于初级阶段。上面其实也提到,在调参之前,都有默认的网络模型和参数,如何定义最初始的模型和参数?就需要进一步深入了解。不过对于一般做工程而言,只需要在默认的网络上调参就可以了,相当于用算法;对于学者和科学家而言,他们会发明算法,难度还是不小的。向他们致敬!

2018-12-30 09:57:09 zyt157376 阅读数 261
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39685 人正在学习 去看看 唐宇迪

深度学习是当下计算机界火得不能再火的研究课题。作为一名计算机人,应当有不断学习当下最前沿技术的觉悟。但问题来了,深度学习领域的入门资料让人看花了眼,我实在不知道该从何学起。刚好在网上看到了Arthur Chan写的此篇文章,我试着(用谷歌)翻译了一下,给各位分享。文中观点不代表译者观点,同时不保证译文质量:)。

许多人问我该如何入门深度学习。坦白说这真是一个不好回答的问题——市面上的书籍和公开课不胜枚举,并且每个人的基础与学习目标也不尽相同。因此给出一个简单实用的学习清单实在不是一件容易的事情。

在本文中我会写出一系列我心目中最重要的学习资源,可以让你快速上手深度学习。在开始介绍之前,我想先和你聊聊我推荐这些资源的理由,以及这份清单与其他人的清单的区别。

推荐原则

网上的确有许多深度学习资源列表。我仅举几个例子:Awesome列表和Reddit机器学习常见问题解答。我认为它们列举的资源非常详尽,质量很高。

此列表并不是一个详尽的列表。相反,列表过于详尽并不是好事。一方面,我们假设您只有有限的时间用来收集资源和学习深度学习。例如,学习每一门在线课程可能需要至少3个月,而完成所有课程需要至少一年的时间。另一方面,没有任何指导,阅读Goodfellow的《深度学习》会让你感到困惑。而诸如Bishop的《模式识别和机器学习》(PRML)之类的书可能是一本更好的“入门书”。因此我们只给出了极少经典的、适合入门的资源。

此列表和其他资源列表之间的另一个区别是资源是经过我个人审核的。我基本亲自体验过列表中的内容。您还会看到一些对该资源简短的评论,诸如“为什么它们是有用的”。

列表正文

万事开头难,我们首先应该以什么资源开始呢?这是一个棘手的问题,因为每个人的学习能力和背景不同。我的建议是从以下开始。

1. 上课(包括网课) - 到目前为止,我认为这是最有效的学习方式。听课+做作业通常会教你很多。
2. 读书 - 这很重要,因为通常普通的课程只是总结一个主题。只有当您阅读某个主题的书籍时,您才会开始深入了解这个领域。
3. 使用框架 - 这使您可以实际创建一些深度学习应用程序,并在现实生活中将您的知识转变成技能
4. 阅读博客 - 这很有用,但您最好知道要阅读哪些博客(请参阅“推荐阅读的博客”部分)。现在博客作者太多了,他们可能自己都“以其昏昏”,更别提“使人昭昭”了。阅读这些只会让你感到更加困惑。
5. 加入论坛并提出问题 - 这是您可以提出一些想法并征求意见的地方。论坛的质量非常重要。所以看看“Facebook论坛”部分。

课程推荐

深度学习基础(更详尽的在这里

如果你想对深度学习的术语有个大致了解,这就是必修课程。 Ng,Karparthy和Socher的课程能教你基本概念,并且能让你了解并建立自己的深度学习应用。Silver的课程将深度学习概念与强化学习联系起来。 因此,在这4个课程之后,您应该能够了解深度学习并能编写一些基本的深度学习应用程序。

  1. Andrew Ng的Coursera机器学习课程
    跑步前先得学会走路。 在我看来,Ng的课程是最好的机器学习初学者课程。 查看此页面以查看我的评论

  2. Andrew Ng的deeplearning.ai专业课程
    在我看来,要想从Ng的机器学习课程过渡到最困难的课程(如cs231n和cs224n),这门课就是最好的选择。请参阅我对课程1课程2的完整评论。还可以在这里查看我的quick impression,并瞻仰一下“深度学习的英雄”Geoffrey Hinton教授

  3. 李飞飞和Andrew Karpathy的计算机视觉课程(Stanford cs231n 2015/2016)
    我上过一次这门课。这门课的教师有大名鼎鼎的Karpathy,还有另一位经验丰富的研究生Justin Johnson。这门课主要讲CNN,还提及了一点困难的部分和最新技术,如图像定位,检测和分割。

  4. Richard Socher的深度学习和自然语言处理(标准cs224d)
    我上过一次这门课,当我试图理解RNN和LSTM时,前面提到的几个课程对我非常有用。这也可能是学习Socher递归神经网络的最佳课程。与Karpathy的课程相比,Socher更强调数学推导。因此,如果您不熟悉矩阵微分,那么这门课程将很适合你。

  5. David Silver的强化学习
    这是一个由AlphaGo的程序员教授的优秀课程。它从强化学习的基础开始,如基于DP的方法,然后进入更加困难的主题,如蒙特卡罗方法和时序差分方法,以及函数逼近和策略梯度。即使你已经有了监督学习的背景,也需要很长时间理解。强化学习被越来越多的应用程序使用,因此你应该学习(换句话说,学到强化学习已经是深入理解了。如果只要求入门,可以不学了!)。

你还可以参考:

中级深度学习

中级课程意味着更难 - 您必须有数学基础。即使你已经拥有硕士学位,也会遇到许多令人困惑的概念。

  1. Hinton的神经网络与机器学习
    Hinton教授的课可是为数不多的能讲明白深度学习与一般的机器学习方法之间的区别的课。我2016年10月第一次旁听该课程,他对基于统计力学模型的解释引起了我的注意。2017年4月左右我完成了该课程,然后我写了一篇课程的热门评论。不幸的是,由于课程的难度太高,它在这个列表中排名较低。 (一开始我把它排在总排名第2,基础排名第4,但我发现它需要对Karparthy,Socher和Silver的课程有深刻的理解。后来当deeplearning.ai出现时,我将Hinton教授的课程转移到中级课程列表。 )

  2. Daphne Koller的概率图模型
    如果你想了解像DBN这样的更艰深的概念,你也想了解贝叶斯网络,那Koller的课程就是为你准备的。但是这个课,就像Hinton的NNML一样,是出了名的困难 - 你会面对概率论、图论和算法和参数估计的挑战。

强化学习(RL)

强化学习本身历史悠久,你可以认为它脱胎于CS和EE。

我对RL的理解相当浅薄,所以我只能告诉你哪个课更容易,但所有这些课都是高级课程。佐治亚理工学院CS8803可以作为你的入坑课。 Silvers老师很有趣,参考书是Sutton的书,但是为了完成课上的练习,你可能得读一点其他的书。

  1. Udacity的强化学习
    这是由Udacity与佐治亚理工学院联合出版的课程,您可以把它看做高级CS8803。我首先参加了上面说的Silver的课程,但是这门课程对于没有深度学习经验而直接从强化学习开始的人相当友好(这段请看英文原文)。

  2. David Silver的强化学习
    请参阅“深入学习入门”部分中的说明。

  3. 麻省理工学院自动驾驶课程6.S094
    自动驾驶专业课程。该课程主要讲计算机视觉,但有一个关于自动驾驶的超有意思的小练习,很可能对你想用RL解决的问题有所帮助。 (这里是关于班级的一些快速评价。)

你还可以参考:

我听说这些课程的评价很好……

  • Oxford Deep NLP 2017
    这可能是学习NLP的第二门课。我发现这个课的资料很有意思,因为它涵盖了Socher课程没有涵盖的材料。我还没开始学。所以我以后会发表评论。

  • Nicholas Zabara的统计计算课
    看起来非常有趣,大多数材料实际上是基于ML的。

  • CMU CS11-747神经网络和NLP
    格雷厄姆·纽比格的一系列精彩公开课。 Neubig在NLP中编写了一些关于DL的有用教程。所以我也把他加了进去。

  • 2014年纽约大学深度学习课程
    Yann LeCun教授。这门课对我来说很重要,重要性相当于Hinton教授的课。主要是因为LeCun教授是BackProp和SGD最早的实验者之一。不幸的是,这些纽约大学的课被删除了。但是还留有一些幻灯片。

  • 同样来自Yann LeCun教授,深度学习就职讲座

  • 伯克利的深度学习研讨会:由无监督学习的早期研究员Ruslan Salakhutdinov教授撰写。

  • 阿姆斯特丹大学深度学习
    如果您已经学过cs231n和cs224d,也许这里的材料你已经看过了,但我发现学完前面两门课后来学习该课就很有用。我喜欢这门课里关于反向传播的PPT,因为数学味更浓。

  • 深度学习专题
    如果你想深入学习更深奥的话题,这门课很不多。

  • 语言和语音的深度学习
    我有一点对语音识别的好奇心。这个课程也许是我在ASR上唯一能找到的DL课程。如果你读到了这一段,我会说你在网上发现的大多数软件在现实生活中并不太适用。在我这篇非常古老的文章中讨论了唯一的例外情况。

其他参考课程

Virginia Tech Deep Learning at 2015
University of Waterloo by Prof Ali Ghodsi
MIT 6.S191 Introduction to Deep Learning
Deep RL and Control from CMU
Udacity Deep Learning and Deep Learning NanoDegree.

先修课

Linear Algebra By Prof. Gilbert Strang
Probabilistic System and Applied Probability By Prof. John Tsitsiklis

更多关于机器学习基础的课程

ColumbiaX: CSMM.102x
ESL
Caltech Machine Learning.
Andrew Ng’s Machine Learning 2008
Tony Mitchell’s Machine Learning 2011
Nando De Freita’s Machine Learning 2012

其他关于AI的课程

Berkley CS 188
Stanford cs221
edX AI
MIT AI Courseware - lectures by Patrick Winston
Prof. Marvin Minsky’s The Society of Minds

我在推荐书籍页面上写了很多。简而言之,我发现像PRML,Duda&Hart(说的应该是那本《模式分类》,Duda和Hart著)这样的经典作品在深度学习的世界里仍然必读。但如果你还想要一份清单,那么…

Michael Nielson的深度学习书:或NNDL(《神经网络与深度学习》),被许多人强烈推荐。本书非常适合想要了解简单前馈神经网络及其设置的初学者。与大多数教科书不同,它不会用纯数学,而会用一些代码来循循善诱。虽然我最近才读,但我强烈建议大家阅读。另见我的评论

《PRML》:我喜欢PRML!请去阅读我推荐的书籍页面,查看理由。

《模式分类》:我不像PRML一样喜欢它,但它是我的第一本机器学习圣经。你可以到我的推荐书页,查看理由。

Goodfellow的《深度学习》:这是深度学习的书,但这对于初学者来说并不容易。我最近浏览了这本书。这是我对它的一些快速印象。

Kyung Hyun Cho的分布式表征自然语言理解(这是一篇论文)。这主要是针对NLP科研人员,但重要的是要注意从深度学习的角度来看NLP的特别之处。

其他:查看我的推荐书籍页面。对于初学者,我发现米切尔和多明戈的书非常有趣。

译者注:国内有两本书写的很好,适合入门,那就是《机器学习》周志华著,与《统计学习方法》李航著

框架

  1. TensorFlow:最流行,安装过程令人生畏。另外请看Keras
  2. Torch:需要会用Lua,但很容易上手。另外请看PyTorch
  3. Theano:深度学习框架的祖宗。另外请看Lasagne
  4. Caffe:可能是框架中运行速度最快的,但是设置过程和语法有点复杂。
  5. Neon:也很快。
  6. deeplearning4j:在企业中应用的很多。

框架的教程

Theano教程
TensorFlow教程
char-rnn
Misc
YeravaNN实验室的学习指南

你应该了解的数学概念

学习机器学习需要相当的数学知识。这些概念经常被用到,请大家积极查询。

  • 贝叶斯方法
  • 多维随机变量的分布,尤其是正态分布
  • 矩阵微分
  • 变分法
  • 信息论
2019-08-22 10:48:06 weixin_44411760 阅读数 562
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39685 人正在学习 去看看 唐宇迪

~~**

  • 深度学习规划

**~~
刚开始学深度学习总会走各种弯路,你不知道什么是深度学习,不知道深度学习的应用,可以实现什么?只是觉得很热门会好找工作?不管是大学生还是研究生,毕竟小学生都开始学python 了。当你开始想学深度学习了 ,看什么书籍?我推荐在脑子发热买任何书籍前看一遍吴恩达老师的深度学习视频,在b站上免费带你深度学习入门。你会明白深度学习可以实现哪些内容。再选择一些适合你的方向,或许是计算机视觉的人脸识别,或许是自然语言处理(nlp)。边看边记笔记,收获颇多。

2017-11-05 21:23:46 zheyanyishhi 阅读数 6481
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39685 人正在学习 去看看 唐宇迪

1.1 什么是学习?

  赫伯特·西蒙教授(Herbert Simon,1975年图灵奖获得者、1978年诺贝尔经济学奖获得者)曾对“学习”给了一个定义:“如果一个系统,能够通过执行某个过程,就此改进了它的性能,那么这个过程就是学习”

  学习的核心目的,就是改善性能

1.2 什么是机器学习?

  对于某类任务(Task,简称T)和某项性能评价准则(Performance,简称P),如果一个计算机程序在T上,以P作为性能的度量,随着很多经验(Experience,简称E)不断自我完善,那么我们称这个计算机程序在从经验E中学习了

  对于一个学习问题,我们需要明确三个特征:任务的类型衡量任务性能提升的标准以及获取经验的来源

1.3 学习的4个象限

这里写图片描述

1.4 机器学习的方法论

  “end-to-end”(端到端)说的是,输入的是原始数据(始端),然后输出的直接就是最终目标(末端),中间过程不可知,因此也难以知。

  就此,有人批评深度学习就是一个黑箱(Black Box)系统,其性能很好,却不知道为何而好,也就是说,缺乏解释性。其实,这是由于深度学习所处的知识象限决定的。从图1可以看出,深度学习,在本质上,属于可统计不可推理的范畴。“可统计”是很容易理解的,就是说,对于同类数据,它具有一定的统计规律,这是一切统计学习的基本假设。

  在哲学上讲,这种非线性状态,是具备了整体性的“复杂系统”,属于复杂性科学范畴。复杂性科学认为,构成复杂系统的各个要素,自成体系,但阡陌纵横,其内部结构难以分割。简单来说,对于复杂系统,1+1≠2,也就是说,一个简单系统,加上另外一个简单系统,其效果绝不是两个系统的简单累加效应,而可能是大于部分之和。因此,我们必须从整体上认识这样的复杂系统。于是,在认知上,就有了从一个系统或状态(end)直接整体变迁到另外一个系统或状态(end)的形态。这就是深度学习背后的方法论。

  “Divide and Conquer(分而治之)”,其理念正好相反,在哲学它属于“还原主义(reductionism,或称还原论)”。在这种方法论中,有一种“追本溯源”的蕴意包含其内,即一个系统(或理论)无论多复杂,都可以分解、分解、再分解,直到能够还原到逻辑原点。

  在意象上,还原主义就是“1+1=2”,也就是说,一个复杂的系统,都可以由简单的系统简单叠加而成(可以理解为线性系统),如果各个简单系统的问题解决了,那么整体的问题也就得以解决。

  经典机器学习(位于第Ⅱ象限),在哲学上,在某种程度上,就可归属于还原主义。传统的机器学习方式,通常是用人类的先验知识,把原始数据预处理成各种特征(feature),然后对特征进行分类。

  然而,这种分类的效果,高度取决于特征选取的好坏。传统的机器学习专家们,把大部分时间都花在如何寻找更加合适的特征上。故此,传统的机器学习,其实可以有个更合适的称呼——特征工程(feature engineering)。这也是有好处的,因为这些特征是由人找出来的,自然也就为人所能理解,性能好坏,可以灵活调整。

1.5 什么是深度学习?

  机器学习的专家们发现,可以让神经网络自己学习如何抓取数据的特征,这种学习的方式,效果更佳。于是兴起了特征表示学习(feature representation learning)的风潮。这种学习方式,对数据的拟合也更加的灵活好用。于是,人们终于从自寻“特征”的中解脱出来。

  但这种解脱也付出了代价,那就是机器自己学习出来的特征,它们存在于机器空间,完全超越了人类理解的范畴,对人而言,这就是一个黑盒世界。为了让神经网络的学习性能,表现得更好一些,人们只能依据经验,不断地尝试性地进行大量重复的网络参数调整。于是,“人工智能”领域就有这样的调侃:“有多少人工,就有多少智能”。

  再后来,网络进一步加深,出现了多层次的“表示学习”,它把学习的性能提升到另一个高度。这种学习的层次多了,就给它取了个特别的名称——Deep Learning(深度学习)。

  深度学习的学习对象同样是数据。与传统机器学习所不同的是,它需要大量的数据,也就是“大数据(Big Data)”。

2.2 深度学习的归属

这里写图片描述
  把深度学习和传统的监督学习和无监督学习单列出来,自然是有一定道理的。这就是因为,深度学习是高度数据依赖型的算法,它的性能通常随着数据量的增加而不断增强,也就是说它的可扩展性(Scalability)显著优于传统的机器学习算法

这里写图片描述

  如果训练数据比较少,深度学习的性能并不见得就比传统机器学习好。其原因在于,作为复杂系统代表的深度学习算法,只有数据量足够多,才能通过训练,在深度神经网络中,将蕴含于数据之中的复杂模式表征出来

机器学习要想做得好,需要走好三大步:

(1) 如何找一系列函数来实现预期的功能,这是建模问题
(2) 如何找出一组合理的评价标准,来评估函数的好坏,这是评价问题
(3) 如何快速找到性能最佳的函数,这是优化问题(比如说,机器学习中梯度下降法)。

2.4 为什么要用神经网络?

  深度学习的概念源于人工神经网络的研究。含多隐层的多层感知机就是一种深度学习结构。所以说到深度学习,就不能不提神经网络。

  “神经网络,是一种由具有自适应性的简单单元构成的广泛并行互联的网络,它的组织结构能够模拟生物神经系统对真实世界所作出的交互反应。”

那为什么要用神经网络学习呢?

  在人工智能领域,有两大主流。第一个是符号主义。符号主义的理念是,知识是信息的一种表达形式,人工智能的核心任务,就是处理好知识表示、知识推理和知识运用。核心方法论是,自顶向下设计规则,然后通过各种推理,逐步解决问题。很多人工智能的先驱(比如CMU的赫伯特•西蒙)和逻辑学家,很喜欢这种方法。但这个的发展,目前看来并不太好。

  还有一个就是试图编写一个通用模型,然后通过数据训练,不断改善模型中的参数,直到输出的结果符合预期,这个就是连接主义。连接主义认为,人的思维就是某些神经元的组合。因此,可以在网络层次上模拟人的认知功能,用人脑的并行处理模式,来表征认知过程。这种受神经科学的启发的网络,被称之人工神经网络(Artificial Neural Network,简称ANN)。这个网络的升级版,就是目前非常流行的深度学习。

  机器学习在本质就是寻找一个好用的函数。而人工神经网络最“牛逼”的地方在于,它可以在理论上证明:只需一个包含足够多神经元的隐藏层,多层前馈网络能以任意进度逼近任意复杂度的连续函数。这个定理也被称之为通用近似定理(Universal Approximation Theorem)。这里的“Universal”,也有人将其翻译成“万能的”,由此可见,这个定理的能量有多大。换句话说,神经网络可在理论上解决任何问题。

3.1 M-P神经元模型是什么?

  现在所讲的神经网络包括深度学习,都在某种程度上,都是在模拟大脑神经元的工作机理,它就是上世纪40年代提出但一直沿用至今的“M-P神经元模型”。

  在这个模型中,神经元接收来自n个其它神经元传递过来的输入信号,这些信号的表达,通常通过神经元之间连接的权重(weight)大小来表示,神经元将接收到的输入值按照某种权重叠加起来,并将当前神经元的阈值进行比较,然后通过“激活函数(activation function)”向外表达输出(这在概念上就叫感知机)。

这里写图片描述

3.3 激活函数是怎样的一种存在?

  神经元的工作模型存在“激活(1)”和“抑制(0)”等两种状态的跳变,那么理想型的激活函数(activation functions)就应该是阶跃函数,但这种函数具有不光滑、不连续等众多不“友好”的特性。为什么说它“不友好”呢,这是因为在训练网络权重时,通常依赖对某个权重求偏导、寻极值,而不光滑、不连续等通常意味着该函数无法“连续可导”。

这里写图片描述

  因此,我们通常用Sigmoid函数来代替阶跃函数。这个函数可以把较大变化范围内输入值(x)挤压输出在(0,1)范围之内,故此这个函数又称为“挤压函数(Squashing function)”。

3.4 卷积函数又是什么?

  所谓卷积,就是一个功能和另一个功能在时间的维度上的“叠加”作用。

  由卷积得到的函数h一般要比f和g都光滑。利用这一性质,对于任意的可积函数f,都可简单地构造出一列逼近于f的光滑函数列,这种方法被称之为函数的光滑化或正则化。

  在时间的维度上的“叠加作用”,如果函数是离散的,就用求累积和来刻画。如果函数是连续的,就求积分来表达。

4.1机器学习的三个层次

大致可分为三类:

(1)监督学习(Supervised Learning):
  监督学习基本上就是“分类(classification)”的代名词。它从有标签的训练数据中学习,然后给定某个新数据,预测它的标签(given data, predict labels)。
  简单来说,监督学习的工作,就是通过有标签的数据训练,获得一个模型,然后通过构建的模型,给新数据添加上特定的标签。
  整个机器学习的目标,都是使学习得到的模型,能很好地适用于“新样本”,而不是仅仅在训练样本上工作得很好。通过训练得到的模型,适用于新样本的能力,称之为“泛化(generalization)能力”。

(2)非监督学习(Unsupervised Learning):
  与监督学习相反的是,非监督学习所处的学习环境,都是非标签的数据。非监督学习,本质上,就是“聚类(cluster)”的近义词。
  简单来说,给定数据,从数据中学,能学到什么,就看数据本身具备什么特性(given data, learn about that data)。我们常说的“物以类聚,人以群分”说得就是“非监督学习”。这里的“类”也好,“群”也罢,事先我们是不知道的。一旦我们归纳出“类”或“群”的特征,如果再要来一个新数据,我们就根据它距离哪个“类”或“群”较近,就“预测”它属于哪个“类”或“群”,从而完成新数据的“分类”或“分群”功能。

(3)半监督学习(Semi-supervised Learning):
  这类学习方式,既用到了标签数据,又用到了非标签数据。
  给定一个来自某未知分布的有标记示例集L={(x1, y1), (x2, y2), …, (xl, yl)},其中xi是数据,yi是标签。对于一个未标记示例集U = {xl+1, x l+1, … , xl+u},I《u,于是,我们期望学得函数 f:X→Y 可以准确地对未标识的数据xi预测其标记yi。这里均为d维向量, yi∈Y为示例xi的标记。
  半监督学习就是以“已知之认知(标签化的分类信息)”,扩大“未知之领域(通过聚类思想将未知事物归类为已知事物)”。但这里隐含了一个基本假设——“聚类假设(cluster assumption)”,其核心要义就是:“相似的样本,拥有相似的输出”。

5.2 认识“感知机”

  所谓的感知机,其实就是一个由两层神经元构成的网络结构,它在输入层接收外界的输入,通过激活函数(含阈值)的变换,把信号传送至输出层,因此它也称之为“阈值逻辑单元(threshold logic unit)”。

  所有“有监督”的学习,在某种程度上,都是分类(classification)学习算法。而感知机就是有监督的学习,所以,它也是一种分类算法。

5.3 感知机是如何学习的?

  对象本身的特征值,一旦确定下来就不会变化。因此,所谓神经网络的学习规则,就是调整权值和阈值的规则(这个结论对于深度学习而言,依然是适用的)。

假设我们的规则是这样的:

这里写图片描述

其中ep = y- y’,y为期望输出,y’是实际输出,所以,具体说来,ep是二者的差值。

5.4 感知机的训练法则

  感知机的学习规则:对于训练样例(x,y)(需要注意的是,这里粗体字x表示训练集合),若当前感知机的实际输出y’,假设它不符合预期,存在“落差”,那么感知机的权值依据如公式规则调整:
这里写图片描述
其中,η∈(0,1)称为学习率(learning rate)

  这里需要注意的是,学习率η的作用是“缓和”每一步权值调整强度的。它本身的大小,也是比较难以确定的。如果η太小,网络调参的次数就太多,从而收敛很慢。如果η太大,容易错过了网络的参数的最优解。因此,合适的η大小,在某种程度上,还依赖于人工经验

5.5 感知机的表征能力

这里写图片描述

  1969年,马文·明斯基和西摩尔· 派普特(Seymour Papert)在出版了《感知机:计算几何简介”》一书[2], 书中论述了感知机模型存在的两个关键问题:
(1)单层的神经网络无法解决不可线性分割的问题,典型例子如异或门电路(XOR Circuit);
(2)更为严重的问题是,即使使用当时最先进的计算机,也没有足够计算能力,完成神经网络模型所需要的超大的计算量(比如调整网络中的权重参数)。
  鉴于明斯基的江湖地位(1969年刚刚获得大名鼎鼎的图灵奖),他老人家一发话不要紧,直接就把人工智能的研究,送进一个长达近二十年的低潮,史称“人工智能冬天(AI Winter)”。

6.1 复杂网络解决“异或”问题

  感知机之所以当初无法解决“非线性可分”问题,是因为相比于深度学习这个复杂网络,感知机太过于简单”。

  想解决“异或”问题,就需要使用多层网络。这是因为,多层网络可以学习更高层语义的特征,其特征表达能力更强。因此,我们在输入层和输出层之间,添加一层神经元,将其称之为隐含层(“隐层”)。于是隐层和输出层中的神经元都有激活函数。
这里写图片描述

  1958年Frank Rosenblatt提出感知机的概念。1965年Alexey Grigorevich Ivakhnenko提出了多层人工神经网络的设想。而这种基于多层神经网络的机器学习模型,后来被人们称为“深度学习”。

6.2 多层前馈神经网络

  常见的多层神经网络如图所示。在这种结构中,每一层神经元仅仅与下一层的神经元全连接。而在同一层,神经元彼此不连接,而且跨层的神经元,彼此间也不相连。这种被简化的神经网络结构,被称之为“多层前馈神经网络(multi-layer feedforward neural networks)”。
这里写图片描述
  在多层前馈神经网络中,输入层神经元主要用于接收外加的输入信息,在隐含层和输出层中,都有内置的激活函数,可对输入信号进行加工处理,最终的结果,由输出层“呈现”出来。

  这里需要说明的是,神经元中的激活函数,并不限于我们前面提到的阶跃函数、Sigmod函数,还可以是现在深度学习常用的ReLU(Rectified Linear Unit)和sofmax等。

  简单来说,神经网络的学习过程,就是通过根据训练数据,来调整神经元之间的连接权值(connection weight)以及每个功能神经元的输出阈值。换言之,神经网络需要学习的东西,就蕴含在连接权值和阈值之中。

6.3 误差逆传播算法

  对于相对复杂的前馈神经网络,其各个神经元之间的链接权值和其内部的阈值,是整个神经网络的灵魂所在,它需要通过反复训练,方可得到合适的值。而训练的抓手,就是实际输出值和预期输出值之间存在着“误差”。

  在机器学习中的“有监督学习”算法里,在假设空间中,构造一个决策函数f,对于给定的输入X,由f(X)给出相应的输出Y,这个实际输出值Y和原先预期值Y’可能不一致。于是,我们需要定义一个损失函数(loss function),也有人称之为代价函数(cost function)来度量这二者之间的“落差”程度。这个损失函数通常记作L(Y,Y)= L(Y, f(X)),为了方便起见,这个函数的值为非负数(请注意:这里的大写Y和Y’,分别表示的是一个输出值向量和期望值向量,它们分别包括多个不同对象的实际输出值和期望值)。

常见的损失函数有如下3类:
这里写图片描述
  损失函数值越小,说明实际输出和预期输出的差值就越小,也就说明我们构建的模型越好。

  神经网络学习的本质,其实就是利用“损失函数(loss function)”,来调节网络中的权重(weight)。

  调神经网络的权值,有两大类方法比较好使。第一种方法就是“误差反向传播(Error Back propagation,简称BP)”。简单说来,就是首先随机设定初值,然后计算当前网络的输出,然后根据网络输出与预期输出之间的差值,采用迭代的算法,反方向地去改变前面各层的参数,直至网络收敛稳定。

  BP算法非常经典,在很多领域都有着经典的应用,当时它的火爆程度在绝不输给现在的“深度学习”。但后来大家发现,实际用起来它还是有些问题。比如说,在一个层数较多网络中,当它的残差反向传播到最前面的层(即输入层),其影响已经变得非常之小,甚至出现梯度扩散(gradient-diffusion),严重影响训练精度。

  再后来,第二类改进方法就孕育而生了。它就是当前主流的方法,也就是“深度学习”常用的“逐层初始化”(layer-wise pre-training)训练机制,不同于BP的“从后至前”的训练参数方法,“深度学习”采取的是一种从“从前至后”的逐层训练方法。

7.3到底什么是梯度?

  在单变量的实值函数中,梯度就可以简单地理解为只是导数,或者说对于一个线性函数而言,梯度就是线的斜率。但对于多维变量的函数,它的梯度概念就不那么容易理解了。

  在向量微积分中,标量场的梯度其实是一个向量场(vector field)。对于特定函数的某个特定点,它的梯度就表示从该点出发,该函数值增长最为迅猛的方向(direction of greatest increase of a function)。

  梯度最明显的应用,就是快速找到多维变量函数的极(大/小)值。

  “梯度递减”的问题所在,那就是它很容易收敛到局部最小值。

7.5 重温神经网络的损失函数

  相比于神经网络输入、输出层设计的简单直观,它的隐含层设计,可就没有那么简单了。依赖于“工匠”的打磨,它就是一个体力活,需要不断地“试错”。

  但通过不断地“折腾”,研究人员掌握了一些针对隐层的启发式设计规则(如下文即将提到的BP算法),以此降低训练网络所花的开销,并尽量提升网络的性能。

  为了达到理想状态,我们希望快速配置好网络参数,从而让这个损失函数达到极小值。这时,神经网络的性能也就接近最优!

8.1 BP神经网络

BP算法,是一个典型的双向算法。更确切来说,它的工作流程是分两大步走:
  (1)正向传播输入信号,输出分类信息(对于有监督学习而言,基本上都可归属于分类算法);
  (2)反向传播误差信息,调整全网权值(通过微调网络参数,让下一轮的输出更加准确)。

8.2.1正向传播信息
  类似于感知机,每一个神经元的功能都可细分两大部分:(1)汇集各路链接带来的加权信息;(2)加权信息在激活函数的“加工”下,神经元给出相应的输出
这里写图片描述

  到第一轮信号前向传播的输出值计算出来后,实际输出向量与预期输出的向量之间的误差就可计算出来。下面我们就用“误差”信息反向传播,来逐层调整网络参数。为了提高权值更新效率,这里就要用到下文即将提到的“反向模式微分法则(chain rule)”。

8.2.2 求导中的链式法则

一般化的神经网络示意图:
这里写图片描述
  为了简化理解,暂时假设神经元没有激活函数(或称激活函数为y=xy=x),于是对于隐含层神经元,它的输出可分别表示为:
        这里写图片描述
  然后,对于输出层神经元有:
        这里写图片描述
  于是,损失函数L可表示为公式:
        这里写图片描述
  这里Y为预期输出值向量(由y1,y2,...,yi,...等元素构成),实际输出向量为fi(w11,w12,...,wij,...,wmn)
  对于有监督学习而言,在特定训练集合下,输入元素xi和预期输出yi都可视为常量。由此可以看到,损失函数L,在本质上,就是一个单纯与权值wij相关的函数(即使把原本的激活函数作用加上去,除了使得损失函数的形式表现得更加复杂外,并不影响这个结论)。
  于是,损失函数L梯度向量可表示为公式:
        这里写图片描述
其中,这里的eij是正交单位向量。为了求出这个梯度,需要求出损失函数L对每一个权值wij的偏导数。

链式求导示例图:
这里写图片描述


这里写图片描述
  当网络结构简单时,即使XZ的每一个路径都使用前向模式微分(forward-mode differentiation)”,也不会有很多路径,但一旦网络结构的复杂度上去了,这种“前向模式微分”,就会让求偏导数的次数和神经元个数的平方成正比。这个计算量,就很可能是成为机器“难以承受的计算之重”。

  为了避免这种海量求导模式,数学家们另辟蹊径,提出了一种称之为“反向模式微分(reverse-mode differentiation)”。取代之前的简易的表达方式,我们用下面的公式的表达方式来求XZ的偏导:
        这里写图片描述

  前向模式微分方法,其实就是我们在高数课堂上学习的求导方式。在这种求导模式中,强调的是某一个输入(比如X)对某一个节点(如神经元)的影响。因此,在求导过程中,偏导数的分子部分,总是根据不同的节点总是不断变化,而分母则锁定为偏导变量“X”,保持定不变。

  反向模式微分方法则有很大不同。首先在求导方向上,它是从输出端(output)到输入端进行逐层求导。其次,在求导方法上,它不再是对每一条“路径”加权相乘然后求和,而是针对节点采纳“合并同类路径”和“分阶段求解”的策略。先求Y节点对Z节点的”总影响”(反向第一层),然后,再求节点X对节点Z的总影响(反向第二层)。

  特别需要注意的是,Z/Y已经在第一层求导得到。在第二层仅仅需要求得Y/X,然后二者相乘即可得到所求。这样一来,就大大减轻了第二层的求导负担。在求导形式上,偏导数的分子部分(节点)不变,而分母部分总是随着节点不同而变化。

  利用链式法则,反向模式微分方法就能避免冗余对所有路径只求一次导数,大大加快了运行速度!BP算法把网络权值纠错的运算量,从原来的与神经元数目的平方成正比,下降到只和神经元数目本身成正比。其功劳,正是得益于这个反向模式微分方法节省的计算冗余。

8.2.3 误差反向传播

  误差反向传播通过梯度下降算法,迭代处理训练集合中的样例,一次处理一个样例。对于样例d,如果它的预期输出和实际输出有“误差”,BP算法抓住这个误差信号Ld,以“梯度递减”的模式修改权值。也就是说,对于每个训练样例d,权值wji的校正幅度为Δwji(需要说明的是,wjiwij其实都是同一个权值,wji表示的是神经元j的第i个输入相关的权值,这里之所以把下标“j”置于“i”之前,仅仅表示这是一个反向更新过程而已):
        这里写图片描述
  在这里,Ld表示的是训练集合中样例d的误差,分解到输出层的所有输出向量,Ld可表示为:
        这里写图片描述
其中:
yj表示的是第j个神经单元的预期输出值。
y'j表示的j个神经单元的实际输出值。
outputs的范围是网络最后一层的神经元集合。

  下面我们推导出Ld/wji的一个表达式,以便在上面的公式中使用梯度下降规则。
  首先,我们注意到,权值wji仅仅能通过netj影响其他相连的神经元。因此利用链式法则有:
        这里写图片描述
在这里,netj=iwjixji,也就是神经元j输入的加权和。xji表示的神经j的第i个输入。需要注意的是,这里的xji是个统称,实际上,在反向传播过程中,在经历输出层、隐含层和输入层时,它的标记可能有所不同。

  由于在输出层和隐含层的神经元对“纠偏”工作,承担的“责任”是不同的,至少是形式不同,所以需要我们分别给出推导。
(1)在输出层,对第i个神经元而言,省略部分推导过程,上一公式的左侧第一项为:
        这里写图片描述
  为了方便表达,我们用该神经元的纠偏“责任(responsibility)” δ(1)j描述这个偏导,即:
        这里写图片描述
  这里δ(1)j的上标“(1)”,表示的是第1类(即输出层)神经元的责任。如果上标为“(2)”,则表示第2类(即隐含层)神经元的责任,见下面的描述。
(2)对隐含层神经元jj的梯度法则(省略了部分推导过程),有:
        这里写图片描述
其中:
  fj表示神经单元jj的计算输出。
  netj表示的是神经单元jj的加权之和。
  Downstream(j)表示的是在网络中神经单元jj的直接下游单元集合。

  在明确了各个神经元“纠偏”的职责之后,下面就可以依据类似于感知机学习,通过如下加法法则更新权值:
对于输出层神经元有:
        这里写图片描述
对于隐含层神经元有:
        这里写图片描述
在这里,η(0,1)表示学习率。在实际操作过程中,为了防止错过极值,η通常取小于0.1的值。hj为神经元j的输出。xjk表示的是神经单元j的第k个输入。

题外话:
LeCun成功应用BP神经网络在手写邮编识别之后,与LeCun同在一个贝尔实验室的同事Vladimir Vapnik(弗拉基米尔·万普尼克),提出并发扬光大了支持向量机 (Support Vector Machine) 算法。
SVM作为一种分类算法,对于线性分类,自然不在话下。在数据样本线性不可分时,它使用了所谓“核机制(kernel trick)”,将线性不可分的样本,映射到高维特征空间 (high-dimensional feature space),从而使其线性可分。自上世纪九十年代初开始,SVM在图像和语音识别等领域,获得了广泛而成功的应用。
在手写邮政编码的识别问题上,LeCun利用BP算法,把错误率整到5%左右,而SVM在1998年就把错误率降到低至0.8%。这远超越同期的传统神经网络算法。
就这样,万普尼克又把神经网络研究送到了一个新的低潮!

2017-02-03 16:17:37 woshiliulei0 阅读数 704
  • 机器学习&深度学习系统实战!

    购买课程后,可扫码进入学习群,获取唐宇迪老师答疑 数学原理推导与案例实战紧密结合,由机器学习经典算法过度到深度学习的世界,结合深度学习两大主流框架Caffe与Tensorflow,选择经典项目实战人脸检测与验证码识别。原理推导,形象解读,案例实战缺一不可!具体课程内容涉及回归算法原理推导、决策树与随机森林、实战样本不均衡数据解决方案、支持向量机、Xgboost集成算法、神经网络基础、神经网络整体架构、卷积神经网络、深度学习框架--Tensorflow实战、案例实战--验证码识别、案例实战--人脸检测。 专属会员卡优惠链接:http://edu.csdn.net/lecturer/1079

    39685 人正在学习 去看看 唐宇迪

Q1:深度学习看上去很复杂,对于新手应该怎么去学,能不能推荐一些深度学习方面的书籍和流行的框架?

A1:深度学习的数学理论其实并不复杂,但是需要注意的细节太多了,我们需要大量的时间来消化理解各个概念,对于新手,我推荐先上手代码,再研究原理,目前的深度学习框架非常之多,包括TensorFlow, theano, lasagne, keras, sknn, no learn, caffe, mxnet, leaf, torch7, convnetjs等。tensorflow目前是github上最火的框架,我本人也是TensorFlow前20的contributor, 但是目前并不推荐新手直接使用Tensorflow,新手最简单易用的框架是keras,没有之一,可以先看上面的tutorial上手代码,理论方面,可以先学习MIT最新出的 Deep Learnign的书来学习,这一本作者包括深度学习三巨头Bengio 


对于90%以上的非结构化医学影像数据的认知分析一直是空白,原因在于涉及到大数据医学影像分析技术和电脑认知计算技术,技术门槛高,而基于认知技术正好弥补了这一技术空白,人工智能在医疗影像领域的商业价值是不容忽视的。据IBM提供的资料,在国外,早在2014年,IBM的“沃森医生”已经在美国安德森癌症中心(M.D. Anderson Cancer Center)上岗,已经被誉为“未来最好的癌症专家”和“医神”。据测算,沃森的诊断准确率达到73%。

作者:刘品杰
链接:https://www.zhihu.com/question/31381946/answer/140936920
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

深度学习综述

阅读数 4588

3天入门深度学习

阅读数 554

深度学习

博文 来自: qq_42415326

深度学习之路

阅读数 126

没有更多推荐了,返回首页