第五章 自适应线性元件自适应线性元件(Adaptive Linear Element,简称Adaline)也是早期神经网络模型之一,它是由威德罗(Widrow)和霍夫(Hoff)首先提出的。它与感知器的主要不同之处在于其神经元有一个线性激活函数,这允许输出可以是任意值,而不仅仅只是像感知器中那样只能取0或1。另外,它采用的是W—H学习法则,也称最小均方差(LMS)规则对权值进行训练,从而能够得到比感知器更快的收敛速度和更高的精度。
自适应线性元件的主要用途是线性逼近一个函数式而进行模式联想。另外,它还适用于信号处理滤波、预测、模型识别和控制。
5.1 自适应线性神经元模型和结构一个线性的具有r个输人的自适应线性神经元模型如下图所示。这个神经元有一个线性激活函数,被称为Adaline如图5.1(a)所示。和感知器一样,偏差可以用来作为网络的一个可调参数,提供额外可调的自由变量以获得期望的网络特性。线性神经元可以训练学习一个与之对应的输入输出的函数关系,或线性逼近任意一个非线性函数,但它不能产生任何非线性的计算特性。

图5,1 自适应线性神经网络的结构当自适应线性网络由s个神经元相并联形成一层网络,此自适应线性神经网络又称为Madallne如图5.1(b)所示。
W—H规则仅能够训练单层网络,但这并不是什么严重问题。如前面所述,单层线性网络与多层线性网络具有同样的能力,即对于每一个多层线性网络,都具有一个等效的单层线性网络与之对应。在反向传播法产生以后,威德罗又将其自适应线性网络扩展成多层,甚至将激活函数也扩展成非线性的了。
5.2 W-H学习规则
W—H学习规则是由威德罗和霍夫提出的用来修正权矢量的学习规则,所以用他们两人姓氏的第一个字母来命名。采用W—H学习规则可以用来训练一定网络的权值和偏差使之线性地逼近一个函数式而进行模式联想(Pattern Association)。
定义一个线性网络的输出误差函数为:
 (5,1)
由(5.1)式可以看出:线性网络具有抛物线型误差函数所形成的误差表面,所以只有一个误差最小值。通过W—H学习规则来计算权值和偏差的变化,并使网络误差的平方和最小化,总能够训练一个网络的误差趋于这个最小值。另外很显然,E(W,B)只取决于网络的权值及目标矢量。我们的目的是通过调节权矢量,使E(W,B)达到最小值。所以在给定E(W,B)后,利用W—H学习规则修正权矢量和偏差矢量,使E(W,B)从误差空间的某一点开始,沿着E(W,B)的斜面向下滑行。根据梯度下降法,权矢量的修正值正比于当前位置上E(W,B)的梯度,对于第i个输出节点有:
 (5.2)
或表示为:
 (5.3)
这里定义为第i个输出节点的误差:
 (5.4)
(5.3)式称为W—H学习规则,又叫δ规则,或为最小均方差算法(LMS)。W—H学习规则的权值变化量正比于网络的输出误差及网络的输入矢量。它不需求导数,所以算法简单,又具有收敛速度快和精度高的优点。
(5.3)式中的η为学习速率。在一般的实际运用中,实践表明,η通常取一接近1的数,或取值为:
 (5.5)
这样的选择可以达到既快速又正确的结果。
学习速率的这一取法在神经网络工具箱中用函数maxlinlr.m来实现。(5.5)式可实现为:

