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

线性神经网络与感知器的主要区别在于,感知器的激活函数只能输出两种可能的值,而线性神经网络的输出可以取任意值,其激活函数是线性函数,线性神经网络采用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 ]
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 改进神经网络的学习方法(上) 当一个高尔夫球员刚开始学习打高尔夫时,他们通常会在挥杆的练习上花费大多数时间。慢慢地...
    nightwish夜愿阅读 3,190评论 2 8
  • 今天想写写我的儿子。一个理想从长大后天天看((小羊肖恩))到上周末我们出去玩说长大了要给我修一栋别墅的十一岁的傻小...
    阿连DYX阅读 398评论 2 3
  • 晚上吃晚饭,听同事介绍有一家新开的饭店,价廉物美,所以拖家带口去品尝,稍微晚了一点,没位置了,需要排队拿号,我竟然...
    久阳海姿阅读 379评论 0 0
  • 月亮滑过小城灯火缭绕的酮体忧郁的男女遛狗,失神,散步灯影的花开在地上夜风像游吟诗人,边走边唱仇恨在十字路口休憩片刻...
    悟秋云阅读 172评论 3 7
  • 0 我喜欢他,从我看到他的那一眼; 他不喜欢我,从他认识我的那一天。 有些事一开始就早已注定结局是什么样子,谁都想...
    泽论阅读 2,096评论 17 19

友情链接更多精彩内容