人类的视觉系统绝对算是这个世界上的一个奇迹。考虑如下的手写数字的序列:
大多数人都能轻易的认出这些数字是504192。其实轻易的认出这些数字只是个假象。在我们大脑的每个半球中都存在一个初级视皮层(primary visual corte),也被称为V1,包含1.4亿个神经元,并且这些神经元之间存在着数百亿的连接。但是人类的视觉系统不仅依赖于V1,而是整个视皮层——V2,V3,V4和V5——来逐步进行复杂的图像处理。我们的大脑就像一台超级计算机,经过亿万年的进化,已经非常适合理解视觉世界。识别手写数字并不简单,但是,我们人类极易理解我们眼睛看到的东西,并且这些几乎都是在无意识的情况下完成的,因此,我们通常并不会感激我们的视觉系统解决了多么艰难的问题。
如果你尝试写一个电脑程序来识别数字,就像上面的那些,视觉模式识别的困难将会非常明显。看起来很简单,但是亲自实现起来却很难。简单直观的识别形状的方法——“数字9上部有一个圆圈,并且右下部有一竖”——在算法表达上却没有这么简单。当你尝试做一些精确的规则的时候,你会很快的迷失在意外情况、注意事项和特殊情况里,毫无希望。
神经网络用不同的方法解决这个问题。这个方法需要大量的手写数字,即训练样本,
然后开发一个系统,这个系统可以从这些训练样本中学习。换句话说,神经网络使用这些训练样本自动的推断出识别手写数字的规则。此外,通过增加训练样本的数量,神经网络可以从更多的手写中学习,以此提高它的正确率。虽然在上面我只展示了100个训练数字,但可能我们要想做一个更好的手写识别器需要数千甚至数百万的训练样本。
在这一章里,我将写一个可以学习识别手写数字的的神经网络程序,这个程序仅仅74行,而且没有使用其他的神经网络库。但是这个小程序识别手写数字的准确率可以达到96%,并且没有人工干预。此外,在接下来的章节里,我们将改进想法,将正确率提高到99%。事实上,最好的商业神经网络效果非常好,可以被银行用来识别支票,可以被邮局用来识别地址。
一般来说,我们选择手写识别是因为它是一个关于神经网络的非常好的原型问题。作为原型,它击中了甜蜜点:具有挑战性,识别手写数字是一个不小的壮举,并且不需要极其困难的解决方案和强大的计算能力;此外,这是一个学习更先进技术的好方法,比如深度学习,所以在本书中会反复提到手写识别问题。本书接下来的部分中,我们会讨论怎样把这些方法用在计算机视觉的其他问题上,还有语音识别、自然语言处理等其他的领域。
当然,如果本章只是写一个识别手写数字的程序的话,本章将会短很多。但是,沿着这条线,我们将会学习很多神经网络的关键思想,包括两个重要的人工神经元(感知机和sigmoid神经元),和神经网络的标准学习算法,随机梯度下降算法。我将始终注重解释使用某种方法解决问题的原因,并建立你的神经网络直觉。这要比我刚才讲是怎样的基本方法要长的多,但为了你更好的理解这是值得的。其中的收益,当本章结束的时候,我们将以适当的方式理解什么是深度学习和深度学习为什么这么重要。