其中lr为学习速率。
W—H学习规则的函数为:learnwh.m来实现,另外,加上线性自适应网络输出函数purelin.m,可以写出W—H学习规则的计算公式为:
A=purelin(W*P);
E=T—A;
[dW,dB]=learnwh(P,E,h);
W=W十dW;
B=B十dB;
采用W—H规则训练自适应线性元件使其能够得以收敛的必要条件是被训练的输入矢量必须是线性独立的,且应适当地选择学习速率以防止产生振荡现象。
5.3 网络训练自适应线性元件的网络训练过程可以归纳为以下三个步骤:
1)表达:计算训练的输出矢量A=W*P十B,以及与期望输出之间的误差E=T—A;
2)检查:将网络输出误差的平方和与期望误差相比较,如果其值小于期望误差,或训练已达到事先设定的最大训练次数,则停止训练;否则继续;
3)学习:采用W—H学习规则计算新的权值和偏差,并返回到1)。
每进行一次上述三个步骤,被认为是完成一个训练循环次数。
如果网络训练获得成功,那么当一个不在训练中的输入矢量输入到网络中时,网络趋于产生一个与其相联想的输出矢量。这个特性被称为泛化,这在函数逼近以及输入矢量分类的应用中是相当有用的。
如果经过训练,网络仍不能达到期望目标,可以有两种选择:或检查一下所要解决的问题,是否适用于线性网络;或对网络进行进一步的训练。
虽然只适用于线性网络,W—H学习规则仍然是重要的,因为它展现了梯度下降法是如何来训练一个网络的,此概念后来发展成反向传播法,使之可以训练多层非线性网络。
采用Matlab进行自适应线性元件网络的训练过程如下:
%表达式
A=purelin(W*P,B);
E=T-A;
SSE=sumsqr(E); %求误差平方和
for epoch=1,max_epoch %循环训练
if SSE<err_goal %比较误差
epoch=epoch—1;
break %若满足期望误差要求,结束训练
end
[dlw,dB]=1earnwh(P,E,lr);%修正权值
W=W十dW;
B=B十dB;
A=purelin(W*P,B); %网络输出
E=T-A;
SSE=sumsqr(E); %计算网络误差平方和
end
同样,工具箱中设计了一个名为trainwh.m的函数可以替代上述整个训练过程。
如果仍用在输入空间作图法来解释自适应线性元件网络的功能,它可以解释为用W*P十B=0的界面通过给出的输入矢量组成的空间(点或线),或线性地逼近这些输入矢量。
在5.4节中首先给出一些简单的例题来了解自适应线性元件的功能。
5.4例题与分析
[例5.1]设计自适应线性网络实现从输入矢量到输出矢量的变换关系。其输入矢量和输出矢量分别为:
P=[1.0 -1.2]
T=[0.5 1.0]
解:
用自适应线性网络求解问题时,设计者要确定期望误差值,以及最大循环次数。对此题可分别选err_goal=0.001;max_epoch=20。自适应线性网络设计程序可写为:
%wf1.m

P=[1 -1.2];
T=[0.5 1];
[R,Q]=size(P);
[S,Q]=size(T);
[W,B]=rands(S,R);
max_epoch=20; %最大循环次数
err_goal=0.001; %期望误差
1r=0.4*maxlinlr(P); %最佳学习速率
disp_freq=1; %设置显示频率
TP=[disp_freq max_epoch err_goal lr]; %设置参数变量TP
[W,B,epochs,error]=trainwh(W,B,P,T,TP) %进行线性网络权值训练
end
在随机初始值为:W0=—0.9309;B0=—0.8931的情况下,经过12次循环训练后,网络的输出误差平方和达到0.000949,网络的最终权值为:
W=-0.2354;B=0.7066
实际上,对于[例5.1]这个简单的例题,它存在一个精确解,且可以用解二元一次方程的方式将P和T值分别对应地代入方程T=W*P十B得:

可解出e=T-A=0的解为:
W=-0.2273;B=0.7273
由此看出,对于特别简单的问题,采用自适应线性网络的训练不一定能够得到足够精确的解。因为当训练误差达到期望误差值后,训练即被终止。
对于具有零误差的自适应线性网络,即输入/输出矢量对存在着严格的线性关系,此时的自适应线性网络的设计可以采用工具箱中另外一个名为solvelin.m的函数。以[例5.1]为例,可简单用下面的命令:
》[W,B]=solvelin(P,T)
可立即得到精确解:
W=—0.2273
B=0.7273
然后可用simulin.m函数来检测所设计的网络:
》A=simulin(P,W,B)
A=
0.5000 1.0000
还可以用sumsqr.m函数来求出误差平方和:
》SSE=sumsqr(T-A)
SSE=
0
可见所设计网络的误差为零。
[例5.2]现在来考虑一个较大的多神经元网络的模式联想的设计问题。输入矢量和目标矢量分别为:

