第一章 用神经网络来识别手写数字(1)

写在章节前面的

翻译文章来源
人类的识别系统是世界上的一大奇迹,看下面的一串手写数字


手写数字

  大部分人都能准确地认出这些数字是504192,这是很容易的。在大脑的每个半球,人类都有一个被称为V1的视觉皮层,其中包含了超过140,000,000个神经元和超过数百亿的神经连接。而且人类的的视觉不仅包含V1,还有一系列的视觉皮层V2、V3、V4、V5,他们承担了相当复杂的图像处理过程,我们经过几百万年的进化,已经把自己的脑袋给改造了一台能够理解周围视觉世界的超级计算机。识别手写数字不是很简单的。我们人类能够很好地从看到的事物提取出其应有的意义。这一切都是无意识的。而且我们大部分时间都认为视觉系统所处理的这些难题都是理所应当的。
  当你尝试要写一个程序来识别如上的手写数字的时候,你就会意识到要建立一个这样的识别模型是多么地困难。直觉上,我们将数字识别成9,是因为9的上部有一个圈,右下部有一条垂直的线,但是这样的算法是很不容易取表达的,当你尝试去准确地描述这些规则的时候,你会发现自己会迷失在异常和特例的沼泽里,这看起来是徒劳无功的。
神经网络采用不同的方法来解决这个问题,先采取大量的手写数字样本作为训练实例,如下图


训练实例

  然后编写一个能够从这些训练实例中学习的系统。换句话说,这神经网络使用这些训练数据来自动推测识别手写数字的规则。而且,增加训练实例的数量后,神经网络可以学到更多关于手写数字的规则,进一步提高识别的准确度。上面我只展示了100个训练数字,理论上我们可以用成千上万的训练实例来构建一个更好的手写识别系统。
这一章,我们实现一个学习识别手写数字的神经网络小程序。程序的总行数大概只有74行,而且没有使用特别的神经网络库。但是这个小程序自动识别数字的成功率可以超过96%,而且在接下来的章节,我们不断改进程序,使成功率超过99%。事实上,现在最好的商用神经网络已经应用到银行处理支票和邮局识别地址了
  手写数字识别是学习神经网路很好的一个切入点。一方面,这个稍微有点挑战性,不是很容易就可以做到,另一方面,这个系统不需要很复杂的解决方法和巨大的计算能力,还有,这是也是一个学习像深度学习这样更高级技术的很好的切入点。通篇我们都在讲关于识别手写数字的问题,在本书的后面,我们会讨论这些想法是如何被应用到计算机视觉、语音和自然语言处理以及其他领域上的。
  当然,本章的主要任务就是写一个识别手写数字的小系统,这章很短!但是我们会渐渐提及许多神经网络中的核心想法,比如两种重要的人造神经元(感知神经元和sigmoid神经元),比如标准的神经网络学习算法——梯度下降。全篇我都在解释为啥要这样做和建立你的神经网络直觉。和只讲讲基础的结构相比,这需要更多的篇幅来讨论。但是这很值得,这会让你对你将看到的有更深的理解。另外作为延伸,我们会在章节的最后解释一下深度学习是啥,另外为啥它很重要。

感知结点(Perceptrons)

  什么是神经网络?首先,我会解释一中叫感知结点的神经元。感知结点大概是在上世纪五六十年代由科学家Frank Rosenblatt提出。虽然,在很多的神经网络中以及本书中,其他类型的人造神经元使用频率更高,其中sigmoid神经元是最主要的。当然,我们很快就会讲到sigmoid神经元。但是为了理解sigmoid神经元是怎么定义的怎么来的,我们有必要花时间先来讲解一下啥是感知结点。
感知结点如何工作的?一个感知结点接收几个二值化输入, x 1 , x 2 ,…,和一个单独的二值化输出:


示意图

  在上图中表示的感知结点有三个输入, x 1 , x 2 , x 3 ,一般地,它会有跟多或者更少的输入。Rosenblatt提出了一种简单计算输出的规则。他引进了权重, w 1 , w 2 …,用实际的数字来表达各自输入到输出。这个神经元的输出是0或者1,这主要看 j w j x j 是大于还是小于阈值。和这些权重类似,这个阈值也是神经元的参数,下面的关系是其更详细的代数关系:

