正文
2.1 感知机是什么
- 接收多个输入信号,输出一个信号。
- 感知机的信号只有“流/ 不流”(1/0)两种取值。在本书中,0 对应“不传递信号”,1 对应“传递信号”。
一个接收两个输入信号的感知机的例子。x1、x2 是输入信号,y 是输出信号,w1、w2 是权重(w 是 weight 的首字母)。图中的○称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重(w1x1、w2x2)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出 1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号 θ 表示。
用数学式来表示:
y={0(w1x1+w2x2≤θ)1(w1x1+w2x2>θ)
感知机的多个输入信号都有各自固有的权重(w1x1、w2x2),这些权重发挥着控制各个信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就越高。
权重相当于电流里所说的电阻。电阻是决定电流流动难度的参数,
电阻越低,通过的电流就越大。而感知机的权重则是值越大,通过
的信号就越大。不管是电阻还是权重,在控制信号流动难度(或者流
动容易度)这一点上的作用都是一样的。
2.3 感知机的实现
2.3.1 简单的实现
1 2 3 4 5 6 7 8 9 10
| def AND(x1, x2): """ 模拟一个 AND 门 """ w1, w2, theta = 0.5, 0.5, 0.7 tmp = x1 * w1 + x2 * w2 if tmp <= theta: return 0 elif tmp > theta: return 1
|
1 2 3 4
| print(AND(0, 0)) print(AND(1, 0)) print(AND(0, 1)) print(AND(1, 1))
|
0
0
0
1
2.3.2 导入权重和偏置
导入权重和偏置, 把 θ 换成 −b:
y={0(b+w1x1+w2x2≤0)1(b+w1x1+w2x2>0)
此处,b 称为偏置,w1 和 w2 称为权重。感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于 0 则输出 1,否则输出 0。
1 2 3 4 5 6
| import numpy as np
x = np.array([0, 1]) w = np.array([0.5, 0.5]) b = -0.7 w * x
|
array([0. , 0.5])
0.5
-0.19999999999999996
2.3.3 使用权重和偏置的实现
1 2 3 4 5 6 7 8 9
| 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 2 3 4
| print(AND(0, 0)) print(AND(1, 0)) print(AND(0, 1)) print(AND(1, 1))
|
0
0
0
1
偏置的值决定了神经元被激活的容易程度。这里我们将 w1 和 w2 称为权重,将 b 称为偏置,但是根据上下文,有时也会将 b、w1、w2 这些参数统称为权重(将 1 也视为输入,b 是调整神经元被激活的容易程度(输出信号为 1 的程度)的参数)。
1 2 3 4 5 6 7 8 9 10 11 12
| def NAND(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 2 3 4
| print(NAND(0, 0)) print(NAND(1, 0)) print(NAND(0, 1)) print(NAND(1, 1))
|
1
1
1
0
1 2 3 4 5 6 7 8 9 10 11 12
| 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: return 0 else: return 1
|
1 2 3 4
| print(OR(0, 0)) print(OR(1, 0)) print(OR(0, 1)) print(OR(1, 1))
|
0
1
1
1
2.4 感知机的局限性
单层感知机无法解决异或问题。
2.5 多层感知机
2.5.1 已有门电路的组合
2.5.2 异或门的实现
1 2 3 4 5 6 7 8
| def XOR(x1, x2): """ 使用之前定义的 AND 函数、NAND 函数、OR 函数,实现 XOR 门。 """ s1 = NAND(x1, x2) s2 = OR(x1, x2) y = AND(s1, s2) return y
|
1 2 3 4
| print(XOR(0, 0)) print(XOR(1, 0)) print(XOR(0, 1)) print(XOR(1, 1))
|
0
1
1
0
实际上,与门、或门是单层感知机,而异或门是 2 层感知机。叠加了多层的感知机也称为多层感知机(multi-layered perceptron)。
上图的感知机总共由 3 层构成,但是因为拥有权重的层实质上只有 2 层(第 0 层和第 1 层之间,第 1 层和第 2 层之间),所以称为“2 层感知机”。不过,有的文献认为上图的感知机是由 3 层构成的,因而将其称为“3 层感知机”。
2.7 小结
- 感知机是具有输入和输出的算法。给定一个输入后,将输出一个既
定的值。
- 感知机将权重和偏置设定为参数。
- 使用感知机可以表示与门和或门等逻辑电路。
- 异或门无法通过单层感知机来表示。
- 使用 2 层感知机可以表示异或门。
- 单层感知机只能表示线性空间,而多层感知机可以表示非线性空间。
- 多层感知机(在理论上)可以表示计算机。