一个简单的分类手写数字神经网络-面向幼儿园的人工智能(5)

*请注意,这一系列文章的骨架来源于Neural Networks and Deep Learning ,本人阅读后对原文进行提炼和加工,重构了整个文笔以让中文的初学者更容易阅读和理解,并首发于****博客上,转载请先联系本人微信986597353,否则一经发现,视为侵权,必将追究法律责任

导航

第一章 面向幼儿园的人工智能

第一篇: 开篇-机器学习

第二篇: 感知器

第三篇: sigmoid神经元

第四篇: 神经网络的结构


第二章 面向小学生的机器学习



正文 一个简单的分类手写数字神经网络


在定义了神经元网络之后,这篇文章希望用一个机器认识手写数字的简单例子,来帮你进行更深入的学习和思考。


在开始之前,我们需要做的是简化问题,把机器认识手写分裂成两个子问题。

一:我们想要一个把一个包含许多数字的图片切割到一些列分离开来的图片中,每一个都只包含一个单独的数字。例如,我们想要切割下面这个图片到六个分离的图片中:

一个简单的分类手写数字神经网络-面向幼儿园的人工智能(5)

一个简单的分类手写数字神经网络-面向幼儿园的人工智能(5)


二:一旦图像被分割,程序解析来需要的就是去分类出每个独立的图片。我们需要让我们的程序去认识上图的第一个数字是5.


我们将会聚焦于写一个程序去解决第二个问题 - 识别分离开来的数字。之所以做这个是因为把图片切割成不同数字问题并没有那么难解决,一旦你有一个不错的方法去识别数字,那么将会有非常多的方法去解决第一个问题。其中一个方法是对切割图像去尝试不同的方式,使用一个单个的数字分类器去不停的切割模块,然后对每一个尝试分离的模块进行评分。如果一个尝试分离的模块获得了高分则说明分离是成功的。所以,认识单个的手写数字是更加有趣和困难的问题。

 

为了认识单个的数字我们将会使用一个三层的神经元网络。

一个简单的分类手写数字神经网络-面向幼儿园的人工智能(5)

该网络的输入层会将输入的像素编码,我们为神经网络提供的训练数据将会是扫描的手写数字,并且包含28×28像素的图片。为了简单,我已经为上图省略了784个输入神经元,输入的像素是灰阶的,代表白色的值是0.0,代表黑色的值是1.0,而在中间的值通常是变暗的灰色阴影。

 

网络的第二层是隐蔽层。我们用n来表示在隐蔽层中的神经元数目,然后我们会对n实验不同的值。这是一个小的隐蔽层,如图所示,仅仅包含15个神经元。

 

网络的输出层包含十个神经元。如果第一个神经元被**,即,有一个约等于1的输出,那么这表明了神经网络认为输出是1,更精准一点,我们把每一个输出神经元数字化成为0到9,并且找出哪一个神经元有一个最高的**值,如果那个神经元是最高说明我们的网络猜测输出的数字是那个神经元代表的数字。

 

这个神经网络的目标是要告诉我哪一个数字(0,1...9)对应了输入图片,把每一个神经元都当成是一个二进制值的话,四个神经元足够去把这个答案编码,因为2的四次方是16,对于输入神经元来说它比10个可能的值的更多。那么为什么我们的网络为什么要使用十个神经元,这样做是否浪费效率?答案是否定的,这是基于经验的判断:我们可以把尝试两种网络的设计,然后事实会证明,对于特定问题,拥有10个输出神经元的网络学习认识数字要好于四个输出神经元的网络。那么原因是什么呢?我们能否从中获得设计输出神经元的一些启发呢?

 

让我们先关注第一个输出神经元,即尝试去决定是数字是否为0的那个。它通过拿到经过神经元隐蔽层加权后的凭证去判断。那么那些隐蔽神经元做什么呢?那么,假设为了论证在隐蔽层的第一个神经元是用来检测是否存在以下这个图片的:

一个简单的分类手写数字神经网络-面向幼儿园的人工智能(5)


它可以通过对覆盖在图片上的像素进行加权来实现,类似的,让我们假设隐蔽层中的第二,第三和第四个神经元检测的是以下图片。

一个简单的分类手写数字神经网络-面向幼儿园的人工智能(5)


就像你猜测的那样,这四张图片一起组成了0的图片

一个简单的分类手写数字神经网络-面向幼儿园的人工智能(5)


所以如果这四个隐蔽神经元被**那么我们就可以得出数字是0的结论。当然我们可能会通过其他渠道的帮助来合理地得出 0 (说的是通过翻译上面的图片后得出一个大致的模型,或者是对图片进行轻微的扭曲,以模仿出各种不同形状的0)。但是看起来至少在这个例子中我们推断输出是0是没问题的。

 

假设神经元网络通过这种方法来判断,那么我们可以给出一个为什么对于这个神经网络有十个输出要好于四个的说明。设想一下如果我们只有四个输出神经元,我们标记为x1,x2,x3,x4,为了表示数字0到9,我们有可能要**两个到三个输出神经元,意思是,我们可以用四个输出神经元都不**来表示0,可以用第一个输出神经元**表示1。。。但是到了5的时候我们显然需要用第一第二个神经元都被**来表示,这只是一种简单的推理,实际上**哪一个输出神经元用二进制来映射会比较好,具体在后面习题会有一张表,看表会清晰得多。但是从这里我们可以看出,假如我们有十个输出神经元的话,即使我们隐蔽层只有三个是指向0,一个指向了其他数字,我们也可以用容错机制,比如说获得隐蔽层指向数多的就是正确的,来让它依旧能够正确的输出0,但是用四个神经元情况就不一样了,理论上0是需要四个输出神经元都不**,但是只有隐蔽层分发错误,对上面四个小图中的其中一个认为是其它数字,他可能会完全错误的认为这是其他数字并且没有任何容错的余地。

 

总的来说,这仅仅是一些启发,没有任何东西可以说明这个三层神经元网络必须要像我设计的这样操作 -用隐蔽神经层去检测部分简单的形状。也许你可以设计一个聪明的学习程序可以通过很好的分配让我们仅仅使用四个输出神经元就实现这个任务,但我们基于目前选用的这种方法的假设下,使用十个输出神经元显然是明智的做法。


第六篇 梯度下降の二次代价函数