深度学习入门之感知机

一. 感知机的定义

感知机接收多个输入信号,输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。像电流流过导线,向前方输送电子一样,感知机的信号也会形成流,向前方输送信息。但是,和实际的电流不同的是,感知机的信号只有“流/不流”(1/0)两种取值。
在这里插入图片描述

其中 x 1 、 x 2 x_1、x_2 x1x2是输入信号, y y y是输出信号, w 1 、 w 2 w_1、w_2 w1w2是权重。输入信号被送往神经元时,会被分别乘以固定的权重 ( w 1 、 w 2 ) (w_1、w_2) w1w2。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被激活”。这里将这个界限值称为阈值,用符号 θ θ θ表示。用数学表达式表达如下:
在这里插入图片描述

二. 感知机实现基本逻辑电路
1. 与门

与门仅在两个输入均为1时输出1,其他时候则输出0。与门的真值表如下:
在这里插入图片描述

2. 或门

或门只要有一个输入信号是1,输出就为1。或门的真值表如下:
在这里插入图片描述

3. 与非门

与非门当两个输入信号同时为1时输出0,其他时候则输出1。与非门的真值表如下:
在这里插入图片描述

4. 异或门

异或门在两个输入信号相同(同时为0或者为1)时输出0,其他时候输出1。
在这里插入图片描述

5. 感知机实现基本逻辑电路

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(x * w) + 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(x * w) + 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(x * w) + b
    if tmp <= 0:
        return 0
    else:
        return 1

if __name__ == '__main__':
    print("与门:输入x1 = 1,x2 = 1,输出 =",AND(1, 1))
    print("与门:输入x1 = 0,x2 = 1,输出 =", AND(0, 1))
    print("与门:输入x1 = 0,x2 = 0,输出 =", AND(0, 0))

    print("或门:输入x1 = 1,x2 = 1,输出 =", OR(1, 1))
    print("或门:输入x1 = 1,x2 = 0,输出 =", OR(1, 0))
    print("或门:输入x1 = 0,x2 = 0,输出 =", OR(0, 0))

    print("与非门:输入x1 = 1,x2 = 1,输出 =", NAND(1, 1))
    print("与非门:输入x1 = 1,x2 = 0,输出 =", NAND(1, 0))
    print("与非门:输入x1 = 0,x2 = 0,输出 =", NAND(0, 0))

运行结果:

与门:输入x1 = 1,x2 = 1,输出 = 1
与门:输入x1 = 0,x2 = 1,输出 = 0
与门:输入x1 = 0,x2 = 0,输出 = 0
或门:输入x1 = 1,x2 = 1,输出 = 1
或门:输入x1 = 1,x2 = 0,输出 = 1
或门:输入x1 = 0,x2 = 0,输出 = 0
与非门:输入x1 = 1,x2 = 1,输出 = 0
与非门:输入x1 = 1,x2 = 0,输出 = 1
与非门:输入x1 = 0,x2 = 0,输出 = 1
三. 感知机的局限性与解决
1. 单个感知机的局限

前面我们通过感知机已经实现了与门,或门,与非门,但是感知机无法实现异或门。

我们试着将或门的动作形象化。或门的情况下,当权重参数 ( b , w 1 , w 2 ) = ( − 0.5 , 1.0 , 1.0 ) (b, w_1, w_2) = (−0.5, 1.0, 1.0) (b,w1,w2)=(0.5,1.0,1.0)时,可满足或门的真值表条件。此时,感知机可用下式表示。
在这里插入图片描述
感知机会生成由直线 − 0.5 + x 1 + x 2 = 0 −0.5 + x_1 + x_2 = 0 0.5+x1+x2=0分割开的两个空间。其中一个空间输出1,另一个空间输出0。
在这里插入图片描述

或门在 ( x 1 , x 2 ) = ( 0 , 0 ) (x_1, x_2) = (0, 0) (x1,x2)=(0,0)时输出0,在 ( x 1 , x 2 ) (x_1, x_2) (x1,x2) ( 0 , 1 ) 、 ( 1 , 0 ) 、 ( 1 , 1 ) (0, 1)、 (1, 0)、 (1, 1) (0,1)(1,0)(1,1)时输出1。下图中, ○ ○ 表示0, △ △ 表示1。如果想制作或门,需要用直线将图中的 ○ ○ △ △ 分开。实际上,刚才的那条直线就将这4个点正确地分开了。
换成异或门的话会如何?如下图所示。
在这里插入图片描述
显然从图中可以看出,不能使用一条直线将图中的 ○ ○ △ △ 分开。

单个感知机的局限性就在于它只能表示由一条直线分割的空间

2. 多层感知机

感知机可以通过叠加实现非线性可分的问题。异或门可以通过与门,与非门,或门的叠加实现。
在这里插入图片描述

异或门编程实现
# 异或门
def XOR(x1, x2):
    s1 = NAND(x1, x2)
    s2 = OR(x1, x2)
    y = AND(s1, s2)

    return y
    
print("异或门:输入x1 = 1,x2 = 1,输出 =", XOR(1, 1))
print("异或门:输入x1 = 1,x2 = 0,输出 =", XOR(1, 0))
print("异或门:输入x1 = 0,x2 = 1,输出 =", XOR(0, 1))
print("异或门:输入x1 = 0,x2 = 0,输出 =", XOR(0, 0))

运行结果:

异或门:输入x1 = 1,x2 = 1,输出 = 0
异或门:输入x1 = 1,x2 = 0,输出 = 1
异或门:输入x1 = 0,x2 = 1,输出 = 1
异或门:输入x1 = 0,x2 = 0,输出 = 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值