正文
2.1 感知机是什么
- 接收多个输入信号,输出一个信号。
- 感知机的信号只有“流/ 不流”(1/0)两种取值。在本书中,0 对应“不传递信号”,1 对应“传递信号”。
一个接收两个输入信号的感知机的例子。、 是输入信号, 是输出信号,、 是权重( 是 weight 的首字母)。图中的○称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重(、)。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出 1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号 表示。
用数学式来表示:
感知机的多个输入信号都有各自固有的权重(、),这些权重发挥着控制各个信号的重要性的作用。也就是说,权重越大,对应该权重的信号的重要性就越高。
权重相当于电流里所说的电阻。电阻是决定电流流动难度的参数, 电阻越低,通过的电流就越大。而感知机的权重则是值越大,通过 的信号就越大。不管是电阻还是权重,在控制信号流动难度(或者流 动容易度)这一点上的作用都是一样的。
2.3 感知机的实现
2.3.1 简单的实现
def AND(x1, x2):
"""
模拟一个 AND 门
"""
w1, w2, theta = 0.5, 0.5, 0.7 # 接受参数 w1 = 0.5, w2 = 0.5, 阈值为 0.7
tmp = x1 * w1 + x2 * w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))0
0
0
1
2.3.2 导入权重和偏置
导入权重和偏置, 把 换成 :
此处, 称为偏置, 和 称为权重。感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值大于 0 则输出 1,否则输出 0。
import numpy as np
x = np.array([0, 1]) # 输入
w = np.array([0.5, 0.5]) # 权重
b = -0.7 # 偏置
w * xarray([0. , 0.5])
np.sum(w * x)0.5
np.sum(w * x) + b # 大约为-0.2(由浮点小数造成的运算误差)-0.19999999999999996
2.3.3 使用权重和偏置的实现
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 1print(AND(0, 0))
print(AND(1, 0))
print(AND(0, 1))
print(AND(1, 1))0
0
0
1
偏置的值决定了神经元被激活的容易程度。这里我们将 和 称为权重,将 称为偏置,但是根据上下文,有时也会将 、、 这些参数统称为权重(将 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 1print(NAND(0, 0))
print(NAND(1, 0))
print(NAND(0, 1))
print(NAND(1, 1))1
1
1
0
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 1print(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 异或门的实现
def XOR(x1, x2):
"""
使用之前定义的 AND 函数、NAND 函数、OR 函数,实现 XOR 门。
"""
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return yprint(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 层感知机可以表示异或门。
- 单层感知机只能表示线性空间,而多层感知机可以表示非线性空间。
- 多层感知机(在理论上)可以表示计算机。