基于BP神经网络的函数逼近仿真实例

基于BP神经网络的函数逼近仿真实例
基于BP神经网络的函数逼近仿真实例

学号:XXXXXXX

题目:基于BP神经网络的函数逼近仿真实例学院:信息学院

专业:计算机科学与技术

姓名:XXX

指导教师:XXX

完成日期:2011 年5月9日

BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前向网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。在人工神经网络的实际应用中,绝大部分的神经网络模型都采用BP网络及其变化形式。它也是前向网络的核心部分,体现了人工神经网络的精华,在函数逼近、模式识别、分类、数据压缩等领域获得了极为有效而广泛的应用。

本文利用自行设计的BP网络开发工具,通过一个简单的三层BP神经网络模拟了对正弦函数(y = sin(x))的逼近过程,并通过设置不同的网络参数初步探讨了学习率、动量项等因素对BP网络收敛性的影响。

全文共分为六个部分,第一部分介绍了BP神经网络的相关背景知识及算法相关公式的数学推导,这也是设计本次函数逼近网络模型的理论基础;第二部分详细介绍了本次函数逼近所采用的网络模型、逼近函数及相关参数,并通过实验给出设置相关参数的经验知识;第三部分介绍了系统设计思路、过程及相关细节,并包含核心代码展示;第四部分给出一次运行示例;第五部分是我对于BP神经网络及本次仿真的自我认识与评价;第六部分是结束语。

关键词:BP网络;函数逼近;仿真

BP neural network model is a Multilayer Feedforward Network model which was first proposed by a research team led by scientists Rumelhart and McCelland in 1986. Trained by Error Back-propagation Algorithm, now it is one of the most widely used neural network models. BP network is able to learn and store various input-output mapping relationships without previously knowing the exact mathematics function which reveals them. As the core of Feedforward Network and essence of Artificial Neural Network, it is widely used in fields such as Function approximation, Pattern recognition, Classification and Data compression.

This thesis uses a 3-layer BP neural network to simulate the process of approximating the Sine function and by setting different network parameters it also briefly discusses the influence of certain factors such as learning-rate on the convergence of this process.

The text is divided into 6 parts. The first part introduces some background knowledge of BP neural network and the mathematics foundation of it, which is also the foundation of my system. The second part discusses my neural network model, the approximated function and some important points of designing in detail. The third part gives the process, some ideas and related details in system designing, which also includes some core code. The fourth part displays a running example and statistics of the system. The fifth part is a self-evaluation of the system and approximating process. The sixth part is the conclusion. Key words: BP neural network;Function approximation;Simulation

序言 (1)

第1章BP神经网络简史及数学基础 (3)

1.1 BP网络的历史发展、能力及优缺点 (3)

1.2 BP网络模型及BP算法简介与推导 (3)

1.2.1 BP网络模型及算法 (3)

1.2.2 梯度下降法 (5)

1.2.3 BP算法推导 (6)

第2章本系统所采用的BP网络模型及逼近函数若干要点 (9)

2.1 神经网络模型 (9)

2.2 逼近函数及相关参数 (9)

第3章系统设计思路、过程及相关细节 (10)

3.1 本次仿真系统设计思路及界面展示 (10)

3.2 系统设计及仿真过程与体会 (15)

3.2.1 设计过程 (15)

3.2.2 体会 (16)

3.3 核心代码展示 (16)

3.3.1 相关数据结构说明 (16)

3.3.2 核心代码 (17)

第4章系统运行及仿真实例 (21)

4.1 系统运行实例 (21)

4.2 设置网络参数的经验总结 (23)

第5章系统自我认识与评价 (24)

第6章结束语 (25)

参考文献 (26)

致谢 (27)

人工神经网络(Artificial Neural Networks,简写为ANNs)也简称为神经网络(NNs)或称作连接模型(Connectionist Model),它是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。

思维学一般认为,人类大脑的思维分为抽象(逻辑)思维、形象(直观)思维和灵感(顿悟)思维三种基本方式。

