使用神经网络识别手写数字

使用神经网络识别手写数字

人的视觉系统是世界的奇观之一。就比如下列的手写字体来说:

图1

大多数人毫不费力的就能识别出这些数字是504192。这种简单是个假象。在我们的大脑的每个半球里,有个主视觉皮层\(V_1\),它包含有14亿神经元,其中有数十亿级的连接。然而,人类的实际不仅仅是\(V_1\),同时包括一系列的视觉皮层,例如\(V_2,V_3,V4\)\(V_5\),它们在做更加复杂的图像处理。我们将我们的脑袋比作一台超级计算机,它经过树十亿年的进化,才适应识别视觉世界。识别手写的数字并非一件容易的事。当然,我们人类也是非常令人惊奇的,非常擅长对将眼睛所观察到得视觉的东西转换成有意义的事。但是这一切都是在没有意识的情况下发生的。因此,我们不会为我们的视觉系统解决如此困难的问题而感到惊奇。

如果您想要写一个如上数字的识别系统并非一件容易的事。当我们想要完成一件非常难的事时什么是一件容易的事。直观的我们怎样识别形状,例如数字“9”在顶部有一个环形,在底部右下方有个竖直的笔画,这样在算法上也并非易事。当你试图准确的去找这些规律时,你会很快迷失在这大量的异常和特别的案例。这样觉得没有希望。

图2

神经网络使用不同的方法解决这个问题。它将大量的手写数字作为训练集,然后从这些训练集中学习出一个系统,即神经网络使用使用案例自动去推理识别手写数字的规则。进一步说,增加训练的样本数目,网络能够学习更多的手写字,从而提高准确性。然后在上图中我们只展现了100哥训练数字,可能我们可以用数千、数十万、数亿的训练样本能够构建一个更加好的手写数字识别系统。

接下来我们实现一个神经网络通过学习去识别手写数字。该程序仅仅74行代码,同时没有使用额外的神经网络库。但是,该简短的代码在没有人工干预的情况下,识别的准确率超过96%。

神经网络有2个重要的神经元类型,感知器和sigmoid神经元,以及使用随机梯度下降的标准学习算法。

感知器

什么是神经网络?首先,我们将会介绍一种神经元,感知器。它是十九世纪50年代由Frank Rosenblatt提出。如今,使用更多的是其他神经元模型,例如sigmoid神经元。

感觉器怎样运行?感知器将一系列的二进制作为输入,例如\(x_1,x_2,...\),产生一个二进制输出。

图3

如上图所示,感知器接收3个输入,\(x_1,x_2,x_3\)。通常它将会有更多的输入。Frank Rosenblatt提出一种更加简单的规则计算输出。他提出一种度量weights,\(w_1,w_2,...\),该度量表示相应的输入对于输出的权重。神经元的输出是0或者1,是由度量值的和决定。如果\(\sum_j{w_j x_j}\)小于或者大于某个阀值,它就相应得取0或者1.

\[\begin{eqnarray} \mbox{output} & = & \left\{ \begin{array}{ll} 0 & \mbox{ ,} \sum_j w_j x_j \leq \mbox{ threshold} \\ 1 & \mbox{ ,} \sum_j w_j x_j > \mbox{ threshold} \end{array} \right. \end{eqnarray}\]

这就是基本的数学模型。你能够假设感知器就是一个基于权重的选择器。例如,周末就要来临,你听说将会在你的城市里举办一个奶酪节。你喜欢奶酪,同时试图决定是否去参与这个节日。你将通过下面3哥事来决定你是否去参加:

  1. 天气怎样?
  1. 你的男朋友或者女朋友愿意陪你去?
  1. 你没有车,所以你将要考虑附近是否有公交车站?

故而我们可以将这三件事定义为\({x_1,x_2,x_3}\)。例如,\(x_1 = 1\)代表天气很好,那么\(x_1 = 0\)代表着天气很差。同时可以修改权重,表示对不同因素的决定程度。最后,可以通过修改权重值与阀值来确定不同模型的决策选择。

图3

在该网络中,感知器第一列,我们称之为第一层感知器,该层通过不同的输入权重,得到各不同的选择。第二层感知器是干啥的呢?第二层感知器将第一层的感知器输出值作为输入,通过权重与阀值确定不同的选择,这样第二层感知器的更加复杂与抽象。第三层的感知器更加复杂与抽象。按照这样的方式,多层感知器通过我们的经验能够构造出来。

然而,当我们在前面说过一个感知器只有一个输出。而在上面的感知器中好像有多个输出。实际上,它们仍然只有一个输出。多个输出箭头只是表示该感知器的输出被多个下一个感知器引用。

为了简化感知器。我们可以将阀值作为感知器的一个输入偏置,从而可以将数学模型改写如下:

\[\begin{eqnarray} \mbox{output} = \left\{ \begin{array}{ll} 0 & \mbox{if } w\cdot x + b \leq 0 \\ 1 & \mbox{if } w\cdot x + b > 0 \end{array} \right. \tag{2}\end{eqnarray}\]

Sigmoid神经元

学习算法很难。但是我们怎样设计这样一个神经网络算法呢?假设我们通过一些神经网络的感知器去解决某些问题。

posted @ 2016-01-16 10:37  晓来东去  阅读(675)  评论(0编辑  收藏  举报