一. 感知机的定义
感知机接收多个输入信号,输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。像电流流过导线,向前方输送电子一样,感知机的信号也会形成流,向前方输送信息。但是,和实际的电流不同的是,感知机的信号只有“流/不流”(1/0)两种取值。
其中
x
1
、
x
2
x_1、x_2
x1、x2是输入信号,
y
y
y是输出信号,
w
1
、
w
2
w_1、w_2
w1、w2是权重。输入信号被送往神经元时,会被分别乘以固定的权重
(
w
1
、
w
2
)
(w_1、w_2)
(w1、w2)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号
θ
θ
θ表示。用数学表达式表达如下:
二. 感知机实现基本逻辑电路
1. 与门
与门仅在两个输入均为1时输出1,其他时候则输出0。与门的真值表如下:
2. 或门
或门只要有一个输入信号是1,输出就为1。或门的真值表如下:
3. 与非门
与非门当两个输入信号同时为1时输出0,其他时候则输出1。与非门的真值表如下:
4. 异或门
异或门在两个输入信号相同(同时为0或者为1)时输出0,其他时候输出1。
5. 感知机实现基本逻辑电路
import numpy as np
# 与门
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:
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:
return 0
else:
return 1
# 或门
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
tmp = np.sum(x * w) + b
if tmp <= 0:
return 0
else:
return 1
if __name__ == '__main__':
print("与门:输入x1 = 1,x2 = 1,输出 =",AND(1, 1))
print("与门:输入x1 = 0,x2 = 1,输出 =", AND(0, 1))
print("与门:输入x1 = 0,x2 = 0,输出 =", AND(0, 0))
print("或门:输入x1 = 1,x2 = 1,输出 =", OR(1, 1))
print("或门:输入x1 = 1,x2 = 0,输出 =", OR(1, 0))
print("或门:输入x1 = 0,x2 = 0,输出 =", OR(0, 0))
print("与非门:输入x1 = 1,x2 = 1,输出 =", NAND(1, 1))
print("与非门:输入x1 = 1,x2 = 0,输出 =", NAND(1, 0))
print("与非门:输入x1 = 0,x2 = 0,输出 =", NAND(0, 0))
运行结果:
与门:输入x1 = 1,x2 = 1,输出 = 1
与门:输入x1 = 0,x2 = 1,输出 = 0
与门:输入x1 = 0,x2 = 0,输出 = 0
或门:输入x1 = 1,x2 = 1,输出 = 1
或门:输入x1 = 1,x2 = 0,输出 = 1
或门:输入x1 = 0,x2 = 0,输出 = 0
与非门:输入x1 = 1,x2 = 1,输出 = 0
与非门:输入x1 = 1,x2 = 0,输出 = 1
与非门:输入x1 = 0,x2 = 0,输出 = 1
三. 感知机的局限性与解决
1. 单个感知机的局限
前面我们通过感知机已经实现了与门,或门,与非门,但是感知机无法实现异或门。
我们试着将或门的动作形象化。或门的情况下,当权重参数
(
b
,
w
1
,
w
2
)
=
(
−
0.5
,
1.0
,
1.0
)
(b, w_1, w_2) = (−0.5, 1.0, 1.0)
(b,w1,w2)=(−0.5,1.0,1.0)时,可满足或门的真值表条件。此时,感知机可用下式表示。
感知机会生成由直线
−
0.5
+
x
1
+
x
2
=
0
−0.5 + x_1 + x_2 = 0
−0.5+x1+x2=0分割开的两个空间。其中一个空间输出1,另一个空间输出0。
或门在
(
x
1
,
x
2
)
=
(
0
,
0
)
(x_1, x_2) = (0, 0)
(x1,x2)=(0,0)时输出0,在
(
x
1
,
x
2
)
(x_1, x_2)
(x1,x2)为
(
0
,
1
)
、
(
1
,
0
)
、
(
1
,
1
)
(0, 1)、 (1, 0)、 (1, 1)
(0,1)、(1,0)、(1,1)时输出1。下图中,
○
○
○表示0,
△
△
△表示1。如果想制作或门,需要用直线将图中的
○
○
○和
△
△
△分开。实际上,刚才的那条直线就将这4个点正确地分开了。
换成异或门的话会如何?如下图所示。
显然从图中可以看出,不能使用一条直线将图中的
○
○
○和
△
△
△分开。
单个感知机的局限性就在于它只能表示由一条直线分割的空间。
2. 多层感知机
感知机可以通过叠加实现非线性可分的问题。异或门可以通过与门,与非门,或门的叠加实现。
异或门编程实现
# 异或门
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
print("异或门:输入x1 = 1,x2 = 1,输出 =", XOR(1, 1))
print("异或门:输入x1 = 1,x2 = 0,输出 =", XOR(1, 0))
print("异或门:输入x1 = 0,x2 = 1,输出 =", XOR(0, 1))
print("异或门:输入x1 = 0,x2 = 0,输出 =", XOR(0, 0))
运行结果:
异或门:输入x1 = 1,x2 = 1,输出 = 0
异或门:输入x1 = 1,x2 = 0,输出 = 1
异或门:输入x1 = 0,x2 = 1,输出 = 1
异或门:输入x1 = 0,x2 = 0,输出 = 0