自适应线性元件也是早期的神经网络模型之一,其学习算法称为LMS(Least Mean Squares)算法。Adaline网络与感知器网络非常相似,只是神经元的传输函数与不同而已。前者是线性传递函数,后者是对称硬极限传递函数。单层Adline网络和感知器网络一样,只能解决线性可分的问题,但其LMS学习规则却比感知器学习规则强得多。
感知器学习规则训练的网络,其分类的判决边界往往离各分类模型靠的比较近,这使得网络对噪声十分敏感;而LMS学习规则则使均方误差最小,从而使判决边界尽可能远离分类模式,增强了网络的抗造能力。旦LMS算法只是英语单层网络的训练,当需要多层网络设计时,需要找新的学习算法,如BP算法。
一、LMS学习率的选择
学习率η越少,算法运行时间就越长,算法也就记忆了更多过去的数据,因此学习率η的倒数反映了LMS算法的记忆容量大小。
η往往需要根据经验选择,1996年Hayjin证明,只要学习率η满足下式,LMS算法就是按方差收敛的:
又可以写成
二、线性神经网络的训练
1.表达。计算训练的输出向量A=W*P+B,以及与期望输出之间的误差E=T-A。
2.检查。将网络输出误差的平方和与期望误差相比较,如果其值小于期望误差或训练达到事先设定的最大训练次数,则停止训练,否则继续。
3.学习。采用W-H学习规则计算新的权值和偏差,并返回到步骤1.
三、线性神经网络函数1.创建函数
(1)newlin函数
newlin函数用于创建一个线性层,在matlab中推荐使用linearlayer函数。所谓线性层,是一个单独的层次,它的权函数为dotprod,输入函数欸netsum,传递函数为purelin。线性层一般用作信号处理和预测中的自适应滤波器。
net = newlin(PR,S,ID,LR)
其中,PR为由R个输入元素矩阵;S为输出向量的数目;ID为输入延迟向量,默认值为【】,LR为学习速率,默认值为0.01;net返回值为一个新的线性层。
(2)linearlayer函数
在matlab 2014b以后就用linearlayer替代newlin函数,该函数的格式为:
linearlayer(inputDelays,widrowHoffLR)
其中inputDelays为输入延迟的行向量,默认为1:2;widrowHoffLR为学习速率,默认值为0.01。
(3)newlind函数
该函数可以设计一个线性层,它通过输入向量和目标向量来计算线性层的权值和阈值,函数的调用格式如下:
net = newlind(P,T,Pi)
其中P为Q组输入向量组成的RxQ维矩阵;T为Q组目标分类向量组成的SxQ维矩阵;Pi为初始输入延迟状态的ID个单元阵列。
2.传递函数
在matlab中,线性传递函数的调用格式为:
A=purelin(N,FP)
其中,N为SXQ维的网络输入列向量,FP为性能参数,返回网络输入向量N的输出矩阵A。
3.学习函数四、线性神经网络的局限性
线性神经网络只能反映输入和输出样本向量间的线性映射关系,和感知器神经网络一样,它也只能解决线性可分问日。由于线性神经网络的误差曲面是一个多维抛物面,所以在学习速率足够小的情况下,对于基于最小二乘梯度下降原理进行训练总可以找到一个最优解。但是,尽管如此,对线性神经网络的训练并不一定总能达到零误差。线性神经网络的训练性能要受网络规则和训练样本集大小的限制。如果线性神经网络的自由度(即神经网络所有权值和阈值的个数总和)小于训练样本集中“输入-目标”向量的对数,且各样本向量线性无关,则网络训练不可能达到零误差,而只能得到一个网络误差最小的解。此外,值得注意的是,线性神经网络的训练和性能都要受到学习速率参数的影响,过大的学习速率可能会导致网络性能发散。
权值w和偏差b所决定的线性网络误差图,可以看出它是一个抛物面。
lr=menu('选择学习速率:',...
'1.2*maxlinlr',...
'2.8*maxlinlr');
disp('')
disp_freq=1;
max_epoch=28;
err_goal=0.001;
iflr==1
lp.lr=1.2*maxlinlr(p,'bias');
else
lp.lr=2.8*maxlinlr(p,'bias');
end
a=W+p+B;
A=purelin(a);
E=t-A;
see=sumsqr(E);%求误差
errors=[see];%求误差矩阵元素的平方和
figure(1);
forepoch=1:max_epoch
ifsee
epoch=epoch-1;
break;
end
lw=W;
lb=B;
dw=learnwh([],p,[],[],[],[],E,[],[],[],lp,[]);
db=learnwh([],ones(1,Q),[],[],[],[],E,[],[],[],lp,[]);
W=W+dw;
B=B+db;
a=W*p+B;
A=purelin(a);
E=t-A;
see=sumsqr(E);
errors=[errors see];%把误差变为一个行向量
ifrem(epoch,disp_freq)==0
holdon;
plot([lw W],[lb,B],'g-');
drawnow
end
end
figure(2);
holdoff;
m=W*p+B;
a=purelin(m);
plot(a)
五、线性网络的应用1.逻辑与
clearall;
%定义变量
p=[0 0 1 1;0 1 0 1];
t=[0 0 0 1];
lr=maxlinlr(p,'bias');%根据输入矩阵求解最大学习速率
%线性网络实现
net1=linearlayer(0,lr);
net1=train(net1,p,t);
%感知器实现
net2=newp([-1 1;-1 1],1,'hardlim');
net2=train(net2,p,t);
%显示
disp('线性网络输出:')
y1=sim(net1,p)
disp('线性网络二值输出:')
y11=y1>=0.5
disp('线性网络最终权值:')
w1=[net1.iw,net1.b]
disp('感知器网络输出:')
y2=sim(net2,p)
disp('感知器网络二值输出:')
y22=y2>=0.5
disp('线性网络最终权值:')
w2=[net2.iw,net2.b]
%图形窗口输出
plot([0,0,1],[0,1,0],'ro');
holdon;
plot(1,1,'bd');
x=-2:0.2:2;
y1=1/2/w1(2)-w1(1)/w1(2)*x-w1(3)/w1(2);
plot(x,y1,'-');
y2=-w2(1)/w2(2)*x-w2(3)/w2(2);
plot(x,y2,'--');
axis([-0.5 2 -0.5 2]);
xlabel('x');
ylabel('y');
title('线性神经网络用于求积与逻辑')
legend('0','1','线性神经网络分类面','感知器分类面');
2.逻辑异或
clearall;
p1=[0 0 1 1;0 1 0 1];
p2=p1(1,:).^2;
p3=p1(1,:).*p1(2,:);
p4=p1(2,:).^2;
p=[p1(1,:);p2;p3;p4;p1(2,:)];
t=[0 1 1 0];
lr=maxlinlr(p,'bias');%根据输入矩阵求解最大学习率
%线性网络实现
net=linearlayer(0,lr);
net=train(net,p,t);
y1=sim(net,p);
w1=[net.iw,net.b];
plot([0 1],[0 1],'ro');
holdon;
plot([0 1],[1 0],'d');
axis([-0.1 1.1 -0.1 1.1]);
xlabel('x');ylabel('y');
title('线性网络用于求解异或逻辑');
x=-0.1:0.1:1.1;
y=-0.1:0.1:1.1;
N=length(x);
X=repmat(x,1,N);
Y=repmat(y,N,1);
Y=Y(:);
Y=Y';
p=[X;X.^2;X.*Y;Y.^2;Y];
yy=net(p);
y1=reshape(yy,N,N);
[C,h]=contour(x,y,y1);
clabel(C,h,0.5);
legend('0','1','线性网络分类面');
3.滤噪
图中s为原始输入信号,假设为平稳的零均值随机信号;
n0为与s不想关的随机信号;
n1为u与n0相关的信号;
系统输出为ε;
s+n0为ADALINE神经元的预期输出;
y为ADALINE神经元的输出。则
通过ADALINE调节,得到
上式中,当Emin[(n-y)2]->0时,y->n,其输出ε为s,则噪声被抵消。
clearall;
%定义输入向量和目标向量
time=0.01:0.01:10;%时间变量
noise=(rand(1,1000)-0.5)*4;%随机噪声
input=sin(time);%信号
p=noise;%将噪声作为ADALINE的输入向量
t=input+noise;%目标向量
%创建线性神经网络
net=newlin([-1 1],1,0,0.0005);
%线性神经网络的自适应调整
net.adaptParam.passes=70;
%输出信号output为网络调整过程中的误差
[net,y,output]=adapt(net,p,t);
holdon;
subplot(3,1,1);
plot(time,input,'r')
title('信号波形sin(t)');
subplot(312);
plot(time,t,'m');
xlabel('t');
title('随机噪声波形sin(t)+noise(t)');
%绘制输出信号的波形
subplot(313);
plot(time,output,'b');
xlabel('t');
title('输出信号波形y(t)');
输出信号除了含有一定的直流分类外,其波形与输入波形基本一直,消除了迭加的随机噪声。
领取专属 10元无门槛券
私享最新 技术干货