感知机
1、感知机是什么
感知机是接收多个输入信号,输出一个信号。
如图就是一个接收两个输入信号的感知机。其中x1,x2是输入信号,w1,w2称为权重,y是输出信号。图中的称为神经元或者节点。输入信号被送往神经元时,会乘以相应的权重w1,w2,神经元会计算传送过来的信号的总和。只有当这个信号和超过某个阈值时,才会输出1,这也称为“神经元被激活”。这里阈值用表示。
通常,除了有权重,还会给其信号和加上一个常数,该常数称为偏置,用b表示。
上图用数学公式表示为:
2、感知机实现简单逻辑电路
简单逻辑电路分为与或非,所谓与门就是只在输入全为1时才会输出1,其他情况都输出0;或门是在输入有一个1时就会输出1,当且仅当输入全为0时,才会输出0。
与门的真值表如图所示:
或门的真值表如图所示:
与非门:就是颠倒了与门的输出,真值表如图所示:
利用Python实现与门:(这里我们使用Python的Numpy库实现)
这里我们将w1和w2分别设为0.5,0.5,将偏置设为-0.7,如下所示,可以实现一个简单的与门
import numpy as np
def AND(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.7
temp = np.sum(w * x) + b
if temp <= 0:
return 0
else:
return 1
同理我们可以实现或门和与非门
import numpy as np
def NAND(x1,x2):
x = np.array([x1,x2])
w = np.array([-0.5,-0.5])
b = 0.7
temp = np.sum(w * x) + b
if temp <= 0:
return 0
else:
return 1
def OR(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.2
temp = np.sum(w * x) + b
if temp <= 0:
return 0
else:
return 1
3、感知机的局限性
我们用感知机可以实现的与门,或门和与非门。我们这里继续考虑异或门。
异或门是当且仅当只有一个输入为1时,才会输出1,。真值表如图所示:
实际上,我们利用一个感知机是无法实现如上图所示的异或门的,这里我们利用画图来解释为什么无法实现异或门。
首先以或门为例,之前实现或者的程序中,设(w1,w2,b) = (1,1,-0.5),这里感知机可以用下式表示:
上式所示的感知机会由直线-0.5+x1+x2=0在空间中分为两个空间,其中一个空间输出0另一个空间输出1
其中代表1,表示0 。
同理,如果想正确表示出或门,则需要将0和1正确分开。
异或门的输出如图所示,无法做到用一条直线将0和1的空间正确的分开,故无法用单个感知机实现异或门。
感知机的局限性就在于它只能表示线性分类或者线性回归问题。
4、多层感知机
尽管单个感知机无法实现异或门(非线性运算),但是多个感知机级联在一起就可以实现异或运算(非线性运算)
我们可以用感知机实现与门,或门和与非门,我们可以将与门,或门,与非门级联起来从而实现或门。如下图所示:
其中x1,x2表示输入,s1表示与非门的输出,s2表示或门的输出,y表示与门的输出,通过级联这三个门,可以实现或门运算。
真值表如图所示:
利用Python实现异或门:
def XOR(x1,x2):
s1 = NAND(x1,x2) # 与非门函数
s2 = OR(x1,x2) # 或门函数
return AND(s1,s2) # 与门函数
用感知机的表示方法表示或门如图所示:
左边第一列称为第0层,中间一列称为第1层,右边一列称为第2层。上图所示感知机称为两层感知机(实际上有权重和偏置的只有两层)。通过叠加了多层的感知机的也称为多层感知机。
由此可见,单层感知机可以表示线性空间,多层感知机可以表示非线性空间。