目录
一、何为感知机
感知机接收多个输入信号,输出一个信号,可以将“信号”理解为水流那样具备流动性的东西。但与实际电流不同的是,感知机的信号只有“流/不流”(1/0)两种取值。在下面的学习中,0代表“不传递信号”,1代表“传递信号”。
以下图接收两个输入信号的感知机为例,为输入信号,y是输出信号,为权重,圆圈就为神经元亦或者称为节点。当输入信号被送往神经元时,分别乘以固定的权重,神经元会计算传送过来的信号的总和,只有当总和大于设定的阈值时,输出1。也称“神经元激活”。阈值一般以θ表示。
以数学公式的形式表示:
每个输入信号都有其固有的权重,这些权重发挥着控制各个信号的作用。权重越高,对应信号的重要性越大。
二、简单逻辑电路
2.1 与门、或门、与非门
电路课程中有学过逻辑门电路,这里就简单的在介绍一下。
与门:输入同时为1时,输出为1,其他的时候均为0。
或门:两个输入中只要有有一个为1,输出就为1.
与非门:与非门即颠倒的与门,只有两个输入同时为1时,输出为0,其余均为1。
这里可以将逻辑电路与感知机进行一波联想,就可以发现通过适当的调整权重与阈值的大小感知机就可以变成与门、或门、与非门。
三、感知机的实现
3.1 简单实现
先前的部分了解到感知机在一定程度上与逻辑电路类似。接下来就是利用python对三种逻辑门进行实现:
与门:
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.7 # 定义两个输入的权重,以及阈值
tmp = w1 * x1 + w2 * x2
if tmp <= theta: # 总和与阈值进行对比,大于阈值返回1
return 0
elif tmp > theta:
return 1
print(AND(0, 1))
print(AND(1, 0))
或门,调整阈值大小:
# 或门:输入有一个为1,输出就为1
def Or(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.5
tmp = w1 * x1 + w2 * x2
if tmp >= theta: # 总和与阈值进行对比,大于阈值返回1
return 1
elif tmp < theta:
return 0
print(Or(0, 1))
print(Or(1, 0))
print(Or(0, 0))
print(Or(1, 1))
与非门:
def NAND(x1, x2):
w1, w2, theta = -0.5, -0.5, -0.7 # 定义两个输入的权重,以及阈值
tmp = w1 * x1 + w2 * x2
if tmp <= theta:
return 1
elif tmp > theta:
return 0
3.2 导入权重与偏置
考虑到上述逻辑门的实现并不能满足以后的事情,将其修改为另一种实现形式。
这里的b为偏置,其他的与之前一样。就如公式所示,感知机会计算输入信号和权重的乘积,然后加上偏置,当这个值大于0则输出1,否则输出为0。
利用python中的Numpy库实现感知机:
import numpy as np
x = np.array([0, 1]) # 使用数组来表示两个输入
w = np.array([0.5, 0.5]) # 使用数组来表示两个权重
b = -0.7
res = w * x
res1 = np.sum(res)
result = res1 + b
print(result)
3.3 使用权重和偏置的实现
简单实现一下:
def AND(x1, x2):
x = np.array([x1, x2]) # 使用数组来表示两个输入
w = np.array([0.5, 0.5]) # 使用数组来表示两个权重
b = -0.7
tmp = np.sum(x*w)+b
if tmp <= 0: # 总和与阈值进行对比,大于阈值返回1
return 0
else:
return 1
# 或门:输入有一个为1,输出就为1
def Or(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b= -0.2
tmp = np.sum(w*x) + b
if tmp >= 0: # 总和与阈值进行对比,大于阈值返回1
return 0
else:
return 1
def NAND(x1, x2):
x = np.array([x1, x2]) # 使用数组来表示两个输入
w = np.array([-0.5, -0.5]) # 使用数组来表示两个权重
b = 0.7
tmp = np.sum(x*w)+b
if tmp <= 0: # 总和与阈值进行对比,大于阈值返回1
return 0
else:
return 1
权重是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度(输出信号为1的程度)的参数。当b = -0.1时,则只要输入信号的加权总和超过0.1,该神经元就会被激活,但如果b=-20.0时,那么神经元激活的条件就更难达到。因此,偏置的值就决定了神经元被激活的容易程度。
四、感知机的局限性
当知道感知机能够实现与门、与非门、或门的时候,就会忍不住想能否实现异或门。
异或门的特点是相同为0,不同为1:
这里就会发现我们介绍的感知机是无法实现异或门的。在对权重参数进行调整后可以发现
() =(-0.5, 1.0, 1.0)时是可以满足异或的真值表的。不妨将值代入之前的公式中就可以得到一个直线:
灰色是输出0的区域,异或门与或门不同的有点在于两个输入都为1时,其输出为0,感知机无法仅仅利用一条线性直线就将两种情况分开,而图4中的非线性曲线就能实现了。
五、多层感知机
感知机的绝妙之处在于它可以“叠加层”:
5.1 异或门的实现
电路课程中有学过,通过一个与非门以及一个或门之间相与就能够实现异或门。
python实现:
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = Or(x1, x2)
y = AND(s1, s2)
return y
异或门是一种多层结构的神经网络。如下图6所示,一般将最左边的一列称为第0层,中间一列为第1层,最右边的一列为2层。
第0层的两个神经元接收信号,并将信号发送至第1层的神经元,再由第1层的神经元将信号发送到第2层的神经元,最终输出结果。