1.1 感知器
什么是神经网络?一开始,我将解释一种被称为“感知器”的人工神经元。感知器在 20 世纪五、六十年代由科学家 Frank Rosenblatt 发明,其受到 Warren McCulloch 和 Walter Pitts 早期著作的影响。今天,使用其它人工神经元模型更为普遍 —— 在这本书中,以及更多现代的神经网络著作中,主要使用的是一种叫做 S 型神经元的神经元模型。我们很快会讲到 S 型神经元。但是要理解为什么 S 型神经元被定义为那样的方式,值得花点时间先来理解下感知器。
感知器是如何工作的呢?一个感知器接受几个二进制输入,,并产生一个二进制输出:
示例中的感知器有三个输入,。通常可以有更多或更少输入。Rosenblatt 提议一个简单的规则来计算输出。他引入权重,,表示相应输入对于输出重要性的实数。神经元的输出, 或者 ,则由分配权重后的总和 小于或者大于一些阈值决定。和权重一样,阈值是一个实数,一个神经元的参数。用更精确的代数形式:
这就是一个感知器所要做的所有事情!
这是基本的数学模型。你可以将感知器看作依据权重来作出决定的设备。让我举个例子。这不是非常真实的例子,但是容易理解,而且很快我们会有根多实际的例子。假设这个周末就要来了,你听说你所在的城市有个奶酪节。你喜欢奶酪,正试着决定是否去参加。你也许会通过给三个因素设置权重来作出决定:
- 天气好吗?
- 你的男朋友或者女朋友会不会陪你去?
- 这个节日举办的地点是否靠近交通站点?(你没有车)
你可以把这三个因素对应地用二进制变量 和 来表示。例如,如果天气好,我们把 ,如果不好,。类似地,如果你的男朋友或女朋友同去,,否则 。 也类似地表示交通情况。
现在,假设你是个嗜好奶酪的吃货,以至于即使你的男朋友或女朋友不感兴趣,也不管路有多难走都乐意去。但是也许你确实厌恶糟糕的天气,而且如果天气太糟你也没法出门。你可以使用感知器来给这种决策建立数学模型。一种方式是给天气权重选择为 ,其它条件为 和 。 被赋予更大的值,表示天气对你很重要,比你的男朋友或女朋友陪你,或者最近的交通站重要的多。最后,假设你将感知器的阈值设为 。这样,感知器实现了期望的决策模型,只要天气好就输出 ,天气不好则为 。对于你的男朋友或女朋友是否想去,或者附近是否有公共交通站,其输出则没有差别。
随着权重和阈值的变化,你可以得到不同的决策模型。例如,假设我们把阈值改为 。那么感知器会按照天气好坏,或者结合交通情况和你男朋友或女朋友同行的意愿,来得出结果。换句话说,它变成了另一个不同的决策模型。降低阈值则表示你更愿意去。
很明显,感知器不是人做出决策使用的全部模型。但是这个例子说明了一个感知器如何能权衡不同的依据来决策。这看上去也可以大致解释一个感知器网络能够做出微妙的决定:
在这个网络中,第一列感知器 —— 我们称其为第一层感知器 —— 通过权衡输入依据做出三个非常简单的决定。那第二层的感知器呢?每一个都在权衡第一层的决策结果并做出决定。以这种方式,一个第二层中的感知器可以比第一层中的做出更复杂和抽象的决策。在第三层中的感知器甚至能进行更复杂的决策。以这种方式,一个多层的感知器网络可以从事复杂巧妙的决策。
顺便提一下,当我定义感知器时我说的是感知器只有一个输出。在上面的网络中感知器看上去像是有多个输出。实际上,他们仍然是单输出的。多个感知器输出箭头仅仅便于说明一个感知器的输出被用于其它感知器的输入。它和把单个输出线条分叉相比,显得讨巧些。
让我们简化感知器的数学描述。条件 看上去有些冗长,我们可以创建两个符号的变动来简化。第一个变动是把 改写成点乘,,这里 和 对应权重和输入的向量。第二个变动是把阈值移到不等式的另一边,并用感知器的偏置 代替。用偏置而不是阈值,那么感知器的规则可以重写为:
我们可以把偏置看作一种表示让感知器输出 (或者用生物学的术语,即激活感知器)有多容易的估算。对于具有一个非常大偏置的感知器来说,输出 是很容易的。但是如果偏置是一个非常小的负数,输出 则很困难。很明显,引入偏置只是我们描述感知器的一个很小的变动,但是我们后面会看到它引导更进一步的符号简化。因此,在这本书的后续部分,我们不再用阈值,而总是使用偏置。
我已经描述过感知器是一种权衡依据来做出决策的方法。感知器被采用的另一种方式,是计算基本的逻辑功能,即我们通常认为的运算基础,例如“与”,“或”和“与非”。例如,假设我们有个两个输入的感知器,每个权重为 ,整体的偏置为 。这是我们的感知器:
这样我们得到:输入 产生输出 ,即 是正数。这里我用 符号来显式地表示乘法。但是输入 产生输出 ,即 是负数。如此我们的感知器实现了一个与非门!
与非门的例子显示了我们可以用感知器来计算简单的逻辑功能。实际上,我们完全能用感知器网络来计算任何逻辑功能。原因是与非门是通用运算,那样,我们能在多个与非门之上构建出任何运算。例如,我们能用与非门构建一个电路,它把两个二进制数 和 相加。这需要计算按位求和,,同时当 和 都为 时进位设为 ,即进位位正好是按位乘积 :
为了得到相等的感知器网络,我们把所有与非门替换为感知器,其具有两个输入、每个权重设为 ,整体偏置为 。结果我们得到这样的网络。注意我已经把右下的与非门移动了一点,只是为了在图上更方便画箭头:
这个感知器网络中有一个部分值得注意,最左边的感知器的输出被两次作为底部感知器的输入。当我定义感知器模型时,我没有说过是否允许这种双输出到同一个地方。实际上这不重要。如果我们不想允许这种形式,那可以简单把两条线合并为到一个权重为 的连接,而不是两个权重为 的连接。(如果你还没明白,应该停下来证明这是相等的。)随着这一改变,原先的网络看起来像下面描绘的,所有未标记的权重等于 ,所有偏置等于 ,标记的单个权重为 :
目前为止我把像 和 这样的输入画成感知器网络左边浮动的变量。实际上,可以画一层额外的感知器 —— 输入层 —— 来方便对输入编码:
这种对有一个输出但没有输入的感知器的标记法,
是一种标准。它并不实际表示一个感知器没有输入。为了看清它,假设我们确实有一个没有输入的感知器。那么加权和 会总是为零,并且感知器在 时输出 ,当 时输出 。那样,感知器会简单输出一个固定值,而不是期望值(上例中的 )。倒不如完全不把输入感知器看作感知器,而是简单定义为输出期望值的特殊单元,。
这个加法器的例子演示了一个感知器网络如何用于模拟包含很多与非门的电路。因为与非门在计算机运算中的通用性,由此可以得出感知器也同样适用的结论。
感知器运算的通用性既是令人鼓舞的,又是令人失望的。令人鼓舞是因为它告诉我们感知器网络能和其它计算设备一样强大。但是它也令人失望,因为它看上去只不过是一种新的与非门。这简直不算个大新闻!
然而,实际情况比这一观点认为的更好。其结果是我们可以设计学习算法,能够自动调整人工神经元的权重和偏置。这种调整可以响应外部的刺激,而不需要一个程序员的直接干预。这些学习算法是我们能够以一种根本区别于传统逻辑门的方式使用人工神经元。有别于显式地设计与非或其它门,我们的神经网络能简单地学会解决问题,这些问题有时候直接用传统的电路设计是很难解决的。