解:
由输入矢量和目标输出矢量可得:r=3,s=4,q=4。所以网络的结构如图5.2所示。

图5.2 网络设计的结构图这个问题的求解同样可以采用线性方程组求出,即对每一个输出节点写出输入和输出之间的关系等式。对于网络每一个输出神经元都有4个变量(三个权值加一个偏差),有四个限制方程(每组输入对应四个输出值)。这样由四个输出节点,共产生16个方程,其方程数目与权值数目相等。所以只要输入矢量是线性独立的,则同时满足这16个方程的权值存在且唯一。对应到网络上来说,则存在零误差的精确权值。
实际上要求出这16个方程的解是需要花费一定的时间的,甚至是不太容易的。对于一些实际问题,常常并不需要求出其完美的零误差时的解。也就是说允许存在一定的误差。在这种情况下,采用自适应线性网络求解就显示出它的优越性:因为它可以很快地训练出满足一定要求的网络权值。对于有完美解的网络设计,通过对期望误差平方和的选定,也能通过加长训练次数来获得。
下面给出[例5.2]的设计程序。为了便于对比,在程序中增加了以下几项:
1)训练前由初始权值所得到的误差平方和;
2)最终误差及训练次数的显示;
3)整个训练过程中的网络误差的记录显示;
4)最终权值。
%wf2.m

P=[1 1.5 1.2 –0.3; -1 2 3 –0.5; 2 1 –1.6 0.9];
T=[0.5 3 –2.2 1.4; 1.1 –1.2 1.7 –0.4; 3 0.2 –1.8 –0.4; -1 0.1 –1.0 0.6];
disp_freq=400; %中间不显示结果
max_epoch=400;
err_goal=0.001;
lr=0.9*maxlinlr(P);
W=[1.9978 –0.5959 –0.3517; 1.5543 0.05331 1.3660; %初始权值
1.0672 0.3645 –0.9227; -0.7747 1.3839 –0.3384];
B=[0.0746; -0.0642; -0.4256; -0.6433];
SSE=sumsqr(T-purelin(W*P,B)); %未训练前误差
fprintf(‘Before trainihg,sum squared error=%g,\n’,SSE)
%训练网络
flops(0)
tp=[disp_freq max_epoch err_goal lr]; %设置参数变量tp
[W,B,epochs,errors]=trainwh(W,B,P,T,tp); %进行线性网络权值训练
W %显示最终训练权矢量
B %显示最终训练偏差矢量
SSE=sumsqr(T-purelin(W*P,B)); %最终误差
%显示结果并给出结论
ploterr(errors),
fprintf (‘\n After%.0f epochs,sum squared e error=%g,\n\n’,SSE),
fprintf (‘Training took %.0f flops,\n’,flops),
fprintf (‘ Trained network operates:’);
if SSE<err_goal
disp(‘Adequately.’)
else
disp(‘Inadequately.’)
end
end
运行wf2.m在训练274次循环后其误差平方和达到0.000993245,而初始误差为144.463。在整个训练过程中误差的变化走向如图5.3所示。
训练后的网络权值为:


图5.3 网络训练过程中的误差记录对于存在零误差的精确权值网络,若用函数solvelin.m来求解,则更加简单如下:
%wf3.m

P=[1 1.5 1.2 –0.3; -1 2 3 –0.5; 2 1 –1.6 0.9];
T=[0.5 3 –2.2 1.4; 1.1 –1.2 1.7 –0.4; 3 0.2 –1.8 -0.4; -1 0.1 –1.0 0.6];
[W,B]=solvelin(P,T);
A=simulin (P,W,B);
SSE=sumsqr (T-A)
W
B
end
由此可得零误差的唯一精确解为:

