使用神经网络识别手写数字
人类的视觉系统是世上的一个奇迹。考虑以下这串手写的数字:
大部分人都能轻易地识别出图上的数字是504192。这个看似简单的过程的背后,实际上很复杂。在我们大脑的每个脑半球中,有一个叫做初级视皮层(primary visual cortex)的部分,也被称作V1。它拥有1亿4千万个神经元,包含了上百亿的神经元连接。然而,人类的视觉系统不仅仅依赖于V1,还依赖于整套视皮层——V2、V3、V4和V5的协同工作,来实现复杂的图像处理任务。我们的大脑就像一台超级计算机,经过了上亿年的进化,才得以能够出色地理解视觉的世界。识别手写数字不是一个简单的任务,但是,人类极其擅长理解眼睛所看到的东西,并且几乎所有这些工作都是在无意识的情况下完成的,所以我们通常不会意识到我们的视觉系统解决了的任务有多么困难。
当你企图实现一个用来识别类似上图数字的计算机程序时,你就会逐渐意识到视觉模式识别的难度。一个本来对于人类看似很简单的事情,突然就变得极其困难。「数字9的上部有一个圆圈,右下部有一笔竖线」这种人类识别形状的直觉,在算法上却很难表示。当你试图定义明确的识别规则时,你会很快地被一大堆特例所困扰。这似乎毫无解决的希望。
神经网络(Neural Networks)使用一种不同的思路解决这个问题。它的思想是利用大量的手写数字,亦被称为训练样例,
从这些训练样例学习并建立一个系统。换一种说法,神经网络使用这些样例,从中能够自动地学习到识别手写数字的规则。而且,随着训练样例的增加,神经网络可以从中学习到更多信息,从而提高它的准确度。所以,尽管我上面只给出了100个训练数字,也许我们可以使用上千、上万、上亿的训练样例来构建一个更好的手写识别器。
在本章中,我们会实现一个神经网络的计算机程序,来学习并识别手写数字。虽然这个程序仅仅只有74行,并且没有使用任何特别的神经网络库,但是它可以在没有任何人工干预的情况下,达到超过百分之96的手写数字识别准确率。在之后的章节中,我们会进一步改善我们的方法,使之达到超过百分之99的准确率。实际上,目前最好的商用神经网络已经足够好到能被银行用来处理支票,以及被邮局用来识别地址。
我们会专注于手写数字的识别这个问题,因为它基本上是学习神经网络最好的示范问题,之所以这么说是因为它戳中了几个痛点:它具有挑战性,识别手写数字不是一个简单的工程;同时它的难度也不是特别大,并不需要极其复杂的方法,或者大量的计算资源。而且它是实现更高级技术的基础,例如深度学习(deep learning)。所以,手写数字识别问题会贯穿本书。在本书的后部分,我们会讨论如何将这些想法应用到计算视觉的其它问题上,甚至语音处理、自然语言处理以及其它领域。
当然,本章的主旨如果只是实现一个程序来识别手写数字,那么本章的内容就会少很多!实际上,在这个过程中,我们会产生许多关于神经网络的关键思想,包括两种重要的人工神经元(感知机和sigmoid神经元),以及神经网络的标准学习算法,称为随机梯度下降(stochastic gradient descent)。在本书中,我关注于解释为什么问题能够被这样解决,以及为你建立关于神经网络的直觉。尽管相比于仅仅展示基础理论过程,这需要更长的篇幅来讨论,但是这对于你的深入理解是很有价值的。从中的收获,就是在章节的最后,我们就能够理解深度学习是什么,以及为什么它能够起作用。