1.感知机的起源
感知机是由美国学者FrankRosenblatt在1957年提出来的。是作为神经网络(深度学习)的起源 的算法。学习感知机的构造也就是学习通向神经网络和深度学习的一种重要思想。
2.感知机的概念
感知机接收多个输入信号,输出一个信号。 这里所说的“信号”可以想象成电流或河流那 样具备“流动性”的东西。像电流流过导线, 向前方输送电子一样,感知机的信号也会形成 流,向前方输送信息。但是,和实际的电流不 同的是,感知机的信号只有“流/ 不流”(1/0) 两种取值。
一个接收两个输入信号的感知机的例子:
3.用单层感知机实现简单逻辑电路
(0,0) | (0,1) | (1,0) | (1,1) | |
AND | 0 | 0 | 0 | 1 |
NOTAND | 1 | 1 | 1 | 0 |
OR | 0 | 1 | 1 | 1 |
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(w*x) + b
if tmp <= 0:
return 0
else:
return 1
def NOTAND(x1,x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w * x) + 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.4
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
if __name__ == '__main__':
print("AND:")
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
print("NOTAND:")
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y2 = NOTAND(xs[0], xs[1])
print(str(xs) + " -> " + str(y2))
print("OR:")
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y3 = OR(xs[0], xs[1])
print(str(xs) + " -> " + str(y3))
4.感知机的局限性
感知机的局限性就在于它只能表示由一条直线分割的空间。弯曲的曲线无法用感知机表示。另外,由曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间。线性、非线性这两个术语在机器学习领域很常见,可以将其想象成直线和曲线。
5.用多层感知机实现异或
异或门的制作方法有很多,其中之一就是组合我们前面做好的与门、与非门、或门进行配置。
异或门是一种多层结构的神经网络。将最左边的一列称为第0 层,中间的一列称为第1层,最右边的一列称为第2层。如下图示的感知机与前面介绍的与门、或门的感知机形状不同。实际上,与门、或门是单层感知机,而异或门是2层感知机。叠加了多层的感知机也称为多层感知机(multi-layered perceptron)。
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(w*x) + b
if tmp <= 0:
return 0
else:
return 1
def NOTAND(x1,x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w * x) + 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.4
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
def XOR(x1,x2):
s1 = NOTAND(x1,x2)
s2 = OR(x1,x2)
y = AND(s1,s2)
return y
if __name__ == '__main__':
print("XOR:")
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = XOR(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
6.总结
多层感知机可以实现比之前见到的电路更复杂的电路。比如,进行加法运 算的加法器也可以用感知机实现。此外,将二进制转换为十进制的编码器、 满足某些条件就输出1的电路(用于等价检验的电路)等也可以用感知机表示。实际上,使用感知机甚至可以表示计算机!
计算机是处理信息的机器。向计算机中输入一些信息后,它会按照某种既定的方法进行处理,然后输出结果。所谓“按照某种既定的方法进行处理”是指,计算机和感知机一样,也有输入和输出,会按照某个既定的规则进行计算。
人们一般会认为计算机内部进行的处理非常复杂,而令人惊讶的是,实际 上只需要通过与非门的组合,就能再现计算机进行的处理。这说明使用感知机也可以表示计算机。前面也介绍了,与非门可以使用感知机实现。也就是说,如果通过组合与非门可以实现计算机的话,那么通过组合感知机 也可以表示计算机(感知机的组合可以通过叠加了多层的单层感知机来表示)。