美文网首页
线性神经网络解决异或问题

线性神经网络解决异或问题

作者: 平衡WorkLife | 来源:发表于2018-03-10 15:15 被阅读0次

    线性神经网络与感知器的主要区别在于,感知器的激活函数只能输出两种可能的值,而线性神经网络的输出可以取任意值,其激活函数是线性函数,线性神经网络采用Widrow-Hoff学习规则,即LMS(Least Mean Square)最小均方算法来调整网络的权值和偏置

    线性神经网络在结构上与感知器非常相似,只是神经元激活函数不同。在模型训练时把原来的sign函数改成了pureline函数(y=x)

    LMS 最小均方规则

    LMS 学习规则可以看作是δ学习规则的一个特殊情况
    该学习规则与神经元采用的转移函数无关,因而不需要对转移函数求导,不仅学习速度较快,而且具有较高的精度,权值可以初始化为任意值,通过权值调整使得神经元实际输出与期望输出之间的平方差最小:


    image.png
    image.png

    线性神经网络结构

    image.png

    两个激活函数,当训练时用线性purelin函数,训练完成后,输出时用到sign函数 (>0, <0)

    Delta学习规则

    1986年,认知心理学家McClelland和Rumelhart 在神经网络训练中引入该规则,也成为连续感知器学习规则
    该学习规则是一种利用梯度下降法的一般性的学习规则

    代价函数(损失函数) (Cost Function, Lost Function)

    误差E是权向量Wj的函数,欲使误差E最小,Wj应与误差的负梯度成正比

    image.png

    梯度即是导数,对误差(代价/损失)函数求导,


    image.png

    可得权值调整计算式为


    image.png

    该学习规则可以推广到多层前馈网络中,权值可以初始化为任意值

    梯度下降法的问题

    • 学习率难以选取,太大会产生振荡,太小收敛缓慢
    • 容易陷入局部最优解
      第一个问题解决方法,开始的学习率可以设的较大,后面逐渐调小学习率

    异或问题的两个解决方法

    可以用一种间接的方式解决线性不可分的问题,方法是用多个线性函数对区域进行划分,然后对各个神经元的输出作逻辑运算。可以用两条直线实现异或逻辑

    另外一个方法是,对神经元添加非线性输入,引入非线性成分,使得等效的输入维度变大

    image.png

    收敛的三个条件(或的关系)

    • 误差比较小的时候
    • 权值的变化比较小的时候
    • 迭代循环到一定次数

    代码

    
    import numpy as np
    import matplotlib.pyplot as plt
    
    X=np.array([[1,0,0,0,0,0],
                [1,0,1,0,0,1],
                [1,1,0,1,0,0],
                [1,1,1,1,1,1]])
    
    Y=np.array([-1,1,1,-1])
    #初始化六个权值 -1~1
    W=(np.random.random(6)-0.5)*2
    print(W)
    lr=0.11
    n=0
    O=0
    
    def update():
      global X, Y, W, lr, n
      n+=1
      O=(np.dot(X, W.T))
      W_C=lr*((Y-O.T).dot(X))/int(X.shape[0])
      W=W+ W_C
    
    for _ in range(1000):
      update()
      #print(W)
      #print(n)
      #O=np.sign(np.dot(X,W.T)) #线性激活函数后,用Sign函数分类 ,计算当前输出值
      #if(O==Y.T).all():   #持续训练千次才停止。否则算出来的权值不是最优解,分类曲线不够漂亮
      #  print('Finished')
      #  print('epoch:',n)
      #  break
    
    
    #diagram to show
    x1=[0,1]
    y1=[1,0]
    
    x2=[0,1]
    y2=[0,1]
    
    def calculate(x, root):
      a=W[5]
      b=W[2]+x*W[4]
      c=W[0]+x*W[1]+x*x*W[3]
      if root==1:
        return (-b+np.sqrt(b*b-4*a*c))/(2*a)
      if root==2:
        return (-b-np.sqrt(b*b-4*a*c))/(2*a)
    
    #diagram to show
    xdata = np.linspace(-1,2)
    
    plt.figure()
    plt.plot(xdata,calculate(xdata,1),'r')
    plt.plot(xdata,calculate(xdata,2),'r')
    plt.plot(x1,y1,'bo')
    plt.plot(x2,y2,'yo')
    plt.show
    

    图形两条曲线的y取值


    image.png

    训练千次后的权值及效果

    image.png
    O=np.dot(X, W.T)
    print(O)
    
    [-0.99326548  0.99550285  0.99550285 -0.9965202 ]
    

    相关文章

      网友评论

          本文标题:线性神经网络解决异或问题

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