感知机
基于<深度学习入门:基于Python的理论与实现>编写,可以作为深度学习入门准备,由浅入深先客观了解一下深度学习内容。
1. 什么是感知机
感知机是由美国学者Frank Rosenblatt在1957年提出来的,因为感知机也是作为神经网络(深度学习)的起源的算法。因此,学习感知机的构造也就是学习通向神经网络和深度学习的一种重要思想。
感知机接收多个输入信号,输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。像电流流过导线,向前方输送电子一样,感知机的信号也会形成流,向前方输送信息。但是,和实际的电流不同的是,感知机的信号只有“流 / 不流”(1/0)两种取值。在本文中,0 对应“不传递信号”,1 对应“传递信号”。
下图是一个接收两个输入信号的感知机的例子。x1、x2 是输入信号,y 是输出信号,w1、w2 是权重。图中的○称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出 1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号 θ 表示。
2. 简单逻辑电路
2.1 与门(and)
我们可以尝试使用感知机来解决简单的问题,我们首先以逻辑电路为题材思考一下与门(AND),与门是有两个输入和一个输出的门电路。下图这种输入信号和输出信号的对应表称为“真值表”。与门仅在两个输入均为 1 时输出 1,其他时候则输出 0。
2.2 与非门和或门(nand和or)
与非门就是颠倒了与门的输出。用真值表表示的话,如下图 所示,仅当x1和x2同时为1时输出 0,其他时候则输出 1。
3. 感知机实现
3.1 简单实现
下面我们尝试使用Python实现刚才的逻辑电路,首先先定义一个接收参数 x1 和 x2的 AND 函数。
def AND(x1,x2):
w1.w2.theta = 0.5,0.5,0.7
tmp = x1*w1 + x2*w2
if tmp < theta:
return 0
elif tmp > theta:
return 1
在函数内初始化参数 w1、w2、theta,当输入的加权总和超过阈值时返回 1,否则返回 0。
AND(0, 0) # 输出0
AND(1, 0) # 输出0
AND(0, 1) # 输出0
AND(1, 1) # 输出1
3.2 导入权重和偏置
刚才与门的实现比较直接、容易理解,但是考虑到以后的事情,我们将其修改为另外一种实现形式。在此之前,首先把表达式的 θ 换成 -b,于是就可以用下图表达式来表示感知机的行为。
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
偏置和权重的作用是不一样的。具体地说,权重是控制输入信号的重要性的参数,而偏置是调整神经元被激活的容易程度(输出信号为1)的参数。
与非门实现
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5]) # 仅权重和偏置与AND不同!
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]) # 仅权重和偏置与AND不同!
b = -0.2
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
与门、与非门、或门是具有相同构造的感知机,区别只在于权重参数的值。因此,在与非门和或门的实现中,仅设置权重和偏置的值这一点和与门的实现不同。
3.3 感知机的局限性
通过上述文章我们已经知道,使用感知机可以实现与门、与非门、或门三种逻辑电路。现在我们来考虑一下异或门是否可以实现,异或门仅当x1和x2中的一方为1是,才会输出1(异或可以理解为拒绝其他的意思),其真值表如下
接下来我们看下异或门在图中如何表示。
从上图可知,用一条直线是无法将○和△分开的。感知机的局限性就在于它只能表示由一条直线分割的空间。
4. 多层感知机
从上述讲述中我们知道单层感知机无法实现异或门,那我们有什么其他办法使用感知机实现异或门呢?我们可以考虑使用多层感知机来实现。
4.1 异或门实现
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
输出结果:
XOR(0, 0) # 输出0
XOR(1, 0) # 输出1
XOR(0, 1) # 输出1
XOR(1, 1) # 输出0
我们试着用感知机的表示方法(明确地显示神经元)来表示这个异或门
上图所示的 2 层感知机中,先在第 0 层和第 1 层的神经元之间进行信号的传送和接收,然后在第 1 层和第 2 层之间进行信号的传送和接收,具体如下所示。
- 第 0 层的两个神经元接收输入信号,并将信号发送至第 1 层的神经元。
- 第 1 层的神经元将信号发送至第 2 层的神经元,第 2 层的神经元输出 y。
这种 2 层感知机的运行过程可以比作流水线的组装作业。第 1 段(第 1 层)的工人对传送过来的零件进行加工,完成后再传送给第 2 段(第 2 层)的工人。第 2 层的工人对第1层的工人传过来的零件进行加工,完成这个零件后出货(输出)。