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

线性神经网络与感知器的主要区别在于,感知器的激活函数只能输出两种可能的值,而线性神经网络的输出可以取任意值,其激活函数是线性函数,线性神经网络采用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 ]

你可能感兴趣的:(线性神经网络解决异或问题)