神经网络和深度学习(一)——初识神经网络

本文转自:https://blog.csdn.net/qq_31192383/article/details/77145993

神经网络和深度学习

  • 神经网络:一种能够经过观测数据使计算机学习的仿生语言范例
  • 深度学习:一组强大的神经网络学习技术程序员

神经网络和深度学习目前提供了针对图像识别,语音识别和天然语言处理领域诸多问题的最佳解决方案。传统的编程方法中,咱们告诉计算机如何去作,将大问题划分为许多小问题,精确地定义了计算机很容易执行的任务。而神经网络不须要咱们告诉计算机如何处理问题,而是经过从观测数据中学习,计算出他本身的解决方案。自动地从数据中学习看起来颇有前途。然而直到2006年咱们都不知道如何训练神经网络使得它比传统的方法更好,除了一些特定问题。直到2006年称为深度神经网络的学习技术被提出,这些技术如今被称为深度学习。它们获得了很好的发展,今天,深度神经网络和深度学习在计算机视觉、语音识别和天然语言处理等许多重要问题上取得了出色的表现。web

初识神经网络

人类的视觉系统是世界上最棒的系统之一,好比下列一串手写数字:
这里写图片描述
大多数人均可以一眼看出它是504192。在咱们大脑的每个半球,都有主要的视觉皮质V1V1,逐步进行更复杂的图像处理。咱们大脑里有一台超级计算机,经过数亿年的进化,能够很好的适应这个视觉世界。识别手写数字并不容易,咱们人类惊人地能够理解咱们眼睛所看到的东西,但这些工做都是在咱们不知不觉中就完成了,咱们根本不知道咱们大脑完成了多么负责的工做。算法

神经网络解决这类问题经过不同的方式。思想是把大量的手写数字做为训练样本,而后生成一个能够经过训练样本学习的系统。换句话说,神经网络使用样本自动地推断出识别手写数字的规则。此外,经过增长训练样本的数量,该网络能够学到更多,而且更加准确。所以,当我展现下图100个训练样本时,可能咱们能够经过使用成千上万甚至上亿的训练样原本创建一个更好的手写识别系统。、这里写图片描述编程

该文咱们将写一个程序实现一个神经网络,学习如何识别手写数字。在不使用神经网络代码库的状况下,74行代码就能够完成。可是这短短的代码识别数字的准确率超过96%。此外,后面的文章咱们将能够实现准确率高达99%的方法。事实上,最好的商业神经网络如今已经很好了,银行能够用它们来处理支票,并经过邮局来识别地址。网络

的确,若是这篇文章只是描述如何实现一个手写数字识别的代码,那么很短的篇幅就能够讲完。可是在这个过程当中,咱们会讲到许多神经网络的核心思想,包括两种重要类型的神经元(感知机和sigmoid神经元),和标准的神经网络的学习算法,被称为随机梯度降低法。整篇文章我致力于解释为何这样作,而且创建你的神经网络观念。在本文的结尾,咱们将了解深度学习是什么,和为何它很重要。架构

  • 感知机svg

感知机是一类人造神经元,在许多神经网络中,主要的神经元模型是sigmoid神经元。咱们将很快的了解什么是sigmoid神经元,可是想要知道为何sigmoid要这么定义,就须要咱们花点时间去了解感知机。函数

感知机如何工做?一个感知机经过一些二进制的输入x1,x2,...x1,x2,...,而后产生一个二进制的输出:
这里写图片描述学习

在上图中,感知机有三个输入x1,x2,x3x1,x2,x3的值是否小于或者大于某一阈值。和权重同样,阈值也是一个实数,它是神经元的一个参数。用代数式表达就是:编码

这里写图片描述

以上就是感知机的工做原理。

这是基本的数学模型,你能够认为感知机是一种经过权衡各个因素作出决定的设备。举个例子,假设周末就要来了,大家城市有一场奶酪节,你很喜欢奶酪,你正在犹豫要不要去参加,你可能经过权衡下面三个因素来作出你的决定:

  1. 当每天气怎么样
  2. 你的男友或者女友要不要一块儿去
  3. 交通是否方便

咱们能够经过对应的二进制变量x1,x2,x3x1,x2,x3表示女友想去,以此类推。

