深度学习入门教程 第一讲

2018-06-21 16:24:54 浏览数 (1)

人类视觉系统是世界上众多奇迹之一。看看下面的手写数字序列:

大多数人毫不费力就能够认出这些数字为 504192。这么容易反而让人觉着迷惑了。在人类的 每个脑半球中,有着一个初级视觉皮层,常称为 V1,包含 1 亿 4 千万个神经元及数百亿条神经 元间的连接。但是人类视觉不是就只有 V1,还包括整个视觉皮层 —— V2、V3、V4 和 V5 —— 他们逐步地进行更加复杂的图像处理。人类的头脑就是一台超级计算机,通过数十亿年的进化 不断地演变,最终能够极好地适应理解视觉世界的任务。识别手写数字也不是一件简单的事。尽 管人类在理解我们眼睛展示出来的信息上非常擅⻓,但几乎所有的过程都是无意识地。所以,我 们通常并不能体会自身视觉系统解决问题的困难。

如果你尝试写出计算机程序来识别诸如上面的数字,就会明显感受到视觉模式识别的困难。 看起来人类一下子就能完成的任务变得特别困难。关于我们识别形状 —— “9 顶上有一个圈, 右下方则是一条竖线”这样的简单直觉 —— 实际上算法上就很难轻易表达出来了。而在你试着 让这些识别规则越发精准时,就会很快陷入各种混乱的异常或者特殊情形的困境中。看起来毫无希望。

神经网络以另一种方式看待这个问题。其主要思想是获取大量的手写数字,常称作训练样本,

然后开发出一个可以从这些训练样本中进行学习的系统。换言之,神经网络使用样本来自动 推断出识别手写数字的规则。另外,通过增加训练样本的数量,网络可以学到更多关于手写数字的知识,这样就能够提升自身的准确性。所以,上面例子中我们只是展出了 100 个训练数字 样本,而通过使用数千或者数百万或者数十亿的训练样本我们也许能够得到更好的手写数字识别器。

本章我们将实现一个可以识别手写数字的神经网络。这个程序仅仅 74 行,不使用特别的神 经网络库。然而,这个短小的网络不需要人类帮助便可以超过 96% 的准确率识别数字。而且, 在后面的章节,我们会发展出将准确率提升到 99% 的技术。实际上,最优的商业神经网络已经 足够好到被银行和邮局分别用在账单核查和识别地址上了。

手写识别常常被当成学习神经网络的原型问题,因此我们聚焦在这个问题上。作为一个原型, 它具备一个关键点:挑战性 —— 识别手写数字并不轻松 —— 但也不会难到需要超级复杂的解决 方法,或者超大规模的计算资源。另外,这其实也是一种发展出诸如深度学习更加高级的技术 的方法。所以,整个教程我们都会持续地讨论手写数字识别问题。本教程后面部分,我们会讨论这些想法如何用在其他计算机视觉的问题或者语音、自然语言处理和其他一些领域中。

当然,如果仅仅为了编写一个计算机程序来识别手写数字,本章的内容可以简短很多!但前 进的道路上,我们将扩展出很多关于神经网络的关键的思想,其中包括两个重要的人工神经元 (感知机和 S 型神经元),以及标准的神经网络学习算法,即随机梯度下降算法。自始至终,我专 注于解释事情的原委,并构筑你对神经网络的直观感受。这需要一个漫⻓的讨论,而不是仅仅 介绍些基本的技巧,但这对于更深入的理解是值得的。作为收益,在本章的最后,我们会准备好了解什么是深度学习,以及它为什么很重要。

1.1 感知机

什么是神经网络?一开始,我将解释一种被称为感知机的人工神经元。感知机在 20 世纪五、 六十年代由科学家 Frank Rosenblatt 发明,其受到 Warren McCulloch 和 Walter Pitts 早期著作的影响。今天,使用其它人工神经元模型更为普遍 —— 在这本书中,以及更多现代的神经网 络著作中,主要使用的是一种叫做 S 型 Sigmoid 神经元的神经元模型。我们很快会讲到 S 型神经元。但是要理解为什么 S 型神经元被定义为那样的方式,值得花点时间先来理解下感知机。

