线性神经网络与感知器的主要区别在于,感知器的激活函数只能输出两种可能的值,而线性神经网络的输出可以取任意值,其激活函数是线性函数,线性神经网络采用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.pngO=np.dot(X, W.T)
print(O)
[-0.99326548 0.99550285 0.99550285 -0.9965202 ]
网友评论