1.1 感知器

什么是神经⽹络?⼀开始,我将解释⼀种被称为“感知器”的⼈⼯神经元。感知器在20世 纪五、六⼗年代由科学家FrankRosenblatt发明,其受到WarrenMcCulloch和WalterPitts早期的⼯作的影响。今天,使⽤其它⼈⼯神经元模型更为普遍——在这本书中,以及更多现代的神 经⽹络⼯作中,主要使⽤的是⼀种叫做S型神经元的神经元模型。我们很快会讲到S型神经元。 但是要理解为什么S型神经元被定义为那样的⽅式,值得花点时间先来理解下感知器。

感知器是如何⼯作的呢?⼀个感知器接受⼏个⼆进制输⼊,x1,x2,...,并产⽣⼀个⼆进制输 出:

⽰例中的感知器有三个输⼊,x1,x2,x3。通常可以有更多或更少输⼊。Rosenblatt提议⼀个简单的规则来计算输出。他引⼊权重,w1,w2,...,表⽰相应输⼊对于输出重要性的实数。神经元的输出,0或者1,则由分配权重后的总和 ∑j wjxj ⼩于或者⼤于⼀些阈值决定。和权重⼀样,阈值是⼀个实数,⼀个神经元的参数。⽤更精确的代数形式:

这就是⼀个感知器所要做的所有事情!

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

  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。那么感知器会按照天⽓好坏,或者结合交通情况和你男朋友或⼥朋友同⾏的意愿,来得出结果。换句话说,它变成了另⼀个不同的决策模型。降低阈值则表⽰你更愿意去。

很明显,感知器不是⼈做出决策使⽤的全部模型。但是这个例⼦说明了⼀个感知器如何能权衡不同的依据来决策。这看上去也可以⼤致解释⼀个感知器⽹络能够做出微妙的决定:

在这个⽹络中,第⼀列感知器——我们称其为第⼀层感知器——通过权衡输⼊依据做出三个⾮常简单的决定。那第⼆层的感知器呢?每⼀个都在权衡第⼀层的决策结果并做出决定。以这种⽅式,⼀个第⼆层中的感知器可以⽐第⼀层中的做出更复杂和抽象的决策。在第三层中的感 知器甚⾄能进⾏更复杂的决策。以这种⽅式,⼀个多层的感知器⽹络可以从事复杂巧妙的决策。

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

让我们简化感知器的数学描述。条件 ∑j wjxj 看上去有些冗⻓,我们可以创建两个符号的变动来简化。第⼀个变动是把 ∑j wjxj 改写成点乘,w·x ≡∑j wjxj,这⾥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这样的输⼊画成感知器⽹络左边浮动的变量。实际上,可以画⼀层 额外的感知器——输⼊层——来⽅便对输⼊编码:

这种对有⼀个输出但没有输⼊的感知器的标记法,是⼀种标准。它并不实际表⽰⼀个感知器没有输⼊。为了看清它,假设我们确实有⼀个没有输⼊的感知器。那么加权和 ∑j wjxj 会总是为零,并且感知器在b > 0时输出1,当b ≤ 0时输出 0。那样,感知器会简单输出⼀个固定值,⽽不是期望值(上例中的x1)。倒不如完全不把输⼊ 感知器看作感知器,⽽是简单定义为输出期望值的特殊单元,x1,x2,...。

这个加法器的例⼦演⽰了⼀个感知器⽹络如何⽤于模拟包含很多与⾮⻔的电路。因为与⾮⻔ 在计算机运算中的通⽤性,由此可以得出感知器也同样适⽤的结论。

感知器运算的通⽤性既是令⼈⿎舞的,⼜是令⼈失望的。令⼈⿎舞是因为它告诉我们感知器⽹络能和其它计算设备⼀样强⼤。但是它也令⼈失望,因为它看上去只不过是⼀种新的与⾮⻔。 这简直不算个⼤新闻!

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