感知机(perceptron)
感知机是由美国学者Frank Rosenblatt在1957年提出的。
学习原因:作为神经网络(深度学习)的起源算法。学习感知机的构造也就是学习通向神经网络和深度学习的一种重要思想。
1. 感知机是什么
- 感知机接收多个输入信号,输出一个信号。感知机的信号也会形成流,向前方输送信息,但是感知机和实际的电流不同的是,感知机的信号只有0/1两种状态(流/不流)
- 严格地讲,本章中所说的感知机应该称为“人工神经元”或“朴素感知机”。
- ⭕️代表神经元或者节点,输入信号被送往神经元时,会分别乘以固定的权重(w1x2,w2x2)神经元会计算传送过来的信号的总和,只有当这个总和超过了某个阈值时才会输出1,称为神经元被激活。
- 数学公式表示:
- 感知机的多个输入信号都有各自的固有的权重,这些权重发挥着控制各个信号的重要性的作用,权重越大,对应该权重的信号就越重要。
2. 简单逻辑电路
与门(and gate)
用感知机来表示这个and gate,需要做的就是确定能满足真值表的w1,w2和theta的值。满足真值表条件的参数选择方法有无数多个。
与非门(nand gate)
颠倒了和and gate的输出。要表示与门,实际上只要把实现与门的参数值的符号取反即可。
⚠️这里决定感知机参数的并不是计算机,而是人。我们看着真值表这种“训练数据”,人工考虑了参数的值。而机器学习的课题就是将这个决定参数值的工作交由计算机自动进行。学习是确定合适参数的过程,而人要做的是思考感知机的构造(模型),并把训练数据交给计算机
3.感知机的实现
def And(x1,x2):
w1,w2,theta = 0.5,0.5,0.7
tmp = w1*x1+w2*x2
if tmp <= theta:
return 0
else:
return 1
print(And(0,0),And(0,1),And(1,0),And(1,1))
导入权值和偏重
改变表达形式,将theta换成b,b称为偏置,w1和w2称为权重,感知机会计算输入信号和权重的乘积,然后加上偏置,如果这个值带0则输出1,否则输出0.
import numpy as np
x = np.array([0,1])
w = np.array([0.5,0.5])
b = -0.7
print(w*x)
print(np.sum(w*x))
print(np.sum(w*x)+b)
先简要实现一个然后写成函数
import numpy as np
def And(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.7
tmp = np.sum(x*w)+b
if tmp <= 0:#注意这里的theta换了,就不是1了
return 0
else:
return 1
print(And(1,0))
print(And(0,1))
print(And(1,1))
print(And(0,0))
偏置和权重的作用不同:
偏置:调节神经元被激活的容易程度(输出信号为1的程度),b的绝对值越大,就越不容易被激活
⚠️有的时候根据上下文也可能把权重和偏置这些参数统称为权重
与门、或门、与非门是具有相同构造的感知机,区别仅在于权重参数的值。
4.感知机的局限性
已知感知机可以实现与门、与非门、或门三种逻辑电路。现在考虑异或(XOR)门。
感知机无法实现XOR gate
感知机的可视化
或门可以正确的使用一条直线将两个区域分开,该得什么值得什么值。而为啥异或门不行呢?就是没有办法使用一条直线将整个区域恰好按照0和1分开。
线性和非线性
虽然无法用直线分开但是可以用曲线分开,感知机的局限性就在于它只能表示一条直线分割的空间,曲线无法用感知机表示。
非线性空间:由曲线分割而成的空间称为非线性空间
线性空间:由直线分割的空间称为线性空间
5.多层感知机
感知机的绝妙之处在于它可以“叠加层”
单层感知机无法表示异或门(单层感知机无法分离非线性空间),但是组合感知机(叠加层)可以实现异或门。
import numpy as np
def And(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.7
tmp = np.sum(x*w)+b
if tmp <= 0:#注意这里的theta换了,就不是1了
return 0
else:
return 1
def Or(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b = -0.2
tmp = np.sum(x*w)+b
if tmp <= 0:#注意这里的theta换了,就不是1了
return 0
else:
return 1
def Nand(x1,x2):
x = np.array([x1,x2])
w = np.array([-0.5,-0.5])
b = 0.7
tmp = np.sum(x*w)+b
if tmp <= 0:#注意这里的theta换了,就不是1了
return 0
else:
return 1
def Xor(x1,x2):
s1 = Nand(x1,x2)
s2 = Or(x1,x2)
y = And(s1,s2)
return y
print(Xor(1,1))
print(Xor(1,0))
print(Xor(0,1))
print(Xor(0,0))
将最左边的一列称为第0层,中间的一列称为第1层,最右边的一列称为第2层。异或门是2层感知机。叠加了多层的感知机称为多层感知机(multi-layered perceptron)
图中的感知机总共由3层构成,但是因为拥有权重的层实质上只有两层(第0层和第1层之间,第1层和第2层之间),所以称“2层感知机”,也有的文献认为是“3层感知机”
6.从与非门到计算机
只要通过与非门的组合,就能再现计算机进行的处理,说明使用感知机可以表示计算机。
理论上说2层感知机就可以构建计算机,这是因为,已有研究证明,2层感知机(严格的说是激活函数使用了费希纳型的sigmoid函数的感知机)可以表示任意函数。
感知机通过叠加层能够进行非线性的表示,理论上还可以表示计算机进行的处理