逻辑性的思维是指根据逻辑规则进行推理的过程:它先将信息化成概念,并用符号表示,然后,根据符号运算按串行模式进行逻辑推理;这一过程可以写成串行的指令,让计算机执行。然而,直观性的思维是将分布式存储的信息综合起来,结果是忽然间产生想法或解决问题的办法。这种思维方式的根本之点在于以下两点:1.信息是通过神经元上的兴奋模式分布存储在网络上;2.信息处理是通过神经元之间同时相互作用的动态过程来完成的。

人工神经网络就是模拟人思维的第二种方式。这是一个非线性动力学系统,其特色在于信息的分布式存储和并行协同处理。虽然单个神经元的结构极其简单,功能有限,但大量神经元构成的网络系统所能实现的行为却是极其丰富多彩的。

通过在学习或训练过程中改变突触权重值以适应周围环境的要求,人工神经网络也具有初步的自适应与自组织能力。同一网络因学习方式及内容不同可具有不同的功能。人工神经网络是一个具有学习能力的系统,可以发展知识,以致超过设计者原有的知识水平。通常,它的学习训练方式可分为两种,一种是有监督或称有导师的学习,这时利用给定的样本标准进行分类或模仿;另一种是无监督学习或称无导师学习,这时,只规定学习方式或某些规则,则具体的学习内容随系统所处环境(即输入信号情况)而异,系统可以自动发现环境特征和规律性,具有更近似人脑的功能。

人工神经网络的实质发展始于二十世纪四十年代[1]。1943年,心理学家W·Mcculloch和数理逻辑学家W·Pitts在分析、总结神经元基本特性的基础上首先提出神经元的数学模型。此模型沿用至今,并且直接影响着这一领域研究的进展。1945年冯·诺依曼领导的设计小组试制成功存储程序式电子计算机,标志着电子计算机时代的开始。1948年,他在研究工作中比较了人脑结构与存储程序式计算机的根本区别,提出了以简单神经元构成的再生自动机网络结构。但是,由于指令存储式计算机

技术的发展非常迅速,迫使他放弃了神经网络研究的新途径,继续投身于指令存储式计算机技术的研究,并在此领域作出了巨大贡献。50年代末,F·Rosenblatt设计制作了“感知机”,它是一种多层的神经网络。这项工作首次把人工神经网络的研究从理论探讨付诸工程实践。当时,世界上许多实验室仿效制作感知机,分别应用于文字识别、声音识别、声纳信号识别以及学习记忆问题的研究。然而,这次人工神经网络的研究高潮未能持续很久,许多人陆续放弃了这方面的研究工作,这是因为当时数字计算机的发展处于全盛时期,许多人误以为数字计算机可以解决人工智能、模式识别、专家系统等方面的一切问题,使感知机的工作得不到重视。随着人们对感知机兴趣的衰退,神经网络的研究沉寂了相当长的时间。80年代初期,模拟与数字混合的超大规模集成电路制作技术提高到新的水平,完全付诸实用化,此外,数字计算机的发展在若干应用领域遇到困难。这一背景预示,向人工神经网络寻求出路的时机已经成熟。美国的物理学家Hopfield于1982年和1984年在美国科学院院刊上发表了两篇关于人工神经网络研究的论文,引起了巨大的反响。人们重新认识到神经网络的威力以及付诸应用的现实性。随即,一大批学者和研究人员围绕着Hopfield提出的方法展开了进一步的工作,形成了80年代中期以来人工神经网络的研究热潮。

BP神经网络模型就是这一时期(1986年)在世界上首次提出并得到广泛应用的神经网络模型。它可以学习和存储大量的输入输出映射关系,而无需事先知道揭示这种关系的数学公式。它采用梯度下降法,能根据误差自动调整神经元之间的连接权值,最终可以使误差减小到可以接受的程度。

