[神经网络这次真的搞懂了!] (3) 使用神经网络识别手写数字 - 神经网络

英文原文:http://neuralnetworksanddeeplearning.com/
对原文的表达有部分改动

神经网络的架构

在彻底的介绍和使用神经网络的架构前,让我们对于神经网络的一些名词做定义和解释。假设我们有网络:


如前所述,这个网络中最左边的一层称为输入层,层内的神经元称为输入神经元。最右边的称为输出层,层内包含输出神经元,在这种情况下,包含单个输出神经元。中间层称为隐藏层,该层中的神经元既不是输入也不是输出。 “隐藏”这个词可能听起来有点神秘,它的真正含义只不过是“不是输入或输出”的层。上面的网络只有一个隐藏层,但有些网络包含多个隐藏层。例如,下面的四层网络有两个隐藏层:


由于历史原因,这种多层网络有时被称为多层感知器或 MLPs,尽管由 sigmoid 神经元组成,而不是感知器。

网络中输入和输出层的设计通常很简单。例如,假设我们试图确定手写图像是否描绘了“9”。设计网络的一种方式是将图像像素值(通常是 0~255)编码到输入神经元中。如果图像是 64 x 64 灰度图像,那么我们将有 4096 个输入神经元,强度在 0 和 1 之间适当缩放。输出层将只包含一个神经元,输出小于 0.5 的值表示“输入图像不是 9”,大于 0.5 的值表示“输入图像是 9”。

虽然神经网络的输入和输出层的设计通常很简单,但隐藏层的设计则是一门艺术。特别是,不可能用一些简单的经验法则来总结隐藏层的设计过程。相反,神经网络研究人员为隐藏层开发了许多启发式的设计方法,帮助人们从网络中获得他们想要的行为。例如,此类启发式方法可用于帮助确定如何在隐藏层的数量与训练网络所需的时间之间进行权衡。我们将在本系列后面遇到几个这样的设计启发式方法。

到目前为止,我们一直在讨论神经网络,其中一层的输出用作下一层的输入。这种网络称为前馈神经网络(feedforward neural networks)。这意味着网络中没有环路——信息总是前馈,从不反馈。如果我们确实有循环,我们最终会遇到 σ 函数的输入取决于输出的情况。我们不允许这样的循环。

然而,还有其他的人工神经网络模型,其中反馈回路是可能的。这些模型称为循环神经网络(recurrent neural networks)。为了限制我们的范围,在本书中我们将专注于更广泛使用的前馈网络。

一个简单的手写数字分类网络

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


拆分成一下六个图像:


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



它是5。

我们将专注于编写一个程序来解决第二个问题,即对单个数字进行分类。事实证明,一旦您有一种对单个数字进行分类的好方法,分割问题就不那么难解决了。因此,与其担心分割,我们将专注于开发一个神经网络,它可以解决更有趣和更困难的问题,即识别单个手写数字。

为了识别单个数字,我们将使用三层神经网络:


网络的输入层包含对输入像素值进行编码的神经元。我们的网络训练数据将由许多 28 x 28 像素的扫描手写数字图像组成,因此输入层包含 个神经元。为简单起见,我省略了上图中的大部分 784 个输入神经元。输入像素是灰度的,0.0 的值代表白色,1.0 的值代表黑色,中间的值代表逐渐变暗的灰色阴影。

网络的第二层是隐藏层。我们用 表示这个隐藏层中的神经元数量,我们将试验不同的 n 值。显示的示例说明了一个小的隐藏层,仅包含 个神经元。

网络的输出层包含 10 个神经元。如果第一个神经元触发,即,则表示网络认为数字是 0。如果第二个神经元触发,则表明网络认为数字是 1。并且很快。更准确地说,我们将输出神经元编号为 0 到 9,并找出哪个神经元的激活值最高。如果该神经元的编号为 6,那么我们的网络将猜测输入数字是 6。对于其他输出神经元,依此类推。

您可能想知道为什么我们使用 10 个输出神经元。毕竟,网络的目标是告诉我们哪个数字 (0,1,2,…,9) 对应于输入图像。一种看似自然的方法是仅使用 4 个输出神经元,将每个神经元视为编码二进制值(0x0001,0x0010...),具体取决于神经元的输出是接近 0 还是接近 1。四个神经元足以编码答案,因为 大于输入数字的 10 个可能值。为什么我们的网络应该使用 10 个神经元?那不是导致效率低下吗?最终的理由是经验性的:我们可以尝试两种网络设计。结果证明,对于这个特定问题,具有 10 个输出神经元的网络比具有 4 个输出神经元的网络学习识别数字性能更好。但这让我们想知道为什么使用 10 个输出神经元效果更好。是否有一些启发式方法可以提前告诉我们应该使用 10个输出神经元编码而不是 4个输出神经元编码?

要理解我们为什么要这样做,从第一原则考虑神经网络正在做什么会有所帮助。首先考虑我们使用 10 个输出神经元的情况。让我们专注于第一个输出神经元,它试图确定数字是否为 0。它通过权衡来自神经元隐藏层的证据来做到这一点。那些隐藏的神经元在做什么?(以下为假设,并不是真实情况)假设为了论证,隐藏层中的第一个神经元检测是否存在如下图像:


它可以通过对与图像重叠的输入像素进行大量加权(类似 mask),并对其他输入进行少量加权来做到这一点。以类似的方式,我们假设隐藏层中的第二、第三和第四个神经元检测是否存在以下图像:


您可能已经发觉了,这四个图像一起构成了我们在前面显示的数字行中看到的图像 “0”:


因此,如果所有四个隐藏神经元都被激活,那么我们可以得出结论,数字是 0。当然,这不是我们可以用来得出图像是 0 的唯一证据,我们合法地得到 0 还有许多其他方式(例如,通过上述图像的翻转,或轻微的扭曲)。但可以肯定地说,至少在这种情况下,我们得出的结论是输入是 0。

假设神经网络以这种方式运行,我们可以给出一个合理的解释,解释为什么网络有 10 个输出而不是 4 个更好。如果我们有 4 个输出,输出的关系会让人捉摸不定,二进制最低位并不能与图像产生什么形象的联系(每一种输出都需要使用到最低位,四位是一个整体)。

现在,综上所述,这只是一种启发式方法。没有说三层神经网络必须按照我描述的方式运行,隐藏神经元检测简单的组件形状。也许一个聪明的学习算法会找到一些权重分配,让我们只使用 4 个输出神经元。但是作为一种启发式方法,我所描述的思维方式非常有效,并且可以为您节省大量时间来设计良好的神经网络架构。

你可能感兴趣的:([神经网络这次真的搞懂了!] (3) 使用神经网络识别手写数字 - 神经网络)