初认识
线性神经网络最经典的例子是自适应线性元件,主要用途是通过线性逼近一个函数式而进行模式联想以及信号滤波,预测,模式识别和控制。线性神经网络的输出是可以任何值,其传输函数是线性函数。采用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,'*-');%输出经过训练后的结果:是一条拟合直线
同样也可以得到一样的结果: