Neural Networks and Deep Learning之中文翻译-第一章 用神经网络识别手写数字

本章原文地址:http://neuralnetworksanddeeplearning.com/chap1.html
人类的视觉系统是这世界上一大奇迹,看一下下面的一串手写数字:

手写数字

大部分人能毫不费力的识别出来是504192,事实上实现这个并不是表面上看起来得那么容易。在我们大脑任何一个半球都有一个基础视觉皮层,这个也被称为V1,它包含了1亿4千个神经元,它们之间有上百亿的连接。然而与人类视觉相关的还不仅仅只有V1区,还包括一系列视觉皮层区——V2,V3,V4和V5,它们逐步进行更复杂的图像处理。我们把我们的大脑比喻成一个超级计算机,经过数亿年的演化调整从而能很好的理解视觉世界。识别手写数字不容易,但是我们却能惊人地理解展现在我们眼前的东西。但是几乎所有的工作都是在无意识下完成的,以致我们通常无法体会我们视觉系统处理一个问题是多么的复杂困难。如果你尝试写一段计算机程序去识别上面的数字,视觉模式识别的困难就显现出来了。一件看起来容易的事,当我们自己来做的时候突然就变得极其困难了。我们识别形状的简单直觉是数字9在顶上有一个圈右下方是一条直线,但是要在算法上把这个表现出来就不那么容易了。当我们试着把识别规则描述的更精准时,会很快陷⼊各种混乱的异常或者特殊情形的困境中,令人绝望。
神经网络用一种不同的方式来解决这一问题,这种方法是采用大量手写数字作为训练样本。
这里写图片描述

然后开发一套系统来学习这些训练样本。也就是说神经网络从训练样本自动推导出识别这些手写数字的规则。并且通过增加训练样本的数量,网络可以学到更多,识别准确度也会提高。所以我在上面只展示了100个训练数字,如果使用数千甚至数百万、数十亿的训练样本我们可以建立个更好的手写数字识别器。在这一章我们会写一个电脑程序运用神经网络去学习识别手写数字。程序只有74行的长度,没有使用任何神经网络库,但是这个简短的程序在无人工干预下识别数字准确度可超过96%。而且在之后的章节我们会学到一方法可以使它识别精确度达到99%。事实上一些好的商业神经网络是如此优秀以至于被银行用来处理支票,邮局用它来识别地址。
我们集中注意力在手写识别上,因为它是一个极好的学习神经⽹络的原型问题,作为一个原型问题关键的一点是:挑战性-识别手写数字并不是一件简单的事-但也不会难到需要超级复杂的解决方法或超大规模的计算资源。并且它也是切入到更先进技术如深度学习一种很好的方式。所以在本书中会不断回到手写识别这个问题上来。之后我们会讨论如何将这一技术应用解决其它计算机视觉问题,当然也包括语音,自然语言处理等领域。
当然如本章只是写一个电脑程序去识别手写数字,那么这章节将会短得多!但是我们将以此引出许多有关神经网络的核心思想,包括两个两类重要的人造神经元(感知器与S型神经元)和被称作随机梯度下降的标准神经网络学习算法。我会集中讲解之所以这么做的原因以帮助你建立对神经网络的直观感觉。相比只单单介绍基本原理,这里会展开更长的讨论。但这都是值得的,这会让你理解得更深。到本章的最后我们会明白什么是深度学习以及为什么它那么重要。

感知机

什么是神经网络?作为开始,我会介绍一种被称为感知机的人造神经元。感知机是在20世纪五六十年代由科学家Frank Rosenblatt提出的,其灵感来自于Warren McCullochWalter Pitts的早期作品,今天普遍使用的是其他的神经元模型-在本书和许多有关现代神经网络著作中主要的使用神经元模型是一种叫S型神经元的模型。我们很快会讲到S型神经元,但是为了理解S型神经元为什么被这样定义,很值得先花些时间去了解感知机。
感知机是如何工作的呢?一个感知机接收多个二进制值x1,x2,…作为输入,然后产生一个二进制值输出:

这里写图片描述

