问题

定义了神经网络后,让我们回到手写识别领域。我们可以将识别手写数字的问题分为两个子问题。首先,我们希望有一种方法将包含多个数字的图像分解为一系列单独的图像,每个图像包含一个单独的数字。例如,我们希望分解图像为六个独立的图像
【第四章】简单网络实现手写数字分类-网络架构-LMLPHP
【第四章】简单网络实现手写数字分类-网络架构-LMLPHP
我们人类可以轻松解决这个分割问题,但对于计算机程序来说,正确地分割图像是具有挑战性的。一旦图像被分割,程序接着需要对每个单独的数字进行分类。因此,举例来说,我们希望我们的程序能够识别上述的第一个数字。
【第四章】简单网络实现手写数字分类-网络架构-LMLPHP
这个是数字5

我们将专注于编写一个程序来解决第二个问题,即对单个数字进行分类。我们之所以这样做,是因为事实证明,一旦你有了一个良好的分类单个数字的方法,分割问题就不那么难解决了。解决分割问题有许多方法。一种方法是尝试许多不同的图像分割方式,利用单个数字分类器对每个试验分割进行评分。如果单个数字分类器在所有分割中对其分类有信心,则试验分割得到高分;如果分类器在一个或多个分割中遇到了很多困难,则得到低分。这个想法是,如果分类器在某个地方遇到困难,那么很可能是因为选择的分割方法不正确。这个想法和其他变种可以很好地解决分割问题。因此,我们不再担心分割,而是专注于开发一个能够解决更有趣和更困难的问题的神经网络,即识别单个手写数字。

网络

为了识别单个数字,我们将使用一个三层神经网络:
【第四章】简单网络实现手写数字分类-网络架构-LMLPHP
网络的输入层包含编码输入像素值的神经元。如下一节所讨论的,我们网络的训练数据将包含许多28x28像素的手写数字扫描图像,因此输入层包含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。四个神经元足以编码答案,因为2的四次方=16比输入数字的10种可能值更多。为什么我们的网络要使用10个神经元而不是4个呢?这不是很低效吗?最终的理由是经验性的:我们可以尝试两种网络设计,结果发现,对于这个特定的问题,具有10个输出神经元的网络比具有4个输出神经元的网络更好地学会识别数字。但这让我们想知道为什么使用10个输出神经元更有效。有没有一些启发式的方法可以提前告诉我们应该使用10个输出编码而不是4个输出编码?

要理解为什么我们这样做,有助于从第一性原则出发考虑神经网络在做什么。首先考虑使用10个输出神经元的情况。让我们专注于第一个输出神经元,试图决定该数字是否为0。它通过权衡隐藏层神经元的证据来做到这一点。那些隐藏神经元在做什么呢?嗯,只是为了论证假设,假设隐藏层的第一个神经元检测到是否存在以下类型的图像:
【第四章】简单网络实现手写数字分类-网络架构-LMLPHP
它可以通过大幅加权与图像重叠的输入像素来实现这一点,并仅轻微加权其他输入。类似地,为了论证假设,让我们假设隐藏层中的第二、第三和第四个神经元检测是否存在以下类型的图像:
【第四章】简单网络实现手写数字分类-网络架构-LMLPHP
正如你可能已经猜到的那样,这四幅图像共同构成了我们之前在数字行中看到的0图像。
【第四章】简单网络实现手写数字分类-网络架构-LMLPHP
因此,如果这四个隐藏神经元都在激活,那么我们可以得出结论,这个数字是0。当然,这不是我们得出图像为0的唯一证据方式 - 我们可以合理地通过许多其他方式得到一个0(比如,通过上述图像的平移或轻微扭曲)。但至少在这种情况下,我们可以安全地假设输入是0。

假设神经网络以这种方式运作,我们可以对为什么从网络输出10个结果而不是4个给出一个合理的解释。如果我们只有4个输出,那么第一个输出神经元将尝试决定数字的最高有效位是什么。而且很难将这个最高有效位与上面显示的简单形状联系起来。很难想象数字的组成形状与输出中的最高有效位有任何良好的历史联系。

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

03-16 10:28