当前位置:文档之家› 机器学习大作业

机器学习大作业

机器学习大作业

Revised on November 25, 2020 题 目: 机器学习

授课老师: 韩红

基于BP 神经网络的非线性函数拟合

摘要:BP(Back Propagation)神经网络是 1986年由 Rumelhart和 McCelland提出的,它是一种误差按反向传播的多层前馈网络,是目前应用最广泛的神经网络模型之一。 BP神经网络具有非常强的非线性映射能力,能以任意精度逼近任意连续函数,因此在人工智能的许多领域都得到了广泛的应用。

通常,BP算法是通过一些学习规则来调整神经元之间的连接权值,在学习过程中,学习规则以及网络的拓扑结构不变。然而一个神经网络的信息处理功能不仅取决于神经元之间的连接强度,而且与网络的拓扑结构(神经元的连接方式)、神经元的输入输出特性和神经元的阈值有关,因而神经网络模型要加强自身的适应和学习能力,应该知道如何合理地自组织网络的拓扑结构,知道改变神经元的激活特性以及在必要时调整网络的学习参数等。

1 BP神经网络概述

BP神经网络是一种多层前馈神经网络,该网络的主要特点是信号前向传递,误差反向传播。在前向传递中,输入信号从输入层经隐含层逐层处理, 直至输出层。每一层的神经元状态只影响下一层神经元状态。如果输出层得不到期望输出, 则转入反向传播,根据预测误差调整网络权值和阈值,从而使B P神经网络预测输出不断逼近期望输出。BP神经网络的拓扑结构如图

图1中, X1, X2, …, Xn 是BP神经网络的输入值, Y1, Y2, …, Ym是BP神经网络的预测值,ωij和ωjk为BP神经网络权值。从图2可以看出, BP神经网络可以看成一个非线性函数, 网络输入值和预测值分别为该函数的自变量和因变量。当输入节点数为n, 输出节点数为m时, BP神经网络就表达了从n个自变量到m个因变量的函数映射关系。

2 主要用途

BP网络主要用于:

(1)函数逼近:用输入矢量和相应的输出矢量训练网络逼近某个函数;

(2)模式识别:用一个特定的输出矢量将它与输入矢量联系起来;

(3)分类:把输入矢量以所定义的合适的方法进行分类;

(4)数据压缩:减少输出矢量维数以便于传输或存储。

在人工神经网络的实际工程应用中,特别在自动控制领域中,大多数神经网络模型是采用BP网络或它的变化形式,它也是前向网络的核心部分,体现了人工神经网络最精华的部分。

算法的数学描述:

三层前馈网中,输入向量为:TnixxxxX),...,,...,,(21;隐层输入向量为:TmjyyyyY),...,...,,(21;输出层输出向量为:TlkooooO),...,...,,(21;期望输出向量为:Tlkddddd),...,...,(21。输入层到隐层之间的权值矩阵用V表示,YmjvvvvV),...,...,(21,其中列向量jv为隐层第j个神经元对应的权向量;隐层到输出层之间的权值矩阵用W表示,),...,...,(21lkwwwwW,其中列向量kw为输出层第k个神经元对应的权向量。

对于输出层,有

对于隐层,有

f(x)具有连续、可导的特点,且有)](1)[()('xfxfxf,以上共同构成了三层前馈网了的数学模型。

当网络输出和期望输出不相等时,存在输出误差E如下:

将以上误差定义式展开至隐层,有 进一步展开至输入层,有

由上式可以看出,网络输入误差是两层权值W和V的函数,因此调整权值可以改变误差E。

显然,调整权值的原则是使误差不断的减小,因此应使权值的调整量与误差的负梯度成正比,即:

式中负号表示梯度下降,常数)1,0(表示比例系数,在训练中反映了学习速率。

容易看出,BP学习算法中,各层权值调整公式形式上都是一样的,均有3个因素决定,即:学习速率、本层误差信号和本层输入信号X/Y。其中输出层误差信号同网络的期望输出与实际输出之差有关,直接反映了输出误差,而各隐层的误差信号与前面各层的误差信号都有关,是从输出层开始逐层反传过来的。在建立 BP 神经网络时,首先要根据应用的问题确定网络结构,即选择网络的层数和隐层节点数。由于本例中实验数据较少,采用最基本的两层网络就可以很好地逼近未知函数了。隐层节点数的选择在神经网络的应用中一直是一个复杂的问题:隐层节点数过多,将导致网 络的预测能力不够,并容易导致网络陷入局部极小值难以跳出;隐层节点数过少,网络训练 不出来,或不能识别以前没有的样本,且容错性差。在设计中,比较实际的做法是通过对不 同神经元数的网络进行训练、对比,找出网络效果最好时的隐层节点数。在本例中,经大量 的训练、对比,最终取中间隐层节点数为 10。在建立模型的过程中也发现了一些问题,主要有两个方面:一是样本数过少,很难精确反映出待建模型的特性,而且容易导致网络在学习过程中难以退出局部极小值。解决的办法是在实验部分增加实验点以增加训练样本数。二是BP 网络本身存在的一些问题,主要表现在收敛速度很慢,有时在局部极小值收敛,不能找到全局极小值。针对这样的情况,可以考虑采用其他算法如:模拟退火、遗传算法等,以保证网络能收敛到全局极小值。神经网络的结构设计是一个非常重要但却十分复杂的问题。网络的结构设计主要指对于给定的任务:①如何选择网络层数因为网络的输入和输出层易于确定,所以这一问题实际上就是隐 层应该为几层;②每层应选多少神经元;③神经元的传递函数应如何选定。所有这些都是使用神经网络时必须加以解决的问题。 但目前对此并没有一个确切的答案,MATLAB 下的神经网络工具箱也不例外。综合以往的研究成果,可以得到 BP

网络结构的一些结论:①对于3层(1个输入层、1个隐层和1个输出层)的

BP 网络,只要其隐层的神经元数 可选,就可以任意精度逼近任何连续函数(Kolmogorov 定理);②随着所逼近函数的波动性增加,隐层的神经元数也应适当增加;③随着学习样本数的增加,隐层神经元数也应增加;④增加隐层数目可以减少各隐层的神经元数,减少陷入局部极小的机会;⑤随着网络复杂程度和学习样本数的增加,其收敛速度变慢,所以网络的规模不应随意增大。

四、BP网络实现

1.初始化

初始化隐层的权值向量和隐层到输出层的权值矩阵。确定每层的学习速率。设定最小误差率以及网络的最大迭代次数。生成sin(x)的训练样本集。

测试数据:P2=*pi:*pi:2*pi; 输入数据:P1=*pi:*pi:2*pi;

2.生成并训练BP网络

产生训练样本集。然后依据实验原理初始化并计算隐层的权值向量,以及隐层到输出层权值矩阵。根据计算出来的实际输出和目标输出做比较,得到误差,从而计算出输出层和隐层的权值变化,并反向调整输出层和隐层的权值大小,直到满足条件退出训练。将计算出的误差率与初始化设定的最小误差率进行比较,当误差率小于或者迭代次数达到1000次时,退出BP网络。

3.实验结果:

前两张图为最大训练次数为4000时得到的输入输出数据曲线和学习误差曲线

以下两张图像为最大训练次数为40000时得到的输入输出数据曲线和学习误差曲线

由以上图像可知,(1)BP网络迭代的前几步,错误率下降的趋势非常的强,当错误率下降到一定时候,就几乎不再变化,总体来说,达到了函数逼近的目的。

(2)由以上通过改变最大训练次数的变化导致的图像变化可知,训练次数从4000到40000时,函数逼近效果明显变好,学习误差明显更快的减小。

MATLAB的实现程序: 打开command

SamNum=100; %训练样本

TestSamNum=100; %测试样本数

HiddenUnitNum=10; %隐节点数

InDim=1; %样本输入维数

OutDim=1; %样本输出维数

% 根据目标样本获得样本输入输出

SamIn=*pi:*pi:2*pi;

SamOut=sin(SamIn);

TestSamIn=*pi:*pi:2*pi;

TestSamOut=sin(TestSamIn);

figure

hold on

grid

plot(TestSamIn,TestSamOut,'k--')

xlabel('Input x');

ylabel('Output y');

MaxEpochs=50000; %最大训练次数

lr=; %前期学习率

E0=1; %前期目标误差

W1=*rand(HiddenUnitNum,InDim); %输入层到隐层的权值

B1=*rand(HiddenUnitNum,1); %隐节点初始偏移

W2=*rand(OutDim,HiddenUnitNum); %隐层到输出层的初始权值

B2=*rand(OutDim,1); %输出层初始偏移

W1Ex=[W1 B1] W2Ex=[W2 B2]

SamInEx=[SamIn' ones(SamNum,1)]'

ErrHistory=[];

for i=1:MaxEpochs

%正向传播网络输出

HiddenOut=logsig(W1Ex*SamInEx);

HiddenOutEx=[HiddenOut' ones(SamNum,1)]';

NetworkOut=W2Ex*HiddenOutEx;

%停止学习判断

Error=SamOut-NetworkOut;

SSE=sumsqr(Error)

%记录每次权值调整后的训练误差

ErrHistory=[ErrHistory SSE];

switch round(SSE*10)

case 4

lr=;

case 3

lr=;

case 2

lr=;

case 1

lr=;

case 0

break;

otherwise

lr=;

end

%计算方向传播误差 Delta2=Error;

Delta1=W2'*Delta2.*HiddenOut.*(1-HiddenOut);

%计算权值调节量

dW2Ex=Delta2*HiddenOutEx';

dW1Ex=Delta1*SamInEx';

%权值调节

W1Ex=W1Ex+lr*dW1Ex;

W2Ex=W2Ex+lr*dW2Ex;

%分离隐层到输出层的初始权值,以便后面使用

W2=W2Ex(:,1:HiddenUnitNum);

end

%显示计算结果

i

W1=W1Ex(:,1:InDim)

B1=W1Ex(:,InDim+1)

W2

B2=W2Ex(:,1+HiddenUnitNum);

%测试

TestHiddenOut=logsig(W1*TestSamIn+repmat(B1,1,TestSamNum));

TestNNOut=W2*TestHiddenOut+repmat(B2,1,TestSamNum);

plot(TestSamIn,TestNNOut,'r*')

%绘制学习误差曲线

figure

hold on

grid

[xx,Num]=size(ErrHistory);

plot(1:Num,ErrHistory,'k-');

相关主题