通常可以直接地判断出一个线性网络是否有完美的零误差的解:如果每个神经元所具有的自由度(即权值与阈值数)等于或大于限制数(即输入/输出矢量对),那么线性网络则可以零误差的解决问题。不过这一事实在当输入矢量是线性相关或没有阈值时不成立。
[例5.3]设计训练一个线性网络实现下列从输人矢量到目标矢量的变换:

由所给输入/输出矢量对可知,所要设计的线性网络应具有阀值,并有两个输入神经元和一个输出神经元。对于这个具有三个可调参数的线性网络,本应得到完美的零误差的精确解。但是不幸的是所给出的输入矢量元素之间是线性相关的:第三组元素等于第二组元素的两倍减去第一组:P3=2P2-P1。此时,由于输入矢量的奇异性,用函数solvelin.m来设计时网络会产生问题。只有在能够线性地解出问题的情况下,用函数solvelin.m才比较准确。若没有准确的零误差,solvelin.m函数会给出最小误差平方和意义下的解。另外当出现奇异矩阵时,使用solvelin.m求解权值可能会出现下列警告:
Warning:Matrix is singular to working precision.
而当采用trainwh.m函数则能训练出达到所给定的训练次数时,或所给定的最小误差意义下的权值时的最小误差。只要将前面已编写的wf2.m程序中的输入与目标矢量改变一下,并给出(—l,1)之间的随机初始值,即可运行看到本例的结果。其最终误差在1.04左右,这就是本例题下的最小误差平方和,而当采用完全线性函数的设计solvelin.m去求解网络权值时,所得到的误差是4.25。采用W—H算法训练出的误差是它的1/4,由此可见其算法的优越性。
[例5.4]现在假定在[例5.1]的输入/输出矢量中增加两组元素,使其变为
P=[1.0 1.5 3.0 -1.2]
T=[0.5 1.1 3.0 -1.0]
本例题的目的是在于了解自适应线性网络的线性逼近求解的能力。
此时,所要解决的问题相当于用四个方程解w和b两个未知数。因为方程数大于未知数,所以采用代数方程是无解的。但仍可以用自适应线性网络来对此问题求解。仍然是单个输入节点和单个输出节点,网络具有一个权值w和一个偏差b,通过选定期望误差平方和的值和最大循环次数后,可以让网络进行自行训练和学习。
图5.4给出了输入输出对的位置以及网络求解的结果。对于所设置的err_goal=0.001,在循环训练了50次后所得的误差平方和仍然为:SSE=0.289。这个值即是本题所能达到的最小误差平方和的值,也是用线性网络所能达到的最佳结果。当采用线性自适应线性网络求解问题所得到的误差特别大时,可以认为此问题不适宜用线性网络来解决。

图5,4网络训练结果图由上面的例子可以看出,自适应线性网络仅可以学习输入输出矢量之间的线性关系,所以对某些问题,自适应线性网络是不能得到满意的结果的。然而,当一个完美的结果不存在,但只要选择足够小的学习速率,自适应线性网络将总是可以使其误差平方和为最小,网络对其给定的结构,总可得到一个尽可能接近目标的结果。这是因为一个线性网络的误差表面是抛物线型的,既然抛物线只有唯一最小值,基于梯度下降法的W—H规则肯定在其最小值处产生结果。
自适应线性网络还有另一个潜在的困难,当学习速率取得较大时,可导致训练过程的不稳定。
[例5.5]在网络设计训练中,学习速率的选择是影响收敛速度甚至结果的一个很重要的因素。只要学习速率足够小,采用W—H规则总可以训练出一个使其输出误差为最小的线性网络。这里展现一个采用大于所建议的maxlinlr.m学习速率进行训练情况的例子。
输入/目标矢量与[例5.1]相同。我们将以不同的学习速率训练两次网络以展现两种不希望的学习速率带来的影响。
为了能够清楚地观察到网络训练过程中权值的修正所带来的误差的变化情况,我们在程序中加入误差等高线图,并在其中显示每一次权值修正后的误差值位置,如图5.5所示。其中图5.5(a)为由权值w和偏差b所决定的线性网络误差曲面,可以看到它是一个抛物线型的。图5.5(b)为图5.5(a)的从上往下的投影图,图中的曲线称为等高线,线上的点具有相同的误差值。图中的记号“o”代表用函数solvelin.m求出的误差最小值;而记号“十”为训练前的初始值点。

