第 6 章 感知机

6.1 感知机的概念

感知机(Perceptron)是二分类模型,接收多个信号,输出一个信号。感知机的信号只有0、1两种取值。下图是一个接收两个输入信号的感知机的例子:

图片[1]-第 6 章 感知机-大赛人网
图片[2]-第 6 章 感知机-大赛人网

6.2 简单逻辑电路

6.2.1 与门

尝试使用感知机解决简单的问题,如实现逻辑电路中的与门(AND gate)。与门是具有两个输入和一个输出的门电路,仅在两输入均为1时输出1,其他时候输出0。这种输入信号和输出信号对应表称为真值表。

图片[3]-第 6 章 感知机-大赛人网

6.2.2 与非门

图片[4]-第 6 章 感知机-大赛人网

6.2.3 或门

图片[5]-第 6 章 感知机-大赛人网

6.3 感知机的实现

6.3.1 简单实现

图片[6]-第 6 章 感知机-大赛人网
def AND(x1, x2):
    w1, w2, theta = 0.5, 0.5, 0.7
    res = x1 * w1 + x2 * w2
    if res <= theta:
        return 0
    elif res > theta:
        return 1

print(AND(0, 0))  # 0
print(AND(1, 0))  # 0
print(AND(0, 1))  # 0
print(AND(1, 1))  # 1

可以以同样的方式实现与非门和或门,不过在此之前先做一些修改。

6.3.2 导入权重和偏置

图片[7]-第 6 章 感知机-大赛人网
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(w * x) + b
    if tmp <= 0:
        return 0
    else:
        return 1

print(AND(0, 0))  # 0
print(AND(1, 0))  # 0
print(AND(0, 1))  # 0
print(AND(1, 1))  # 1
图片[8]-第 6 章 感知机-大赛人网
import numpy as np

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

print(NAND(0, 0))  # 1
print(NAND(1, 0))  # 1
print(NAND(0, 1))  # 1
print(NAND(1, 1))  # 0

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

print(OR(0, 0))  # 0
print(OR(1, 0))  # 1
print(OR(0, 1))  # 1
print(OR(1, 1))  # 1

与门、与非门、或门是具有相同构造的感知机,区别仅在于权重参数的值。因此在与非门和或门的实现中,仅设置权重和偏置的值这一点和与门的实现不同。

6.4 感知机的局限

图片[9]-第 6 章 感知机-大赛人网
图片[10]-第 6 章 感知机-大赛人网
图片[11]-第 6 章 感知机-大赛人网

如果要实现异或门,是无法使用一条直线将0和1分开的:

图片[12]-第 6 章 感知机-大赛人网

但如果将直线这个限制条件去掉就可以了:

图片[13]-第 6 章 感知机-大赛人网

感知机的局限性就在于它只能表示由一条直线划分的空间,而上图中的曲线无法用感知机表示。由曲线划分的空间称为非线性空间,由直线划分的空间称为线性空间。

6.5 多层感知机

图片[14]-第 6 章 感知机-大赛人网
图片[15]-第 6 章 感知机-大赛人网

使用之前实现的与门、与非门和或门代码来实现异或门:

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(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

def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)
    return y

print(XOR(0, 0))  # 0
print(XOR(1, 0))  # 1
print(XOR(0, 1))  # 1
print(XOR(1, 1))  # 0

试着使用感知机的表示方法来表示这个异或门:

图片[16]-第 6 章 感知机-大赛人网

如图所示,这是一种多层感知机结构。

第0层的两个神经元接收输入信号,并将信号发送给第1层的神经元。第1层的神经元将信号发送给第2层的神经元。第2层的神经元输出结果。

通过叠加层,感知机能进行更加灵活的表示。

感知机是一种非常简单的算法,也是后续学习神经网络的基础。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像-大赛人网
欢迎您留下宝贵的见解!
提交
头像-大赛人网

昵称

取消
昵称

    请登录后查看评论内容