简略描述-感知机速成
夫道未始有封,言未始有常,为是而有畛也。
作为《深度学习入门》的阅读笔记,本文简略概述感知机,并辅以python实现
Python基础
再简单的描述离不开基本的语言基础,确保了解《蜻蜓点水-python》中的内容在进行下去
逻辑运算和感知机
如上所述,python中有逻辑运算,电路中也有逻辑运算,并以“门”的形式呈现,有电流则为1(True),无电流则为0(True)。
如下图所示,三种门的符号,真值表就不再赘述,可以用python快速验证
感知机的历史1957提出,是神经网络的起源的算法之一。
感知机接受多个信号,并输出一个信号。
感知机实现
先说实现的思路,上述三种逻辑运算都可以用同一种逻辑表达,区别只在于特定参数的不同
b称为偏置,w称为权重,二者控制了函数的不同逻辑表示
下面直接给出代码实现:
- 初始化函数设定了权重和偏置
- forward函数在深度学习中代表正向传播,这里借用作为感知机的处理函数
- 逻辑如公式,但将等号给了1
class Perceptron:
def __init__(self, w=np.array([0,0]),delta=-1.):
self.w=w
self.delta = delta
def forward(self,x):
tmp=self.w*x
if np.sum(tmp) + self.delta < 0:
return 0
else:
return 1
andclass = Perceptron(w=np.array([0.5,0.5]))
print(andclass.forward(np.array([0,0])))
print(andclass.forward(np.array([1,0])))
print(andclass.forward(np.array([0,1])))
print(andclass.forward(np.array([1,1])))
# 0
# 0
# 0
# 1
orclass = Perceptron(w=np.array([1,1]))
print(orclass.forward(np.array([0,0])))
print(orclass.forward(np.array([1,0])))
print(orclass.forward(np.array([0,1])))
print(orclass.forward(np.array([1,1])))
# 0
# 1
# 1
# 1
nandclass = Perceptron(w=np.array([-0.5,-0.5]),delta=0.9)
print(nandclass.forward(np.array([0,0])))
print(nandclass.forward(np.array([1,0])))
print(nandclass.forward(np.array([0,1])))
print(nandclass.forward(np.array([1,1])))
# 1
# 1
# 1
# 0
目前感知机的局限
可以对当前感知机的输入和输出作图,可得:
总之,有办法做一条直线将0和1的结果划分开,能这么表示的称为线性感知机
但是这样的感知机无法表示XOR操作,也就是异或操作:
XOR感知机的实现
该问题由1969年被提出,直到1986年被解决,这段时间人工智能的发展是停滞的。
解决的方法就是使用多层感知机,即单独的“门”无法解决的问题,就用多个连接一起解决,直接给方法:
用代码表示就是:
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
进一步的实现:
#def XOR(x1, x2):
# s1 = NAND(x1, x2)
# s2 = OR(x1, x2)
# y = AND(s1, s2)
# return y
class XOR:
def __init__(self):
self.nandclass = Perceptron(w=np.array([-0.5,-0.5]),delta=0.9)
self.orclass = Perceptron(w=np.array([1,1]))
self.andclass = Perceptron(w=np.array([0.5, 0.5]))
def forward(self,x):
s1 = self.nandclass.forward(x)
s2 = self.orclass.forward(x)
tmp = self.andclass.forward(np.array([s1,s2]))
return tmp
print("XOR: ")
print(XOR().forward(np.array([0,0])))
print(XOR().forward(np.array([1,0])))
print(XOR().forward(np.array([0,1])))
print(XOR().forward(np.array([1,1])))
#XOR:
#0
#1
#1
#0
其他问题
多层感知机的层数
按权重算,2层,因为有两套权重参数
按节点(神经元)算,3层,从输入,到中间结果,到输出,有三个阶段
多层感知机的进一步
感知机通过叠加层能够进行非线性的表示,理论上还可以表示计算机进行的处理
多层感知机可以认为是一种神经网络
评论已关闭