2017-09-11 10:20:10 shangfan0930 阅读数 8055
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16250 人正在学习 去看看 AI100讲师
作者: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 的回答

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

2017-06-14 10:33:57 yang9649 阅读数 711
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16250 人正在学习 去看看 AI100讲师

转载https://www.leiphone.com/news/201611/cWf2B23wdy6XLa21.html


大神Yann LeCun亲授:如何自学深度学习技术并少走弯路本文作者:亚萌 2016-11-29 11:59导语:Yann LeCun是Quora上非常踊跃的答者。有人问:你最喜欢的机器学习算法是什么?,LeCun 的回答是Backdrop。大神Yann LeCun亲授:如何自学深度学习技术并少走弯路编者按:深度学习领域泰斗级人物 Yann LeCun 是 Quora上非常踊跃的答者,他乐于分享自己的心得体会。例如,有人问“你最喜欢的机器学习算法是什么?”,Yann LeCun 的回答是“Backdrop”。深度学习是新兴领域,很多人想要学习,也不知如何入手,所以 Quora上有很多关于“如何学习深度学习技术”的问题,Yann LeCun 在一些问题下面给出了一些自己的见解,雷锋网(公众号:雷锋网)据此整理编辑成本文,供读者参考。大神Yann LeCun亲授:如何自学深度学习技术并少走弯路问:自学机器学习技术,你有哪些建议?在网上有很多关于Machine Learning 的材料、教程和视频课程,包括 Coursera 上的一些大学课程。这里我主要讲讲深度学习领域。你可以在网上听一些指导性课程和演讲,对深度学习有一个大致的了解。里面我比较推荐的有:2015年5月《自然》上刊登的一篇概述性论文《深度学习》(Deep learning),由我自己、Yoshua Bengio 、Geoff Hinton共同撰写。(网址:http://www.nature.com/nature/journal/v521/n7553/abs/nature14539.html)系统性的课本方面,我推荐由 Goodfellow、Bengio 和 Courville共同撰写的《深度学习》(Deep learning)(这个在网上有HTML版本,本书旨在帮助学生和从业人员入门机器学习,尤其是深度学习领域。HTML版本已经编辑完成,并且永久免费。网址:http://www.deeplearningbook.org/)我曾在巴黎法兰西公学院开课,其中有8堂课是关于深度学习,当时是用法语讲课,现在加上了英文版本。法语版网址:Accueil 英语版网址:HomeCoursera 上面有 Geoff Hinton 关于神经网络的视频课程(不过从现在的角度看,内容稍微有点过时了)2012 年 IPAM 上针对研究生的“深度学习和特征学习夏季课程”(这个夏季课程的授课老师包括 Geoff Hinton 、Yann LeCun、吴恩达、Yoshua Bengio等众多深度学习专家,历时半个多月时间,网上有完整视频录像,网址:http://www.ipam.ucla.edu/programs/summer-schools/graduate-summer-school-deep-learning-feature-learning/?tab=schedule)2015 年我在纽约大学开了一门“深度学习”的课程,当时录成视频放到了网上,但是由于愚蠢的法律原因,视频现在已经不在了,但 PPT 还在。2017 年春天我会重新在纽约大学教这门课。网址:http://cilvr.nyu.edu/doku.php?id=deeplearning2015%3Aschedule)2015年在加拿大蒙特利尔市举行了“深度学习夏季课程”(该课程的对象为:已经具备的机器学习基本知识的研究生、业界工程师和研究人员,授课量十分丰富。网址:http://videolectures.net/deeplearning2015_montreal/)另外,我还推荐一些关于特定平台的使用教程,比如Torch、TensorFlow 和 Theano。问:如果一名本科生想要成为深度学习领域的研究型科学家,你有什么建议?首先,尽你所能,把所有具有连续性的数学和物理课都上一遍。如果必须要在“iOS 编程”和“量子力学”之间选一门,一定要选后者。在任何情况下,都要上微积分(I)、 微积分(II), 微积分(III)、线性代数、概率论和统计学,另外尽可能多的去听物理学的课程。同时,还是要确保学习编程。为什么物理学这么重要?因为物理学发明了很多数学方法,来给真实世界建模。比如,贝叶斯推理(BayesIan inference)在本质上与统计力学(Statistical Mechanics)是相同的,反向传播算法( Backpropagation)可以看作是经典力学里拉格朗日算符(Lagrangian)的一种简单应用。图模型里的前向算法( Forward Algorithm)是一种广泛应用于量子力学的路径积分(Path Integral)。物理,能够教你如何使用傅里叶变换(“海森伯不确定原理”的基石)、最大熵原理、配分函数、蒙特卡洛法、热处理、波尔兹曼分布、动力系统、混沌等等。选一个你感兴趣的与 AI 有关的问题。然后独立对这个问题进行思考。一旦你形成了自己的想法,就开始阅读围绕这个问题的相关文献。你将会发现(a)你之前的想法有点幼稚,但是(b)你对该问题的看法开始有点不一样了。在你就读的学校里,找到一个教授,他可以帮你把想法具体化。这或许有点困难,因为教授们都很忙,没有多少时间来指导本科生。有很多空余时间的教授往往很年轻,而那些年纪比较大的教授,又往往不再活跃在研究圈子里。如果你找到一个合适的教授,但他没有空余时间指导你,那么你可以转而去“勾搭”他/她实验室里的博士后或博士生。问问这个教授,是否可以让你去参加他/她实验室里的会议和研讨,或者只是在他们开会的时候旁听也行。在你本科毕业之前,尝试着写一篇关于你研究工作的论文,或者在网上公布一些开源代码。现在,你可以去申请 PhD 项目了。不要去管所谓的学校“排名”,一定要找你感兴趣领域里有声誉的教授,他论文你很喜欢或钦佩。你可以同时申请几个学校的 PhD 项目,当然选择的时候参考上条标准。在申请信里,你要提到你很希望跟这个教授一起工作,但是也愿意与其他教授一起。问一问你的本科教授,请他帮你写一封推荐信。如果你的本科教授与你所申请的 PhD 项目教授认识,那么将是非常有利的。如果你没有录取到自己心仪的 PhD 项目,可以到Facebook或谷歌工作,并且尝试去FAIR 或Google Brain 实验室做一个工程师,来协助实验室里科学家的工作。发表与公司实验室里课题有关的论文,然后重新申请 PhD 项目,并且让 FAIR 或 Google Brain 实验室里的科学家帮你写推荐信。问:在未来5-10年内,AI 将可能朝哪些方向发展?有很多人在致力于不同的领域,并取得了非常好的进展:深度学习与推理和规划相结合。基于模型的深度强化学习(涉及到无监管预测型学习)。经由可辨的记忆模块巩固加强的递归神经网络(例如,记忆网络):a. 记忆网络(FAIR)(网址:https://scholar.google.com/citations?view_op=view_citation&hl=en&user=lMkTx0EAAAAJ&sortby=pubdate&citation_for_view=lMkTx0EAAAAJ%3AumqufdRvDiIC)b. 堆栈增强的RNN(FAIR)(网址:https://scholar.google.com/citations?view_op=view_citation&hl=en&user=oBu8kMMAAAAJ&sortby=pubdate&citation_for_view=oBu8kMMAAAAJ%3AgKiMpY-AVTkC)c. 神经图录机(DeepMind)(网址:https://arxiv.org/abs/1410.5401)d. 端对端型MemNN (FAIR/NYU)(网址:https://scholar.google.com/citations?view_op=view_citation&hl=en&user=lMkTx0EAAAAJ&sortby=pubdate&citation_for_view=lMkTx0EAAAAJ%3AKbBQZpvPDL4C)经过对抗性训练得到的生成型(预测)模型。“微程序设计”:其核心思想----将程序(或电路)看作可通过Backdrop进行训练的微模块。这一思想表明深度学习不仅可以学会识别模型(如前馈神经网),而且可以生成算法(如循环算法,递归算法,子程序算法等)。从DeepMind、FAIR及其他资源中可获得一些相关方面的文章,但是,这些仅仅是初级阶段的成果。分层规划与分层强化学习:这是学习将一个复杂的任务拆分成一些简单的子任务的问题所在,是所有智能系统要满足的要求。对外界事物的无监管学习预测模型(例如,视频预测)。如果未来几年 AI 能在这些方向取得重大发展,那么将会涌现大量更为智慧的AI 智能体,应用于对话系统、问答、适应性的机器人控制与规划等领域 。构建出无监督学习方法,这是一大挑战。但这将允许大型神经网络在没有直接人工注释数据的情况下,通过看视频、阅读书本便能够“学习现实世界是如何运转的”。这将最终衍生出对现实世界有足够了解的机器,它们开始具有人类的“常识”。要实现这一目标,可能会花费5年、10年、20年,甚至更久的时间,我们尚不能确定具体的期限。

2015-08-15 16:23:06 u012990623 阅读数 1498
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16250 人正在学习 去看看 AI100讲师

深度学习自学笔记(一)

声明

这是一个初学者写给自己看的笔记,一个原因是想记录我学习深度学习的思考过程,另一个是顺便整理自己刚学的内容,所以内容非常肤浅,但我认为这样反而更容易让新手接触这个东西,所以若大牛们发现里面的错误,还望不吝指点,我会尽快更正,以免误导他人。我主要的学习思路是来自这篇博客http://blog.csdn.net/fish0058/article/details/19756845,我认为他是目前论坛里最简单易懂的教程,所以各位看客若是觉得本渣写的很差,请看这篇博客。另外我会尽量少用数学推导来讲解一个算法,一是大牛们早已推倒过无数次(我也会把大牛推导的连接的附在上面),二是这篇笔记主要是用来引导自己思考和回忆的作用。好了,我马上开始进入深度学习的世界,这篇帖子也会随着我的学习而更新。



一、什么是深度学习

以我的学习经验来看,学习一个东西,最好先清楚他是做什么的,有什么用处,于是在学习其中每一步的时候,有了大方向的指引,才更好理解。所以我想先记录深度学习到底能做什么,它为什么这么火,然后再慢慢学习其中的细节。

首先大家都了解机器学习吧,就是让计算机能和人一样的认知事物,所以我认为机器学习一个很重要的工作就是分类,先从训练数据中进行学习,然后给定一堆数据能正确的对每一个数据进行分类。而深度学习的作用就是让计算机具有更强的学习能力,所以他是一种非常非常优秀的机器学习算法,那我们先来看目前机器学习的大概工作流程:

比如放在计算机视觉相关领域中,第一步得到图片矩阵,里面都是raw pixel;第二步进行图像预处理,比如灰度,白化,仿射投影什么的,主要为了降噪,提高后面的效果;第三步提取特征,如sift, hog, pixel difference,直接用像素作为特征效果一般很差;第四步选取特征;第五步根据提取到的特征进行分类回归。

粗略的来说我认为归为两大步骤:一是特征表达(2,3,4步),二是分类回归(第五步)。这点和人认知事物的思路是一样的,比如认一个篮球,先看这个物体的特征表达,形状是球形,颜色是橡胶红色,将这两点特征给大脑已经学习好的知识体系,得出结论这东西是篮球。

也就是说要想本质的提高机器学习算法的性能,必须在两个步骤中进行改进。那我们先来看看在机器学习中,这两大步骤一般都是哪些算法。我比较熟悉的,特征提取里面有sift,hog,光流,pixel difference。分类算法有SVM,regression tree,random forest。而系统主要的计算和测试工作都耗费在特征提取这一块,而且一般这些特征都是人工设计的,人为的告诉计算机这个特征该怎么提取。虽然,有不少效果非常好的特征,如sift,但也不是万能的,人脸用sift,行为用sift,目标跟踪还用sift,效果肯定是因用途而异。因此我们想要一种模型,能够自己根据目标对象来设计特征,这样的特征肯定能更好的揭露目标的本质,提取更多有用信息,效果肯定也更好。而deep learning就是这么做的,正如其另一个别名unsupervised feature learning。

我能想到最类似的方法为FA3000里面结合random forest和pixel difference在训练数据中学习出的binary features,该方法也是通过训练数据学习出特征提取,取得了the state of art成果,也证明了学习得到的特征效果往往较好。

接下来问题来了怎样一个牛逼的模型才能自己学习提取特征呢?说起来可能会吓到宝宝,为了实现自动学习特征提取,深度学习模拟大脑神经网络采用分层结构来学习训练数据,即一层层的对数据进行抽象认知,先提取低级特征(如边缘特征),然后对低级特征进行组合提取出语义层次高一些的特征(如形状),通过这样不断的迭代,最后得到的特征最具有区别性。听起来有点复杂,所以借用一张图来说明人脑是怎么认知事物的

我再来解释一下,人脑从曾经接触过的无数个图片(像素矩阵)中,挑取出最具有代表性的像素组合作为特征,也就是边缘patch(生物学上有实验依据,记住就行),然后大脑又将这些边缘特征进行组合提取出更具有代表性的组合patch,继续这样,最后组合出来的特征就极具区分性了。深度学习就是描述这个过程,所谓深度,就是分层的深度,学习就是每一层怎样学习挑取特征。因此深度学习的结构模型与人脑认知的结构类似

第一层为输入层,输入一大堆训练数据,黑线就是要学习的参数-权重,影响如何生成第二层的特征,那橘黄色的第二层显然就是要学习的特征空间了,对应人脑里面的边缘那一层,最后一层为输出,输出最终要提取的特征。(如果在最后一层加个分类器,不就是整个ML过程了?)

数学上,我认为还可以这样理解,如果把特征提取看做是一个映射函数,将原始图像映射到一组向量-特征。那么深度学习的每一层其实是一个线性映射(基的线性组合)将数据映射到那一层所在的特征空间,这样多次线性映射后的结果接近非线性映射,从而能够拟合更复杂的映射函数,也就获得了更优秀的特征(感觉和级联回归模型类似,通过多次线性回归,模拟非线性回归)。

讲到这里,只是想让大家明白深度学习想要干什么,他能完后什么牛逼的工作,为什么能变的这么火,他的结构是什么样子的,至于这个结构为什么能完成这个功能,每一层的圈圈到底是什么,那些权重为什么影响学习的特征,什么牛逼的算法才能训练这个结构,这些东西我会接下来慢慢更新给大家。还是那句话,我也是初学者,很多东西都很肤浅甚至是错误的,所以希望大家能提取意见,我会积极改正。

2019-02-27 14:10:39 weixin_43766770 阅读数 218
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16250 人正在学习 去看看 AI100讲师

在回顾深度学习相关知识的时候参考链接博客,将自己遗忘的知识点进行整理归纳。

  • Train/Dev(验证集)/Test Sets
    没有Test sets也是没有问题的。Test sets的目标主要是进行无偏估计。我们可以通过Train sets训练不同的算法模型,分别在Dev sets(测试不同算法的表现)上进行验证,根据结果选择最好的算法模型。这样也是可以的,不需要再进行无偏估计了。如果只有Train sets和Dev sets,通常也有人把这里的Dev sets称为Test sets。
  • Bias(偏差)/Variance(方差)
    当base error0时,假设Train set error为1%,Dev set error为11%,即该算法模型对训练样本的识别很好,但是对验证集的识别却不太好。这说明了该模型对训练样本可能存在过拟合,模型泛化能力不强,导致验证集识别率低。这恰恰是high variance的表现。假设Train set error为15%,而Dev set error为16%,虽然二者error接近,即该算法模型对训练样本和验证集的识别都不是太好。这说明了该模型对训练样本存在欠拟合。这恰恰是high bias的表现。模型既存在high bias也存在high variance,可以理解成某段区域是欠拟合的,某段区域是过拟合的。
  • Basic Recipe for Machine Learning
    减少high bias的方法通常是增加神经网络的隐藏层个数、神经元个数,训练时间延长,选择其它更复杂的NN模型等。在base error不高的情况下,一般都能通过这些方式有效降低和避免high bias,至少在训练集上表现良好。
    减少high variance的方法通常是增加训练样本数据,进行正则化Regularization(有效途径),选择其他更复杂的NN模型等。

防止过拟合的有效途径

  • Regularization添加正则化项
    L1 regularization vs L2 regularization:
    与L2 regularization相比,L1 regularization得到的w更加稀疏,即很多w为零值。其优点是节约存储空间,因为大部分w为0。然而,实际上L1 regularization在解决high variance方面比L2 regularization并不更具优势。而且,L1的在微分求导方面比较复杂。所以,一般L2 regularization更加常用。

更新w[l]时,比没有正则项的值要小一些,不断迭代更新,不断地减小,当lambd比较大时,w接近于0,某些神经元的部分功能下降。选择合适的lambd的值就可以同时避免high variance和high bias.
图

  • Dropout Regularization
      Dropout是指在深度学习网络的训练过程中,对于每层的神经元,按照一定的概率将其暂时从网络中丢弃。也就是说,每次训练时,每一层都有部分神经元不工作,起到简化复杂网络模型的效果,从而避免发生过拟合。
    Dropout在电脑视觉CV领域应用比较广泛,因为输入层维度较大,而且没有足够多的样本数量。值得注意的是dropout是一种regularization技巧,用来防止过拟合的,最好只在需要regularization的时候使用dropout。
  • 增加训练样本数量
  • early stopping
    Early stopping的做法通过减少得带训练次数来防止过拟合,这样J就不会足够小。L2 regularization可以实现“分而治之”的效果:迭代训练足够多,减小J,而且也能有效防止过拟合。而L2 regularization的缺点之一是最优的正则化参数λ
    的选择比较复杂。对这一点来说,early stopping比较简单。总的来说,L2 regularization更加常用一些。

Normalization inputs

对训练样本进行归一化处理,提高训练的速度。

Vanishing and Exploding gradients

梯度消失和梯度爆炸。意思是当训练一个层数非常多的神经网络时,计算得到的梯度可能非常小或非常大,甚至是指数级别的减小或增大。这样会让训练过程变得非常困难。
在这里插入图片描述
发生在指数稍大于1和稍小于1的情况下。

  • 防止梯度爆炸和梯度消失
    Weight Initialization for Deep Networks
    为了让z不会过大或者过小,思路是让w与n有关,且n越大,w应该越小才好。这样能够保证z不会过大。一种方法是在初始化w时,令其方差为1/n.
    如果激活函数是ReLU,权重w的初始化一般令其方差为2/n.

Gradient checking

在这里插入图片描述

参考博客
https://blog.csdn.net/red_stone1/article/details/78208851

2016-09-16 13:01:45 hyliu006006 阅读数 253
  • Fast.ai 深度学习实战课程「中文字幕」

    本课程由 Jeremy Howard 教授开设,共8节。目的是让大家在不需要深入研究高水平数学问题的情况下,学习如何建立先进的深度学习模型。 Jeremy Howard 教授结合自己参加 Kaggle 大赛并夺魁的经验认为,传统学院派的教学方式对于大多数学习者来说已经不适用,应该以问题为引导,以实践为驱动,尽快切入到核心理论和核心工具的使用上,掌握深度学习优模型的构建方法。

    16250 人正在学习 去看看 AI100讲师

最近一段时间进行深度学习的自学,把学习流程总结整理一下:

1:深度学习基础阶段推荐Andrew Ng的网页教程UFLDL Tutorial本教程将阐述无监督特征学习和深度学习的主要观点。通过学习,你也将实现多个功能学习/深度学习算法,能看到它们为你工作,并学习如何应用/适应这些想法到新问题上。

2:深度学习起源于机器学习,开始必须了解机器学习。Andrew Ng的网页教程UFLDL Tutorial假定熟悉机器学习的基本知识(特别是熟悉的监督学习,逻辑回归,梯度下降的想法),如果你不熟悉这些想法,我们建议你去这里机器学习课程,并先完成第II,III,IV章(到逻辑回归)。国内各个研究者有很多中文解释,可参考tornadomeethttp://www.cnblogs.com/tornadomeet/archive/2013/03/14/2959138.html

3:Zouxy的Deep Learning(深度学习)学习笔记整理系列:http://blog.csdn.net/zouxy09/article/details/8775360,本系列深入浅出的介绍了深度学习的历史、基本思想和基本模型以及展望。

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