目录
1、感知机
感知机(perceptron)是由美国学者Frank Rosennblatt在1957年提出来的,它是神经网络(深度学习)的起源算法,感知机有多个输入信号,一个输出信号。信号只有1、0两种取值。
最简单的两输入感知机的结构:
图2.1 单层感知机
其中,符号说明:
、
——输入信号
y——输出信号
、
——权重
——神经元、节点
根据上图2.1,可以将感知机的输出表示为表达式:
(2.1)
根据式2.1计算出来的y的值是介于(0,1)之间的某一个值,而我们希望y的值只取0或者1。所以需要给定一个阈值来约定y的值。即:大于阈值
的为1,小于阈值
的为0。所以表达式2.1可以修改为:
(2.2)
为了考虑通用性,将表达式2.2中的更改为-b,并移到左端,变为:
(2.3)
更改后的形式方便后续使用,其中b称为偏置。
2、简单逻辑电路
根据式2.3可以实现基本的逻辑门电路功能。
2.1 与门
表2.1 与门真值表
从真值表2.1可以看出,只有x全部为1时,y的输出才为1,其余都输出为0。满足表2.1的组合有很多种,比如。
2.2 与非门
表2.2 与非门的真值表
从与非门的真值表可以看出,和与门刚好相反,当x全是1的时候输出为0,其它输出均为1。
实现方法也很简单,直接将与门的参数全部取反就可以得到与非门。
2.3 或门
表2.3 或门的真值表
从或门的真值表可以看出,当x全为0时,y的输出为0,其它情况y的输出全为1.
上面提到的三个门电路的python的实现代码:
#与门使用权重和偏置的实现代码
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])
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])
b=-0.2
tmp=np.sum(w*x)+b
if tmp<=0:
return 0
else:
return 1
说明:
偏置b和权重w的作用是不一样的,w是控制输入信号的重要性的参数,w越大说明信号越重要。而偏置是调整神经元被激活的容易程度的参数。比如若b=-0.1,则只要输入信号的加权总和超过0.1,神经元就会被激活;如果b=-20时,则输入信号的加权总和必须超过20,神经元才能被激活。偏置的值决定了神经元被激活的容易程度。
3、感知机的局限性
当使用上面同样的方法实现异或门的时候,发现无法实现。原因是,异或门的图形是非直线的。
表2.4 异或门的真值表
根据真值表,画出y与x的平面图,如图2.2。由于感知机只能表示由一条直线分割的空间,而异或门是一个非线性的空间,所以用感知机无法分割,但是可以用曲线进行分割如图2.4。
图2.2 异或门的输入输出平面图
图2.3 用感知机分割空间
图2.4 用曲线分割空间
4、多层感知机
感知机可以实现叠加层
异或门可以通过与门、与非门和或门来叠加实现。
图2.5 叠加门实现异或门
根据上面的门电路叠加实现异或门的真值表如表2.5.
表2.5 叠加门实现异或门真值表
实现也很简单,直接调用基本门电路的函数来实现。
异或门的实现代码:
def XOR(x1,x2):
s1=NAND(x1,x2)
s2=OR(x1,x2)
y=AND(s1,s2)
return y
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))
将图2.5更改为感知机的形状,如图2.6
图2.6 用感知机表示异或门
与门、或门是单层感知机,而异或门是2层感知机。叠加了多层的感知机称为多层感知机。
图2.6为三层感知机。也说明,通过加深层可以实现更复杂的功能。
参考资料:《深度学习入门:基于python的理论与实现》