2018-12-31 10:32:31 qq_36298178 阅读数 137
  • 深度学习30天系统实训

    系列教程从深度学习核心模块神经网络开始讲起,将复杂的神经网络分模块攻克。由神经网络过度到深度学习,详解深度学习中核心网络卷积神经网络与递归神经网络。选择深度学习当下流行框架Tensorflow进行案例实战,选择经典的计算机视觉与自然语言处理经典案例以及绚丽的AI黑科技实战,从零开始带大家一步步掌握深度学习的原理以及实战技巧。课程具体内容包括:神经网络基础知识点、神经网络架构、tensorflow训练mnist数据集、卷积神经网络、CNN实战与验证码识别、自然语言处理word2vec、word2vec实战与对抗生成网络、LSTM情感分析与黑科技概述。

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

很多人问我如何开始机器学习和深度学习。在这里,我整理了一个我使用过的资源列表,以及我第一次学习深度学习时所走过的路。

免费课程

从Andrew Ng在Coursera上的机器学习课程开始(https://www.coursera.org/learn/machine-learning)。这门课程会教会你机器学习的一些诀窍,并且会提高你的线性代数技巧。你一定要好好作业,在完成课程后,你会掌握机器学习的概念,例如:线性回归、逻辑回归、支持向量机、神经网络和k均值聚类。你也有机会建立一个推荐系统来玩玩。这会开阔你的眼界,让你更有信心进入机器学习和深度学习的领域。但是要知道,还有许多其他重要的概念,这门课程无法涵盖。所以,在这门课结束后,要准备好拓宽你的知识面。如果你在完成吴博士的课程后非常兴奋,你应该去看看他的其他课程,它是Coursera上深度学习专业课程的一部分。

Fast.ai提供免费的在线深度学习课程,课程分为两个部分:

  • 深度学习第一部分:Practical Deep Learning for Coders

  • 深度学习第二部分:Cutting Edge Deep Learning for Coders

在这些课程之后,您可能已经准备好学习Hinton的机器学习神经网络了。Hinton的课程相对于前面提到的课程来说比较难,因为课程很枯燥,而且包含了更多的数学概念。如果你觉得你还不能解决这个问题,不要慌!停一段时间,先做数学部分(在下一节中描述),然后再回来。这次你一定能解决这个问题!记住,决心,决心,决心,更多的决心。

数学

深度学习当然需要你对线性代数、微分学和向量有很好的掌握。如果你想快速复习一些基本的线性代数并开始写代码,强烈推荐Andrej Karpathy的黑客神经网络指南。我发现hadrienj 's notes在《深度学习》一书中对实际了解底层数学概念,以及如何使用Python (Numpy)非常有用。如果你喜欢从视频中学习,3blue1brown有一个关于线性代数、微积分, 神经网络以及其他数学相关概念的非常好的视频。在非卷积问题上自己实现一个基于cpu的反向传播算法也是真正理解反向传播工作原理的好方法。

来点真格的

如果你想提高你的机器学习知识,并准备认真对待(我的意思是研究生水平的认真对待),去研究一下 Learning From Data ,这是一本加州理工教授写的书。准备好做所有的数学运算。这可能有点挑战性,但是你要是读完了而且做完了作业的话,绝对是值得的。我认为,教科书很难捕捉到目前深度学习的状态,因为这一领域的发展速度非常快。但最受欢迎的教科书应该是 Goodfellow, Bengio, 和Courville的《深度学习书》(http://www.deeplearningbook.org/)。它可以在网上免费下载,所以你也可以一章一章地下载,一章一章地阅读课本。

论文,论文,论文,我再也追不上它们

是的,深度学习的知识主要来自论文,而这些论文的发表速度在当今是非常快的。Reddit是一个很好的起点。订阅/r/machinelearning和/r/deeplearning。不过我觉得机器学习的reddit版块更有用。ArxivSanity是一个查看与你正在寻找的论文相关的论文的好地方。在深度学习中,阅读论文时要做的一件重要的事情就是做好文献综述。做一个好的文献回顾可以让你更好地了解事物是如何发展的。解决文献综述问题的一种方法是安装谷歌Scholar Chrome扩展并搜索你想查找的论文。你可以跟随“相关文章”和“被引用”来跟随之前的工作以及基于那篇论文的新工作。阅读论文的一个好习惯是在论文中画出概念的思维导图。

当我阅读一篇关于“few-shot learning”的论文时,我画出了这张思维图。

思维导图的优点是它是一种很好的方法来跟踪文章中提出的概念之间的关系。我发现思维导图对于跟踪相关文献以及它们与我正在阅读的论文之间的关系非常有用。思维导图能让我对一篇论文有一个清晰的认识,也能让我在读完之后对论文有一个很好的总结。

我发现Twitter(国内就是微博,公众号了吧)对于跟踪机器学习和深度学习研究非常有用。你可以从跟踪ML/DL领域中的知名人员开始,然后从那里开始扩展。因为我经常转发关于对抗机器学习和自动驾驶汽车的研究,你也可以关注我的twitter(关注我的公众号吧?),把它当作你的feed。你能做的就是查看我转发过的人,查看他们的推特,关注他们圈子里的其他研究人员。一旦你提供了足够的数据,Twitter也会推荐优秀的人去关注,也就是关注足够多的ML/DL研究者。

Kaggle

Kaggle实在是太有用了。我强烈建议你尝试Kaggle竞赛,即使你进入前100名的机会很小。Kaggle竞赛的价值在于社区。阅读kernel并从中汲取好的实践经验。阅读评论并参与讨论。在那里你会学到很多东西。你会了解人们如何进行探索性数据分析,以及如何处理丢失数据、不平衡数据等各种情况。Kaggle竞赛中有很多知识。

灵感

机器学习的可视化介绍是一种很好的方法,可以直观地掌握统计学习技术是如何用于识别数据中的模式的。

谷歌的Seedbank是一个获得灵感的伟大资源!看一看这些例子,跟着文献走。

Distill.pub是一个交互式学习DL概念的好地方。我希望Distil出现更多的文章。

冰山一角

除非你把自己所学的付诸实践,否则什么都不重要。ML和DL听起来很神奇,当你自己实现整个pipeline,你会发现也就那样。整个pipeline包括数据来源、数据收集、数据质量评估、数据清理、数据注释、数据预处理、构建工作流、构建模型、调优模型、评估模型、部署模型和重复模型。这些步骤只是整个ML/DL pipeline中的一些步骤。那些已经完成了全面DL工作的人知道尽可能保持整个开发操作的流畅是多么重要。整个数据来源、收集、注释、清理和评估步骤至少占整个项目的60%,而且它们可能是项目中最昂贵的部分之一(除了耗电的GPU !)

总之,ML/DL领域是一个不断发展的领域,你必须张大你的耳朵、睁大你的眼睛,开放你的思想。不要仅仅因为一篇论文/博客/教程/个人/YouTube视频说某一项新技术在某一特定数据集上表现很好就跳到它上面。我看到许多闪亮的新技术来了又去的很快。永远要意识到区分信号和噪音是很重要的。转载原文地址

2019-10-11 22:52:28 weixin_44762772 阅读数 36
  • 深度学习30天系统实训

    系列教程从深度学习核心模块神经网络开始讲起,将复杂的神经网络分模块攻克。由神经网络过度到深度学习,详解深度学习中核心网络卷积神经网络与递归神经网络。选择深度学习当下流行框架Tensorflow进行案例实战,选择经典的计算机视觉与自然语言处理经典案例以及绚丽的AI黑科技实战,从零开始带大家一步步掌握深度学习的原理以及实战技巧。课程具体内容包括:神经网络基础知识点、神经网络架构、tensorflow训练mnist数据集、卷积神经网络、CNN实战与验证码识别、自然语言处理word2vec、word2vec实战与对抗生成网络、LSTM情感分析与黑科技概述。

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

开始深度学习的学习
在这里插入图片描述

2017-09-11 10:20:10 shangfan0930 阅读数 8055
  • 深度学习30天系统实训

    系列教程从深度学习核心模块神经网络开始讲起,将复杂的神经网络分模块攻克。由神经网络过度到深度学习,详解深度学习中核心网络卷积神经网络与递归神经网络。选择深度学习当下流行框架Tensorflow进行案例实战,选择经典的计算机视觉与自然语言处理经典案例以及绚丽的AI黑科技实战,从零开始带大家一步步掌握深度学习的原理以及实战技巧。课程具体内容包括:神经网络基础知识点、神经网络架构、tensorflow训练mnist数据集、卷积神经网络、CNN实战与验证码识别、自然语言处理word2vec、word2vec实战与对抗生成网络、LSTM情感分析与黑科技概述。

    14361 人正在学习 去看看 唐宇迪
作者: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 的回答

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

2016-12-08 00:20:13 kamendula 阅读数 1275
  • 深度学习30天系统实训

    系列教程从深度学习核心模块神经网络开始讲起,将复杂的神经网络分模块攻克。由神经网络过度到深度学习,详解深度学习中核心网络卷积神经网络与递归神经网络。选择深度学习当下流行框架Tensorflow进行案例实战,选择经典的计算机视觉与自然语言处理经典案例以及绚丽的AI黑科技实战,从零开始带大家一步步掌握深度学习的原理以及实战技巧。课程具体内容包括:神经网络基础知识点、神经网络架构、tensorflow训练mnist数据集、卷积神经网络、CNN实战与验证码识别、自然语言处理word2vec、word2vec实战与对抗生成网络、LSTM情感分析与黑科技概述。

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

深度学习的一些个人学习(1)

首先我们从感知机开始说起。

通常感知机的形式如下图:

感知机

其中x1 x2 x3 是输入,output是输出。

当我们想由输入得到输出时,可以按照如下的公式得到:

output=01if jwjxj thresholdif jwjxj> threshold(1)

你可以这样理解:x1x2x3 是衡量结果、影响最终结果判断的因素,而wj则是用来判断这些因素在对结果的影响中,能占多大的权重,也就是会多大程度上影响结果。通过(1)式我们也可以看出来,通过调节不同的threshold,我们可以获得不同的判断结果。

但是很明显的,这么简单的模型不能理解我们这个世界,于是我们让中间再加两层:

在这里,输入的的因素不仅仅做出一个判断,而是三个。而这三个输出结果,又成为下一层的输入,综合这一次的权重,影响第三层的结果判断。以此类推,我们可以增加好多层的感知机结构。

虽然这种情况下还是不能很好的描述我们这个世界,但是起码朝着理解世界更前进了一步。

从上面的结构来看,我们会以为多层的感知机有多个输出结果,但是实际上只有一个。我们这样画,只是为了表明一个感知机的多种不同的可能结果,作为下一层的输入来说,是怎么样组合起来,是怎样影响下一层的输出的。这样看起来比较方便些。

我们简化下公式(1):

  1. 我们用向量点乘来代替jwjxj :

    wx=jwjxj

  2. 将thresh_hold进行转化,放到方程里面去 bthresh_hold

    通过上面的转化,我们可以重写(1)


    output={01if wx+b0if wx+b>0(2)

b我们称之为偏差,可以理解为我们让结果输出为1的难易程度:b越大,结果为1就越难;b越小,结果为1就越简单。

这样一看,公式是不是清爽了好多。

通过感知机,我们可以“制作”简单的与门,或门,或者与非门。

例如我们看下面的例子:

我们可以看到:输入(0,0) ,(-2)* 0 + (-2)*0 +3 = 3 ,结果输出为正;

我们输入(1,0)(0,1),都会输出结果1;而如果输入(1,1),就会输出结果-1;

这样,我们就实现了一个与非门!

利用这个与非门,我们可以实现一些更复杂的逻辑,比如:

计算bitwise sum,也就是bit和;还可以用来标识当x1 x2都设定为1时进行标识:

可以自己看下结果:当x1, x2均为输入1时, x1x2结果为1,其余为0;

然后可以自己再设定下x1 x2分别为0,1,看下x1x2,可以看到结果就是他们的bit相加的结果。

注意,这里显示的器件都是nand门,也就是与非门。

通过这里我们可以看到感知机的一些潜力:他可以根据我们输入的一些因素,来对最终的结果产生影响,而不用我们人为的去定义一些规则。因此我们可以更深入的去挖掘它。

sigmod 神经元

想一下:我们想要使用感知机来处理结果,比如我们有一个要处理的图像,图像是数字8。我们的感知机最终的输出结果是数字9.那么如何来进行调整呢?加入你有一个小扳手,可以轻轻的调动参数w的值的话,那么理想的情况应该是:我稍微动一点扳手,也就是稍微动下w,那么最终的结果就稍微的变下,在这里我们可以理解为图像是9的概率小了些,而图像为8的概率大了些;我使劲的动了下调整的扳手,那么相对的8,9 的概率也会变大。这种情况下,实在是太方便我们调整参数了。

但是实际上你要相信,美好的事情不会这么容易发生。

更通常的情况是,你稍微扳了下扳手,这一层的输出结果没啥变化;你使劲扳了下,还是没啥变化;你再扳,结果噗的发生了突变,比如说从0变到了1,而这种突变使得后面各层的输入输出都会发生巨大变化!

牵一发而动全身,南美的蝴蝶啊,同志们。

所以,如果你不断的调参,最后的输出即使是9,那么在用这个网络去预测别的图像的时候,结果也会变得十分的有问题。

那么怎么解决这个问题呢?很明显,我们就找一个“动一下参数,结果就稍微动一下的输出函数”就可以了。而sigmod函数就是我们的真命天子了。

sigmod函数如下:

σ(z)11+ez.(3)

为了避免你忘了z,我们将z带入一下:

11+exp(jwjxjb).(4)

这就是我们新的输出公式了。

为什么我们要选择这个函数作为我门的输出公示呢?

一开始,我们说,是为了实现“你动一点,我动一点”这个功能而选择的它。

首先,让我们来看下这个函数本身,能不能作为一个激活函数。

当z很大时,结果趋向于1;当z很小时,结果趋向于0;

我们看下该函数的图形:

从该图形我们也可以看出,sigmod函数的有着很好的平滑性,这种平滑性的有点就是:我们在对结果求导之后,得到的结果:

ΔoutputjoutputwjΔwj+outputbΔb,(5)

sigmod的这种平滑性,使得最终的结果也可以可控。想象一下,如果结果直接是

如果直接是这种形状,那么导数直接为0,就会影响我们的“微调”。

为什么我们用这个函数,而不是用其他的呢?实际上,我们也会用其他的函数来作为激活函数。我们选用sigmod函数,是因为sigmod函数的求导有着十分好的性质,这个性质方便我们进行处理。

于是,通常情况下,我们可以得到如下的模型:

这种模型,就是深度学习的模型了。

当然有时候,由于一些历史的原因,我们也会称之为multilayer perceptrons or*MLPs*。

接下来我们用一个例子来详细的说明。这个例子是用来识别手写字符的,例如:

我们希望可以从这个图片中,把里面的数字识别出来。

假设我们的输入为x,所希望的输出为y,也就是说我们给了一个字符“5”,那么输出的结果y(x)就是“5”。设定输入输出关系为y = y(x). 而a,则是我们输入字符“5”,我们通过深度学习网络能得到的结果。至于这个结果是5,还是其他的结果,就取决于我们的这个学习网络的能耐了。

那么,怎么来衡量这个网络结果的好坏呢?我们希望的情况是,通过调整合适的w和b,从而使得理想结果y(x)与a的结果尽量的小。我们使用代价函数来表征这个结果:

C(w,b)12nxy(x)a2.(6)

我们称该方程为二次代价方程,也成为均值平方差或者MSE。

从方程的形式我们可以看出来,C(w,b) 是非负的。而且,当我们的网络预测的很好时,它的结果就是C(w,b)0;当预测的结果很差时,它的结果就是C(w,b) 很大。因此,我们希望通过调整w,b,使得(6)很小,从而使得误差很小。

怎么找w,b呢?

这时候,梯度下降gradient descent 就要出场了。

也许有人会问了,我们的本心是为了预测图片准确识别的数量,为什么不直接去衡量图片识别的准确率,而是间接的要通过一个二次方的代价呢?本来这是可以的,但是有个问题:图片的准确率对于w和b来说不是平滑可导的, 大部分情况下,小的w和b的改变对于结果没啥影响,这就很不利于调整参数。而如果用(6)式的话,就会有一个平滑可导的结果,从而可以让我们可以方便的去调整参数。

但是也会有人问,想要一个平滑可导的函数,好。可是,为什么非得选二次方呢?是随机选的吗?我们选其他的,那么不就得到了完全不同的w和b?

这是有道理的,后面我们再探讨这个事情。但是,二次导数在大部分情况下,是切实可行的,所以我们暂时先用这个进行计算。

接下来,我们暂时忘记我们要做的事情,把目标转移到另外一个问题上来。尽管可能你觉得很奇怪(当然,我知道其实你并不觉得),这个问题的探讨会很有帮助。

假设我们有一个函数C(v) ,其中v=v1,v2,v3 假设我们只有两个参数,我们可以画出如下的图形:

很明显的,我们可以看到有个谷底,这个谷底就是我们梦寐以求的最小值。然后我们就知道,我们肯定可以找到这个最小的点。但是我们肯定不能用肉眼来看最小值,而是用积分的方法来求。但是这个积分的方法话,对于只有几个参数的来说还行,但是参数一多,根本就无能为力了。

那么,我们该怎么求呢?

想象一下,我们站在一个山谷的谷顶,向下扔球,这个球会怎么样呢?这个球会自然的向谷底的地方滑去(假如没有摩擦力的话),那不正是我们期望的?!

假定一下,我们如果是个数学世界的造物主,有设定数学世界物理规律的能力,想要球按照上面的方式滚动,我们该怎么设计呢?

假如我们只有两个方向,v1和v2,我们向v1方向移动了v1,向v2方向移动了v2,那么我们可以知道总的移动:

ΔCCv1Δv1+Cv2Δv2.(7)

因此,我们希望给v1v2 找到一个值,使得C 为负值,这样,就使得球不断的往下走了么!

我们用下式进行变化:

C(Cv1,Cv2)T.(8)

于是就可以得到:

ΔCCΔv.(9)

因此,我们设定
Δv=ηC,(10)

这样
ΔCηCC=ηC2

就一定是负值了!就一定可以向下走了!(η 设定为正值)

于是

vv=vηC.(11)

这样不断地循环,我们就可以不断地向下走了!一直走到世界的,不是,是谷的低谷!

而且,更好的是,我们不仅仅希望向下走,而且可以以最快的速度向下走,这个问题也通过这个公式解决了。

设想下,我们移动v ,希望极可能的减小C ,也就是尽可能的使ΔCCΔv 小。也就是说,限定Δv=ϵ 步长的情况下,使其最小。可以证明,在当Δv=ηC 时会使其尽可能的小。

因此,既可以减小,而且又可以尽量小!

好了,重新回到我们的深度学习的世界中来。

在这里,v1>wk,v2>bl ,因此我们可以设定为:

wkblwk=wkηCwkbl=blηCbl.(16)(17)

通过反复的迭代,我们可以找到C的最小值了。

再想一下,我门的代价函数是:

C(w,b)12nxy(x)a2

设定

Cxy(x)a22

于是就有C=1nxCx ,求偏导则有:C=1nxCx

其中x是样例点的个数。可以看出来,每次更新,都需要综合考虑所有的样例点进行计算,可见非常的耗时。

因此,为了提高速度,有一种随机梯度下降的方法,来进行计算梯度。这个方法的思想就是,选择训练样本点中的一小部分来计算C ,通过这种处理,我们可以更快的来计算梯度下降。

那么,为什么我们可以这么算呢?

你可以这样假定:

mj=1CXjmxCxn=C,(18)

这样,我们就可以得到:
C1mj=1mCXj,(19)

wkwk=wkηmjCXjwk(20)\

blbl=blηmjCXjbl(21)\

由此可见,我们可以有这种随机梯度下降的方法,来计算我们的函数了。

neuralnetworksanddeeplearning Michael Nielsen

2019-10-28 22:01:20 qq_28400629 阅读数 14
  • 深度学习30天系统实训

    系列教程从深度学习核心模块神经网络开始讲起,将复杂的神经网络分模块攻克。由神经网络过度到深度学习,详解深度学习中核心网络卷积神经网络与递归神经网络。选择深度学习当下流行框架Tensorflow进行案例实战,选择经典的计算机视觉与自然语言处理经典案例以及绚丽的AI黑科技实战,从零开始带大家一步步掌握深度学习的原理以及实战技巧。课程具体内容包括:神经网络基础知识点、神经网络架构、tensorflow训练mnist数据集、卷积神经网络、CNN实战与验证码识别、自然语言处理word2vec、word2vec实战与对抗生成网络、LSTM情感分析与黑科技概述。

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

深度学习开始

深度学习之路

阅读数 125

深度学习环境搭建

阅读数 776

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