BP网络目前主要用于以下四个方面[2]:函数逼近;模式识别;分类;数据压缩。本文呈现的即是基于BP神经网络的函数逼近实例,即利用BP神经网络逼近正弦函数。在设计过程中,查阅了BP网络提出者关于该领域研究的较早期的论文,并参考了Matlab神经网络工具箱的设计思路。本人基于Visual C++技术开发的神经网络开发工具,可实现任意有限结点的三层神经网络计算,有一定的实用价值。

第1章BP神经网络简史及数学基础

1.1 BP网络的历史发展、能力及优缺点

20世纪80年代,Rumelhart、McClelland和他们的同事洞察到神经网络在信息处理方面的重要性[3],尽管Minsky和Papert指出单层感知器的局限性,他们仍坚持不懈地研究,1982年成立了PDP小组,研究并行分布式信息处理方法,探索人类认知的微结构。1986年Rumelhart,Hinton,Williams完整而简明地提出一种ANN的误差反向传播训练算法(简称BP算法),系统解决了多层网络中隐含单元连接权的学习问题,还对其能力和潜力进行了探讨。Parker在1982年也提出过同样的算法。后来才发现Werbos早在1974年他的博士论文中曾提出过有关BP学习算法及其几种变形,但未引起注意。自此以后,BP神经网络模型得到了极其迅速的发展和极其广泛的应用,迄今为止也是应用最多、研究最热门的神经网络模型之一。

许多应用表明,BP神经网络具有较好的学习能力和自适应能力。由于BP网络的输入(x1,x2,…,x n)∈R n,输出(y1,y2,…,y m)∈R m,所以一个BP网络就是一个从n维空间到m维空间的高度非线性映射。理论研究表明,通过学习,BP网络可以在任意希望的精度上逼近任意的连续函数。所以,BP网络就可作为一种函数估计器,通过学习来实现我们所需的但无法表示的未知函数。

但BP网络模型也有一些不足,主要是:BP网络在训练中采用梯度下降法,由于训练中稳定性要求学习率很小,所以训练很慢,虽然采用动量法比单纯的梯度下降法要快一些,但在实际应用中速度还是不够;多层神经网络可以应用于线性系统和非线性系统,对任意函数模拟逼近,但是理论上是可行的,实际上BP网络不一定总能有解;在学习率的选择中,过大会导致训练过程不稳定,过小则又会使训练时间过长;由于多层网络中非线性传递函数有多个局部最优解,寻优的过程与初始点的选取关系很大,初始点如果更靠近局部最优点,而不是全局最优点,就不会得到正确结果;网络隐层神经元的数目也对网络有一定的影响,神经元数目太少会造成网络的不适性,而神经元数目过多又会引起网络的过适性。

1.2 BP网络模型及BP算法简介与推导

1.2.1 BP网络模型及算法

BP(Back-Propagation)网络即误差反向传播网络是应用最广泛的神经网络模型。

(1)BP网络的拓扑结构为分层前向网络。

(2) 神经元的特性函数一般为Sigmoid 型(S 型)函数,一般取为

x

e x

f -+=

11

)( (1.1) (3) 输入为连续信号量(实数)。 (4) 学习方式为有导师学习。

(5) 学习算法为推广的δ学习规则,成为误差反向传播算法,简称BP 学习算

法。

BP 算法的一般步骤如下: 步1 初始化网络权值、阈值及有关参数(如学习因子η等)。 步2 计算总误差

∑=

k

k E p E 21

(1.2)

其中p 为样本的个数,

2

'j

k )(21E j

j k k y y -=

∑ (1.3) 其中,j k y 为输出层节点j 对第k 个样本的输入对应的输出(成为期望输

出),'

j

k y 为节点j 的实际输出。 如果总误差E 能满足要求,则网络学习成功,算法结束。 步3

对样本集中各个样本依次重复以下过程,然后转步2。

首先,取一样本数据输入网络,然后按如下公式向前计算各层节点(记为j )的输出:

j

a j j e

a f O -+=

=11)( (1.4)

其中

i n

i ij j O w a ∑==0

(1.5)

是节点j 的输入加权和;i 为j 的信号源方向的相邻层节点,i O 为节点i 的输出,节点j 的输入;10-=O ,θ=j w 0(阈值)。

其次,从输出层节点到输入层节点以反向顺序,对各连接权值ij w 按下面的公式进行修正:

i j ij ij O t w t w ηδ++=+)1()1( (1.6)

其中

)')(1()