在上面的例子中展示了一个感知机有三个输入:x1,x2,x3,通常它可以有更多或更少的输入。 Rosenblatt 提出了一个很简单的规则来计算输出,他引进了实数的权重值w1,w2,…用来代表各输入对于输出的重要性,输出0或1取决于各分配权重之和 jωjxj 是大于还是小于某个阈值。跟权重值一样,阈值是一个实数,也是神经元的一个参数。用更精确的代数形式来表示:
output={0,1,if jωjxjthreshould if jωjxj>threshould

这就是感知机工作的方式。
这就是基本的数学模型。你可以这样理解,感知机是一种通过权衡各种依据来做判断的机器。举个例子,这个例子可能并不实际但是很容易去理解,之后我也会举一些更现实的例子。假设快到周末了,你得知在你所在的城市将会举办一个奶酪节,你很喜欢奶酪于是决定是否去参加这个节日。你可能需要权衡三个因素来做决定:
1、天气是否好?
2、你男朋友或女朋友是否会陪你去?
3、是否靠近公共交通站点?(假设你没有车)
我们可以用3个二进制变量 x1 , x2 x3 来表示这三个因素,比如我们用 x1 =1来表示天气好, x1 =0来表示天气不好。与此类似 x2 =1 表示你男朋友或女朋友会陪你去, x2 =0 表示不会。同样 x3 来代表公共交通情况。
现在假设你极其喜欢奶酪,所以即使你的男朋友或女朋友没有兴趣参加或者交通不方便的情况下你还是愿意去参加这个节日,但是你非常讨厌坏天气,如果天气不好你绝对不会去。你可以用感知机去模拟这种决策。一种方法是选好一个 w1 =6作为天气的权重, w2 =2、 w3 =2分别作为另外两个的因素的权重。 w1 有更大的值表示天气是否好相比你男朋友和女朋友的陪伴或交通是否便利对你来说更重要。最后假设选择5作为感知机的阈值。有了这些选择,感知机实现了想要的决策模型。当天气好的时候总是输出1,而当天气不好的时候总是输出0。至于你男朋友或女朋友是否想去或公共交通是否便利对输出不会产生什么影响。
通过采用不同的权重值和阈值,我们可以得到不同的决策模型。例如,假如我们把阈值换成3,那么这个感知机做出去奶酪节的决策条件是天气很好( jωjxj 必定大于6)或者在你男朋友或女朋友可以陪你去并且交通也比较便利的情况下( jωjxj 必定大于4),换句话说这就是一个与之前的模型不同的决策模型。降低阈值表示你更愿意去参加这个节日。
显然上面的感知机并不是一个完整的人类决策模型!但是这例子展示了一个感知机是如何通过权衡各种因素来做决定。那么可以相信一个由感知机组成的更复杂的网络可以做出更精细的决定。
这里写图片描述

在这个网络中,第一列的感知机,我们又称之为第一层感知机通过权衡输入做出3个简单决策。那么第二层的感知机是怎样的呢?这一层的感知机通过权衡第一层的决策结果来做决策,那么这一层的感知机相比第一层的感知机,可以在更复杂更抽象的层面作出决策。那么第三层的感知机可以做出更加复杂的决策。通过这种方式一个多层感知机网络可以用于做复杂精细的决策。
附带说一下,在我定义感知机的时候说过一个感知机只会有一个输出,但是在上面的网络图中一个感知机似乎有多个输出。事实上,它仍然还是只有一个输出。多个表示输出的箭头只是为了更方便表示一个感知机的输出会被用作其它多个感知机的输入。相比画一根分叉的线这样显得更讨巧一些。
我们再简化一下对感知机的描述。条件 jwjxj>threshold 有点累赘,我们可以用两个数学记号变化来简化它,第一变化是把 jwjxj 表示为一个点积形式, wxjwjxj 这里的 w x 分别表示代表权重与输入的向量。另一个变化是把阈值移到等式的另一边,并用感知机的偏置 bthreshould 来代替。那么感知机的规则可以写成下面的形式:
output={01if wx+b0if wx+b>0

你可以把偏置看做是让感知机输出1的难易程度的估计。或者用生物术语来说,偏置代表一个神经元被激活的难易程度。如果一个感知机有一个很大的偏置,那么它比较容易输出1,如果偏置是一个负值那么它就很难输出1。很显然,引入偏置只是对感知机的描述做了小小的改变,但之后我们进一步对它进行符号简化。因此本书后面内容将使用偏置这一概念,而不用阈值。
上面我已经描述了感知机通过权衡各种依据来做决策,感知机另一个用法是基本的逻辑计算,这通常被认为是计算底层基础,像“与”,“或”,“与非”的计算。举个例子,假设一个感知机有两个输入,每一个输入的权重值为-2,偏置为3。表示如下:
这里写图片描述

我们可以看到输入00产生输出1,因为 (2)0+(2)0+3=3 是一个正值。这⾥我⽤符号 来显式地表⽰乘法。类似当输入01和10可以计算输出1。但是当输入11时产生输出0,因为 (2)1+(2)1=1 是负值。所以我们的感知机就变成了一个与非门!
与非门的例子表明我们可以用感知机进行简单的逻辑计算。事实上,我们可以利用感知机网络进行实现任何逻辑运算。原因是与非门是通用运算,我们可以利用与非门构建任何逻辑功能的电路。比如我们可以利用与非门去搭建一个电路,这个电路实现加运算。这就需要按位求和 x1x2 ,当 x1 x2 都为1时,还必须考虑进位为1,即进位位正好是按位乘积 x1 x2
这里写图片描述

为了得到一个等价的感知机网络,我们用有两个输入权重分别为-2偏置为3的感知机来替换与非门。得到了下面的网络。要注意的是我已经把右下的与⾮门移动了⼀点,只是为了更⽅便画箭头:
这里写图片描述

一个值得注意的点是最左边的感知机的输出被两次用作最下面感知机的输入。当我在定义感知机模型时我并没有说这种双输出到同一个地方是否可以。事实上这并不是什么大问题。如不想出现这种情况,你可以简单地把这两根线合并成一条连接,将这个权重改为-4.(如果你没有发现这一点,应该停下来自己推导一下它们是等价的)经过改变,网络会变成下面的样子,没标识出来权重值等于-2,所有的偏置值等于3,只有一个权重值为-4,如图标识所示:
这里写图片描述

现在我把 x1 , x2 输入作为变量画在网络的左边。事实上,通常是画一层额外的感知机-输入层-来对输入编码。
这里写图片描述

这是输入感知机的表示符号,它只有一个输出没有输入:
这里写图片描述

这只是一个缩影。它并不意味着一个感知机没有输入。要理解这一点,假设我们的确有个感知机没有输入,那么加权和 jwjxj 将永远是0,所当偏置值b>0时这个感知机会输出1否则输出0,这就意味着这个感知机只会输出一个固定值(上面的例子中输出 x1 )。不把输入感知机当做真正感知机理解更好,而是简单定义为输出期望值的特殊单元,x1、x2…。
加法器展示了感知机网络如何模拟一个包含许多与非门组成的逻辑电路。因为与非门在计算中的通用性,因此感知机也同样具有普遍性。
感知机的计算通用性既让人感到安心也让人觉得失望。安心的是它可以和其它计算设备一样强大,失望的是它似乎就是一种新类型的与非门。这几乎不是什么大新闻!
然而实际情况比这一观点认为的要好。事实上我们可以设计一套学习算法,它可以自动调整人工神经元网络的权重值与偏置值,这种调优是在对外部刺激的响应中发生的,并不需要程序员直接接入。这种学习算法让我们以一种完全不同于传统逻辑门的方法来使用人工神经元。与预先铺设好各种与非门及其它门电路不同,神经网络可以通过学习去解决问题,有时一些问题很难通过直接设计一个传统的电路去解决。

S型神经元

学习算法听起来非常完美,但是我们如何为神经网络设计这样的算法呢?假如我们有一个人工神经元网络,如何让他去学习解决问题。例如,输入数据是扫描仪扫描手写数字图像的原始像素数据,然后我们想网络自己去学习调整权重值与偏置值使它能够正确的识别出数字。为了明白学习是如何进行的,假设稍稍对权重值或偏置值做些改变,这样会导致网络的输出也会发生些许改变。稍后我们可以知道这个特性使自主学习成为可能。下图就是我们想要的结果(当然很显然这个网络过于简单难以去用作手写识别):

这里写图片描述

如果真的在权重值和偏置值上做很小的改变导致输出结果也只会有很小的改变,那么我们利用这一点去修改权重值与偏置值使网络可以表现得更符合我们需求。举个例子,如果网络错误地把9识别成8了,那么我们可以知道如何调整权重值与偏置值使网络更倾向于把图片识别成9。如此不断重复,不断调整权重值与偏置值使网络产生的结果越来越好,这样网络就能自我学习了。
但问题是感知机网络并不像前面说的那样,事实上网络中任何一个感知机的权重值或偏置值发生微小改变有时可能会导致它的输出完全翻转,也就是说从0变到1。这样的翻转会以一种非常复杂方式导致之后的网络表现完全不同。所以或许现在它可以正确的识别9了,但是对于其它图片的表现完全改变了,这种改变是不可控的。这样想通过逐步调整权重值与偏置值来使网络越来越接近我们想要的表现变得很困难。可能有一种更巧妙的方法来解决这个问题。但是这种学习方式可能并不直接明显。
我们可以通过一种新的叫S型神经元的人工神经来解决这个问题。S型神经元与感知机类似,但是做了一些调整使当它的权重值或偏置值发生小的改变时侯,它的输出只发生很小的改变。这是使得S型神经元网络能够学习的关键性因素。
所以让我们来描述一下什么是S型神经元。我会以描绘感知机同样的方式来描绘S型神经元,如下:
这里写图片描述

跟感知机一样,S型神经元同样有输入,x1,x2,….但是不同的是它们不只是0和1,它也可以是0到1之间的任何值。举例来说,0.638…也算是一个S型神经元的有效输入。同样类似感知机,S型神经元对每一个输入有相应权重值 w1 , w2 ,…,和一个整体的偏置值 b 。但是他的输出并不是0和1,它的输出表示为 σ(wx+b) ,这里的 σ 叫做S形函数定义如下:(注: σ 有时也被称为逻辑函数,把这种新型的神经元叫做逻辑神经元,记住这个术语很有用因为很多从事神经网络的人使用这个术语,然而在本书中我继续使用S型这个术语)。
σ(z)11+ez.(3)

写的更明白一点,把输入 x1 , x2 ,…,权重值 w1 , w2 ,…,和偏置值 b 代入可得:
11+exp(jwjxjb).(4)

第一眼看上去,S型神经元与感知机非常不同。在你不熟悉的情况下,S型函数看起来非常复杂令人生畏。事实上他跟感知机有很多相似的地方,克服障碍,你会发现S型函数的代数形式包含许多技术细节。
要理解它与感知机的相似性,先假设 z=wx+b 是一个很大的整数。那么 ez0 所以 σ(z)1 。换句话说,就是当 z=wx+b 是一个大的正数时,那么这个S型神经元的输出趋近于1,这个和感知机是一样的。再假设 z=wx+b 是一个很小的负数,那么 ez 趋近于无穷大那么 σ(z) 就趋近于0。所以当 z=wx+b 是一个很大的负数时,S型神经元的表现也同感知机类似。只有当w x+b的大小适中时才会跟感知机模型有较多偏差。
那么 σ 代数形式呢?我们该如何去理解?事实上,它的精确代数形式并不那么重要,正真重要的是这个函数图像的形状,如下:
这里写图片描述

这个形状是阶梯函数的平滑版本:
这里写图片描述

事实上如果 σ 是一个阶梯函数,那么S型神经元就是一个感知机,因为输出0或1取决于 wx+b 是负还是正。(注:当 wx+b=0 感知机会输出0,但是阶梯函数会输出1。所以严格来说针对这一点我们需要对阶梯函数做些修改)通过使用 σ 函数得到了一个圆滑输出的感知机。它的平滑性才正是关键而并非它具体的代数形式。平滑性意味着在权重值上的微小改变 Δwj 和权重值上的微小改变 Δb 只会在神经元的输出上产生一个很小的改变 Δoutput 。事实上微积分告诉我们 Δoutput 约等于:
ΔoutputjoutputwjΔwj+outputbΔb,(5)

求和是在所有权重 wj 上进行的, output/wj output/b 分别表示 output wj b 的偏微分。如果你对偏微分感到不适,请不要惊慌!尽管上面的表达式看起来如此复杂,包含那么多的偏微分,事实上它要表达的其实很简单(这是一个好消息): Δoutput Δwj Δb 的线性函数。线性特性使得通过改变 Δwj Δb 对输出进行微调以达到我们期望的输出变得容易。所以S型神经元既有同感知机一样的性质同时它又使得我们很容易了解权重值与偏置值是如何影响改变输出的。
既然我们在意的是 σ 的形状而不是它的代数形式,那么为什么要用等式3( σ(z)11+ez )作为 σ 呢?事实上在本书的后面会不时提到使用其它不同的激活函数 f() ,输出为 f(wx+b) 的神经元。使用不同激活函数造成主要的变化是等式 ΔoutputjoutputwjΔwj+outputbΔb 在特定值下的不同。我们使用 σ 只是因为在计算偏导数时它会简化代数式,因为它有指数函数在求微分时有些可爱的属性。总之它被广泛用于神经网络中,并且它也是本书中用得最多的激活函数。
那么我们如何去理解一个S型神经元的输出呢?很显然,感知机与S型神经元一个很大的不同是S型神经元不只输出0和1,它可以输出0到1之间的任何实数,所以像0.173…和0.689…也可以成为输出。这个有时是很有用的,比如如果我们用它来表示一张输入到神经网络的图片的平均像素灰度。但是有时它可能会造成麻烦,假如我们想通过网络的输出来指示一张输入的图片是否是数字9。很显然当像感知机那样输出0或1的时候是最容易处理的。对于S型神经元在实际应用中我们可以建立一个规则去处理这样的问题,例如我们假定输出大于0.5,就表明是9;如果小于0.5那么就不是9。当我们正在使⽤这样的约定时,我总会清楚地提出来,这样就不会引起混淆。

练习

S型神经元模拟感知机,第一部分
如果我们让一个感知机网络中的所有权重值与偏置值都乘以一个大于0的常数 c ,证明网络输出不会改变。
证明:
*我们知道感知机的输出表示如下:

output={01if wx+b0if wx+b>0

假设原网络的某一感知机权重和 z=wx+b ,那么当权重与偏置都乘以 c ,那么得到新的权重和 z=cwx+cb=cz ,如果 z0 因为 c>0,z=cz0 那么他们的输出都为0,如果 z>0,z=cz>0 那么它们的输出都为1,即每个感知机的输出都不会改变那么整个网络的输出都不会改变。*
S型神经元模拟感知机,第二部分
假如我们同上面一样有一个感知机网络。假设我们选定好一组输入,当我们并不需要知道确切的输入值,只需要知道输入是确定的。假设这组输入对网络中所有感知机都满足 wx0 。现在把网络中所有感知机都换成S型神经元并且所有偏置值与权重值都乘以一个大于0的常数 c 。证明当 c 时这个S型神经元网络与感知机网络的结果完全相同。为什么当有个感知机存在 wx=0 时前推论会失效。
证明:
假设在感知机网络中的某个感知机输出为1,那么它的权重和 (z=wx+b)>0 如果把它替换为S型感知机那么它的输出可以表示为 11+ez 当所有权重值和偏置值乘以常数 c 那么它的权重和 z=cwx+cb=cz 输出变为 11+ezc ,因为 z>0 czcezc0 最终输出 11+ezc1 与感知机输出相同;同理当感知机输出为0时,那么它的权重和 (z=wx+b)<0 (已经假定 wx+b0 )那么 ezc 最终输出 11+ezc0 与感知机输出相同,即每个神经元与原来的感知机输出都是相同的那么整个网络的输出也会是一致的。当存在某一神经元使得 z=wx+b=0 时,那么当它作为感知机时输出为0,而作为S型神经元时 11+ezc=0.5 它们的输出不一致,那么整个网络的输出可能也会因此不同。

神经网络的结构

下一章节我会讲解用神经网络很好地去识别手写数字。为此需要了解网络不同部分的术语及解释。假设有这样的网络:

这里写图片描述

如之前提到的,网络最左边的一层被称为输入层,这一层的神经元称为输入神经元。最右边叫做输出层,输出层的神经元称为输出神经元。中间层被称为隐藏层因为这一层的神经元既不接收外界的输入也不对外界输出。“隐藏“这个词听起来有些神秘-我第一次听到这个词时我想它一定有着某种很深的哲学或数学意义-但是它真的没有其它的意思,它只是表示它既不输出也不输入。上面的网络只有一个隐藏层,但是一些网络会有多个隐藏层。例如下面的四层网络中就有两个隐藏层:
这里写图片描述

有些令人困惑的是,由于某些历史原因,这种多层的网络有时被称作多层感知机或者MLPs,尽管它是由S型神经元而不是感知机组成的。我不会使用在本书中使用多层感知机这个术语,因为我觉得它会让人觉得困惑,我只是想要你知道有这么一回事。
输入层与输出层的设计通常是直截了当的。例如,我们想要区分一个手写图片是否是9,很自然地把图片像素的灰度编码输入到输入神经元。如果这个图片是64 x 64的灰值图像,那么我们需要64 x 64 = 4096个输入神经元,只要把灰度值压缩投射到0到1之间的数值即可。输出层只要一个神经元,它的输出小于0.5就认为它不是9,如果大于0.5就认为它是9。
尽管输入输出层设计是直接了当的,但是对隐藏层的设计就堪称艺术了。特别是,想通过⼀些简单的经验法则来总结隐藏层的设计流程是不可⾏的。相反,神经⽹络的研究⼈员已经为隐藏层开发了许多设计最优法则,这有助于⽹络的⾏为能符合⼈们期望的那样。例如这些法则可以帮助权衡网络隐藏层的数量与训练网络所需时间。我们会本书的后面接触到几个像这样的设计法则。
到现在为止,我们知道在神经网络中一层的输出会作为下一层的输入,所以这种网络又被称为前馈神经网络。这就意味着网络中没有回路-信息总是向前传播,不会形成反馈。如果存在这样一个回路,那么我们会遇到这样的情况 σ 函数的输入就会取决于它的输出这样就变得无法理解了,所以我们不能允许有这样的回路。
然而还有其它的人工神经元模型是允许有反馈回路的,这种模型被称为 递归神经网络( Recurrent Neural Networks)。这种模型的设计思想,是具有休眠前会在⼀段有限的时间内保持激活状态的神经元。这种激活状态可以刺激其它神经元,使其随后被激活并同样保持⼀段有限的时间。这样会导致更多的神经元被激活,随着时间的推移,我们得到⼀个级联的神经元激活系统。因为⼀个神经元的输出只在⼀段时间后而不是即刻影响它的输⼊,在这个模型中回路并不会引起问题。
递归神经网络相比前馈神经网络影响力要小,部分原因是递归网络的学习算法截至目前还不够强大。但是递归网络仍然是极具吸引力的。与前馈网络相比它更接近与我们大脑的工作方式,并且他可能解决一些前馈网络很难处理的问题。限于本书讨论的范围,在本书中我们只关注更广泛应用的前馈网络。

一个用于识别手写数字的简单网络

经过对神经网络的定义,让我们重新回到手写数字的识别。我们把这个问题分解成两个子问题。首先我们需要找到一个方法把一张包含多个数字的图片分解成一系列的单独图片,使每个图片包含一个数字。例如我们需要把下面这个图片:

这里写图片描述

分解成6个单独图片如下:
这里写图片描述

我们人类很容易处理这种分割的问题,但是对于计算机程序来说还是比较有挑战性的。然后图片被单独分割出来后,程序只需要去对单个数字分别去识别,例如我们可以让程序去识别上面的第一个数字是5。
这里写图片描述

我们主要集中于写一个程序去解决第二个问题即识别单独的数字。我们这样做是因为分割的问题解决起来并不那么困难,一旦我们能够识别单个数字,那么会有多种方法可以解决分割的问题。一种方法是先尝试多种方式来分割图片,然后通过对识别分割后的图片来对每种分割方法进行评估打分。如果数字识别器能够很肯定地对所有分割得到的图片进行识别,那么这种分割方式就能得到高的分数,如果对其中一个或几个图片片段识别有困难那么这种分割方式就会得到一个较低的分数,因为如果识别困难很可能是分割不正确造成的。这种方法或者它变种可以很好的解决分割问题。所以与其担心分割,我们会集中精力搭建一个神经网络用来解决更有趣更困难的问题,也就是识别单个的手写数字。
我们用一个3层神经网络来识别单个数字:
这里写图片描述

在网络输入层中,输入神经元对输入的像素值进行编码。下一节会提到,用于训练网络的数据是扫描到的28 x 28像素的手写数字图片,所以输入层包含784(28x28)个神经元。为了简便在上图中我省略大部分的输入神经元。输入的像素代表灰度,0表示白色1表示黑色,0-1之间的数字表示不同灰度等级。
第二层是隐藏层,我们用n来表示这一层神经元的数量,我们会试验不同n值,上面的例子画出了包含15个神经元的隐藏层。
网络的输出层包含10个神经元。如果第一个神经元激活,即它输出接近于1,那么就表示网络识别出这张图片为0。如果第二神经元被激活表示识别为1,依次类推。更准确地说是,我们比较从第0到第9个神经元的输出值,找出最大值的那个,如果是第六个神经元输出值最大就表示网络识别为数字6,其它神经元依次类推。
你可能想知道为什么要用10个输出神经元。毕竟网络的目标是把输入的图片与数字(0-9)对应起来。一个看起来很自然的方法是只用4个输出神经元,把每个神经元当做一个二进制来对待,它的值取决于神经元输出接近于0还是接近于1。四个输出神经元足够对结果进行编码,因为它可以表示 24=16 种情况大于10种可能的输入。那么为什么我们要用10个神经元呢?难道不是效率更低?最终的理由是经验性的:我们可以分别尝试用两种方式来设计网络,结果证明对于识别数字这个问题,用10个神经元作为输出比使用4个神经元作为输出效果更好。但是这就留给我们一个疑问为什么使用10个输出神经元更好?是否存在某些法则能提前告诉我们使用10个输出进行编码要比使用4个输出进行编码好?
要理解我们这么做的原因,我们首先来看一下10个输出神经元的情况,我们先看第一个输出神经元,它通过隐藏层输出的权衡判断输入图片是否是数字0。隐藏层做了什么呢?为了论证我们假设隐藏层的第一个神经元是检测图片是否存在下面这样的结构:
这里写图片描述

它可以增加与该图片重合区域相应的输入像素的权重值,减少其它输入像素的权重值来实现对该图片结构的识别。类似,我们假设隐藏层的第2、3、4个神经元会分别检测是否有下面的图片的结构:
这里写图片描述

你可能已经猜测到了,这4个图片一起组成了0的图片:
这里写图片描述

所以如果这4个隐藏神经元被激活那么我们可以得出这个图片是数字0的结论。当然这并不是得出数字0的唯一证据——我们可以通过很多其它的方式得到0的结论(举个例⼦来说,通过上述图像的转换,或者稍微变形)但是至少在上面的这种情况得出数字0是合理的。
假设神经网络以这种方式工作,我们似乎可以对为什么用10个输出神经元比用4个输出神经元要好做出一合理的解释。假设我们用4神经元作为输出,那么第一个输出神经元需要决定数字的最高位是什么,那么要把最高位与某种简单的形状对应联系起来就变得不容易了,很难想象出有什么恰当的历史原因,⼀个数字的形状要素会和⼀个数字的最⾼有效位有什么紧密联系。
上面所说的只是一种启发式方法。并不是说一个3层的神经网络必须要像我之前所说的那样运作即隐藏层识别特定的形状单元来判定数字。或许会有一种更聪明的学习算法能够找到一种权值分配方式使网络只需要4个输出神经元就能很好地工作,并且可以大大地为你节省去设计神经网络结构的时间。
练习
有一种按位表示数字的方法是在上面三层网络的基础上在额外再增加一层。这额外的一层把上一层的输出转化成二进制表示,如下图所示,请为新的输出层找到一组合适的权重值与偏置值。假设在第三层的神经元在被正确激活时输出值大于0.99,而未被激活的情况下输出值小于0.01。
这里写图片描述

解:
如图我们要将数字按位对应输出:
这里写图片描述

我们先确定第三层的输出与第四层输出的关系:
0———>bit0=0; bit1=0; bit2=0; bit3=0.
1———>bit0=1; bit1=0; bit2=0; bit3=0.
2———>bit0=0; bit1=1; bit2=0; bit3=0.
3———>bit0=1; bit1=1; bit2=0; bit3=0.
4———>bit0=0; bit1=0; bit2=1; bit3=0.
5———>bit0=1; bit1=0; bit2=1; bit3=0.
6———>bit0=0; bit1=1; bit2=1; bit3=0.
7———>bit0=1; bit1=1; bit2=1; bit3=0.
8———>bit0=0; bit1=0; bit2=0; bit3=1.
9———>bit0=1; bit1=0; bit2=0; bit3=1.
未完待续。。。

猜你喜欢

转载自blog.csdn.net/wangchongttg/article/details/78519758