第一章 用神经网络识别手写数字(第一节 感知器)

来源:互联网 发布:关于编程的电影 编辑:程序博客网 时间:2024/06/06 09:37

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

人类的视觉系统,是个世界奇迹。

看看下面的手写数字:

大多数人毫不费力地识别这些数字为504192。以为这很容易,其实是错觉。在人类大脑半球上,有个初级视觉皮层,V1区,含有1亿4000万个神经元。在这些神经元之间有数百亿个连接。然而,人的视觉不只是V1,而是多个视觉皮层 —— V2、V3、V4和V5,做更复杂的图像处理。我们的头脑好比一台超级计算机,和谐的进化了数亿年,非常适应观看世界的需要。手写体数字的识别是不容易的。相反,眼睛给我们的视觉,是一种极强的机能。但视觉所有的工作几乎是在不知不觉中完成,所以我们通常不理解视觉系统如何解决棘手的问题。

如果你想写个计算机程序识别像上面那样的数字,会明显感到视觉模式识别的困难。看来很容易的事,自己做起来却变得极为困难。例如识别9这个数字。简单的直觉是“9的顶部有个圆环,右下有一竖直”。但是,如何具体表示这个形状,并没有简单的算法。当你试图建立精确表示的规则时,很快就会迷失在一大堆的例外之中。似乎问题无解。

神经网络方法用不同的办法来解决问题。这个办法是把大量的手写体数字,作为训练样本,

然后开发了一个可以从这些训练样本进行学习的系统。换句话说,神经网络使用这些训练样本,自动推断出手写体数字的识别规则。此外,通过增加训练样本的数量,可以通过神经网络了解更多笔迹形态,从而提高识别的准确性。这里展示的训练样本虽然只有100个,但其实可以用数千甚至数百万或数十亿的训练样本,去建立更好的手写识别器。

在这一章中,我们要写一个计算机程序,实现学习识别手写体数字的神经网络。程序只有74行,不使用特殊的神经网络库。但这个短小程序的识别准确度超过96%,且无需人的干预。此外,在后面的章节中我们将拓展思路,提高识别精度超过99%。实际上,最好的商业用神经网络现已在银行处理支票,在邮局识别邮件地址。

我们专注于手写识别,因为它是学习神经网络所需要的具有普遍性的很好的原型问题。作为一个原型,它有四两拨千斤之妙,它做出了挑战手写数字识别的壮举,但它没有使用非常复杂的解决方案,没有使用巨大的计算能力,没有遇到大的麻烦。此外,它是发展成更先进的技术,如深度学习的一个很好的途径。因此在本书中我们会多次回顾手写识别的问题。在本书的后面,我们将讨论如何将这些想法应用于计算机视觉的其他问题,以及应用在语音处理、自然语言处理等领域。

当然,如果本章只是要写一个程序来识别手写数字,本章内容会很简短。但是,开发神经网络有多种重要思路,其中包括人工神经元的两种重要类型,感知器和S形神经元,以及称作“随机梯度下降”的标准的学习算法。自始至终,我重点解释为什么事情是这样的,并且重点关注建立神经网络所需的直觉。这需要一个更为冗长的讨论,但为了得到更深的理解,这样做也是值得的。通过本章的学习,最后我们会明白深度学习是什么,以及为什么它很重要。

第一节 感知器


神经网络是什么?一开始,我先说明感知器是一种人工神经元。感知器是在1950-1960年代由科学家Frank Rosenblatt开发,而他的灵感来自Warren McCulloch 和 Walter Pitts 早期的工作。今天,本书中使用的人工神经元模型十分常见。在现代神经网络中,主要的神经元模型是S形(Sigmoid)神经元。下面会很快说到S形神经元。但要明白为什么S形神经元要如此定义,就要先花时间了解一般意义上的感知器。

感知器是怎样工作的?感知器需要几个二进制输入,x1,x2,,并产生一个二进制输出:


示例中的感知器网络有三个输入,x1,x2,x3。一般来说,可以有更多或更少的输入。Rosenblatt 提出了计算输出的简单规则。他引入了权重w1,w2,,以实数表示各个输入相对于输出的重要程度。神经元的输出,是0还是1,取决于加权的  ∑jwjxj 累加值是小于还是大于某一阈值。阈值像权值,是一个实数,也是神经元的参数。可以用更精确的代数式表示它:

output=01if jwjxj thresholdif jwjxj> threshold(1)

这时发现,CSDN blog 处理 markdown 的方式,使得本文的大量数学符号难以处理,只好放弃继续翻译。

打算在 Jupyter Notebook 平台上完成全书的翻译。它的 markdown 功能强大。

0 0
原创粉丝点击