线性神经网络(7月13)

初认识

线性神经网络最经典的例子是自适应线性元件,主要用途是通过线性逼近一个函数式而进行模式联想以及信号滤波,预测,模式识别和控制。线性神经网络的输出是可以任何值,其传输函数是线性函数。采用widrow-hoff学习规则,即LMS算法来调整网络的权值和偏置。

线性神经网络的机构

线性神经网络在结构上与感知网络非常相似,只是神经元的传输函数不一样:
在这里插入图片描述
即线性神经系统除了产生二值输出外,还可以产生模拟输出——即采用线性传输函数,使输出为任意值
假设输入是一个N维向量x=[x1,x2,x3,…xn],然后也可以得到在神经元的输出:

v=xi*wi+b

经过线性函数purelin,就可以得到在输出层的结果y:

y=purelin(v);

而且我们也只知道单层感知器在输出层的结果也是这样:

y=hardlim(v);

也可以写成矩阵形式,同时也是仿照单层感知器的那种方式:

x(n)=[1 x1 x2 x3 x4 x5...xn);  是指偏置也做为输入分量,即共有n+1个输入分量;
w(n)=[b w1 w2 w3 w4 w5......wn);

y=v=x(n)*w(n)T;     这里可以得到任意值;
q=sgn(y);    这里可以得到二值;

若网络中包含多个神经元节点,就能形成多个输出,这种线性神经网络叫Madaline网络。
在这里插入图片描述

LMS学习算法

大家们说:线性神经网络的闪光之处在于器学习算法,LMS算法称为Δ规则(delta rule).
LMS算法只能训练单层网络,但这并不会对其功能造成很大的影响。
定义某次迭代时得到的误差信号为:

e(N)=d(n)-y(n);  y(n)即输出层的输出结果; d(n)为期望输出值;

而且LMS算法与单层感知器的算法不一样的地方还有就是:采用均方误差作为评价指标:

mse=(1/Q)*e^2;  Q是训练样本的维数

线性神经网路学习的目标就是找出适当的权值w,使得误差的均方误差mse最小。
找出最小值,就需要用到导数的方法:只要用mse对w求偏导,再令该偏导等于零即可以求出mse的极值。
在实际运算时,有时候会出现权值的维数过高,给计算会带来困难,往往是通过调节权值,使mse从空间中的某一点开始,沿着斜面向下滑行,最终达到最小值。
滑行的方向是该点最陡下降的方向,即负梯度方向。沿着此方向以适当的强度对权值进行修正,就能最终达到最佳权值。
在这里插入图片描述
因此,根据梯度下降法,权矢量的修正值正比于当前位置上E(w)的梯度,权值调整的规则:
在这里插入图片描述
在这里插入图片描述
同时继续进行变化:
在这里插入图片描述
然后是线性网络的步骤:

定义输入变量X(n),输出期望值d(n),偏置与权值(b,w(n));
将权值和偏置初始化;
输出多个训练样本;
训练神经网络;
判断算法是否收敛,若不收敛,便调整权值,再进行重新计算,重新训练;

算法中学习率的选择

学习率越小,算法的运行时间就越长,算法也就记忆了更多过去的数据。
在这里插入图片描述

学习率的下降

在这里插入图片描述

线性神经网络的Matlab函数

