BP神经网络原理分析及c++代码实现(上)

来源:互联网 发布:网络信息服务费合同 编辑:程序博客网 时间:2024/05/22 03:45

    本博客所述BP神经网络,是本人研究总结的结果,希望对您有所帮助,当然,如果有需要,大家可以互相交流。

   设计一个BP神经网络类,来实现一个BP神经网络。要求输入层节点数、隐层数、隐层节点数、输出层节点数、传递函数、算法等等可以由用户自主设定。

具体代码部分:http://blog.csdn.net/hjkhjk007/article/details/9010343

神经网络的基本原理

BPBack Propagation)网络是1986年由RumelhartMcCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)和输出层(output layer)

神经元模型

3-1人工神经元的基本构成单元

 

3-1 给出了一个具有n个输入的基本BP神经元模型结构。图中每一个输入被赋予一定的权值,求和后形成神经元传递函数的输入。

激活函数的作用是对该神经元所获得的网络输入进行变换,也可以称为激励函数或活化函数,如图(3-1)所示 BP网络属于多层网络,其常用的传递函数有线性函数(purelin)和sigmoid型函数。

1、线性函数(purelin

abd为常数。它的饱和值为aa + b

函数的饱和值为01S形函数有较好的增益控制性能,如果BP网络输出层采用sigmoid型传递函数,那么网络的输出值就限制在[ a , a + b ]之间,根据实际需要,通常将输出值限制在[ -1 , 1 ]之间,而如果将线性函数purelin作为输出层的传递函数,那么输出值可为任意值。因此在隐层中常常采用sigmoid函数进行中间结果的传递,而在最后的输出层则用线性传递函数对输出值进行值域扩张。

3.2 BP神经网络结构

图3-4显示了一个具有n个输入,m个输出的BP神经网络结构。

 

图3-4 BP神经网络结的拓扑结构

信号只被允许从较低层流向较高层。

层号表示层的高低:层号较小者,层次较低,层号较大者,层次较高。

输入层:被记作第0层。该层负责接收来自网络外部的信息

j层:第j-1层的直接后继层(j>0),它直接接受第j-1层的输出。

输出层:它是网络的最后一层,具有该网络的最大层号,负责输出网络的计算结果。

隐藏层:除输入层和输出层以外的其它各层均叫隐藏层。隐藏层不直接接受外界的信号,也不直接向外界发送信号

约定 :

输出层的层号为该网络的层数:n层网络或n级网络。

j-1层到第j层的联接矩阵为第j层联接矩阵,输出层对应的矩阵叫输出层联接矩阵。今后我们在需要的时候一般用表示第j层矩阵。

前向型神经网络通常具有一个或多个由sigmoid神经元构成的隐层,和一个由线性神经元构成的输出层。多个具有非线性传递函数的神经元层使得网络可以学习输入和输出之间的非线性关系,而线性输出层则使网络可以产生区间[ -1 , 1 ]之外的值。

如果需要对网络输出的值域加以限制,例如想要将网络输出值限制在[ 0 , 1 ]以内,那么输出层就应该采用sigmoid型函数。

3.3 BP网络学习规则

BP网络的学习是有监督的学习,训练过程中需要提供输入向量P和输出向量T,根据网络误差性能对网络权值和偏差进行调整,最终实现期望的功能。前向型神经网络仍然采用均方误差作为默认的网络性能函数,网络学习的过程就是使均方误差最小化的过程。BP学习规则是使用不同的算法来实现网络均方误差的最小化,本文主要阐述五种算法:基本的BP算法(traingd增加动量项的BP算法(traingdm)带动量及自适应学习速率的BP算法(traingdx)共轭梯度算法(traincgf)弹性梯度算法(trainrp)。文档中所有的传递函数默认为sigmoid型,但purelin型相对比较简单,因此用户可参照本文自行推理。

3.3.1基本的BP算法(traingd)

基本的BP算法,是最简单的BP算法,也是最基础的BP算法。我们知道函数的梯度方向是函数值增加最快的方向,那么负梯度方向便是函数值减小最快的方向,基本的BP算法就是沿着负梯度方向通过调整权值来减小均方误差的,其他的算法基本都是在BP算法的基础上进行改进的。

用输出层的误差来调整输出层的权矩阵,并估计输出层的直接前导层的误差,然后再用输出层的前导层误差估计更前一层的误差,如此获得了所有其它各层的误差估计。用这些估计实现对权矩阵的修改,形成将输出端表现出的误差沿着与输入信号相反的方向逐级向输入端传递的过程。这个过程的具体实现如下文所述。

(一)神经元的输入输出

神经元的网络输入:

根据图(3-1)和式3-4,任意神经元的输入可表示为

图3-5 传递函数(3-10)

(二)训练过程概述

样本:(输入向量,理想输出向量)

权初始化:小随机数与饱和状态。

Step1, 向前传播阶段:

1)从样本集中取一个样本,将输入网络;

2)计算相应的实际输出:

如果将学习速率设定为可变的,那么就可以改变学习算法的性能。具备自适应学习速率的梯度下降算法可以在保持训练过程稳定的前提下采用最大的步长。

本程序中采用的方法是通过比较相邻两次迭代之间的误差平方和的大小,来判断学习速率是增加还是减少。

  

3.3.5弹性梯度算法(trainrp)

该算法是在traingdx算法的基础上实现的,也是对BP算法的进一步改进。多层神经网络通常在隐层中采用sigmoid型传递函数。由于sigmoid函数的作用是将无限的输入范围压缩到一个有限的输出范围内,因此它们都有这样一个特性,即输入样本变量非常大的时候,函数曲线斜率将会逐渐接近于零。这可能造成的一个问题,即如果采用该算法进行训练,梯度值有可能会很小,这样每一次迭代的权值和偏差的该变量会很小,尽管它们距离最优值还有很远的距离。

有弹性的BP训练算法的目标就是消除由于误差函数偏微分的数值上变动所造成的不利于训练的效应。这种算法只通过偏微分函数符号决定权值的变化方向,而忽略偏微分数值的大小,权值的变化量则由一个独自更新的数值来决定。

如果在连续两次迭代中误差性能函数对某一权值的偏导数的正负号相同,则权值更新值会增大,而如果连续两次迭代中误差性能函数对某一权值的偏导数正负号不同,则权值更新值会减小,如果偏导数等于0,则迭代停止。这样,权值的变动过程是一个幅度逐渐减小的震荡过程,最后收敛到梯度为0的目标点。

4 BP神经网络类的实现

4.1概述

该类是基于BP神经网络的原理,利用c/c++语言在vs2005上实现的一个BP神经网络类,该类当中参数的命名、定义等都是参照matlab当中的神经网络工具箱来实现的。该BP神经网络的输入层节点数、隐层数、隐层节点数、输出层节点数、传递函数、算法等均可以由用户自主设定,并且给出通用的接口,方便用户使用。

该类的实现是通过网络构造网络训练网络应用三个模块实现的。网络构造模块的主要功能是创建一个BP神经网络;网络训练模块的主要功能是根据输入的训练数据,通过训练调整权值,最终输出一个需要的网络;应用模块的主要功能是提供方便用户使用的借口。网络实现的流程图如图4-1所示。

 

 

BP神经网络c++代码本人已经更新至微博,请阅读本人博客 BP神经网络原理分析及c++代码实现(下):http://blog.csdn.net/hjkhjk007/article/details/9010343 

原创粉丝点击