夫道未始有封,言未始有常,为是而有畛也。

作为《深度学习入门》的阅读笔记,本文简略概述感知机,并辅以python实现

Python基础

再简单的描述离不开基本的语言基础,确保了解《蜻蜓点水-python》中的内容在进行下去

逻辑运算和感知机

如上所述,python中有逻辑运算,电路中也有逻辑运算,并以“门”的形式呈现,有电流则为1(True),无电流则为0(True)。

如下图所示,三种门的符号,真值表就不再赘述,可以用python快速验证
image-20251009214626196.png

感知机的历史1957提出,是神经网络的起源的算法之一。

感知机接受多个信号,并输出一个信号。

感知机实现

先说实现的思路,上述三种逻辑运算都可以用同一种逻辑表达,区别只在于特定参数的不同

image-20251009215857997.png

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

目前感知机的局限

可以对当前感知机的输入和输出作图,可得:
image-20251009220709154.png

总之,有办法做一条直线将0和1的结果划分开,能这么表示的称为线性感知机

但是这样的感知机无法表示XOR操作,也就是异或操作:

image-20251009220911874.png

XOR感知机的实现

该问题由1969年被提出,直到1986年被解决,这段时间人工智能的发展是停滞的。

解决的方法就是使用多层感知机,即单独的“门”无法解决的问题,就用多个连接一起解决,直接给方法:
image-20251009221438817.png

用代码表示就是:

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层,从输入,到中间结果,到输出,有三个阶段

多层感知机的进一步

感知机通过叠加层能够进行非线性的表示,理论上还可以表示计算机进行的处理

多层感知机可以认为是一种神经网络

标签: 感知机

评论已关闭