(1) o u t p u t = { 0 i f j w j x j t h r e s h o l d 1 i f j w j x j t h r e s h o l d

感知结点就是这样工作的!

  这就是基本机制的模型。你可以就这样想,感知机就是通过权衡权重然后来做决定的一个设备。让我给你举个例子。这不是一个非常真实的例子,但是很容易理解,而且我们很快会接触到很真实的例子。假设周末快要到了,而且在你的城市里将会有一个奶酪节。你喜欢奶酪,而且正试图决定到底去不去参加这个奶酪节。你会通过权衡这三个因素来做决定:

    1. 天气会很好吗?
    2. 你女朋友会和你一起去吗?
    3. 去奶酪节的交通方便吗?(前提是你没有车)

  我们可以用相对应的二值化的变量 x 1 , x 2 x 3 。举个例子,如果天气很好,那么我们令 x 1 = 1 ,如果天气很差,那么会令 x 1 = 0 ,相似地对于 x 2 x 3 也是这样。
  现在,假设你非常喜欢奶酪,喜欢到即使你女朋友不感兴趣并且交通很不方便,你也会毅然决然地去参加。或者假设你非常讨厌坏天气,如果那里的天气不好,你是无论如何都不会去的。你可以用感知机来做这方面的决定。一种方法是为天气添加权重 w 1 = 6 ,而且为其他条件也添加权重 w 2 = 2 , w 3 = 2 。天气的权重 w 1 较大,这显示了你非常在意天气这个因素。这比你女朋友是否同去和交通是否方便更重要。最后,假设你为这个感知机选择了一个 5 的权重。在这些选择下,这个感知机实现了决策模型,当天气好的时候总会输出1,当天气差的时候总会输出0。你女朋友是否想去和交通是否方便对输出根本没有影响。
  通过变换权重和阈值,我们可以得到不同的决策模型。例如,假设我们选择阈值为 3 。然后这个感知机会只满足在天气好的这个条件的时候,或者满足交通方便和你女朋友会和你一起这两个条件的时候输出1。换句话说,这会变成一个不同的决策模型。把阈值设得越低说明你越想去这个奶酪节。
  明显地,这个感知机而和人为决定模型不是一一致的。但是这个例子说明了一个感知机如何权衡多种前提来做决定。而且一个复杂的赶至网络可以做很细微的决定,这看起来是合理的。


感知结点的原始模型

  在这个网络中,我们常常把第一列的感知结点成为第一层感知层,如图所示,第一层感知层通过权衡输入的权重,正在做三个非常简单的决定。那么第二层的感知结点有啥作用?其中的每个感知结点都在权衡第一层处理结果来做决策。这个过程中,相对于第一层来说,第二层的感知结点可以做更复杂和更抽象的决定。至于第三层的感知结点,甚至可以做更复杂的决策。在这种程度上来说,一个多层的感知网络可以做处理机器复杂的决策。
  顺便说一下,我定义感知结点的时候,说其只有一个输出,但是上面的感知网络中的感知结点看起来应该有很多个输出。实际上,他们都只有一个输出,虽然从每个感知结点画出了很多指向箭头,但是这只是在说明,这个感知结点的输出正在被很多个下一层的感知结点作为输入。这样画更方便。
  让我们来简化一下我们对感知结点的描述。 j w j x j > t h r e s h o l d 这个条件是比较繁琐的。而且我们可以用两个用两个可以替代的符号来简化一下。首先用点乘符号 x y = j w j x j ,当 w x 都是有权重和输入组成的向量。另外,第二个简化,就是将阈值移到不等式的另一边,同时用偏差(bias)来代替threshold,其中 b t h r e s h o l d 。现在来重写感知结点的规则:

(2) o u t p u t = { 0 i f w x + b 0 1 i f w x + b 0

  可以将偏差(bias)看做是用来描述令感知器输出 1 的难度。或者是从生物学上来解释的话,偏差就是用来度量命中某一感知结点的难度。对于一个非常大的bias,这样的感知结点是很容易输出1的。如果bias非常小,感知结点是很难输出1的。明显的,介绍bias只是我们如何描述感知结点的一点小改变,我们在不久的将来会看到这会导致一个符号化的简化。由于这个,在这本书的剩余部分,我们不会再用阈值这个概念,我们会一直使用偏差(bias)这个概念。
  上面,我已经提到感知网络可以作为一个通过权衡已知条件来做决定的方法。除此之外,感知网络还可以用来计算基本的逻辑运算,可以做一些底层的逻辑运算,像与、或和与非。例如,加入我们有一个有两个输入的感知结点,每个输入的权重是 2 ,同时结点的bias是 3 ,下面的这个是我们的感知结点:


与非感知结点

  之后我们看到输入 0 0 会产生输出 1 ,因为 ( 2 ) 0 + ( 2 ) 0 + 3 = 3 是正的。这里我介绍了 来做乘法。类似的计算方式可以看出当输出为 01 10 的时候,这个感知结点都会输出 1 ,但是当输入为 1 的时候,感知结点会输出 0 ,因为 ( 2 ) 1 + ( 2 ) 1 + 3 = 1 是负的,所以,我们的感知结点实际上是实现了一个与非门。
  然后我们可以用与非门来实现很多相关的逻辑运算。
这个感知器应用在逻辑运算上让人充满希望,但是同时又很让人失望。一方面,这个感知器告诉我们感知网络可以像其他所有计算设备那样强大,另一方面,让人失望的是,这让人看起来这个感知器好像仅仅是个与非门,这压根没啥用。
  然而,实际情况比上面的观点要好。结果是,我们设计出可以自动调整神经网络结点的权重(weights)和偏差(bias)的学习算法。这种调整由外部刺激决定,调整过程中没有人为的干预。这种学习算法让我们找到了人工神经元完全不同于设计个逻辑门或逻辑电路的应用。相比于明确地设计出与非门和其他逻辑门,我们的神经网络可以轻松地学着去解决问题,有时候是些很难直接设计一个传统电路就能解决的问题。

猜你喜欢

转载自blog.csdn.net/shihunyewu/article/details/78567941