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

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

作者: 平衡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 ]

相关文章

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

    线性神经网络与感知器的主要区别在于,感知器的激活函数只能输出两种可能的值,而线性神经网络的输出可以取任意值,其激活...

  • 神经网络简介

    BP神经网络结构 我们知道单层感知机(perceptron)的局限性:它无法解决异或(XOR)问题,或者其它线性不...

  • 人工智能之人工神经网络——多层感知器

    异或问题成为感知器和早期神经网络的阿喀琉斯之踵,但它并非无解的问题。恰恰相反,解决它的思路相当简单,就是将...

  • 神经网络从被人忽悠到忽悠人(二)

    引子 Minsky说过神经网络无法解决异或问题。60年代关于神经网络的研究还取得了一定的进展,但是都没有取得重大的...

  • ML-简单线性回归(一元线性回归)

    特点:主要用于解决回归问题,线性回归是许多强大非线性模型的基础(多项式回归,逻辑回归,SVM,神经网络...本质都...

  • 独家连载 | 线性神经网络应用

    线性神经网络应用 3.3线性神经网络 3.3.1线性神经网络介绍 线性神经网络跟单层感知器非常类似,只是把单层感知...

  • 常用的激活函数

    激活函数的作用 激活函数的作用是能够给神经网络加入一些非线性因素,使得神经网络可以更好地解决较为复杂的问题。我们知...

  • 使用2层神经网络解决XOR问题

    感知机,逻辑回归,或者说单层神经网络只能解决线性可分的问题,比如AND和OR问题,图中的直线是决策边界。 对于XO...

  • 深度学习入门(三)BP神经网络——解决异或问题

    原理部分:此部分主要数学知识为方程的求导,如不懂则直接重点看公式3.22a与3.22b 注:Wjk,如W21代表从...

  • 激活函数专题

    激活函数用于神经网络的线性加权操作或池化操作之后,通过加入非线性因素来提高神经网络的表达能力。本专题用于整理和总结...

网友评论

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

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