前言
本章主要参考《MATLAB 神经网络原理与实例精讲 陈明等编著》
一、线性神经网络原理
一般来说,线性神经网络就是感知器的升级版,但相比于单层感知器,线性神经网络有很多的优点,其对比如下表所示:
对比 | 单层感知器(前向传输) | 线性神经网络 |
传输函数 | 阈值函数 | 线性函数(purelin) |
输出值 | 1/(0/-1) | 归一化任意值 |
调整权重和偏置 | INIT初始化算法 | LMS(least mean square)算法 |
网络层结构 | 1输入层1隐含层1输出层 | 1输入层1隐含层1输出层 |
解决问题所属 | 线性可分(与或问题) | 线性可分(与或以及异或问题) |
分类后的边界 | 随机偏向于某一个类别 | 距两个类别距离适中 |
是否适应病态矩阵 | 否 | 否 |
线性神经网络的结构以及公式:
设权重是wi,偏置为b,输入向量为xi,输出神经元为v,最终输出为y,其他可选输出为p,则其网络的具体输出可以表示为:
线性神经网络解决非线性可分的方法有两种:
1、Madalin网络,其思想就是利用多个隐含层(线性函数)对输入向量进行线性划分,然后对多个输出神经元做逻辑划分;
2、对于多个输入神经元,两两神经元之间添加非线性输入,或者理解为两个神经元之间建立数学关系作为输入;
LMS算法原理:LMS算法又称为最小均方算法,主要是为了对权重和偏置进行调整,其基本原理就是利用让训练时每次迭代的均方误差mse最小,可以采用对均方误差mse求取偏导的形式得到其极小值;
但是由于权重的数量和输入向量成正比,所以当输入向量很大时,就会使权重很大从而使得求偏导的运算量很大;
所以就要引入大家耳熟能详的梯度下降算法,梯度下降算法可以理解为一个球体在一个三维地形空间内的随机滚落到谷底,但是需要知道的是,球体在下降滚动的过程中,其下降滚动的方向和速度并不是稳定不变的,地形的不确定性和每次训练迭代时的求解偏导时的不确定性一样,需要利用这个变化以适应强度对权重和偏置进行调整,当符合一定收敛条件时,其输出的权重永远是最佳权重;
对于上面的权值向量调整过程中,除了网络中用户自定义的参数以外,非常需要注意的就是学习率ŋ的选取,因此需要确保一个能够稳定收敛的学习率:通过观察上面的(4)条公式可知,学习率ŋ的大小影响着权值的变化,学习率ŋ越小,权值变化程度也是越小,其与以前的权值的相关性就越高,这里简称LMS的记忆力,学习率的倒数与LMS记忆力成正比;
外国学者证明:当LMS算法按方差收敛时,学习率可满足下式:
其中λmax为输入向量组成的自相关矩阵的最大特征值;由于这个值计算很困难,因此需要对公式进行转化,得到的结果如下:
其中tr(R)表示自相关矩阵的对角线元素之和;这里之所以可以代替最大特征值,具体原理还请参考资料自行验证;
另外值得一提的就是,学习率ŋ并不是一成不变的,上面的步骤只是为了确定一个最优的初始学习率,而因此如果保持这个学习率不变的话,就会出现以下问题,学习率太低,将会拖慢整个训练的效率;学习率太高,LMS算法的记忆力太低以至于会使整个训练的精度太低;
为解决上面的问题,学习率可以按照以下方式进行减小:
1、直接下降(n表示迭代的次数):
2、指数下降(c≈1 &c < 1):
3、搜索收敛方案:
Matlab线性网络的函数清单(若对函数不熟,请在matlab自行输入help 函数名 进行查看):
函数名 | 用途 |
Net=newlind(P,T,Pi) | 设计一个线性层 |
Net=newlin(P,T,ID,IR)/Net=newlin(P,S,ID,IR) | 构建一个线性层 |
A=purelin(N,FP)/dA_dN=purelin(’dn’,N,A,FP) | 线性传输函数 |
[dw,ds]=learnwh(W,P,Z,N,A,T,E,gW,gA,D,LP,LS) | LMS学习函数 |
Max_learn=maxlinlr(P,’bias’) | 计算最大学习率 |
Perf=MSE(e) | 均方误差性能函数 |
Net=linearlayer(inputDelays,widrowHoffLR) | 构造线性层的函数 |
二、线性神经网络拟合线代码及图示
[p,d,Ir,net,x,y]=net_lin();
function [p,d,Ir,net,x,y]=net_lin()
p=-20:20;
d=3*p+3;
%p=[ones(1,length(p));p];
randn('state',2)
d=d+randn(1,length(d))*10;
plot(p,d,'.');
Ir=maxlinlr(p,'bias');
%net=linearlayer(0,Ir);
net=newlin(minmax(p),1,[0],maxlinlr(p));
tic;net=train(net,p,d);toc;
x=-20:.2:20;
y=sim(net,x);
y1=3*x+3;
hold on;
plot(x,y,'Color','red');
plot(x,y1,'Color','green');
s=strcat('拟合线:::','y=',num2str(net.iw{1,1}),'x+',num2str(net.b{1,1}));
s1=strcat('原始线:::''y=3x+3');
legend('原始数据',s,s1);
title('线性网络拟合数据求解系数');
end
三、线性神经网络分类代码及图示
[data,d2,net2,Ir2]=argt();
function [data,d2,net2,Ir2]=argt()
x1=[1,3,2,3,4,12,8,12,9,10];
y1=[5,2,6,5,3,8,9,10,6,15];
x1=mat2gray(x1);
y1=mat2gray(y1);
data=[x1;y1];
figure;
plot(data(1,1:5),data(2,1:5),'o');
hold on
plot(data(1,6:10),data(2,6:10),'*');
d2=[zeros(1,5),ones(1,5)];
Ir2=maxlinlr(data,'bias');
net2=linearlayer(0,Ir2);
net2=train(net2,data,d2);
w2=[net2.iw{1,1},net2.iw{1,1}];
xx=0:0.2:10;
yy=0.5/w2(2)-w2(1)/w2(2)*xx-w2(3)/w2(2);
xx=mat2gray(xx);
yy=mat2gray(yy);
plot(xx,yy,"r");
xlim([-0.5,1.5]);
ylim([-0.5,1.5]);
legend('类别一','类别二','分类面','south');
title("线性神经网络分类")
hold off;
end