免费的AI经典教材!神经网络和深度学习 第一章(迈克尔·尼尔逊)

Neural networks and deep learning

神经网络和深度学习

Michael Nielsen/Jun 2019
迈克尔 尼尔逊/更新至2019年6月


Chapters

章节

  • 1 using neural nets to recognize handwtritten digits 用神经网识别手写数字
  • 2 how the back propagation works 后向传播算法工作原理
  • 3 improving the way neural networks learn 改进神经网络的学习方式
  • 4 a visual proof that neoral nets can compute any function 神经网能计算任何函数的可视化依据
  • 5 why are neural networks hard to train 神经网络为什么难以训练
  • 6 deep leaning 深度学习

第一章 用神经网识别手写数字

人类的视觉系统是世界上的奇迹之一。请看下面这一列手写的数字: 免费的AI经典教材!神经网络和深度学习 第一章(迈克尔·尼尔逊)_第1张图片

大多数人可以很轻易地认出它们:504192。这个案例是具有欺骗性的。在我们大脑的每一个半球,人类有一个主要的视觉中枢,也被称为V1,它有1.4亿神经元,几百亿的神经连接。不仅如此,人类视觉系统不止包括V1,还有一系列神经中枢V2,V3,V4,V5,这些神经中枢进行着更为复杂的图像处理工作。
我们的脑袋里就像装了一台超级计算机,经过几亿年的进化,它可以很出色地适应理解视觉的世界。
识别手写的数字绝非易事,但是,我们人类却令人吃惊地非常擅长理解我们的眼睛告诉我们的事情。但是所有那些工作都是下意识完成的。因此,我们通常并不会感谢我们的视觉系统处理了多难的一个问题。
如果你试着去写一个计算机程序来识别像上面那样的数字,你就会发现视觉模式识别的难度显而易见。我们做起来似乎很简单的事突然变得极其困难。
举例来说,数字“9”在上半部分有个圈,在右下部分有个垂直的线,我们辨别形状的这样一个简单的直觉结果变得很难用算法来表达。
当你努力去吧这些识别的规则搞清楚,你将会很快被各种特例弄得乱成一团。看起来,毫无希望可言。
神经网络用一种不同的方式来解决这个问题。主要的想法是选取大量的手写数字,比如下面的训练实例:
免费的AI经典教材!神经网络和深度学习 第一章(迈克尔·尼尔逊)_第2张图片
然后开发一个能从诸如以上的训练集中学习的系统。换句话说,神经网络使用训练实例来自动推断出识别手写数字要用到的规则。不仅如此,通过增加训练实例的数量,神经网络可以学到关于手写字迹更多的细节,进而提高它的精确度。所以,尽管我只在上文中展示了100个训练数字,也许我们可以使用成千上万,甚至数百万,数十亿的训练实例来搭建一个更好的数字识别器。
在本章中,我们将会编写一个能够学习识别手写数字的神经网络程序。这个程序只有74行,不适用任何特殊的神经网络库。但是,这个看似简短的程序,在不借助人为干预的情况下,可以达到96%的精确程度。
后面,我们还将编写超过99%精确程度的程序。事实上,现在最好的金融神经网络已经好到被银行用来处理支票业务,被邮局用来识别地址。
我们专注于手写数字识别,因为这是通常来讲学习神经网络的很棒的原型问题。作为一个原型问题,识别手写数字同样也是具有挑战性的。但是,它并不是那么的难,以至于需要很复杂的解决方案或者巨大的计算量。而且,这是一个绝佳的方式来进一步开发更高级的技术,比如深度学习。所以在本书中,我们将会不时地回到字迹识别的问题上。在本书的后面,我们将会讨论这些想法是怎样应用到计算机视觉、语音识别、自然语言处理等领域。
诚然,如果本章只是要编写一个计算机程序来识别手写数字,那么本章的篇幅就会很短了。我们还将涉及到关于神经网络的很多关键想法,包括两类重要人造神经元(感知器和Sigmoid神经元),以及神经网络的标准学习算法,也就是随机梯度下降法。

Perceptrons 感知器

