1.4 一个分类手写数字的简单神经网络(七)

定义完了神经网络,让我们回到手写识别。我们可以将手写识别这个问题分解成两个子问题。第一,我们需要将一张包含很多数字的图片分解成只包含一个数字的单独图片序列。例如,我们要把这幅图片

1.4 一个分类手写数字的简单神经网络(七)_第1张图片

分解成6个单独的图片,

我们人类很容易就能处理这种 分割问题,但是对计算机程序来说,正确的分割照片是一个挑战。一旦照片被分割完成,程序接下来需要分类每个单独的数字。所以,例如,我们要程序识别上面的第一个数字,

是5。

我们将主要写一个解决第二个问题的程序,也就是识别单独数字。我们这样做是因为分割问题并不是很难解决,一旦你找到了一个分类单独数字的好方法,将会有很多方法解决分割问题。一种方法就是尝试不同的分割方法,使用数字分类器为每个分割打分。如果数字分类器对每一个分段的置信度都很高,那么这个分割就会得到很高的分数。相反,数字分类器在一个或多个分段上出现问题,那么这个分割方法就会得到很低的分数。这个方法的关键是如果分类器出现了问题,那么这有可能是因为分割方法不对造成的。这个方法或其他的变种可以很好的解决图片分割问题。与其关心分割问题还不如把精力集中在开发一个神经网路来解决更有趣和更难的问题,即手写数字识别。

为了解决这个问题,我们将使用一个三层网络:


1.4 一个分类手写数字的简单神经网络(七)_第2张图片

输入层是对输入像素编码的神经元。接下来的部分,我们将使用28x28像素的扫描手写数字图片组成训练数据,因此输入层包含784=28x28个神经元。为了简便,上图中我省略了784个神经元中的大部分。输入的像素点是其灰度值,0.0代表白色,1.0代表黑色,中间值表示不同程度的灰度值

第二层是隐层,我们用n表示这一层中的神经元的个数,我们将尝试不同大小的n。举例的图中是一个很小的隐层,仅仅包含n=15个神经元。

这个网络的输出层包含了10个神经元。如果第一个神经元激活了,例如输出1,则表明网络认为数字是0,如果第二个神经元激活了,则表明神经元认为数字是1,等等。说的更明确一点,我们为每个神经元从0到9进行编号,然后观察哪个神经元有最高的活动值。如果这个神经元是6号神经元,那么可以得到神经网络的输出是6。其他的也是如此。

你也许对为什么用10个输出神经元感到奇怪。毕竟这个神经网络的目标是哪一个数字和我们输入的图片一致。看起来更自然的做法是使用4个输出神经元,将每一个神经元二值化,取决于神经元的输入是否接近0或1。四个神经元足够编码答案的解,因为2^4 = 16远远超过了10种可能输入的数字。为什么我们要用10个神经元代替呢?这难道不是低效的吗?终极原因源于经验:我们可以同时试验设计两个神经网络,然而事实证明,在这个特殊的问题上,10个神经元的神经网络要比4个输出神经元的神经网络要好。令我们好奇的是为什么使用10个输出神经元更有效呢?有什么启发式的思考可以提前告诉我们为什么使用10个输出神经元替代4个输出神经元的编码吗?

为了理解我们为什么这样做,需要从根本原理上思考神经网络是怎样做的。思考第一种我们使用10个出书神经元的情况,让我们集中在第一个输出神经元上,它尽力决定输入数字是不是0。他通过权衡隐层的输入来做出决策。那隐层神经元做了什么呢?假设隐层的第一个神经元只是为了检查是否存在以下图像:

1.4 一个分类手写数字的简单神经网络(七)_第3张图片

它可以通过增加和它重叠部分的权重,而减少其他输入的权重。同样的,我们假设隐层第2/3/4个神经元是为了识别以下的图片:

1.4 一个分类手写数字的简单神经网络(七)_第4张图片

也许你已经猜到了,这四个图片组合成了我们之前看到的数字0图片:

1.4 一个分类手写数字的简单神经网络(七)_第5张图片

因此,如果这四个神经元被激活了,我们可以认为数字是0。当然,这不是唯一的能得出这个图片是0的方法,我们还有很多其他合理的方法(比如,对上述图像做些转换,或者轻微的变形)。但是在这里,这种方法可以得出输入是0。

假设神经网络以这种方式工作,我们可以给出一个貌似合理的解释,为什么10个输出神经元工作的要比4个输出神经元要好。如果我们有4个输出,那么第一个神经元就会尽力判断最高有效位是什么,把数字的最高有效位和数字的形状联系取来并不是一个简单的问题。很难想想有什么恰当的历史原因,数字的形状和最高有效位有什么紧密联系。

上面所说的仅仅是给出一个启示。没有什么能够表明神经网络像我说的那样工作,即隐层判断数字的形状。也许一个聪明的学习算法将会找到一些合适的权重让我们仅仅用4个输出神经元就行。但是,这个启发式的思考通常很有效,它会节省你大量的时间去设计一个好的神经网络架构。

你可能感兴趣的:(1.4 一个分类手写数字的简单神经网络(七))