net=newlind(P,T,PI)
P:训练样本;
T:期望输出向量;
PI:初始输入延迟
函数返回设计好的线性神经网络net,设计的方法是求一个线性方程组在最小均方误差意义下的最优解;而且值得注意的是:newlind函数一旦调用,就不需要用别的函数重新训练了,可以直接进行仿真测试;
net=newlin(P,S,ID,LR) 被更换为linearlayer函数
p:训练样本;;
S:输出节点个数
ID:表示输入延迟的向量,默认值为[0];
LR: 学习率,默认值为0
newlin函数的作用是船家女一个未经训练的线性神经网络,以dotprod为权值函数,netsum为网络输入函数,purelin为传输函数。
A=purelin(N,FP);
N:训练样本的矩阵;
[dw,LS]=Learnwh(W,P,Z,N,A,T,E,gW,gA,D,LP,LS)
learnwh是LMS算法的学习函数,
W;权值矩阵
P:输入向量矩阵
Z:权值输入向量
N:网络输入向量;
A:输出向量;
T:期望输出向量
E:隐含层中的误差的向量
gW:权重梯度;
gA:输出梯度:
D:神经元距离;
LP:学习参数;
Ls:学习状态,初始值为空矩阵;
lr=maxlinlr(p);  或者是lr=maxlinlr(p,’bias'); 
p:输入矩阵,输入向量按列存放,
lr是返回最大学习率;
后面的第二个参数的作用是使矩阵p在最后一行被加入一行全一向量,作为偏置对应的固定输入,这样权值和偏置就可以统一计算。
pref=mse(E);
可见只有一个有效的输入参数,E是误差向量组成的矩阵或细胞数组
net=linearlayer(inputDelays,widrowhoffLR)
intputdelay :输入延迟的行想想;
widrowhoffLR:学习率
返回值是创建好的线性层,还要进行训练才具有分类,拟合,识别的能力。
它将会替换newlin函数;

实例补充说明

①newlind

x=-5:5;                        
y=3*x-7;                       %这是期望直线;
randn('state',2);
y1=y+randn(1,length(y))*1.5;    %加入噪音的直线,制造一种非线性的情况
plot(x,y,'-');                 %把期望直线画出
plot(x,y1,'o-');                %把实际直线画出,可以看到是曲折的直线

P=x;T=y1;  %设置好输入向量,与输出期望
net=newlind(P,T);   %建立线性层
%newlind函数一旦意境调用,就不需要再调用别的函数重新训练;
A=-5:2:5;
B=sim(net,A);
hold on;
plot(A,B,'*-');%输出经过训练后的结果:是一条拟合直线
C=net.iw           %求出训练后的权值
D=net.b            %求出偏置值

在这里插入图片描述
这里实现了的功能是:使用线性神经网络,用线性去逼近任意非线性函数,当输入与输出是非线性关系时,线性神经网络可以通过对网络的训练,得出线性逼近关系,这一特点可以在系统辨识或模式联想中得到应用。
②newlin

x=-5:5;
y=2*x-5;
randn('state',2);
y1=y+randn(1,length(y))*1.5;    %加入噪音的直线,制造一种非线性的情况
plot(x,y1,'o-');                %把实际直线画出,可以看到是曲折的直线
P=x;T=y1;
net=newlin(P,1,[0],maxlinlr(P));      %用newlin创建一个还没训练的线性网络;
x1=-2:2;
A=sim(net,x1);
hold on;
plot(x1,A,'-');                   %发现是一条y=0的直线,也就是说明,此时的没训练的系统, 权值为0, 偏置为0。
C=net.iw           %求出训练后的权值
D=net.b            %求出偏置值
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
net1=train(net,P,T);              %训练线性网络;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A=-5:2:5;
B=sim(net1,A);
hold on;
plot(A,B,'*-');%输出经过训练后的结果:是一条拟合直线

可以得到以下图,发现红色圈住的地方是一个线性元件。
在这里插入图片描述
也可以发现newlind和newlin实现的是一样的功能;
在这里插入图片描述
③purelin

>> x=-5:5;
>> y=purelin(x)

y =

    -5    -4    -3    -2    -1     0     1     2     3     4     5

>> y=3*purelin(x)-7

y =

   -22   -19   -16   -13   -10    -7    -4    -1     2     5     8
>> y=purelin(3*x)

y =

   -15   -12    -9    -6    -3     0     3     6     9    12    15

>> y=purelin(3*x-7)

y =

   -22   -19   -16   -13   -10    -7    -4    -1     2     5     8


通过这个函数,我们对线性网络的理解会更加深刻,因为我们知道了线性元件的功能;
也可以看出这个函数的作用是Y=v(x), v(x)=w*x+b;
④maxlinlr

x =

     1     2    -4     7
     0     3    10     6

>> lr=maxlinlr(x)

lr =

    0.0069

>> lr=maxlinlr(x,0.3)

lr =

    0.0067

>> lr=maxlinlr(x,7)

lr =

    0.0067

可以看出无论偏置为多少,此时最大的学习率都是一样的;
⑤linearlayer

x=-5:5;
y=2*x-5;
randn('state',2);
y1=y+randn(1,length(y))*1.5;    %加入噪音的直线,制造一种非线性的情况
plot(x,y1,'o-');                %把实际直线画出,可以看到是曲折的直线
P=x;T=y1;
lr=maxlinlr(P,'bias')
net=linearlayer(0,lr);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
net1=train(net,P,T);              %训练线性网络;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A=-5:2:5;
B=sim(net1,A);
hold on;
plot(A,B,'*-');%输出经过训练后的结果:是一条拟合直线

同样也可以得到一样的结果:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值