什么是神经网络?我们将从介绍感知器这类人造神经元开始。
感知器是由科学家Frank Rosenblatt在上世纪50、60年代开发的,Frank受了Warren McCulloch和Walter Pitts早期工作的启发。
今天人们通常使用其他人造神经元模型,在本书和其他当代神经网络工作中,主要使用的一个模型叫做sigmoid神经元。要了解sigmiod神经元,我们需要知道一些基础知识。
感知器是如何工作的?
一个感知器接收多个二进制的输入:x1,x2,x3等等,产生一个二进制的输出,如下图所示:
免费的AI经典教材!神经网络和深度学习 第一章(迈克尔·尼尔逊)_第3张图片
在上面的例子中,感知器有三个输入x1,x2,x3,通常情况下,可以有更多或者更少的输入。Rosenblatt提出了一个简单的规则来计算这个输出,他引入了权值(weights)w1,w2,w3等等,这些实数表示每个输入对输出的重要性。神经元的输出,0或者1,是根据权重和(weighted sum)
∑ j w j x j \sum_j w_jx_j jwjxj
比门限值(threshold value)大还是小决定的。就像权值一样,门限值也是神经元的一个实数参数。我们可以用数学表达式表述得更清楚一些:
(1) y = { 0 , ∑ j w j x j ≤ 0 1 , ∑ j w j x j > 0 y= \begin{cases} 0,\quad \sum_j w_jx_j\leq 0\\ 1, \quad \sum_j w_jx_j>0 \end{cases} \tag{1} y={0,jwjxj01,jwjxj>0(1)
上面就是感知器的工作原理!
这是个基础的数学模型,你可以把感知器理解为一种通过权衡数值的装置。让我们看一个例子,这不是个很实际的例子,但是很好理解。假设周末马上就要到了,你听说你的城市将会有个音乐节(原著为cheese festival),你很喜欢参加音乐节,现在要决定去不去参加这个音乐节,你可能会根据下面的因素衡量是否要去参加:

  1. 音乐节当天的天气怎么样?
  2. 你的男朋友或者女朋友想和你一起去吗?
  3. 音乐节的举办地点距离公共交通近吗?(假设你没有私家车)

我们可以把这三个因素用对应的二进制变量x1,x2,x3来表示。比方说,如果天气不错,那么 x 1 = 1 x_1=1 x1=1否则为0。
现在我们假设,你真的非常喜欢音乐节,即使你的男朋偶或者女朋友不跟你去。但是,可能你真的厌恶坏天气,如果天气很糟糕你就不会去了。这种情况下,你可以用感知器来描述这种决策问题。假如:
天 气 权 值 w 1 = 6 男 朋 友 w 2 = 2 交 通 w 3 = 2 天气权值 w_1=6男朋友w_2=2 交通w_3=2 w1=6w2=2w3=2
天气的权值更大,表示天气对你来说更重要,假设这个决策问题的门限值是5,经过上述选择,当天气好的时候,无论如何感知器都会输出1(你肯定会去音乐节)。
通过改变权值和门限值,我们可以得到不同的决策问题模型。举例来说假设我们选择一个门限值3,感知器就会决定,无论什么时候天气是好的或者当音乐节离公交很近并且你的男朋友愿意和你一起去,你都会去参加音乐节。换句话说,这将是一个不同的决策模型。降低门限值意味着你更乐意去参加这个音乐节。
显然,感知器并不是人类决策的完整模型。这个例子要说明的是一个感知器为了做出决定是如何权衡不同的根据的。一个复杂的感知器网络足以做出这些细致的决定看起来是可信的:
免费的AI经典教材!神经网络和深度学习 第一章(迈克尔·尼尔逊)_第4张图片
在这个网络中,第一列感知器,我们称之为第一层感知器,只是通过对输入做出三个很简单的决定。那么第二层感知器做什么?第二层的每一个感知器根据第一层的决策输出权衡决策。第三层与第二层一样,我们甚至可以添加更多、更复杂的决策处理模块。
很巧的是,当我定义感知器的时候,我假设感知器网络只有一个输出。但是在上面的感知器却有多个输出。事实上,他们依然是单一输出的。多个输出的箭头仅仅是一种很有用的表示方法,表示一个感知器的输出可以当做多个其他感知器的输入。
让我们来简化描述感知器的方式。
∑ j w j x j \sum_j w_jx_j jwjxj上面的表述方式十分笨重,我们可以用两个改变来简化它。
第一个方式是把上面的形式写成一个点乘形式:
w ⋅ x ≡ ∑ j w j x j w·x\equiv\sum_j w_jx_j wxjwjxj
其中,w和x分别是向量weights和inputs,也就是权值和输入参数。
第二个改变是把门限值移到不等式的另一侧,并把他用感知器的阈值(bias)表示
b ≡ − t h r e s h o l d b\equiv-threshold bthreshold
用阈值代替门限值,感知器表达式可以重写如下:
{ 0 , w ⋅ x + b ≤ 0 1 , w ⋅ x + b > 0 \begin {cases} 0,w·x+b\leq0\\ 1,w·x+b>0 \end{cases} {0,wx+b01,wx+b>0
你可以把bias(b)认为是衡量感知器输出1的难易程度的方法。或者把它用一个更生物学的词汇来表示,bias是启动感知器的度量。对于一个有着很大阈值(bias)的感知器,我们可以很容易地启动感知器。但是如果阈值是一个很小的负数,就会很难使感知器输出1。显而易见,引出阈值(bias)知识我们描述感知器的一个很小的改变,但是后面我们会基于阈值给出更进一步的简化。
我把感知器描述为一种决策衡量依据方法。另一种感知器的用途是用来计算我们通常认为是底层计算的基础逻辑函数,比如说AND、OR和NAND。举例来说,假设我们有一个二输入的感知器,如下图所示:
免费的AI经典教材!神经网络和深度学习 第一章(迈克尔·尼尔逊)_第5张图片
我们知道,输入 x 1 = 0   x 2 = 0 x_1=0\ x_2=0 x1=0 x2=0,输出1,因为 ( − 2 ) ∗ 0 + ( − 2 ) ∗ 0 + 3 = 3 (-2)*0+(-2)*0+3=3 (2)0+(2)0+3=3的结果是正数。假设我们输入 x 1 = 1   x 2 = 1 x_1=1\ x_2=1 x1=1 x2=1,结果是-1,感知器输出负数,所以我们的感知器就充当了一个NAND门。
NAND的例子说明我们可以用感知器计算简单的逻辑函数。事实上,我们可以用感知器网络计算任何逻辑函数。举例来说,我们要搭建一个求和电路,把 x 1   x 2 x_1\ x_2 x1 x2相加,这需要我们计算比特求和 x 1 ⊕ x 2 x_1\oplus x_2 x1x2,也就是异或操作,逻辑电路如下所示:
免费的AI经典教材!神经网络和深度学习 第一章(迈克尔·尼尔逊)_第6张图片
为了得到上面逻辑电路的等效网络,我们用感知器代替所有的NAND门,每一个感知器的权值都是-2,整体的阈值是3,如下图所示:
免费的AI经典教材!神经网络和深度学习 第一章(迈克尔·尼尔逊)_第7张图片
在这个感知器网络中,值得注意的是,最左侧的感知器的输出被用作最下面的感知器的输入两次。在我定义感知器模型的时候,我没有说这种情况是否合理。事实上,这没有太大关系。如果我们不想这种事情发生,我们可以把原来的两个输入改成一个输入,权值改成-4,如下图所示:
免费的AI经典教材!神经网络和深度学习 第一章(迈克尔·尼尔逊)_第8张图片
到现在为止,我一直在把 x 1   x 2 x_1\ x_2 x1 x2这样的输入当做感知器网络的左侧变量。事实上,更经典的做法是建立额外的一层感知器——输入层,如下所示:
免费的AI经典教材!神经网络和深度学习 第一章(迈克尔·尼尔逊)_第9张图片
这个记号代表输入感知器,它没有输入,只有输出:
在这里插入图片描述
但是,这只是一种速记法(shorthand),它并不代表一个没有输入的感知器。让我们来理解一下,假设我们真的有一个没有输入的感知器,那么加权和 ∑ j w j x j \sum_jw_jx_j jwjxj将永远等于0,所以这个感知器在 b > 0 b>0 b>0的时候输出1,反之输出0,也就是说,感知器知乎输出一个固定值,而不是我们想要的数值。所以,我们最好把输入感知器当做不是一个真正的感知器,而是把它当做一个只产生固定数值的特殊单元。
加法器的例子说明了感知器网络是怎样的被用来模拟一个包含很多NAND门的电路,因为NAND门在逻辑计算中是通用的,所以感知器可以实现任何形式的计算。
感知器的计算通用性既是可靠的(reassuring)又是令人失望的(disappointing)。它是可靠的,因为它告诉我们感知器网络可以与任何其他计算设备一样足够强大。他也是令人失望的,因为感知器看起来只是一种新型的NAND门。

未完待续,持续翻译中,敬请期待^ _ ^

你可能感兴趣的:(神经网络,深度学习)