感知机(perceptron):感知机是神经网络(深度学习)的起源算法,学习感知机的构造是通向神经网络和深度学习的一种重要思想。
感知机接收多个输入信号,输出一个信号。信号只有0、1两种取值。
如图是一个接收两个输入信号的感知机:
x1、x2是输入信号;y是输出信号;w1、w2是权重;图中的○称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重(w1x1、w2x2)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出 1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号 θ 表示。根据以上规律可以导出其公式为:
【说明】:感知机的输入信号都有各自固有的权重,这些权重发挥着控制各个信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就越高。
import numpy as np
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
if __name__ == '__main__':
for xs in [(0, 0), (1, 0), (0, 1), (1, 1)]:
y = AND(xs[0], xs[1])
print(str(xs) + " -> " + str(y))
(0, 0) -> 0
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 1
【说明】:实际上,满足条件的参数的选择方法有无数多个。比如,当(w1,w2,b)=(0.5,0.5,0.7)时,可以满足条件。此外,当(w1,w2,b)为(0.5, 0.5, 0.8)或者(1.0, 1.0, 1.0) 时,同样也满足与门的条件。设定这样的参数后,仅当x1和x2同时为1时,信号的加权总和才会超过给定的阈值。
import numpy as np
def OR(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.2
tmp = x1 * w1 + x2 * w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 1
def NAND(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
(0, 0) -> 1
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0
【说明】:这里决定感知机参数的并不是计算机,而是我们人!我们看着真值表这种“训练数据”,人工考虑(想到)了参数的值。而机器学习的课题就是将这个决定参数值的工作交由计算机自动进行。学习是确定合适的参数的过程,而人要做的是思考感知机的构造(模型),并把训练数据交给计算机。
我们将原公式表达修改为另外一种实现形式:首先把θ换成-b,如下图所示
【说明】:b称为偏置,w1和w2称为权重。感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于0则输出1,否则输出0。
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 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
我们已经知道,使用感知机可以实现与门、与非门、或门三种逻辑电路。现在我们来考虑一下异或门(XOR gate),到底应该设定什么样的权重参数呢?
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
实际上,用前面介绍的感知机是无法实现这个异或门的。为什么用感知机可以实现与门、或门,却无法实现异或门呢?让我们利用图像来分析一下,首先看看或门的图像:
【说明】:感知机的可视化:灰色区域是感知机输出0的区域
而当面对异或门时,无论怎么调整参数都无法保证一条直线满足其条件。除非用曲线来划分区域:
【说明】:感知机的局限性就在于它只能表示由一条直线分割的空间,弯曲的曲线无法用感知机表示。另外,由这样的曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间。
感知机其实并不是真正的不能表示异或门。实际上,感知机的绝妙之处在于它可以利用“叠加层”的方式来表示。
x1 | x2 | s1 | s2 | y |
---|---|---|---|---|
0 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 1 | 1 |
0 | 1 | 1 | 1 | 1 |
1 | 1 | 0 | 1 | 0 |
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0
利用感知机的表示方法(神经元)来表示这个异或门:
【说明】:异或门是一种多层结构的神经网络,将最左边的一列称为第0层,中间的一列称为第1层,最右边的一列称为第2层。与前面的与门、或门的感知机形状不同。实际上,与门、或门是单层感知机,而异或门是2层感知机。叠加了多层的感知机也称为多层感知机。
【工作过程】:第0层的两个神经元接收输入信号,并将信号发送至第1层的神经元;第1层的神经元将信号发送至第2层的神经元,第2层的神经元输出y。“单层感知机无法表示的东西,通过增加一层就可以解决”。也就是说,通过叠加层(加深层),感知机能进行更加灵活的表示。
评论