感知机是如何工作的呢?一个感知机接受几个二进制输入,x1, x2, . . .,并产生一个二进制输出:

示例中的感知机有三个输入,x1, x2, x3。通常可以有更多或更少输入。Rosenblatt 提议一个简单的规则来计算输出。他引入权重,w1, w2, . . .,表示相应输入对于输出重要性的实数。神经元的输出,0 或者 1,则由分配权重后的总和

小于或者大于一些阈值决定。和权重一样,阈值是一个实数,一个神经元的参数。用更精确的代数形式:

这就是一个感知机所要做的所有事情!

这是基本的数学模型。你可以将感知机看作依据权重来作出决定的设备。让我举个例子。这 不是非常真实的例子,但是容易理解,而且很快我们会有根多实际的例子。假设这个周末就要 来了,你听说你所在的城市有个奶酪节。你喜欢奶酪,正试着决定是否去参加。你也许会通过给 三个因素设置权重来作出决定:

1. 天气好吗? 2. 你的男朋友或者女朋友会不会陪你去? 3. 这个节日举办的地点是否靠近交通站点?(你没有⻋)

你可以把这三个因素对应地用二进制变量 x1, x2 和 x3 来表示。例如,如果天气好,我们把x1 = 1,如果不好,x1 = 0。类似地,如果你的男朋友或女朋友同去,x2 = 1,否则 x2 = 0。x3也类似地表示交通情况。

现在,假设你是个嗜好奶酪的吃货,以至于即使你的男朋友或女朋友不感兴趣,也不管路有 多难走都乐意去。但是也许你确实厌恶糟糕的天气,而且如果天气太糟你也没法出⻔。你可以 使用感知机来给这种决策建立数学模型。一种方式是给天气权重选择为 w1 = 6 ,其它条件为w2 = 2 和 w3 = 2。w1 被赋予更大的值,表示天气对你很重要,比你的男朋友或女朋友陪你,或 者最近的交通站重要的多。最后,假设你将感知机的阈值设为 5。这样,感知机实现了期望的决 策模型,只要天气好就输出 1,天气不好则为 0。对于你的男朋友或女朋友是否想去,或者附近 是否有公共交通站,其输出则没有差别。

随着权重和阈值的变化,你可以得到不同的决策模型。例如,假设我们把阈值改为 3 。那 么感知机会按照天气好坏,或者结合交通情况和你男朋友或女朋友同行的意愿,来得出结果。换句话说,它变成了另一个不同的决策模型。降低阈值则表示你更愿意去。

很明显,感知机不是人做出决策使用的全部模型。但是这个例子说明了一个感知机如何能权衡不同的依据来决策。这看上去也可以大致解释一个感知机网络能够做出微妙的决定:

在这个网络中,第一列感知机 —— 我们称其为第一层感知机 —— 通过权衡输入依据做出三 个非常简单的决定。那第二层的感知机呢?每一个都在权衡第一层的决策结果并做出决定。以这 种方式,一个第二层中的感知机可以比第一层中的做出更复杂和抽象的决策。在第三层中的感 知机甚至能进行更复杂的决策。以这种方式,一个多层的感知机网络可以从事复杂巧妙的决策。

顺便提一下,当我定义感知机时我说的是感知机只有一个输出。在上面的网络中感知机看上 去像是有多个输出。实际上,他们仍然是单输出的。多个感知机输出箭头仅仅便于说明一个感 知机的输出被用于其它感知机的输入。它和把单个输出线条分叉相比,显得讨巧些。

让我们简化感知机的数学描述。条件

看上去有些冗⻓,我们可以创建两个符号的变动来简化。第一个变动是把

改写成点乘,

这里 w 和 x 对应权重和输入的向量。第二个变动是把阈值移到不等式的另一边,并用感知机的偏置 b ≡ −threshold 代替。用偏置而不是阈值,那么感知机的规则可以重写为:

