第 05章 自适应线性元件
zoujiang@public.wh.hb.cn
邹江自适应线性元件 (Adaptive Linear Element,简称
Adaline)
由威德罗( Widrow)和霍夫( Hoff)首先提出的它与感知器的主要不同之处在于其神经元有一个线性激活函数,这允许输出可以是任意值,而不仅仅只是像感知器中那样只能取 0或 1。
它采用的是 W—H学习法则,也称最小均方差
(LMS)规则对权值进行训练自适应线性元件的主要用途是线性逼近一个函数式而进行模式联想。
5,1自适应线性神经元模型和结构图 5,1 自适应线性神经网络的结构
5,2 W- H学习规则
W—H学习规则是由威德罗和霍夫提出的用来修正权矢量的学习规则采用 W—H学习规则可以用来训练一定网络的权值和偏差使之线性地逼近一个函数式而进行模式联想 (Pattern Association)。
定义一个线性网络的输出误差函数为:
我们的目的是通过调节权矢量,使 E(W,B)达到最小值。
所以在给定 E(W,B)后,利用 W—H学习规则修正权矢量和偏差矢量,使 E(W,B)从误差空间的某一点开始,沿着 E(W,B)的斜面向下滑行。
根据梯度下降法,权矢量的修正值正比于当前位置上 E(W,B)的梯度,对于第 i个输出节点有:
或表示为:
( 5,3)
η为学习速率 。 在一般的实际运用中,实践表明,
η通常取一接近 1的数,或取值为:
( 5.5)
学习速率的这一取法在神经网络工具箱中用函数
maxlinlr.m来实现。 (5,5)式可实现为:
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)。
采用 Matlab进行自适应线性元件网络的训练过程如下:
trainwh.m
% 表达式
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
[dW,dB]= 1earnwh(P,E,lr); % 修正权值
W= W十 dW;
B= B十 dB;
A= purelin(W*P,B); % 网络输出
E= T-A;
SSE= sumsqr(E); % 计算网络误差平方和
end
5,4例题与分析
[例 5,1]设计自适应线性网络实现从输入矢量到输出矢量的变换关系 。 其输入矢量和输出矢量分别为:
P= [1.0 -1.2]
T= [0.5 1.0]
% 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) % 进行线性网络权值训练在随机初始值为,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的函数。
[W,B]= solvelin(P,T)
然后可用 simulin.m函数来检测所设计的网络,A
= simulin(P,W,B)
还可以用 sumsqr.m函数来求出误差平方和:
SSE= sumsqr(T-A)
[例 5,2]现在来考虑一个较大的多神经元网络的模式联想的设计问题。输入矢量和目标矢量分别为:
解:
由输入矢量和目标输出矢量可得,r= 3,s= 4,q
= 4。所以网络的结构如图 5,2所示。
这个问题的求解同样可以采用线性方程组求出,即对每一个输出节点写出输入和输出之间的关系等式。
实际上要求出这 16个方程的解是需要花费一定的时间的,甚至是不太容易的。
对于一些实际问题,常常并不需要求出其完美的零误差时的解。也就是说允许存在一定的误差。
在这种情况下,采用自适应线性网络求解就显示出它的优越性:因为它可以很快地训练出满足一定要求的网络权值。
% 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.55430.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(‘Beforetrainihg,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
训练后的网络权值为:
网络训练过程中的误差记录对于存在零误差的精确权值网络,若用函数 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才比较准确。
只要将前面已编写的 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]
本例题的目的是在于了解自适应线性网络的线性逼近求解的能力。
图 5,4给出了输入输出对的位置以及网络求解的结果。
对于所设置的 err_goal= 0.001,在循环训练了 50次后所得的误差平方和仍然为,SSE= 0.289。这个值即是本题所能达到的最小误差平方和的值。
当采用线性自适应线性网络求解问题所得到的误差特别大时,可以认为此问题不适宜用线性网络来解决。
图 5,4网络训练结果图自适应线性网络还有另一个潜在的困难,当学习速率取得较大时,可导致训练过程的不稳定。
[例 5,5]输入 /目标矢量与 [例 5,1]相同。我们将以不同的学习速率训练两次网络以展现两种不希望的学习速率带来的影响。
以例 5.1 为样本,
1)对于第一个尝试,学习速率 lr取:
1r= 1.7*maxlinlr(P);
2)第二个尝试是选用更大学习速率:
1r= 2.5*maxlinlr(P);
5,5对比与分析感知器和自适应线性网络
(1)网络模型结构上感知器和自适应线性网络而言,结构上的主要区别在于激活函数:一个是二值型的,一个线性的。
当把偏差与权值考虑成一体时,自适应线性网络的输入与输出之间的关系可以写成 A= W*P。如果 P是满秩的话,则可以写成 AP-1= W,或
W=A/P。
(2)学习算法感知器的算法是最早提出的可收敛的算法,
它的自适应思想被威德罗和霍夫发展成使其误差最小的梯度下降法。最后又在
BP算法中得到进一步的推广,它们属于同一类算法。
(3)适用性与局限性感知器仅能够进行简单的分类。从前面的例题中已经看出,感知器可以将输入分成两类或四类等。它的局限性是仅能对线性可分的输入进行分类。
自适应线性网络除了像感知器一样可以进行线性分类外,又多了线性逼近,这仅是由于其激活函数可以连续取值而不同于感知器的仅能取 0
或 1的缘故。
作业设计一个有三个输入的单层线性网络:
P={2 3 2.4 -0.6;
-2 4 6 -1;
4 2 -3.2 1.8}
T={1 6 -4.4 2.8;
2.2 -2.4 3.4 -0.8;
6 0.4 -3.6 -0.8;
-2 0.2 -2 1.2}
5,6 本章小结
1)自适应线性网络仅可以学习输入输出矢量之间的线性关系,可用于模式联想及函数的线性逼近 。 网络结构的设计完全由所要解决的问题所限制,网络的输入数目和输出层中神经元数目,由问题所限制;
2)多层线性网络不产生更强大的功能,从这个观点上看,
单层线性网络不比多层线性网络有局限性;
3)输入和输出之间的非线性关系不能用一个线性网络精确地设计出,但线性网络可以产生一个具有误差平方和最小的线性逼近 。