第2章 由感知机导入神经网络

作者: 陶不渊 | 来源:发表于2019-01-13 21:15 被阅读0次

    重点:

    1. 感知机将权重与偏置设定为参数。
    2. 不改变结构,只改变参数可以使感知机实现不同的功能。
    3. 单层感知机只能表示线性空间,多层感知机可以表示非线性空间。

    2.1 感知机是什么

    感知机接收多个(0,1)输入信号,输出一个(0,1)信号。

    下图展示了一个二输入的感知机的例子:

    x1,x2是输入信号,y是输出信号,w1,w2是权重,⚪表示一个神经元,还有一个重要参数没在图中表示出来,是阈值θ,大于阈值输出1,小于阈值输出0。具体公式如下:


    当w1x1+w2x2>θ时,输出为1,称“神经元被激活”。

    小结:

    1. 阈值θ决定了输出神经元激活的难易程度
    2. 权重w1,w2决定了输入信号x1和x2的重要性

    2.2 简单逻辑电路

    2.2.1 与门

    与门真值表:

    x1 x2 y
    0 0 0
    1 0 0
    0 1 0
    1 1 1

    考虑用上面的二输入感知机实现与门,可调的参数只有3个,分别是权重w1,w2和阈值θ。

    w1,w2,θ可取的值为:

    w1 w2 θ
    0.5 0.5 0.7
    0.5 0.5 0.8
    1.0 1.0 1.0

    可以验证,当参数取上面3种情况时,只有x1,x2都为1,输出y才为1。除了上面3种取法,还有无数种,可见参数的选择不唯一。

    2.2.2 与非门

    与非门真值表:

    x1 x2 y
    0 0 1
    1 0 1
    0 1 1
    1 1 0

    与非门就是在与门基础上,取反

    w1,w2,θ可取的值为:

    w1 w2 θ
    -0.5 -0.5 -0.7
    -0.5 -0.5 -0.8
    -1.0 -1.0 -1.0

    与非门的参数选择亦有无数种,不唯一。

    2.2.3 或门

    或门真值表:

    x1 x2 y
    0 0 0
    1 0 1
    0 1 1
    1 1 1

    w1,w2,θ可取的值为:

    w1 w2 θ
    0.5 0.5 0.3
    0.5 0.5 0.4
    1.0 1.0 0.7

    或门的参数选择亦有无数种,不唯一。

    重点: 与,或,与非门的感知机构造都是一样的,都是用二输入感知机实现,通过选取不同的参数,实现不同的逻辑计算。

    机器学习的目标就是告诉计算机要实现的目标,让计算机自动选择合适的参数。


    2.3 感知机的Python实现

    2.3.1 用偏置代替阈值

    将上面的数学表达式的θ移到右边,令b=-θ,换一种表达方式:


    image

    我们称b为偏置,效果就像穿木屐,在计算b+w1x1+w2x2的过程中,权重w和输入x都知道的时候,b总是将计算结果抬到一个高度,使其更容易或更难大于0。

    权重w1,w2是控制输入信号的重要性的参数。

    偏置b是调整神经元被激活的容易程度的参数。

    2.3.2 用Python实现与门,与非门,或门

    与门:

    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   
        
        #mumpy中数组相乘,为其对应位置元素相乘,构成表达式b+w1x1+w2x2
        
        if tmp <= 0:
            return 0
        else:
            return 1
    

    与非门:

    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
    

    或门:

    import numpy as np
    
    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
    

    2.4 感知机的局限性

    2.4.1 异或门

    我们来看一下异或门的真值表:

    异或门真值表:

    x1 x2 y
    0 0 0
    1 0 1
    0 1 1
    1 1 0

    只有当输入x1和x2不一样时,输出才为1。

    我们用前面使用的二输入感知机无法实现异或门,可以通过画图理解。

    下面是或门的输入输出分布图,●表示0,▲表示1,可以通过参数的选取,w1=1,w2=1,b=-0.5。


    image

    用直线-0.5+x1+x2=0可以将两个不同的输出区域分割开。


    但是观察异或门的输入输出分布图:

    image

    很明显,如果遵从数学公式:

    image

    无法使用一条直线b+w1x1+w2x2=0将不同的输出区域分割开。

    2.4.2 线性和非线性

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

    倘若我们要分割异或门的输入输出空间,就必须使用曲线。


    image

    这种由曲线分割而成的空间称为非线性空间

    而由直线分割而成的空间称为线性空间


    2.5 多层感知机

    2.5.1 异或门的实现

    单层二输入感知机无法实现异或门的表达,但是通过叠加感知机,可以实现更多的逻辑表达。

    用下面的符号来表达已有的可以用一个感知机表达的逻辑:


    可以通过组合,叠加感知机,实现异或门。


    s1是与非门的输出结果,s2是或门的输出结果,将s1,s2作为与门的输入,得到y,可以实现异或门。

    x1 x2 s1 s2 y
    0 0 1 0 0
    1 0 1 1 1
    0 1 1 1 1
    1 1 0 1 0

    2.5.2 异或门的python实现

    #要先从包含与,或,与非门的模块导入对应的函数
    def XOR(x1, x2):
        s1 = NAND(x1, x2)
        s2 = OR(x1, x2)
        y = AND(s1, s2)
        return y
    

    用感知机表示异或门,如下图所示


    image

    从图可以看出,异或门是一个多层感知机

    最左边一层神经元称为第0层,为的是与Python的列表逻辑符合,由于上图中,拥有权重的层实际上只有2层(第0层和第1层之间,第1层和第2层之间),所以称为2层感知机,有的文献也称为3层,忽略权重。

    通过叠加层,感知机能进行更灵活的表示,例如表示非线性空间。

    相关文章

      网友评论

        本文标题:第2章 由感知机导入神经网络

        本文链接:https://www.haomeiwen.com/subject/lenldqtx.html