深度学习与神经网络入门必读4!

一个简单的神经网络对手写数字进行分类:

定义了神经网络之后,让我们回到手写识别。我们可以把识别手写数字的问题分成两个子问题。首先,我们想要一种将包含许多数字的图像分解成一系列单独图像的方法,每个图像包含一个数字。例如,我们想要拆解这个图像:

深度学习与神经网络入门必读4!

到六个分离的图像:

深度学习与神经网络入门必读4!

我们人类很容易地解决了这个分割问题,但是对于计算机程序来说,正确地分割图像是很有挑战性的。一旦图像被分割,程序就需要对每个数字进行分类。例如,我们希望我们的程序能识别上面的第一个数字是5.。

深度学习与神经网络入门必读4!

我们将专注于编写一个程序来解决第二个问题,即对单个数字进行分类。我们这样做是因为,一旦你有了一种很好的方法来对个位数进行分类,那么分割问题就不难解决了。有许多解决分割问题的方法。一种方法是尝试许多不同的分割图像的方法,使用单个的数字分类器来评分每个试分。如果单个数字分类器对其在所有区段中的分类有信心,并且分类器在一个或多个区段中有很多麻烦,则试块获得高分。这个想法是,如果分类器在某个地方遇到麻烦,那么它可能有麻烦,因为分割被错误地选择了。这种思想和其他的变化可以很好地解决分割问题。因此,我们不用担心分割,而是专注于开发一个能够解决更有趣和更困难的问题的神经网络,即识别单个手写数字。
为了识别个位数,我们将使用三层神经网络:

深度学习与神经网络入门必读4!

网络的输入层包含编码输入像素值的神经元。正如在下一节中所讨论的,我们的培训数据网络将包括许多28 * 28像素的图像扫描手写的数字,所以输入层包含784 = 28×28个神经元。为了简单起见,我在上图中省略了大部分784的输入神经元。输入像素为灰度值,值为0 .0表示白色,代表黑色的值为1.0,中间值表示逐渐变暗的灰色阴影。


网络的第二层是隐藏层。我们用n表示这个隐藏层神经元的数量,我们将尝试不同的n值。这个例子展示了一个隐藏的小层,包含了n= 15个神经元。


网络的输出层包含10个神经元。如果第一个神经元**,也就是。,有一个输出≈1,然后将说明网络认为数字是0。如果第二个神经元触发,那将表明网络认为数字是1。等等。更准确地说,我们将从0到9的输出神经元编号,并计算出哪个神经元的**值最高。如果这个神经元是6号神经元,那么我们的网络就会猜出输入数字是6。其他输出神经元也一样。


你可能想知道为什么我们使用10个输出神经元。毕竟,网络的目的是告诉我们哪个数字(0,1,2,…,9)对应于输入图像。一种看起来很自然的方法是使用4个输出神经元,将每个神经元处理成二进制值,这取决于神经元的输出是否接近0或1。4个神经元可以编码答案,因为24 =16,是输入数字的10个可能值。为什么我们的网络要使用10个神经元呢?这不是效率低下吗?最终的理由是经验的:我们可以尝试两个网络设计,结果是,对于这个特定的问题,10输出神经元的网络学习识别数字比拥有4个输出神经元的网络更好。但这让我们想知道为什么使用10个输出神经元的效果更好。是否有一些启发式可以提前告诉我们,我们应该使用10输出编码而不是4输出编码?


为了理解我们为什么这样做,它帮助我们思考神经网络从最初的原理中做了什么。首先考虑我们使用10个输出神经元的情况。让我们把注意力集中在第一个输出神经元上,这个神经元试图决定数字是否为0。它通过对隐藏的神经元层的证据进行权衡。那些隐藏的神经元在做什么?好吧,假设一个隐藏层的第一个神经元检测到像下面这样的图像是否存在:

深度学习与神经网络入门必读4!

它可以通过高度加权输入像素来实现这一目标,它与图像重叠,并且只对其他输入进行轻量化。以同样的方式,让我们假设,为了论证,隐藏层的第二、第三和第四神经元会检测到下列图像是否存在:

深度学习与神经网络入门必读4!

正如您可能已经猜到的,这四个图像组成了我们在前面的数字中所看到的0图像:

深度学习与神经网络入门必读4!

如果这四个隐藏的神经元都被**那么我们可以得出这个数字是0。当然,这并不是我们可以用来推断图像是0的唯一证据,我们可以通过其他方式合法地得到一个0(比如,通过上述图像的翻译,或者轻微的失真)。但至少在这种情况下,我们可以得出结论,输入是0。


假设神经网络的功能是这样的,我们可以给出一个合理的解释,为什么从网络中得到10个输出,而不是4个。如果我们有4个输出,那么第一个输出神经元将试图决定这个数字中最重要的位是什么。没有简单的方法可以将最重要的一点与上面所示的简单形状联系起来。很难想象,有什么好的历史原因,数字的组成部分会与输出中最重要的部分密切相关。


说了这么多,这都是启发式。没有什么东西说三层神经网络必须像我描述的那样运作,隐藏的神经元检测简单的组件形状。也许一个聪明的学习算法会找到一些权重分配,让我们只使用4个输出神经元。但作为一种启发,我所描述的思维方式很好,可以为你节省大量时间来设计良好的神经网络架构。


练习:
通过在上面的三层网络中添加一个额外的层,有一种方法可以确定一个数字的位表示。额外的层将前一层的输出转换为二进制表示,如下图所示。为新的输出层找到一组权重和偏差。假设第一个3层的神经元是这样的,第三层的输出是正确的。旧的输出层至少有0.99的**,错误输出的**小于0.01。

深度学习与神经网络入门必读4!