1.4 ⼀个简单的分类⼿写数字的⽹络

定义神经⽹络后,让我们回到⼿写识别上来。我们可以把识别⼿写数字的问题分成两个⼦问题。⾸先,我们希望有个⽅式把包含许多数字的图像分成⼀系列单独的图像,每个包含单个数字。例如,我们想要把图像分成六个单独的图像,

我们⼈类可以很容易解决这个分割的问题,但是对于计算机程序来说却是个挑战。⼀旦图像被分割,那么程序需要把每个单独的数字分类。例如,我们想要我们的程序能识别上⾯的第⼀个数字是5。

我们将专注于编程解决第⼆个问题,分类单独的数字。这样是因为,⼀旦你有分类单独数字的有效⽅法,分割问题是不难解决的。有很多途径可以解决分割的问题。⼀种⽅法是尝试不同的分割⽅式,⽤数字分类器对每⼀个切分⽚段打分。如果数字分类器对每⼀个⽚段的置信度都⽐较⾼,那么这个分割⽅式就能得到较⾼的分数;如果数字分类器在⼀或多个⽚段中出现问题,那么这种分割⽅式就会得到较低的分数。这种⽅法的思想是,如果分类器有问题,那么很可能是由于图像分割出错导致的。这种思想以及它的变化形式能够⽐较好地解决分割问题。因此,与其关⼼分割问题,我们不如把精⼒集中在设计⼀个神经⽹络来解决更有趣、更困难的问题,即⼿写数字的识别。

我们将使⽤⼀个三层神经⽹络来识别单个数字

⽹络的输⼊层包含给输⼊像素的值进⾏编码的神经元。就像下⼀节会讨论的,我们给⽹络的训练数据会有很多扫描得到的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。四个神经元⾜够编码这个问题了,因为24 = 16⼤于10种可能的输⼊。为什么我们反⽽要⽤10个神经元呢?这样做难道效率不低吗?最终的判断是基于经验主义的:我们可以实验两种不同的⽹络设计,结果证明对于这个特定的问题⽽⾔,10个输出神经元的神经⽹络⽐4个的识别效果更好。但是令我们好奇的是为什么使⽤10个输出神经元的神经⽹络更有效呢。有没有什么启发性的⽅法能提前告诉我们⽤10个输出编码⽐使⽤4个输出编码更有好呢?

为了理解为什么我们这么做,我们需要从根本原理上理解神经⽹络究竟在做些什么。⾸先考虑有10个神经元的情况。我们⾸先考虑第⼀个输出神经元,它告诉我们⼀个数字是不是0。它能那么做是因为可以权衡从隐藏层来的信息。隐藏层的神经元在做什么呢?假设隐藏层的第⼀个神经元只是⽤于检测如下的图像是否存在:

为了达到这个⽬的,它通过对此图像对应部分的像素赋予较⼤权重,对其它部分赋予较⼩的权重。同理,我们可以假设隐藏层的第⼆,第三,第四个神经元是为检测下列图⽚是否存在:

就像你能猜到的,这四幅图像组合在⼀起构成了前⾯显⽰的⼀⾏数字图像中的0:

如果所有隐藏层的这四个神经元被激活那么我们就可以推断出这个数字是0。当然,这不是我们推断出0的唯⼀⽅式——我们能通过很多其他合理的⽅式得到0(举个例⼦来说,通过上述图像的转换,或者稍微变形)。但⾄少在这个例⼦中我们可以推断出输⼊的数字是0。

假设神经⽹络以上述⽅式运⾏,我们可以给出⼀个貌似合理的理由去解释为什么⽤10个输出⽽不是4个。如果我们有4个输出,那么第⼀个输出神经元将会尽⼒去判断数字的最⾼有效位是什么。把数字的最⾼有效位和数字的形状联系起来并不是⼀个简单的问题。很难想象出有什么恰当的历史原因,⼀个数字的形状要素会和⼀个数字的最⾼有效位有什么紧密联系。

上⾯我们说的只是⼀个启发性的⽅法。没有什么理由表明这个三层的神经⽹络必须按照我所描述的⽅式运⾏,即隐藏层是⽤来探测数字的组成形状。可能⼀个聪明的学习算法将会找到⼀些合适的权重能让我们仅仅⽤4个输出神经元就⾏。但是这个启发性的⽅法通常很有效,它会节省你⼤量时间去设计⼀个好的神经⽹络结构。

练习

  • 通过在上述的三层神经⽹络加⼀个额外的⼀层就可以实现按位表⽰数字。额外的⼀层把原 来的输出层转化为⼀个⼆进制表⽰,如下图所⽰。为新的输出层寻找⼀些合适的权重和偏置。假定原先的3层神经⽹络在第三层得到正确输出(即原来的输出层)的激活值⾄少是 0.99,得到错误的输出的激活值⾄多是 0.01。