感知机(perceptron)是美国人在1957年提出来的一个算法,是神经网络的起源算法。
它能接受多个信号(输入),输入一个信号。
对于感知机而言,信号只有两种0或者1。
通过设置合理的权重与偏置,感知机就可以达到我们想要的目的。
有输入源 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3,其对于的权重是 w 1 , w 2 , w 3 w_1,w_2,w_3 w1,w2,w3,感知机的偏置为 b b b,其中 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3为0或者1。
则当 x 1 × w 1 + x 2 × w 2 + x 3 × w 3 + b > 0 x_1\times w_1 + x_2\times w_2 + x_3\times w_3+b>0 x1×w1+x2×w2+x3×w3+b>0的时候,该感知机的输出就为1,否则就为0。
权重可以理解为每一个输入源在该感知机的所有输入源中的重要程度,或者说它影响力的大小。权重越大,它就越重要,对该感知机输出的影响程度就越大。
而偏置其实就是一个阈值,当超过这个设定阈值的时候,就会输出1,否则就输出0。
首先说明一点,达到某个特定条件所设置的权重与偏置不是唯一的,是有很多种设置方法的。
有两个输入源,部分记为 x 1 , x 2 x_1,x_2 x1,x2,根据运算的性质可以知道,这两个输入源是等价的,即它们对最终感知机输出的影响是一样大的,因此它们的权重 w 1 = w 2 w_1=w_2 w1=w2。
现在考虑偏置,只要满足 w 1 = w 2 ≤ − b < w 1 + w 2 w_1=w_2\le -b < w_1+w_2 w1=w2≤−b<w1+w2都是满足条件的。
这也再次说明了达到某个特定条件的参数设置方法不是唯一的。
运用numpy
库来实现:
def AND(x1, x2):
x = numpy.array([x1, x2])
w = numpy.array([1, 1])
b = -1.5
tmp = numpy.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
同理,只需要稍微修改一下偏置的取值就好了。
只要满足 0 ≤ − b < w 1 = w 2 0\le-b < w_1=w_2 0≤−b<w1=w2都是满足条件的。
运用numpy
库来实现:
def OR(x1, x2):
x = numpy.array([x1, x2])
w = numpy.array([1, 1])
b = -0.5
tmp = numpy.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
不难发现,只需要将与门的所有参数都取各负号,就能得到与非门了。
运用numpy
库来实现:
def NAND(x1, x2):
x = numpy.array([x1, x2])
w = numpy.array([-1, -1])
b = 1.5
tmp = numpy.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
对于一个有 n n n个输入源的感知机,可以看作一个 n n n维空间。
现在空间上分布在 2 n 2^n 2n个点,分别为 ( w 1 , 0 , 0 , ⋯ , 0 ) 、 ( 0 , w 2 , 0 , ⋯ , 0 ) 、 ( 0 , 0 , w 3 , ⋯ , 0 ) 、 ⋯ 、 ( 0 , 0 , 0 , ⋯ , w n ) 、 ( w 1 , w 2 , 0 , ⋯ , 0 ) 、 ⋯ \pod{w_1,0,0,\cdots,0}、\pod{0,w_2,0,\cdots,0}、\pod{0,0,w_3,\cdots,0}、\cdots、\pod{0,0,0,\cdots,w_n}、\pod{w_1,w_2,0,\cdots,0}、\cdots (w1,0,0,⋯,0)、(0,w2,0,⋯,0)、(0,0,w3,⋯,0)、⋯、(0,0,0,⋯,wn)、(w1,w2,0,⋯,0)、⋯
可以看出,每一个点就对应着一种输入的可能。
现在用一个线性的东西,将它们分为两部分,一部分输出1,另一部分就输出0。
在二维平面上有四个点,分别是 ( 0 , 0 ) , ( 0 , 1 ) , ( 1 , 0 ) , ( 1 , 1 ) \pod{0,0},\pod{0,1},\pod{1,0},\pod{1,1} (0,0),(0,1),(1,0),(1,1)
现在用直线 x + y − 1.5 = 0 x+y-1.5=0 x+y−1.5=0把整个平面分成两部分,一部分是 ( 1 , 1 ) \pod{1,1} (1,1),另一部分是 ( 0 , 0 ) , ( 0 , 1 ) , ( 1 , 0 ) \pod{0,0},\pod{0,1},\pod{1,0} (0,0),(0,1),(1,0)
通过图像,也可以非常形象地看出来满足条件的参数设置不是唯一的,因为你可以画和多条直线,都能做到这样对点的划分。
一句精炼的话来概况:感知机就是神经网络中的神经元。
它的重要性不言而喻。
0就表示这个神经元是静息状态,1就表示这个神经元是兴奋状态。
来考虑另一种比较常见的异或门,不难发现无论我们如何设置参数,都无法找到合适的参数。
通过图像来看,显然是不存在一条直线将点 ( 0 , 0 ) , ( 1 , 1 ) \pod{0,0},\pod{1,1} (0,0),(1,1)与点 ( 0 , 1 ) , ( 1 , 0 ) \pod{0,1},\pod{1,0} (0,1),(1,0)分在两个不同的集合中。
那这种情况有没有解决方案呢?
答案是肯定的。
多层感知机就可以完美地解决。