图5,5 线性网络的误差图形
1)对于第一个尝试,学习速率lr取:
1r=1.7*maxlinlr(P);
图5.6给出了网络在此学习速率下的权值训练及其误差的记录。

图5,6 1r=1.7*maxlinlr(P)时的网络训练过程正如所看到的,由于学习速率太大,虽然能够使权值得到较大的修正,但由于过量而产生了振荡。不过误差在其权值振荡过程中仍然能够直线下降,所以在经过14次循环后(注意在[例5.1]中只用了12次)达到了误差的最小值。如果学习速率再加大,可能就不是这么幸运了。
2)第二个尝试是选用更大学习速率:
1r=2.5*maxlinlr(P);
图5.7同样给出了网络的权值训练及其误差的记录。从中可以看出,由于其学习速率太大,网络的权值修正过程总是在最小误差方向上运动,但每一次都由于过大的调整使其偏离期望日标越来越远,其误差是向增加而不是减少的方向移动。由此可以得出结论:应选取较小的学习速率以保证网络收敛,而不应选太大的学习速率而使其发散。

图5.7 1r=2.5*maxlinlr(P)时的网络训练过程最后给出用MATLAB工具箱编写本例题的程序:
%wf4.m

P=[1 –1.2];
T=[0.5 1];
[R,Q]=size(P);
[S,Q]=size(T);
[W,B]=rands(S,R);
%画误差曲面图
Wrange=-2:0.2:2;Brange=-2:0.2:2;
ES=errsurf(P,T,Wrange,Brange,’purelin’);
mesh(ES,[60 30]);
title(‘Error Surface Graph’)
pause
%设计网络权值并画出投影图
[DW,DB]=solvelin(P,T); %求出理想网络权值
contour (ES,25,Wrange,Brange); %画误差的等高线
axis(‘equal’)
hold on
plot(DW,DB,‘oy’)
xlabel(‘W’),ylabel(‘B’)
pause
%选择学习速率
LR=menu(‘Use a learning rate of,‘,…
‘1.7*maxlinlr’…
‘2.5*maxlinlr’);
disp(‘’)
%训练权值
disp_freq=1; max_epoch=30; error_goal=0.001;
if LR=1
1r=1.7*maxlinlr(P,1);
else
1r=2.5*maxlinlr(P,1);
end
flops(0)
pausetime=1; %设置暂停时间为1秒钟
A=purelin(W*P,B);
E=T-A; SSE=sumsqr(E);
errors=[SEE];
for epoch=1:max_epoch
if SSE<error_goal,epoch=epoch-1; break,end
LW=W; LB=B;
[dW,dB]=learnwh(P,E,1r);
W=W十dW;B=B十dB;
A=purelin(W*P,B);E=T—A; SSE=sumsqr(E); %学习后的再次表达式
errors=[errors SEE]; %误差的再次记录
%训练过程中的显示
if rem(epoch,disp_freq)==0
temp=flops;
plot([LW W],[LB B],‘r-‘);
drawnow
flops(temp);
pause2(pausetime)
end
end
%误差记录
A=purelin(W*P,B);
ploterr(errors)
end
5.5对比与分析到目前为止,我们已经学习了感知器和自适应线性网络。这两类网络在其结构和学习算法上都没有什么太大的差别,甚至是大同小异。我们前面在人工神经网络的发展历史中已经介绍过,这两种模型实际上是最早的模型,且自适应线性网络是在感知器的研究基础上建立发展起来的。不过就是从它们细小的区别上,我们也能够看到它们之间功能的不同点,而这些不同点,在其它各种神经网络中表现得更加突出。所以在此想再次强调一下学习人工神经网络的重点在于掌握不同的概念上,在于掌握不同网络名称的不同特点上。这些特点主要表现在下面三点上:
(1)网络模型结构上一种网络有一种结构。我们已学过的感知器和自适应线性网络,几乎具有相同的结构,但其他网络如霍普菲尔德网络就完全是另外一种结构。可以说所有的不同的网络都是为了完成某一需要而设计成特有的网络模型结构。我们必须了解各自独特的结构以及所达到的不同作用。只有这样,我们才能够设计出符合特殊需要的其他网络结构来。
就感知器和自适应线性网络而言,结构上的主要区别在于激活函数:一个是二值型的,一个线性的。仅此一点,就使得感知器仅能做简单的分类工作,而自适应线性网络除了有分类功能外,还可以进行线性逼近。当把偏差与权值考虑成一体时,自适应线性网络的输入与输出之间的关系可以写成A=W*P。如果P是满秩的话,则可以写成AP-1=W,或W=A/P。从自动控制理论的角度来说,W就是系统的传递函数,只不过W不是计算出来的,而是训练出来的,且自适应线性网络中的W只能表现出输入与输出之间的线性关系。当输入与输出之间是非线性关系时,通过对网络的训练,可以得出线性逼近关系,即线性化的传递函数。这个思想可以运用在对被控系统的建模上,即系统辨识上。当然,若把此思想用在后面将要学习到的BP网络中,则意味着可以对任意非线性被控系统建立精确的系统模型。这无论用自动控制的经典理论,还是用现代控制理论,都是无法做到的,因为在那里,只能对线性的或线性化的系统建立传递函数。而运用人工神经网络,采用最简单的自适应线性网络即可做到。
(2)学习算法学习算法是为了完成不同的任务、达到不同的目的所建立的,所以不同的模型,有不同的算法。感知器的算法是最早提出的可收敛的算法,它的自适应思想被威德罗和霍夫发展成使其误差最小的梯度下降法。最后又在BP算法中得到进一步的推广,它们属于同一类算法。除此以外,在其它模型中,则采用各种完全不同的算法。
(3)适用性与局限性每个网络模型以其独特的结构和学习算法,决定了它所能够解决的问题,这就给出了它的适用性,同时也指出了它的局限性。比如,感知器仅能够进行简单的分类。从前面的例题中已经看出,感知器可以将输入分成两类或四类等。它的局限性是仅能对线性可分的输入进行分类。遗憾的是,哪些输入是线性可分的,在划分前我们并没有办法得知,只有进行训练后才能知道是否线性可分。不过理论已经证明,对于线性可分的输入矢量,感知器在有限的时间里一定可以达到结果。
自适应线性网络除了像感知器一样可以进行线性分类外,又多了线性逼近,这仅是由于其激活函数可以连续取值而不同于感知器的仅能取0或1的缘故。后面将要学习到的BP网络又以不同的网络结构以及多层学习算法,而能够进行诸如非线性函数逼近与压缩等其它模型所没有的功能,但它也有自身的缺点与局限性,如:需要的训练时间较长,易陷入局部最小值等。再如,霍普菲尔德网络以完全另一种网络结构和学习算法能够达到自己收敛到自己的功能,但实际上也存在着很难找到这种收敛的情况。
总而言之,我们应从以上三个方面去学习人工神经网络。只有这样,当我们自己遇到一个实际问题时,才能够正确选择进而达到设计出有效的神经网络来。
5.6 本章小结
1)自适应线性网络仅可以学习输入输出矢量之间的线性关系,可用于模式联想及函数的线性逼近。网络结构的设计完全由所要解决的问题所限制,网络的输入数目和输出层中神经元数目,由问题所限制;
2)多层线性网络不产生更强大的功能,从这个观点上看,单层线性网络不比多层线性网络有局限性;
3)输入和输出之间的非线性关系不能用一个线性网络精确地设计出,但线性网络可以产生一个具有误差平方和最小的线性逼近。