我们可以把偏置看作一种表示让感知机输出 1(或者用生物学的术语,即激活感知机)有多 容易的估算。对于具有一个非常大偏置的感知机来说,输出 1 是很容易的。但是如果偏置是一 个非常小的负数,输出 1 则很困难。很明显,引入偏置只是我们描述感知机的一个很小的变动, 但是我们后面会看到它引导更进一步的符号简化。因此,在这本书的后续部分,我们不再用阈值,而总是使用偏置。

我已经描述过感知机是一种权衡依据来做出决策的方法。感知机被采用的另一种方式,是计算基本的逻辑功能,即我们通常认为的运算基础,例如“与”,“或”和“与非”。例如,假设我 们有个两个输入的感知器,每个权重为 −2,整体的偏置为 3。这是我们的 感知机:

这样我们得到:输入 00 产生输出 1,即 (−2)∗0 (−2)∗0 3 = 3 是正数。这里我用 ∗ 符 号来显式地表示乘法。但是输入 11 产生输出 0,即 (−2) ∗ 1 (−2) ∗ 1 3 = −1 是负数。如此 我们的感知机实现了一个与非⻔!

与非⻔的例子显示了我们可以用感知机来计算简单的逻辑功能。实际上,我们完全能用感知 器网络来计算任何逻辑功能。原因是与非⻔是通用运算,那样,我们能在多个与非⻔之上构建出 任何运算。例如,我们能用与非⻔构建一个电路,它把两个二进制数 x1 和 x2 相加。这需要计 算按位求和,x1 ⊕ x2,同时当 x1 和 x2 都为 1 时进位设为 1,即进位位正好是按位乘积 x1x2:

为了得到相等的感知机网络,我们把所有与非⻔替换为感知机,其具有两个输入、每个权重 设为 −2,整体偏置为 3。结果我们得到这样的网络。注意我已经把右下的与非⻔移动了一点, 只是为了在图上更方便画箭头:

这个感知机网络中有一个部分值得注意,最左边的感知机的输出被两次作为底部感知机的输 入。当我定义感知机模型时,我没有说过是否允许这种双输出到同一个地方。实际上这不重要。 如果我们不想允许这种形式,那可以简单把两条线合并为到一个权重为 −4 的连接,而不是两 个权重为 −2 的连接。(如果你还没明白,应该停下来证明这是相等的。)随着这一改变,原先的 网络看起来像下面描绘的,所有未标记的权重等于 −2,所有偏置等于 3,标记的单个权重为 −4:

目前为止我把像 x1 和 x2 这样的输入画成感知机网络左边浮动的变量。实际上,可以画一层额外的感知机 —— 输入层 —— 来方便对输入编码:

这种对有一个输出但没有输入的感知机的标记法,

是一种标准。它并不实际表示一个感知机没有输入。为了看清它,假设我们确实有一个没有输入的感知机。那么加权和

会总是为零,并且感知机在 b > 0 时输出 1,当 b ≤ 0 时输出 0。那样,感知机会简单输出一个固定值,而不是期望值(上例中的 x1)。倒不如完全不把输 入感知机看作感知机,而是简单定义为输出期望值的特殊单元,x1, x2, . . 。

通过这个加法器例子,我们演示了一个感知机网络如何用于模拟包含很多与非⻔的电路。因 为与非⻔在计算机运算中的通用性,由此可以得出感知机也同样适用的结论。

感知机运算的通用性既是令人鼓舞的,又是令人失望的。令人鼓舞是因为它告诉我们感知机 网络能和其它计算设备一样强大。但是它也令人失望,因为它看上去只不过是一种新的与非⻔。 这简直不算个大新闻!

然而,实际情况比这一观点认为的更好。其结果是我们可以设计学习算法 ,能够自动调整人工神经元的权重和偏置。这种调整可以自动响应外部的刺激,而不需要一个程序员的直接干预。 这些学习算法是我们能够以一种根本区别于传统逻辑⻔的方式使用人工神经元。有别于显式地 设计与非或其它⻔,我们的神经网络能简单地学会解决问题,这些问题有时候直接用传统的电 路设计是很难解决的。


0 人点赞