1({

j y j y j O j O l

jl

w l j O j O j ---∑

=δδ (1.7)

l 为与节点j 在输出侧有连接的节点个数。

在经典BP 算法中,上述两个权值微调公式较为复杂[4],但考虑到它对于证明BP 算法的有效性及对后来的研究者理解该算法有重要作用,现将其数学推导过程简述如下。

1.2.2 梯度下降法

首先简述梯度下降法,这也是BP 神经网络模型的数学理论基础。 (1)关于f (x ): 当x = (x )时,f (x )是一条曲线; 当x = (x 1, x 2)时,f (x 1, x 2)是一个曲面;

当x = (x 1, x 2, x 3)时,f (x 1, x 2, x 3)是一个体密度(或类位势函数);

当x = (x 1, x 2, …, x n )时,f (x 1, x 2, …, x n )是一个超曲面。

(2)曲面,自然有许多极大值和极小值,必然各有一个全局最大值和全局最小值。

超曲面,与上相同。

有些算法,只能在自己的小范围内搜索极大值或极小值。这些算法称为局部优化算法,常称为经典优化算法。

另有些算法,可以在整个超曲面取值范围内搜索最大值或最小值。这些算法称为全局性优化算法,又称为现代优化算法。 (3)局部优化算法之一梯度下降法 见图1.1。局部极小值是C 点(x 0)。

梯度,即导数,但是有方向,是一个矢量。 曲线情况下,表达式为

(1.8) 如果,f’(x )>0,则x 增加,y 也增加,相当于B 点;如果f’(x )<0,则x 增加,y 减小,相当于A 点。

对于输出节点

对于中间节点

dx dy

x f =

)('

要搜索极小值C 点,在A 点必须向x 增加方向搜索,此时与A 点梯度方向相反;在B 点必须向x 减小方向搜索,此时与B 点梯度方向相反。总之,搜索极小值,必须向负梯度方向搜索。

图1.1 一元函数曲线图

(4)一般情况下分析:

Y = f (x 1, x 2, … , x n ) (1.9) 假设只有一个极小点。初始给定参数为 (x 10, x 20, …, x n0)。问题:

从这个点如何搜索才能找到原函数的极小值点? 方法: a.首先设定一个较小的正数η,ε;

b.求当前位置处的各个偏导数:d y /d x 1, d y /d x 2, …, d y /d x n ;

c.按照下述方式修改当前函数的参数值:

x 10=x 10 - η d y /d x 1, x 20=x 20 - η d y /d x 2, …, x n0=x n0 - η d y /d x n ;

d.如果超曲面参数变化量小于ε,退出;否则返回2。

1.2.3 BP 算法推导

BP 神经网络的调整过程与此原理相同,如图1.2所示。在BP 网络中,定义误差函数为[5](偏差即网络实际输出与期望输出的差值)

2,,)(21

E c j c j j

c

d y -=

(1.10) 其中c 为遍历所有输出输入对的索引,j 为遍历所有输出单元的索引,y 为输出

单元的实际输出,d 为输出单元的期望输出。

在BP 算法的推导过程中,认为总误差E 与任意两个节点间的权值有关,因此根据梯度下降法,要求出总误差对每个权值的偏导数,然后向梯度下降的方向调整权值,通过多轮迭代,以期达到总误差最小即最优解。由于在调整权值的过程中是从输出层向输入层反向计算误差对权值的偏导数,因此该算法被称为误差反传算法(Error Back-propagation Algorithm)。

图1.2 三层神经网络图

在反传算法中,信号要经过两次传播过程,一是输入信号的正向传播,二是误差信号的反向传播。

正向传播过程易由上文BP 基本算法的描述得出,下面仅介绍误差反传部分部分。 在反传过程中,首先对每个输出层单元,计算

j j j

d y y -=??E

,然后利用链式规则[6]

计算j

j

x y j j d d y E x E ???=??(j x 是输出层j 单元的输入),此时认为其他输出层单元的状态与j x 无关,再对Sigmoid 函数做微分,即得:

)1()()1(j j j j j j j

j y y d y y y y E

x E -??-=-????=?? (1.11)

隐层

误差E

由于j x 只是后一级节点的输出和权重的线性函数,故仍要计算

i

j

ji j j ji y x E

w x x E w E ???=?????=?? (1.12)

而对于中间层节点i 来说,

ji j i j j w x E

y x x E ???=?????

(1.13) 由于中间层节点的输出要作用到下一层所有节点,由偏微分法则可知,误差对中间层节点输出的微分为

ji j j

i w x E

y E ???=??∑

(1.14) 则倒数第二层所有节点的y

??E

均可计算,进而可以仿照输出层的例子递归地计算所有节点间的

w

E

??,接下来可在每个输入输出对中修改权值,权值修正量的一种简单形式为w

E

w ??-=?δ

(δ为学习率),则新权值为)()1(n w w n w +?=+。 由于理论较为完备,数学基础较为坚实,BP 算法的正确性容易得到证明,这也是它有效地发展这么多年的原因吧。由于本人在学习BP 算法的过程中颇费周折,在研究了BP 网络提出者的原创性论文后,对本算法才有了深入的理解和认识,而且这也是本人设计的神经网络开发工具的理论基础,故不惜花些篇幅详细叙述,以期本人的设计建立在科学的基础上。

第2章 本系统所采用的BP 网络模型及逼近函数若干要点

2.1 神经网络模型

本人设计的神经网络开发工具可实现任意节点的三层神经网络,但具体到本次函数逼近仿真实例,采用的是单输入、单输出、隐层有30个节点的网络模型,如图2.1所示。

图2.1 本文采用的神经网络模型图

经系统运行测试发现,该模型可以较好地逼近函数。

2.2 逼近函数及相关参数

本次设计要逼近的函数是正弦函数)sin(x y =,π≤≤x 0。 (2.1) 激励函数为Sigmoid 型函数,在修改权值时采用了动量项以使结果更加平滑。 采用的相关参数如下: (1) 最大迭代次数10000; (2) 学习率0.8; (3) 动量项0.8;

(4) 期望误差(即迭代终止误差)4-10。

由于本系统有一定的灵活性,亦可采用其他参数,不同的参数选择有不同的收敛效果,相关比较在第四章中有所展示。

隐层共30个节点

第3章系统设计思路、过程及相关细节

3.1 本次仿真系统设计思路及界面展示

由于时间及技术水平限制,本次仿真并未设计一个普适的系统,即可实现任意层数、任意结点的神经网络模型,而仅仅是一个三层、任意结点的模型。但考虑到理论上已经证明三层神经网络已具有相当好的逼近能力,故本人设计的系统仍具有相当大的适用范围和应用价值。

在设计系统过程中,考虑到BP算法多涉及到矩阵和向量的操作,并需要设置较多参数,从系统易用性角度出发,将系统设计为可视化界面,所用语言为Visual C++,开发环境为Microsoft Visual Studio 2008,现将有关界面展示如下[7]。在设计界面过程中,亦参考了Matlab神经网络工具箱的有关风格。系统欢迎界面,如图3.1所示。

图3.1 系统欢迎界面图

考虑到处理方便,数据文件(训练和测试)的格式要求如下:

(1)每行为一个输入输出对;

(2)输入在前,输出在后;

(3)每两个数据之间以空格间隔。

选择文件界面,如图3.2所示;选择数据界面,如图3.3所示。

图3.2 选择训练数据文件图

图3.3 选择数据文件图

选择数据后,如图3.4所示;点击下一步进入参数选择页面,如图3.5所示,为默认情况下系统选择的参数,也是本次函数逼近仿真实例所采用的参数。经实例仿真,发现该参数设置可使系统的逼近效果较好。

图3.4 展示数据图

图3.5 选择参数图

除了可视化展示本次逼近实例的需要,考虑到系统的实用性和灵活性,故给予用户设置如上七项参数的自由,如图3.6所示(注意参数已变化);设置完参数后点击进入下一步,训练控制页面,如图3.7所示。

图3.6 设置参数图

图3.7 训练图

训练结果及相关数据统计在图3.7右侧控件中展示;选择测试数据文件的界面如图3.8所示;测试页面如图3.9所示;最后的拟合曲线图如图3.10所示。

图3.8 选择测试文件图

图3.9 测试图

图3.10 拟合曲线

3.2 系统设计及仿真过程与体会

3.2.1 设计过程

在本次实例仿真过程中,遵照了软件工程的一般方法,采用了自顶向下、逐步求精的设计思路。具体过程大致分为如下几个阶段。

(1)神经网络及BP算法的理论学习

因为涉及对算法的理解及设计数据结构的需要,这一阶段在前期准备工作中最重要,实际上也花了较多时间。期间参阅了多种神经网络专著及学术论文,基本达到了对BP算法的准确和深刻理解。

(2)系统核心算法模拟

在理论学习完成后,本人并未急于设计可视化的系统,而是在Windows Console 环境下完成了对核心算法的模拟。期间选择过多个逼近函数,如笛卡尔叶形线、星形线等等,发现BP网络对不同函数的逼近效果有差异,故最终选择了正弦函数。经过多轮模拟测试,发现训练后的网络对该函数逼近效果较好。

期间数据结构的设计也随着算法的优化有所变化。考虑到目前所有关于BP神经网络的改进方法,加入了动量项等因素,数据结构亦做了相应改变和扩充。

(3)系统界面设计

核心算法经测试正确后,我采用了Visual C++开发系统界面,开发环境为Microsoft Visual Studio 2008。在设计过程中,参考了Matlab神经网络工具箱的风格和思路。

(4)实际设计阶段

即把算法与界面相结合的阶段,在核心工作完成之后,此阶段耗时相对较少。3.2.2 体会

在本次系统设计及仿真过程中,我对软件工程的相关方法有了进一步的熟练,同时有了自己的一些体会,比如说抵制代码的诱惑、程序调试的一般流程等。抵制代码的诱惑是指在整体的算法、数据结构、大体框架等没有明确考虑之前,不要急于动手编程,否则效率极低,容易弄混目标,而如在实际编程时对上述问题考虑在先,将会事半功倍。程序调试的流程是指在程序遭遇Bug后,一方面要看错误提示,另一方面可以使用系统配置的调试工具通过设置断点等深入细节、查找原因。

在界面设计中,遇到一个无法读取文件的Bug,后来通过设置断点发现存储文件路径的变量中含有中文汉字,而在没有设置Unicode的情况下系统无法处理中文,采取的方法是使用相对路径且文件名字为英文字符。如果不了解程序调试的一般流程和方法,可能会花费更多本来不必要的时间。

3.3 核心代码展示

由于本系统及仿真的成功实现较依赖于算法,且BP算法的数学理论含量较高,故将核心代码展示如下。

3.3.1 相关数据结构说明

int Inputlayer_node_num = 1; //输入层节点数

int Hiddenlayer_node_num = 30; //隐层节点数

int Outputlayer_node_num = 1; //输出层节点数

int MaxIterativeTimes = 10000; //最大迭代次数

doulbe LearningRate = 0.8; //学习率

double SmoothingElement = 0.6; //动量项

double TerminalError = 0.5e-4; //终止误差

double Weight_IH[Inputlayer_node_num][Hiddenlayer_node_num];

//输入层和隐层间的权值矩阵

相关主题
相关文档
最新文档