什么是神经网络呢?开始,我将讲解一种人工神经元,感知机(Perceptron)。受 Warren McCulloch 和 Walter Pitts的启发,在20世纪50/60年代科学家Frank Rosenblatt开发了感知器。如今,在本书和很多现代的神经网络工作中,更常用的是另一种人工神经元——sigmoid 神经元。我们很快就会学习sigmoid神经元,但是为了理解sigmoid神经元定义的本质,我们首先要理解感知机模型。
那么感知机是怎样工作的呢?一个感知机需要几个输入,x1,x2,...,然后产生单一的二进制输出:
上面例子里的感知机有三个输入,x1,x2,x3,实际上,感知机可以有更多或者更少的输入。Rosenblatt提出了一个简单的规则来计算输出。他介绍了权重(<code>weight</code>),使用实数w1,w2来表示各个输入对输出的重要程度。神经元输出0还是1由加权和
所有感知机就是这样工作的!
这是一个基础的数学模型。你可以理解为感知机通过权衡利弊作出决定。下面举一个例子,虽然不是一个很实际的例子,但是很好理解,接下来我们还会举更多实际的例子。假设周末快要到了,你听说在你们的城市将要举办一个奶酪节。你喜欢奶酪并且想决定是否去参加节日。你可能会通过权衡下面的三个因素来作出你的决定:
- 天气好吗?
- 你的男(女)朋友会陪你去吗?
- 节日地点靠近公交站吗?(你没有自己的车)
我们可以使用相应的二进制数x1,x2,x3来表示这三个因素。例如,若天气好令x1 = 1,天气不好令x1 = 0。同样的,如果你的男(女)朋友也想去就令x2 = 1, 不去就令x2 = 0。x3 和 公共交通站也是一样。
现在假设你非常喜欢奶酪,即使你的男(女)朋友没有兴趣去并且交通并不是很方便,你也会去。但是也许你非常讨厌坏天气,如果天气不好你就不会去。你就可以使用感知机为这种决策建模。比如使天气的w1=6,其他条件的权重w2=2,w3=2,w1的值比较大,这表明天气因素对你的影响比你的女(男)朋友是否陪伴你或者公共交通是否方便对你的影响更大。最后,设置感知机的阈值为5。经过这些设置,感知机实现了决策模型,当天气好时输出1,反之输出0,而你的女(男)朋友是否想去、公共交通是否方便对结果没有影响。
通过调整权重和阈值,能够实现不同的决策模型,比如,使阈值为3,好天气或者你的女(男)朋友想去并且公共交通很方便时你都回去参加节日。换句话说,这是一个不同的决策模型,降低阈值意味着你更想去参加节日。
显然感知机并不是人类决策的完整模型!但是这个例子说明了感知机怎样权衡不同的条件来做出决定。并且复杂的感知机网络能够作出相当微妙的决定似乎是合理的:
在这个网络中,通过权衡输入的数据,感知机的第一列——我们这样称呼感知机的第一层——做了三个非常简单的决策。那感知机的第二列呢?这一层的每个感知机都通过权衡第一层得出的结果做出决策。通过这种方式,第二层的感知机能够比第一层做出更复杂和更抽象的决策,并且第三层更甚。通过这种方式,一个多层感知机组成的网络可以从事复杂的决策。
我定义感知机的时候说感知机只有一个输出,但是上面的感知机看起来有多个输出。事实上,他们仍然只有一个输出,多个输出只是用来表示一个感知机的输出用于多个感知机的输入。
让我们简化一下感知机模型。条件<code>∑jwjxj > threshold</code>比较繁琐,我们可以使用两个符号来简化它。第一个,使用点乘运算,<code>w⋅x ≡ ∑jwjxj</code>,w和x都是向量,分别用来表示权重向量和输入向量。第二个,将阈值移到不等式的另一边,并且使用感知机的偏移(bias)来代替,b = -threshold。使用便宜代替阈值之后,感知机可以表示为:
你可以认为偏移意味着感知机输出1的难易程度,或者用生物学属于来讲,偏移意味着感知机有多容易被激活。例如一个感知机有很大的偏移,它将很容易输出1,但是如果它的偏移很小,它将很难输出1。显然,引入偏移描述感知机只是一个很小的改变,但是在后面它会引起进一步的简化。因此,在本书剩余的部分中,不使用阈值而使用偏移。
我曾把感知机描述为一个通过权重做出决策的方法。另外,感知机可以用来做基本逻辑运算,比如AND、OR和NAND。例如,我们有一个感知机,它有两个输入并且权重都为-2,偏移为3。如下:
易知输入00会输出1,因为(-2)0 + (-2)0 + 3 = 3是正的。这里我是用了*用来表示乘法。同上,易得输入10和01都会输出1,但是输入11却会输出0,因为(−2)∗1+(−2)∗1+3=−1是负数。因此我们的感知机充当了一个NAND门(与非门)!
NAND的例子说明感知机可以用来做基本逻辑运算,事实上,我们可以使用感知机网络做任何逻辑运算。因为与非门是通用的计算,我们可以用与非门实现任何计算。例如,我们可以用与非门建立一个电路实现两个bit相加,x1和x2,这需要计算按位和,x1⊕x2,当x1和x2都为1时进位会被设为1。进位仅仅计算x1x2:
为了得到等价的感知机网络我们全部用两个输入的感知机代替NAND门,权重都为-2并且偏移为3。这是最终的网络:
这个网络中值得注意的是最左边的感知机两次作为最底部感知机的输入。在我定义感知机的时候并没有说明这种double-output-to-the-same-place 情况是否被允许,实际上,它是被允许的。如果我们不想允许这种情况出现,可以把这两条线权重为-2的线合并为一条权重为-4的线。(如果你没有觉得这显然是对的,你应该停下来并且自己证明这是对的。)经过这个改变,网络看起来如下图所示,所有没有标记的权重为-2,所有的偏移为3,并且一个单独的权重为-4:
目前为止,我在途中使用像x1和x2的变量作为右面感知机网络的输入。事实上,更常见的是为网络多画一层感知机——输入层——为输入编码:
这个输入感知机符号是一个缩写,只有输出而没有输入:
但这并不意味着感知机没有输入。换种说法,假设我们有一个没有输入的感知机,那么权重将为0,也就是说,如果b>0输出1,如果b<=0输出0。也就是说,这个感知机将简单的输出一个固定值,而不是我们想要的值(x1,在上面的例子中)。更好的理解应该是不要把输入感知机完全当做感知机,而是一种简单定义为输出想要的值(x1,x2,x3....)的单元。
增加的例子示范了一个感知机网路可以用来模拟一个包含很多NAND的电路。因为NAND门对计算通用,所以感知机同样适用所有计算。
感知机的计算通用性同时令人高兴又令人失望。令人高兴的是这告诉我们感知机网络像其他计算模型一样强大。但是它也是令人失望的,因为他看起来仅仅像一个新的NAND门。这不是什么大新闻!
然而,情况要比上面显示的好。它让我们设计出学习算法,可以用来自动计算人工神经元网络的权重和偏移。这发生在在没有程序员的介入下对外界的刺激做出反应。这些学习算法使我们从根本上跟使用传统逻辑门不一样的使用人工神经元网络。我们的神经元网络可以简单的学习来解决问题,而不是明确的画出电路图,有时有些问题是很难直接设计出传统电路的。