使用神经网络识别手写数字
人类的视觉系统是世界奇迹之一。考虑以下手写数字序列:
大多数人毫不费力地就把这些数字识别为504192,这是一种欺骗。在我们大脑的每个半球,人类都有一个初级视觉皮层,也称为V1,包含1.4亿个神经元,它们之间有数百亿个连接。然而,人类的视觉不仅涉及到V1,还涉及到一系列的视觉皮层——V2、V3、V4和V5——进行越来越复杂的图像处理。我们脑子里装着一台超级计算机,经过亿万年的进化调整,非常适合理解视觉世界。识别手写数字并不容易。更确切地说,我们人类是惊人的,惊人的善于理解我们的眼睛显示给我们什么。但几乎所有的工作都是在不知不觉中完成的。所以我们通常不会意识到我们的视觉系统解决了一个多么困难的问题。
如果你试图写一个计算机程序来识别像上面那样的数字,那么视觉模式识别的困难就显而易见了。当我们自己动手时,看似简单的事情突然变得极其困难。关于我们如何识别形状的简单直觉——“9在顶部有一个循环,在右下角有一个垂直笔划”——结果证明在算法上并不是那么简单。当你试图使这些规则变得精确时,你很快就会迷失在例外、警告和特殊情况的泥潭中。似乎没有希望了。
神经网络以不同的方式处理这个问题。这个想法是取大量的手写数字作为训练样本,
神经网络以不同的方式处理这个问题。这个想法是取大量的手写数字作为训练样本,然后开发一个系统,可以从这些训练的例子中学习。换句话说,神经网络利用这些例子来自动推断识别手写数字的规则。此外,通过增加训练样本的数量,网络可以了解更多的笔迹,从而提高其准确性。因此,虽然上面我只展示了100个训练数字,但也许我们可以通过使用数千甚至数百万甚至数十亿个训练示例来构建一个更好的手写识别器。
在本章中,我们将编写一个计算机程序,实现一个学习识别手写数字的神经网络。这个程序只有74行长,没有使用特殊的神经网络库。但是这个简短的程序可以识别数字,准确率超过96%,无需人工干预。此外,在后面的章节中,我们将提出一些可以将准确率提高到99%以上的想法。事实上,最好的商业神经网络现在非常好,它们被银行用来处理支票,被邮局用来识别地址。
我们把重点放在手写识别上,因为它是学习一般神经网络的一个极好的原型问题。作为一个原型,它达到了一个最佳点:它具有挑战性——识别手写数字是一个不小的壮举——但它并不难,因为它需要一个极其复杂的解决方案,或者巨大的计算能力。此外,这是发展更先进技术的好方法,比如深度学习。因此,在整本书中,我们将反复讨论笔迹识别的问题。在本书的后面,我们将讨论如何将这些思想应用到计算机视觉中的其他问题,以及语音、自然语言处理和其他领域。
当然,如果这一章的重点只是写一个计算机程序来识别手写数字,那么这一章就会短得多!但在这一过程中,我们将发展许多有关神经网络的关键思想,包括两种重要的人工神经元(感知器和sigmoid神经元),以及神经网络的标准学习算法,即随机梯度下降法。自始至终,我专注于解释为什么事情是这样做的,以及建立你的神经网络直觉。这需要一个比我只是介绍了发生了什么的基本力学更长的讨论,但它是值得的,因为你将获得更深入的理解。在收获中,到本章结束时,我们将能够理解什么是深度学习,以及为什么它很重要。