“plugins”: [ “katex” ]

第一章:使用神经网络识别手写数字


人类的视觉系统是世界的一个奇迹,下面是一串手写的数字

handwritingdigits

人们可以轻松认出来这些数字是504192。非常简单。在我们大脑的每一个区域,人类有一个主要的视觉区,叫做v_1,它由14亿个视觉细胞构成,这些视觉细胞之间形成了百亿数量级的连接。人类的视觉系统不仅仅有v_1,还有v_2v_3v_4,和v_5. 它们一起组成了复杂的渐进式视觉处理系统。事实上,我们脑袋中有一台超级计算机,经过几亿年的进化和调校,形成了超常的视觉认知能力。实际上,识别手写字体绝非易事。我们人类在认知眼睛所看到的事物时时有着让人惊讶的能力。更神奇的是,整个识别的过程在我们无意识中就完成了。因此,我们经常忽视我们视觉系统这一超能力。

但,当你准备用计算机程序来完成这一识别上述手写字体的过程时,就会感到十分困难。原本开起来对于我们来说易如反掌的事情突然变得极端困难。例如对9的识别,直觉上,9的特征是顶部一个圆圈,其下面是一个垂直的竖线,直达底部,这通过计算机算法描述起来却没这么简单。当你试图让这些特征精确起来,你会发现自己很快就迷失在无尽的特例和异常情况中。看起来简直不可能。

神经网络试图从另外一个角度解决这个问题。方法是通过大量的手写字体也就是训练集(如下图),构建一个可以学习这些训练集的系统。

MNISTSamples

也就是说,神经网络通过这些手写数字训练集自动找到识别它们的规律。然后,通过增加训练集的规模,神经网络可以学习更多手写体,逐渐提升识别的准确性。上面是100个训练集的例子,如果有一千个、一百万个甚至几十亿个训练集,我们可以构建一个更好的手写识别系统。 这一张中,我们将写一个由计算机程序实现的神经网络,来识别手写字体。其实仅仅需要74行代码就够了,甚至不需要特殊的神经网络库。别小瞧这个神经网络,不需要人工干预,它的识别准确性就可达到96%。在后续的章节中,我们还会将它的识别率提升到99%。现实中最好的商业化神经网络已经足够好,银行已经在用它来识别支票,邮局用它识别地址。

手写体的识别对于我们学习神经网络是一个非常棒的典型问题,后续我们也会聚焦在手写识别上。手写体识别有不是一个简单的问题,有一定的挑战性,但也不至于过于复杂而需要非常复杂的解决方案,也不需要海量的计算能力。此外,对于学习诸如深度学习一类的更高级一些的技术也有帮助。此书自始至终将不断回到手写体识别这个问题上来。后面,我们还将讨论如何将之应用到其它领域,例如计算机视觉、语音识别、自然语言的处理等等。

当然,如果这一章的目的只是写一个能够识别手写字体的程序,这章将会非常短。我们还将涉及神经网络的相关的一些概念,包括两个重要的人工神经元(感知神经元和sigmoid神经元),以及标准的神经网络学习算法,也就是梯度下降算法。我将着重解释为什么问题是这样解决的,帮助你建立神经网络的直观印象。除了我给大家介绍基本的机制之外,还需要进行更为深入的探讨。不过这对于你的更进一步理解会十分有帮助。这一章结束时,我们将了解到什么是深度学习,以及它的重要性。