1.1
Background:感知机perceptron, 美国学者Frank Rosenblatt 1957年提出来的,为啥现在还要提它?
因为,perceptron是NN和DL算法的起源。
相关定义:>=2个的输入,1个输出,其实和逻辑电路很多相似的地方。
上图就是接受2个输入的例子,和
是输入信号,
是输出信号,
和
是权重,⚪是神经元或者节点,输入信号被送往神经元时,会被分别乘以固定的权重(
、
)。例如,神经元计算传过来的信号总和,超过某个届限值时(往往被称为阈值),可以输出1,也就是“神经元被激活”
感知机的多个input 有各自的权重,控制各个信号的重要性,权重越大,重要新越高。
逻辑电路中权重类似于电阻,电阻越小,电流就越大。感知机整好相反,但在激活过程来看是类似的。
1.2 AND门电路的Py实现
#multiple input, single output
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,1))
print(AND(1,1))
print(AND(1,0))
print(AND(0,0))
其他门电路实现就很简单了...
考虑到后面的操作方便,把阈值重新整理下,把改为
,
称为偏置。
使用NumPy实现AND门:
import numpy as np
def AND(x1,x2):
x=np.array([x1,x2]) #input
w=np.array([0.5,0.5]) #set weight
b=-0.7 #set offset
tmp=np.sum(w*x)+b
if tmp<=0:
print(0)
return 0
else:
print(1)
return 1
AND(0,1)
有些论文会把这些参数都叫做权重。现在,实现非门和或门 :
import numpy as np
def NAND(x1,x2):
x=np.array([x1,x2]) #input
w=np.array([-0.5,-0.5]) #set weight
b=0.7 #set offset
tmp=np.sum(w*x)+b
if tmp<=0:
print(0)
return 0
else:
print(1)
return 1
def OR(x1,x2):
x=np.array([x1,x2]) #input
w=np.array([0.5,0.5]) #set weight
b=-0.2 #set offset
tmp=np.sum(w*x)+b
if tmp<=0:
print(0)
return 0
else:
print(1)
return 1
NAND(0,1)
OR(0,0)
XOR门如何实现呢,感知机的局限性来了,但是为什么无法实现?
。。。
。。。
。。。
感知机的局限性在于它只能表示由一条直线分割的空间,XOR的解空间是非线性空间,所以没办法玩。那么如何用感知机的基本逻辑门实现XOR?多层感知机诞生了。