本章介绍的感知机,严格上应该成为“人工神经元”或“朴素感知机”
感知机是什么
- 两层神经元组成的结构,输入层 + 输出层
- 感知机的信号只有“流|不流”(0|1)两种取值
- “输入信号*权值”的和大于某个界限值(阈值,用符号 θ 表示)时,输出1,这也称为“神经元激活”
- 用数学公式来表示感知机的原理:y = (w1 * x1 + w2 * x2) > θ ? 1 : 0
简单逻辑电路
与门
与门的真值表
X1 | x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
与非门
与非门的真值表
X1 | x2 | y |
---|---|---|
0 | 0 | 1 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
或门
或门的真值表
X1 | x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
用感知机来描述上述逻辑,即转化为对 w1、w2、θ模型的设定,使其满足真值表。举个例子:
- 与 门 --(w1,w2,θ) = (0.5,0.5,0.7)
- 与非门-(w1,w2,θ) = (-0.5,-0.5,-0.7)
- 或 门 --(w1,w2,θ) = (0.5,0.5,0.4)
感知机的实现
简单实现
与门的实现
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
print(AND(0, 0))
print(AND(0, 1))
print(AND(1, 0))
print(AND(1, 1))
运行结果:
与非门的实现
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
print(AND(0, 0))
print(AND(0, 1))
print(AND(1, 0))
print(AND(1, 1))
运行结果:
或门
def AND(x1, x2):
w1, w2, theta = 0.5, 0.5, 0.4
tmp = x1*w1 + x2*w2
if tmp <= theta:
return 0
elif tmp > theta:
return 1
print(AND(0, 0))
print(AND(0, 1))
print(AND(1, 0))
print(AND(1, 1))
运行结果:
导入权重和偏置
把上一小节的公式中的θ 换成 -b,即可用类似如下的三目表达式来表示感知机的行为:
y = (b + x1 * b1 + x2 * b2 > 0) ? 1 : 0
此时,b我们称之为偏置,w1和w2称为权重
使用权重和偏置的实现
import numpy as np
def AND(x1,x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = b + np.sum(w*x)
if (tmp <= 0):
return 0
else:
return 1
print("----test and----")
print(AND(0, 0)) # 0
print(AND(0, 1)) # 0
print(AND(1, 0)) # 0
print(AND(1, 1)) # 1
def NAND(x1, x2):
x = np.array([x1, x2])
weight = np.array([-0.5, -0.5])
b = 0.7
tmp = b + np.sum(weight*x)
if (tmp <= 0):
return 0
else:
return 1
print("----test nand----")
print(NAND(0, 0)) # 1
print(NAND(0, 1)) # 1
print(NAND(1, 0)) # 1
print(NAND(1, 1)) # 0
def OR(x1, x2):
x = np.array([x1, x2])
weight = np.array([0.5, 0.5])
b = -0.4
tmp = b + np.sum(weight*x)
if (tmp <= 0):
return 0
else:
return 1
print("----test or----")
print(OR(0, 0)) # 0
print(OR(0, 1)) # 1
print(OR(1, 0)) # 1
print(OR(1, 1)) # 1
感知机的局限
异或门
异或门的真值表
x1 | x2 | y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
感知机无法构建出满足上述的函数模型
线性和非线性
感知机的局限在于它只能表示由一条直线分割的空间,也就是线性空间
多层感知机
感知机可以“叠加层”,通过叠加层来表示异或门
x1 | x2 | s1 | s2 | y |
---|---|---|---|---|
0 | 0 | 1 | 0 | 0 |
0 | 1 | 1 | 1 | 1 |
1 | 0 | 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
print("----test XOR----")
print(XOR(0, 0)) # 0
print(XOR(0, 1)) # 1
print(XOR(1, 0)) # 1
print(XOR(1, 1)) # 1
输出结果:
- 异或门是一种多层结构的神经网络
- 与门、或门以及与非门是单层感知机,而异或门是 2 层感知机
- 叠加了多层的感知机也称为多层感知机(multi-layered perceptron)
- 多层感知机能够进行复杂的表示,甚至可以构建计算机
- 理论上可以说 2 层感知机就能构建计算机,但是,使用 2 层感知机的构造,权重的构造比较考究和烧脑
- 通过感知机表示计算机时,使用叠加了多层的构造来实现是比较自然的流程