译者:本文为转载翻译自免费英文电子书《Neural Networks and Deep Learning》,将逐步翻译成中文,原文连接:http://neuralnetworksanddeeplearning.com/chap1.htmlhtml
因为本章节很长,编辑器很卡,翻译时我会分红几个小节,这是第一小节。程序员
人类的视觉系统是很神奇的。考虑一下下面几个手写的数字:面试
大多数人一眼就认出这些数字是504192。在人的每一个大脑半球,人类有一个主要的视觉皮质,被称为 V1,包含 1.4亿个神经元, 有几百亿的神经链接。人类的视觉系统不单只涉及V1,并且涉及到一整个视觉皮质 - V2, V3, V4, 和 V5 - 它们一步步处理着复杂的图像。咱们大脑是一个超级计算机,通过几十亿年的演变,逐渐适应这个可视化的世界。识别手写数字不是那么容易的。相反地,人类的处理能力是惊人的,人类善于使咱们理解看到的东西。几乎全部工做都是无心识地进行。咱们一般不会佩服本身的视觉系统怎样解决怎么困难的问题。视觉模式识别的困难性显而易见,若是你尝试写一个程序来识别相似下面数字。看起来简单的东西实现起来很是困难。简单直观的例子是咱们怎么识别形状。 - "数字 9 头顶上有一个圈,右下方是一竖" - 用算法来表达不是那么容易的。当你尝试让这些规则变得很精确,你很快就会在异常、警告和例外的困境中蒙圈。它看起来毫无解决的但愿。算法
神经网络以不一样的方式解决这个问题。思路是拿大量的手写数字来做为训练样本,小程序
而后演化为一个能够从样本中学习的系统,从另外的角度来说,神经网络使用样原本自动推理手写识别的规则。进一步,经过增长训练样本,网络能够学习更多手写文字,改善它识别的准确度。我只是在上面展现了100个用于训练的数字,也许咱们能够经过使用几千、几百万、几十亿的训练样原本建一个更好的手写识别器。网络
在这一节,咱们会写一个程序来实现一个学习手写数字的神经网络。这个程序只有74行代码,而且没有用到第三方的神经网络库。但这个小程序的识别精度能够达到96%,并且是在没有人的介入的状况下达到的。而后进一步,在接下来的章节中,咱们会改进,使程序的精度达到99%。事实上,最好的商业应用神经网络能够应用在银行的帐单处理中,以及邮局的地址识别。架构
咱们专一于讲解手写识别,由于这是一个学习神经网络的很是棒的原型。手写识别做为学习例子有个好处:有挑战性 - 识别手写数字是一个不小的本领 - 但不须要很是复杂的解决方案,也不须要海量计算那么困难。进一步讲,这是一个发展高级计算,例如深度学习的很好的途径。这这本书的整个过程,咱们会重复地提到手写识别的问题。这本书的后面,咱们会讨论怎样将这些思想应用到计算机视觉方面,人机对话和天然语言处理,以及其余领域。 编辑器
固然,若是这节的关键在于写一个程序来识别手写数字,那么这节内容会短不少。但在此期间,咱们会引出不少关键的神经网络思想,包括两种重要的人工神经网络 (感知网络和 sigmoid 神经网络),以及标准的神经网络学习算法,例如梯度降低算法。在此期间,我会集中讲解为何神经网络的原理,让你从直观上认识神经网络。 我不止给你简单展现基本的机制,我须要啰嗦一大段。啰嗦是值得的,但愿你会理解更加深入。 从这章节,你能够理解什么是深度学习,为何它那么重要。函数
什么是神经网络?为了开始,我会解释一种叫感知网络的神经网络。感知网络在1950到1960左右被科学家 Frank Rosenblatt提出,它受到 Warren McCulloch 和 Walter Pitts早期研究成果的启发。 今天,这种网络以及被其它种类的神经网络代替了 - 在这本书中,更加先进的主流使用的神经网络是sigmoid 神经网络。 咱们很快就介绍到它了。但为了明白为何会出现 sigmoid 网络,首先要明白什么是感知网络。工具
那么感知网络是怎样工做的呢? 感知网络有一个或以上的输入 x1,x2,…之有一个二进制输出:
在下面的例子,展现了感知网络有三个输入, x1,x2,x3。一般可能少于或者多于三个输入。 Rosenblatt 提出一个简单地规则来计算输出值。他引入了权重, w1,w2,…用一个真实的数值表达各个输入到输出的重要性。神经元的输出 0 或者 1,取决因而否的权重的和∑jwjxj小于或者大于阈值。就像权重,阈值也是一个数值,它是神经元的一个参数之一。用更加精确的算法术语来表达:
输出=0 若是≤ 阈值
这就是感知网络的工做原理!
这是基本的数学模型。你能够这样理解感知网络,它是一个经过衡量各类因素的重要程度来做决定的设备。 我举个例子,不是很现实的例子,但人容易明白,稍后咱们会了解到更加现实的例子。假如周末要来了,你据说你所在将举办一个奶酪节 。你很喜欢奶酪,你纠结是否要去这个奶酪节看看。你可能会衡量三个因素来决定是否要去:
咱们能够经过三个二进制变量来呈现这三个因素 x1,x2, and x3。举例, x1=1 若是天气晴朗, x1=0 表示天气很糟糕。 相似地 x2=1 表示你的男/女友想陪你去,x2=0 表示不陪你去。 x3x3 表示公共交通情况以此类推。
如今,假如你很是喜欢奶酪, 你固然乐于去奶酪节现场,即便你男/女友对此不感兴趣,或者交通不是特别方便。但可能你很是讨厌下雨天,若是下雨的话你对什么节之类丧失兴趣。你能够用感知网络来做这种决策的建模。其中的一个建模方法是选择一个圈子 w1=6 w1=6用来表明天气的权重, w2=2和 w3=2表明其它条件的权重。最大的权重w1代表天气对你的决定影响很大。它比朋友和交通状况都要重要。最后,假如你选择了一个阈值5。这样感知网络的决策模型的建模就完成了。输出1,当天气好,当天气坏输出0。 无聊朋友是否陪伴仍是交通情况都没法影响你最后的决定。
经过不一样的权重和阈值,咱们能够获得不一样的决策模型。例如,假如你的阈值选了3。那么感知网络会认为你应该去,不管天气状况、交通情况、是否有朋友陪伴。换言之,这变成了另一个决策模型了。减小阈值意味着你更想去奶酪节。
显然,感知网络不是人类完整的决策模型。但至少证实了感知网络能够经过设置不一样条件的权重来作决策。并且它看起来能够经过复杂的网络来做出稳定的决策:
(2016-03-24待续)在这个网络,第一列 - 这里咱们称为第一层 - 经过衡量输入条件的权重来做出三个简单的决策。第二层是什么表示什么呢?每个感知器都是经过衡量第一层做出的决定来做出一个新的决策。在这种状况,第二层网络能够做出比较复杂,比第一层更加抽象的决策,在第三层网络能够做出更加复杂的判断。这样看来,有多层网络的感知机能够做出很复杂决策。
很意外,当我定义感知网络的时候,我说过感知网络只有一个输出。在上面的感知网络看起来好像有不少个输出。事实上,它们依然只有一个输出。多个输出都指向下一个网络做为下一个网络的输入。 画一条想而后分开两条并不难。
咱们简化地描述感知器。 ∑jwjxj>阈值这个条件显得很累赘,咱们用两个符号变换来简化它。第一个变换是将∑jwjxj用点来表示, w⋅x≡∑jwjxj,w 和x是一个向量,分别表示权重和输入值。第二个变换是将阈值移动到不等式的另外一边。用偏移量来代替表示阈值 b≡−threshold。 这样感知器就能够表示为:
你能够将偏移量当作感知器输出1的容易程度。或者用生物学的角度来讲,是激活感知器的的容易程度。偏移量越大,越容易输出1,反之很难输出1。(2016-3-25待续)明显,引入了偏移量对于描述感知器是一个很小的变化,但咱们会在后面看到这会致使进一步的符号简化。由于这个,这篇文字的余下内容咱们再也不使用阈值这个概念,取代之的是偏移量。
我将感知器描述为衡量各类因素来作决策的一种方法。感知器也能够用于计算基本的逻辑函数例如 与门AND
, 或门 OR
, 和 与非门NAND。例如,假如你有一个感知器有两个输入的,每个输入的权重都是-2,偏移量为
3。像下面这样:
咱们能够看到输入0和0时输出1,由于(−2)∗0+(−2)∗0+3=3 输出值为正数。相似的计算输入0和1 输出1,可是输入1和1的时候会输出0,由于 (−2)∗1+(−2)∗1+3=−1 是负数。这样的话感知器就能够实现与非门了!
与非门 NAND的例子代表咱们可使用感知器来计算简单的逻辑功能。事实上,咱们可使用感知器的网络来计算任何的逻辑函数。由于非门在计算机领域是通用的,也就是说咱们可使用非门来实现任意计算。例如咱们可使用非门来创建一个用于两个位相加的回路,x1和x2。这须要计算按位相加
x1⊕x2,当x1 和 x2都为1 移位运算后值为1:
为了获得一个等效于非门逻辑的两个输入的感知器,咱们将两个输入的权重都设为-2,偏移量设为3。以下图所示:
这个感知器要注意的是输出从最左边的感知器被使用了两次做为输入到最底部的感知器。当我定义一个感知器模型,我不会说是否两个输入指向同一个地方的作法是否正确。事实上,没有关系。若是咱们不想容许这种作法,那么你简单的合并这两天线就好了,这样就变成了一个权重为-4的链接了,而不是两个各有-2权重的链接。(若是你看不明白,你应该先停一下,慢慢推理证明一下这二者是否等效) 通过这样的变化以后,网络就看起来以下图所示了, 所有都有没有标出的权重 -2,因此偏移量等于3,其中一个的权重是-4, 标记出来是这样的:
到如今为止,我已经在网络的左边出了输入如x1和x2做为变量。事实上,按照惯例咱们会画出一个额外的感知器的层 - 输入层 - 用来编码这些输入:
这个符号用来表示输入感知器,只有输出没有输入,
这是一个简写。并不真正意味着感知器没有输入。为了看到这个,假如咱们有一个没有输入的感知器。那么权重加起来∑jwjxj 会老是0,若是 b>0感知器会输出1 ,若是 b≤0输出0。感知器会简单地输出一个固定的值,不是想要的值 (x1,在下面的例子中)。 你把输入感知器看错不是真的感知器比较好,但至关特殊的单元,被简单地定义输出想要的值 x1,x2,…。
加法器的例子证实了一个感知器怎样用于模拟一个包含不少个与非门的电路。由于与非门 NAND
对于计算是通用的,因此能够说感知器对计算也是通用的。
感知器的计算通用性同时使人安慰和失望。使人安慰是由于它告诉咱们感知器网络能够和其它计算设备那么强大。但使人失望的是,由于它看起来仅仅是一种新的与非门。这几乎不上什么大新闻!
然而,状况比看起来要好。结果是咱们能够设计出能够自动调整神经网络权重和偏移量的学习算法。这种调整发生在响应外界的刺激时,没有程序员的直接介入。这个学习算法可让咱们经过一种彻底不一样与传统逻辑门的方式来使用神经网络。而不是明确的与非门和其它逻辑门的电路层,咱们的神经网络能够简单的学会解决问题,特别是对于那些直接设计传统电路很难解决的难题。
学习算法听起来很了不得。可是咱们怎样给神经网络设计出这样算法呢?假如咱们有一个想用来学习解决问题的感知器神经网络。 例如,网络的输入多是来自扫描机或者手写数字的图片像素数据。咱们想让网络学习权重和偏移量,网络的输出能够正确的分类这些数字。为了能看见学习是怎样开展的,咱们假设在权重(或者偏移量)上面做一个小的改动,这个小的改动会相应的引发输出的一个变化。咱们一会以后就能够看到,这个特性会让学习成为可能。下图就是咱们想要的 (明显这个网络对于手写识别过于简单):
若是这是真的,一个权重或者偏移量的值得一个小的变化只会引发输出的一个小的变化,那么咱们能够用这个机制类改变权重和偏移量让升级网络以咱们想的方式来表现。例如,假如网络错误地将数字9识别为8。咱们能够计算出怎样改变权重和偏移量,让网络的识别结果偏向的正确的9。而后咱们会重复这样调整,改变权重和偏移量,让输出原来越正确。这样的话,网络就有学习的能力了。
问题是感知器不能实现这种微调的的效果。事实上,权重或者偏移量的一个微小的变化有时候会致使输出结果意想不到的改变,该输出0的输出了1,改输出1的输出了0。当你调整网络的权重或者偏移量使数字图片 "9" 能正确的被分类,其它图片的分类可能所以被打乱了。这使咱们很难经过微调权重和偏移量来让网络接近咱们想要的结果。也许会有一些聪明的方法来避免这个问题。
咱们能够经过引入一种叫作S型神经元的新的人工神经元来解决这个问题。S型神经元相似于感知器,可是通过了改造,从而可以使得权重和偏移量的小的变化会对输出产生小的影响。这个关键的特性使得是S型神经元具备学习能力。
好,让我妈描述一下S型神经元。 咱们会已面试感知器的形式类描述S型神经元:
就像感知器,S型神经元能够有多个输入 x1,x2,…。可是输入不仅是0或者1,而是0到1之间的任意值。例如 0.638…是S型神经元的有效的输入。就像感知器,S型神经元每一个输入都有对应的权重 w1,w2,…,和全局的偏移量b。输出也不仅是0或者1,而是 σ(w⋅x+b),σ 被称为 sigmoid 函数。顺便说一下 σ 有时又被称为 逻辑函数,这种新的神经元叫逻辑神经元。记住这个术语是颇有用的,由于这个术语在神经网络界常常被用到。咱们会继续介绍sigmoid ,它被定义为
为了更加清晰,它的输入x1,x2,…,权重 w1,w2,…以及偏移量b表示以下:
一眼看去,它和感知器有很大的不一样。这个代数公司看起来晦涩难懂,除非你很熟悉它。事实上,它和感知器有不少相似的地方。
为了明白它和感知器的类似性,假如 z≡w⋅x+b是一个很大的正数。 e−z≈0, 那么σ(z)≈1。换言之,当 z=w⋅x+b是一个很大的正数,那么S型神经元输出接近1,就像感知器那样。假如z=w⋅x+b是一个很小的复数。那么 e−z→∞,那么 σ(z)≈0。感知器也有相似的特性。只有当w⋅x+b 是最合适的大小时才会有最大的偏离来自于感知器模型。
代数式σ是什么鬼?怎样理解它?事实上,σ 的准确形式并不重要 - 重要的是它的曲线图。这就是它的曲线图形状:
这个形式就是阶梯函数平滑一点的版本:
若是σ 是一个阶梯函数,那么S型神经元就变成了一个感知器,由于输出只能是1或者0,这取决因而否 w⋅x+b为正或者负数。事实上当w⋅x+b=0 感知器输入为0,而阶梯函数则输出1。严格来讲,咱们须要改造一下阶梯函数。但你明白这种思想。经过使用真实的σ函数,上面提到的那个,一个平滑的感知器。事实上, σ函数的平滑性是决定性的,不是公式的细节自己。σ的平滑性意味着细微的权重变化Δwj和偏移量变化Δb会引发神经元的一个很小的输出变化 Δoutput。事实上微积分告诉咱们
总和是全局的权重wj, ∂output/∂wj和 ∂output/∂b各自贡献输出值的一部分导数。不要惊慌若是你不适应部分导数,上面的表达式看似复杂,全都是部分导数,它事实上是表示了一些很简单的东西(好消息):Δoutput 是权重变化Δwj和偏移量变化Δb的一个线性函数。 线性特质使得权重和偏移量的小变化能够达到想要的输出的微小变化。所以S型神经元和感知器在性质上类似的,它们更容易算出怎样经过改变权重和偏移量来改变输出值。
若是σ 的曲线图真的很重要而不是公式,那么为何使用使用这个特定的公式呢?事实上,在本书的后面,咱们会提一下输出为f(w⋅x+b) 的其它激活函数的神经元。使用其它激活函数的不一样点是部分导数的特别地值 在等式(5)改变。 在任何状况下, σ在神经网络领域是通用的,它是咱们这本书中最常使用的激活函数。
咱们应该怎么诠释S型神经元的输出呢?明显,一个很大不一样是S型神经元不仅是输出0或者1。它们能够输出0到1之间的任意小数值例如0.173… ,0.689…等是合法的输出。这个颇有用,例如,若是咱们想使用输出值来表明输入图片的平均像素的灰度。 但有时可能会很烦人。假如咱们想表示"输入图片是9" 或者 "输入图片不是9"。明显在感知器中很容易用输出是0或者1来表示。但实践中,咱们能够指定规矩来处理,例如,经过决定解释任何输出至少为0.5就表示识别为"9",任意小于0.5的输出表示这个图片不是 9。我会老是明确地表述当咱们使用这样的规定,所以不会致使混淆。
在下一节我会介绍一个能够很好地分类手写数字的神经网络。做为预热,咱们先熟悉一些术语。假如咱们有一个网络:
如早些提到的,最左边的叫输入层,其中的神经元叫输入神经元。最右边的输出层包含的是输出神经元。在上图中只有一个输出神经元。两层之间的叫隐藏层, - 我第一次听到这个名词是我我想确定会有深层的哲学或者数学意思 - 但真的没有什么特别意思,还不如说这是“非输入非输出层”。上图的网络只有一个隐藏层,但某些网络可能有不少个隐藏层。例如,下面的四层网络有两个隐藏层:
可能会让人迷惑的是,基于历史的缘由,一些多层网络有时候被称为多层神经元MLP。 无论是否有sigmoid神经元或者感知器组成, 我不会继续使用MLP这个术语了。我认为他让人搞不懂,但我提醒你一下,有这么一个名词。
输入输出层的设计一般是很直观的。例如,假如咱们尝试判断手写数字图片是不是9.一个很天然的方法是实际一个网络将图片的像素的颜色长度转换为数字输入神经网络。若是图片是 64X64的灰度图片,那么咱们就有 4,096=64×64个输入神经元,灰度数字在0 和1之间。输出层只有一个神经元,输出小于0.5则表示这个图片不是9,反之这个图片就是9。
咱们也能够颇有技巧地设计一个隐藏层。尤为,将隐藏层处理结果用简单的规则加起来的比较困难的。神经网络研究者已经发明了不少设计探索法设计隐藏层,帮助人们设计出能得到想要的输出结果的网络。这些方法能够用来帮助决定怎样权衡隐藏层的数量和时间需求。咱们会在后面介绍几个这样的方法。
迄今为止,咱们邮件讨论输出用于下一层输入的神经网络。这样的网络叫作前馈网络。这意味着网络中没有循环 - 信息老是向前传递,不会往回传递。若是咱们有了循环,咱们就打破σ函数依赖于输出这个情形。这样很没意义,咱们不容许这样的循环。
然而,有不少神经网络模型能够有反馈的循环。这些模型称为递归神经网络。这些模型的思想是让神经元在某个时间段内激活,而后转为非激活状态。激活能够模拟其它迟点激活的神经元。这样致使了级联式的神经元激活。在这个模型中循环不会有问题,由于输出只会在一段时间后影响输入,不是马上。
递归神经网络比前馈网络的影响力小,某方面缘由是递归神经网络的算法(至少到如今)还没显现出巨大威力。但他仍然很是有意思。由于它们比前馈网络更接近大脑的工做原理。并且它可能能够解决对于前馈网络很难解决的问题。然而,基于文本章节限制,咱们暂时不讨论这个,咱们集中讨论普遍应用的前馈网络。
继续阅读第一章的第二小节: http://www.cnblogs.com/pathrough/p/5322736.html