如今,假设你真的很是喜欢奶酪,以致于你不管你女友去不去,或者交通十分不便,你都很想去。可是可能由于你又很是很是讨厌恶劣天气致使你绝对不会参加。这时你可使用感知机来模拟这种决策。由于天气对你的影响最大,你能够选择w1=6w1=6的权重最大表示天气因素对你影响最大。最后假设你选择了5做为阈值,这样以来,你的感知机决策模型就创建好了。也就是说这个模型在天气好的时候会输出1,天气很差的时候输出0,其实和其余两个因素不要紧。

显然,人类的决策模型不只仅只有感知机。可是这个例子说明了感知机如何作出决定的。一个复杂的感知机网络能够作出更加精准的决定彷佛是合理的:

这里写图片描述

在这个网络中,第一列感知机——咱们称做第一层感知机,经过权衡输入用来作三个很简单的决定。那么第二层的感知机是干什么的呢?这些感知机每个都经过权衡第一层输出的结果做为输入而作决定。这样以来第二层的感知机能够比第一层作出更加复杂和抽象的决策。更复杂的决策能够在第三层作出。经过这种方式,一个第一层的感知机网络能够进行十分复杂的决策。

顺便说一下,咱们定义的一个感知机都只有一个输出,上图的多层感知机看起来一个感知机有不少个输出,其实它只是把同一个输出传递给不一样的下一层感知机用来利用,若是不嫌难看,你也能够先画一条输出线,而后再分支。

让咱们简化一下感知机的描述方式,首先咱们可使用向量点积的方式代替jwjxj∑jwjxj,其中b被称为感知机的误差。经过误差代替阈值,综上,感知机规则改写为:
这里写图片描述

你能够把误差b看做衡量感知机输出1的难易程度。从生物学的角度来说,误差衡量一个感知机是否容易激活。若是误差b是个很大的实数,那么该感知机就很容易输出1。显然,目前引入误差让咱们对感知机的描述只是产生了很小的改变,后面咱们将会看到它致使的进一步简化。后文咱们将再也不使用阈值而是使用误差。

前面已经说过感知机是一个权衡输入作决定的方法。感知机的另外一种使用方法是计算咱们一般认为是底层计算的基本逻辑函数,如AND、OR和NAND。好比,假设咱们有一个感知机有两个输入,每个的权重都是-2,误差是3,下图是该感知机模型:
这里写图片描述

而后咱们看到输入值为[0,0]的话,感知机输出值就为1,由于(2)0+(2)0+3=3(−2)∗0+(−2)∗0+3=3是正数。这里使用*表示乘法是显而易见的。一样不管输入[0,1]仍是[1,0],最后产生的结果都是1,可是当输入[1,1]的时候产生的结果是0,由于计算出来的表达式为-1。其实咱们的感知机在这里实现了一个NAND功能。

该例子说明了感知机能够用来计算简单的逻辑函数。事实上,咱们可使用感知机网络计算任何逻辑函数。由于任何逻辑计算均可以经过NAND组合而产生。好比,咱们可使用NAND门来构建一个含有两位的电路x1x2x1和x2
这里写图片描述

为了获得等价的感知机网络,咱们将全部的NAND门替换为拥有两个输入,输入权重均为-2,误差全为3的感知机。下图是所得的网络。
这里写图片描述

须要注意的时,最左侧的感知机的输出被最下方的感知机做为输入使用了两次。前面的感知机模型的定义中并无说是否容许一个输出被同一个感知机使用屡次。事实上这并不重要。若是咱们不想容许这种状况存在,咱们能够简单的将两天直线合并,用一根权重为-4的线代替这两根权重为-2的线。而后上述感知机网络变为下面这个等价的网络,其中没有标记的输入权重还是-2:
这里写图片描述

到目前为止,我都是把像x1,x2x1,x2这样的输入看成变量画在了网络的左侧,事实上,一般咱们会画一个额外的感知机——输入层,对输入进行编码:
这里写图片描述

能够看到输入感知器有输出但没有输入.
这里写图片描述
但它实际上并非一个没有输入的感知机。若是咱们确实有一个没有输入的感知机,那么jwjxj∑jwjxj

