第 1 章 使用神经网络识别手写数字
人类的视觉系统堪称世界奇迹。看看如图 1-1 所示的手写数字序列。
图 1-1
大多数人能轻松认出这些数字是 504192,而这容易让我们忽视其背后的复杂性。人的大脑半球中有一个初级视觉皮层,常称为 V1,它包含约 1.4 亿个神经元,神经元间的连接有数百亿条。然而,人类的视觉系统并不只涉及 V1,还包括整个视觉皮层——V2、V3、V4 和 V5,它们进行更加复杂的图像处理。人脑就像一台超级计算机,历经数亿年的进化,最终能够很好地以视觉感知世界。识别手写数字并不简单。尽管人类非常擅长理解眼睛接收到的信息,但几乎所有的过程都是无意识的,所以我们通常体会不到自身视觉系统解决问题的困难程度。
如果尝试编写计算机程序来识别以上数字,就会发现视觉模式识别的复杂性,人类可以轻松完成的任务顿时变得困难重重。识别形状时,对于“数字 9 的上半部分是一个圈,右下部分是一条竖线”这样的简单直觉,实际上很难用算法表达出来。如果试着细化识别规则以提高准确度,很快就会出现各种异常和特殊的情形,似乎毫无希望。
神经网络以其他方式应对这个问题,其主要思路是获取大量手写数字——常称作训练样本,如图 1-2 所示,然后开发出一个系统,从这些训练样本中学习。换言之,神经网络使用样本来自动推断识别手写数字的规则。另外,通过增加训练样本的数量,神经网络可以学到关于手写数字的更多信息,这样就能够提升自身的准确度了。图 1-2 展示了 100 个用作训练样本的手写数字,而使用数千或者数百万甚至数十亿的训练样本,可以得到更好的手写数字识别器。
图 1-2
本章将实现一个可以识别手写数字的神经网络。这个程序仅有 74 行,并且不使用特别的神经网络库。然而,无须人类帮助,这个小型神经网络识别数字的准确率就能达到 96%。后文会介绍能将准确率提升至 99%的技术。实际上,卓越的商业级神经网络已经被银行和邮局分别用于核查账单和识别地址了。
之所以关注手写数字识别问题,是因为它是神经网络研究中的原型问题。作为原型,它具备一个关键点——颇具挑战性。识别手写数字并不容易,但也没有难到需要极其复杂的解决方法,或者超大规模的计算资源。另外,由它发展出了一些高级技术,比如深度学习。因此,手写数字识别问题会贯穿本书。本书在后面会讨论如何将这些知识应用于其他计算机视觉问题以及语音识别、自然语言处理等领域。
当然,本章内容不仅仅限于编写一个计算机程序来识别手写数字。随着内容推进,我们将学习关于神经网络的很多关键思想,其中包括两种重要的人工神经元——感知机和 sigmoid 神经元,以及常用的神经网络学习算法——随机梯度下降算法。本书会着重解释原理,深入解析神经网络;详尽探讨,而不只是介绍一些基本技巧;最后会介绍深度学习及其重要性。