上述的例子论证了一个感知机网络能够用来模拟许多包含了NAND门的电路。由于NAND门是通用的计算方法,所以感知机也通用于计算。

感知机的计算广泛性既让人欣慰,又让人失望。安心是由于感知机网络能够和其余任意的计算设备相媲美,失望是由于它看起来仅仅像是一种新型的逻辑门,而不是什么NB的技术。

然而事实上并非这这样的,事实证实咱们能够设计出可以自动调节人工神经元网络参数和误差的学习算法。这种调参是对外部刺激的相应,不须要程序员的干预。这些学习算法使咱们可以以一种与传统的逻辑门大相径庭的方式使用人工神经元。它并非明确的列出门电路,咱们的神经网络能够简单的学习解决问题,有些问题是很难经过设计传统电路就能解决的。

  • Sigmoid神经元

  • 学习算法看起来很是好。可是咱们如何才能为神经网络设计一个这样的算法呢?假设咱们有一个感知器网络,咱们想让它学习着去解决一些问题。举个例子,网络的输入多是手写数字的原始扫描像素数据。咱们想让这个网络学习出一个能够识别出对应数字的参数和误差。为了了解如何学习,假设咱们对网络中的权重和误差作了一些小的改变。咱们想要这个小的权重的改变形成一点网络中对应的输出的改变,这个特性让学习变得可能。下图是咱们想要的(这个网络太简单不能作手写数字的识别):
    这里写图片描述

    若是对权重和误差一个晓得调节能够形成输出的很小的变化,而后咱们就能够根据这个事实修改权重和误差,使得咱们的网络以咱们想要的方式作得更多。举个例子,假设这个网络老是把9分类为8,咱们能够想办法对网络的权重和误差作一些小的改变,使得网络能够将图片分为9。而后咱们重复这样作,一次又一次改变权重和误差,使得输出愈来愈好,网络就获得了学习。

    问题是当你的网络包含感知机时不会发生这种状况。事实上,任何一个感知机上发生一点小的改变有时可能致使感知机的结果翻转(要么翻转要么不变),由0变为1或者相反。这样的翻转可能形成形成一系列连锁反应,形成其余全部感知机的复杂变化。也就是当你可能调节到数字9能够被很好的识别时,网络在其余图像上的行为已经变得彻底难以控制。这使得咱们经过一点点调试参数和误差让网络更接近指望的行为变得艰难。或许有一些巧妙得方法来解决这个问题,可是如何使用一个感知机网络学习并非那么容易的事情。

    咱们能够经过一种新的人造神经元来解决上述问题——sigmoid神经元。Sigmoid神经元和感知机很类似,可是它却能够实现当对权重和误差作微小的改变时,输出量的改变也是微小的。这将使得sigmoid神经元网络能够学习成为了可能。

    下面开始描述sigmoid神经元。咱们将像描述感知机那样描述sigmoid神经元:
    这里写图片描述

    和感知机同样,sigmoid函数也拥有输入向量,可是它的输入向量再也不仅限于0和1,而是0到1之间的连续值。好比,0.1314能够做为sigmoid神经元的输入值。一样,sigmoid神经元对每一个输入都有分配权重和一个总的误差。可是输出也再也不是0和1,而是σ(wx)+bσ(w⋅x)+b被称为sigmoid函数,定义为:
    这里写图片描述

    一个拥有输入x1,x2...x1,x2...误差b的sigmoid神经元的输出为:
    这里写图片描述

    这个式子咋一看比感知机的公式复杂不少,事实上,它和感知机很类似。为了体现和感知机的类似性,假设z=wx+bz=w⋅x+b的值不大不小的时候,sigmoid的输出才和感知机不同。

    对于σσ所造成的函数图形:
    这里写图片描述

    该函数图形是阶跃函数的平滑处理以后的样子。
    这里写图片描述

    若是σσ的平滑功能比它具体的代数表达式要重要得多。有了平滑处理,才使得咱们在稍微改变权重或者误差的时候,神经元的输出值才会有些许改变,而不是要么不变要么翻转。事实上,微积分告诉咱们输出值得改变量能够近似表达为:
    这里写图片描述

    其中求和是对于全部的权重而言, output/wj∂output/∂wj的线性函数。这样的线性关系使得在改变微小的权重和误差时能够的到指望的输出的微小改变成为一件容易的事情。虽然sigmoid神经元和感知机在行为上有不少类似之处,可是他能够很轻松的知道如何微小的改变权重和误差使得输出改变。

    若是σσ函数是最多见的激活函数。

    咱们应该如何解释sigmoid神经元的输出呢?显然,感知机和sigmoid神经元之间最大的不一样在于,sigmoid输出的值不止0和1.他们能够输出0到1之间的全部实数。这将会是颇有用的,好比:若是咱们想要使用输出值表示输入到一个神经网络的像素图像的平均强度。但有时候这也是很烦人的一件事。假设咱们想要从网络中得到输出值来表示是否“图像表示的是9”或者“图像表示的不是9”,显然,感知机的输出0和1会更加清楚。可是在实际使用的时候,咱们会创建一个共识来解决这个问题,好比输出的值大于0.5咱们认为它是9,反之不是9.

  • 神经网络的架构

  • 在下一节我将介绍一个能够很好识别手写数字的神经网络。在此以前,先解释一下网络中的各部分的专业术语。假设咱们有一个网络:
    这里写图片描述

    正如前面提到的,最左边的一层称为输入层,位于这一层的神经元称为输入神经元。最右边的输出层包含了输出神经元,本例只有一个输出神经元。中间的层被称为隐藏层,由于这些神经元既不是输出也不是输入。隐藏层听起来很神秘,我第一次听到这个词的时候,我以为它必定有深入的哲学或数学意义。可是他真的其实就只意味着既不是输入也不是输出而已。上图的神经网络中只包含了一个隐藏层,可是有些网络有许多隐藏层,好比下图的四层网络结构,含有两个隐藏层:
    这里写图片描述

    由于历史的缘由,这样的多层网络有时候被称做多层感知机(MLPs),尽管这个网络是有sigmoid组成的而不是感知机。本文不会使用MLP这个术语,可是你应该知道它的存在。

    网络中的输入和输出层通常都被设计的很简单。好比:假设咱们试图识别一幅图像是不是9,一个天然的方法就是将该图片的灰度值编码做为神经元的输入。若是这个图片是64X64的灰度图,那么咱们的输入神经元就有64X64=4096个输入神经元,它的值随着灰度在0到1里适当的变化。输出神经元只有一个,输出的值小于0.5表示这个数字不是9,反之就是9.

    虽然输入输出层的设计很简单,可是隐藏层的设计倒是门艺术。咱们不可能经过一些简单的经验法则来总结隐藏层的设计过程。相反,神经网络的研究人员已经开发了隐藏层的许多的最优设计规则,这能够帮助人们从他们的网络中的到预期的行为。好比,这种启发式能够帮助人们决定如何权衡网络的隐藏层数和训练网络所需的时间。咱们将在后面见到几种这样的最优设计规则。

    到目前为止,咱们所讨论的神经网络都是上一层的输出做为下一层的输入。这样的网络被称为前馈神经网络(FeedforwardNerralNetworksFeedforwardNerralNetworks的输入依赖于其输出,这很难理解,因此咱们不容许这样的循环。

    然而,有些人造神经网络中存在反馈回路是可能的。这样的模型称为递归神经网络。这些模型的思想是让神经元在有限时间里激活,而后保持非激活状态。这种激活能够刺激其余神经元在稍后一段时间激活。这会致使许神经元激活,随着时间推移,咱们将得到一串激活神经元。在这样的模型中,循环不会引发问题,由于一个神经元的输出只会在稍后的时间影响它的输入,而不是立刻就影响。

    递归神经网络的影响力比前馈神经网络的小,一部分缘由是到目前为止,递归网络的学习算法不那么强大。可是递归网络仍然颇有研究意义。比起前馈网络,它更接近咱们大脑的思惟方式。递归网络可能解决一些前馈网络很难解决的问题。本书目前只专一于更普遍使用的前馈网络。



    更多案例请关注“思享会Club”公众号或者关注思享会博客:http://gkhelp.cn/ ![在这里插入图片描述](https://img-blog.csdnimg.cn/20181207165621837.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3NoYW5saXBlbmc5OTg=,size_16,color_FFFFFF,t_70)