神经网络——BP算法

2024-05-20 09:42

1. 神经网络——BP算法

对于初学者来说,了解了一个算法的重要意义,往往会引起他对算法本身的重视。BP(Back Propagation,后向传播)算法,具有非凡的历史意义和重大的现实意义。
  
 1969年,作为人工神经网络创始人的明斯基(Marrin M insky)和佩珀特(Seymour Papert)合作出版了《感知器》一书,论证了简单的线性感知器功能有限,不能解决如“异或”(XOR )这样的基本问题,而且对多层网络也持悲观态度。这些论点给神经网络研究以沉重的打击,很多科学家纷纷离开这一领域,神经网络的研究走向长达10年的低潮时期。[1]
  
 1974年哈佛大学的Paul Werbos发明BP算法时,正值神经外网络低潮期,并未受到应有的重视。[2]
  
 1983年,加州理工学院的物理学家John Hopfield利用神经网络,在旅行商这个NP完全问题的求解上获得当时最好成绩,引起了轰动[2]。然而,Hopfield的研究成果仍未能指出明斯基等人论点的错误所在,要推动神经网络研究的全面开展必须直接解除对感知器——多层网络算法的疑虑。[1]
  
 真正打破明斯基冰封魔咒的是,David Rumelhart等学者出版的《平行分布处理:认知的微观结构探索》一书。书中完整地提出了BP算法,系统地解决了多层网络中隐单元连接权的学习问题,并在数学上给出了完整的推导。这是神经网络发展史上的里程碑,BP算法迅速走红,掀起了神经网络的第二次高潮。[1,2]
  
  因此,BP算法的历史意义:明确地否定了明斯基等人的错误观点,对神经网络第二次高潮具有决定性意义。 
  
 这一点是说BP算法在神经网络领域中的地位和意义。
  
  BP算法是迄今最成功的神经网络学习算法,现实任务中使用神经网络时,大多是在使用BP算法进行训练[2],包括最近炙手可热的深度学习概念下的卷积神经网络(CNNs)。 
  
  
 BP神经网络是这样一种神经网络模型,它是由一个输入层、一个输出层和一个或多个隐层构成,它的激活函数采用sigmoid函数,采用BP算法训练的多层前馈神经网络。
  
 BP算法全称叫作误差反向传播(error Back Propagation,或者也叫作误差逆传播)算法。其算法基本思想为:在2.1所述的前馈网络中,输入信号经输入层输入,通过隐层计算由输出层输出,输出值与标记值比较,若有误差,将误差反向由输出层向输入层传播,在这个过程中,利用梯度下降算法对神经元权值进行调整。
  
 BP算法中核心的数学工具就是微积分的 链式求导法则 。
  
                                                                                  
 
  
                                          
 
  
                                                                                                                                                                                                                                                  
 BP算法的缺点,首当其冲就是局部极小值问题。
  
 BP算法本质上是梯度下降,而它所要优化的目标函数又非常复杂,这使得BP算法效率低下。
  
  
 [1]、《BP算法的哲学思考》,成素梅、郝中华著
  
 [2]、《机器学习》,周志华著
  
 [3]、 Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现  
  
 2016-05-13 第一次发布
  
 2016-06-04 较大幅度修改,完善推导过程,修改文章名
  
  
 2016-07-23 修改了公式推导中的一个错误,修改了一个表述错误

神经网络——BP算法

2. bp神经网络算法介绍 bp神经网络算法简介

1、BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)和输出层(output layer)。
 
 2、BP神经网络算法是在BP神经网络现有算法的基础上提出的,是通过任意选定一组权值,将给定的目标输出直接作为线性方程的代数和来建立线性方程组,解得待求权,不存在传统方法的局部极小及收敛速度慢的问题,且更易理解。

3. 基于遗传算法的BP神经网络

 源码地址: https://github.com/Grootzz/GA-BP     介绍:    利用遗传算法并行地优化BP网络的权值和阈值,从而避免了BP网络在优化权值和阈值时陷入局部最优的缺点
    背景:    这个项目的背景为客运量和货运量的预测
   文件介绍:
   因为项目中用到了GAOT工具包中的函数,所以需要将GAOT工具包加入路径。   操作步骤为:点击GAOT文件--->添加到路径--->选定文件夹和子文件夹   这样,工程中就可以调用GAOT工具包中的函数了
   源码地址: https://github.com/Grootzz/GA-BP 

基于遗传算法的BP神经网络

4. BP神经网络的非线性系统建模

 在工程应用中经常会遇到一些复杂的非线性系统(我们航空发动机就是典型的强非线性模型),这些系统状态方程复杂,难以用数学方法准确建模。在这种情况下,可以建立BP神经网络表达这些非线性系统。该方法把未知系统看成黑箱,首先用系统输入输出数据训练BP神经网络,使网络能够表达该未知函数,然后用训练好的BP神经网络预测系统输出。   本文要拟合的非线性函数是
                                           该函数的图形如下图1所示。
                                           回顾上一篇文章建立BP网络的算法流程,进行具有非线性函数拟合的BP网络可以分为网络构建、训练和预测三步,如下图2所示。
                                            BP神经网络构建 根据要拟合的非线性函数特点确定BP网络结构,由于该非线性函数有两个输入参数,一个输出参数,所以BP网络结构可以设置为2-5-1,即输入层有2个节点,隐含层有5个节点,输出层有1个节点。    BP神经网络训练 用非线性函数输入输出数据训练神经网络,使训练后的网络能够预测非线性函数输出。从非线性函数中随机得到2 000组输入输出数据,从中随机选择1 900组作为训练数据,用于网络训练,100组作为测试数据,用于测试网络的拟合性能。    神经网络预测 用训练好的网络预测输出,并对预测结果进行分析。
   根据非线性函数方程随机得到该函数的2 000组输入输出数据,将数据存储在data.mat文件中,input是函数输入数据,output是函数输出数据。从输入输出数据中随机选取1 900组数据作为网络训练数据,100组作为网络测试数据,并对训练数据进行归一化处理。
   用训练数据训练BP神经网络,使网络对非线性函数输出具有预测能力。
   用训练好的BP神经网络预测非线性函数输出,并通过BP神经网络预测输出和期望输出,分析BP神经网络的拟合能力。
   用训练好的BP神经网络预测函数输出,预测结果如下图3所示。
                                           BP神经网络预测输出和期望输出的误差如下图4所示。
                                           从图3和图4可以看出,虽然BP神经网络具有较高的拟合能力,但是网络预测结果仍有一定误差,某些样本点的预测误差较大。
   在上一篇文章中提到了调整隐含层节点数目、改变权值和阈值更新算法以及变学习率学习算法等方法,针对非线性拟合,BP神经网络的优化还可以使用多隐层的BP神经网络、改变激活函数等方法。

5. 深入理解BP神经网络

BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型:
  
 BP神经网络的过程主要分为两个阶段,第一阶段是信号的前向传播,从输入层经过隐含层,最后到达输出层;第二阶段是误差的反向传播,从输出层到隐含层,最后到输入层,依次调节隐含层到输出层的权重和偏置,输入层到隐含层的权重和偏置。
                                          
 神经网络的基本组成单元是神经元。神经元的通用模型如图所示,其中常用的激活函数有阈值函数、sigmoid函数和双曲正切函数。 
                                          
 神经元的输出为: 
                                          
 神经网络是将多个神经元按一定规则联结在一起而形成的网络,如图 所示。 
                                          
 从图 可以看出,一个神经网络包括输入层、隐含层(中间层)和输出层。输入层神经元个数与输入数据的维数相同,输出层神经元个数与需要拟合的数据个数相同,隐含层神经元个数与层数就需要设计者自己根据一些规则和目标来设定。在深度学习出现之前,隐含层的层数通常为一层,即通常使用的神经网络是3层网络。 
  
 BP网络采用的传递函数是非线性变换函数——Sigmoid函数(又称S函数)。其特点是函数本身及其导数都是连续的,因而在处理上十分方便。为什么要选择这个函数,等下在介绍BP网络的学习算法的时候会进行进一步的介绍。S函数有单极性S型函数和双极性S型函数两种,单极性S型函数定义如下:f(x)=1/1+e−x
  
 其函数曲线如图所示:
                                          
 双极性S型函数:f(x)=1−e−x/1+e−x
  
 
  
                                          
 使用S型激活函数时,输入:
                                          
 输出:
                                          
 输出的导数:
                                          
 使用S型激活函数时,BP网络的输出及其导数图形:
                                          
 根据S激活函数的图形:
  
 net在 -5~0 的时候导数的值为正,且导数的值逐渐增大, 说明此时f(x)在逐渐变大 且 变大的速度越来越快 
  
 net在 0~5  的时候导数的值为正,且导数的值逐渐减小, 说明此时f(x)在逐渐变大 但是 变大的速度越来越慢 
  
 对神经网络进行训练,我们应该尽量将net的值尽量控制在收敛比较快的范围内。
                                                                                                                                                                                                                                                                                                                                                                                                                  
 1.  定义一个BP神经网络的类,设置网络相关参数
                                          
 2.    实例化该神经网络,按下图被构建成一个输出3维,输出1维,带有3个隐藏层(每个隐藏层10个节点)的BP网络;(此处还可以随意扩展输入、输出维度和隐藏层相关系数)
                                          
 3.    初始化BP神经网络的时候,开始初始化各层网络节点的 权重、权重动量、误差初始值
                                          
 4.  引入学习训练数据;4组输入、输出数据迭代5000次
                                          
     5000次中不断向前逐层计算输出的节点数据
                                          
     并同时逐层计算误差反向修改权重值,直到迭代完毕;注意误差函数值必须呈现下降趋势
                                          
 5.  引入数据进行结果预测,将数据带回模型计算得结果;最终可知预测结果趋近于0.7
                                                                                  
 神经网络利用现有的数据找出输入与输出之间得权值关系(近似),然后利用这样的权值关系进行仿真,例如输入一组数据仿真出输出结果,当然你的输入要和训练时采用的数据集在一个范畴之内。例如预报天气:温度 湿度 气压等作为输入 天气情况作为输出利用历史得输入输出关系训练出神经网络,然后利用这样的神经网络输入今天的温度 湿度 气压等 得出即将得天气情况。同理,运用到自动化测试中,使用测试数据反映结果走向,bug数,质量问题等情况也可以做到提前预测的!
  
  附录:

深入理解BP神经网络

6. BP算法、BP神经网络、遗传算法、神经网络这四者之间的关系

这四个都属于人工智能算法的范畴。其中BP算法、BP神经网络和神经网络
属于神经网络这个大类。遗传算法为进化算法这个大类。
神经网络模拟人类大脑神经计算过程,可以实现高度非线性的预测和计算,主要用于非线性拟合,识别,特点是需要“训练”,给一些输入,告诉他正确的输出。若干次后,再给新的输入,神经网络就能正确的预测对于的输出。神经网络广泛的运用在模式识别,故障诊断中。BP算法和BP神经网络是神经网络的改进版,修正了一些神经网络的缺点。
遗传算法属于进化算法,模拟大自然生物进化的过程:优胜略汰。个体不断进化,只有高质量的个体(目标函数最小(大))才能进入下一代的繁殖。如此往复,最终找到全局最优值。遗传算法能够很好的解决常规优化算法无法解决的高度非线性优化问题,广泛应用在各行各业中。差分进化,蚁群算法,粒子群算法等都属于进化算法,只是模拟的生物群体对象不一样而已。

7. 如何建立bp神经网络预测 模型

建立BP神经网络预测 模型,可按下列步骤进行:
1、提供原始数据
2、训练数据预测数据提取及归一化
3、BP网络训练
4、BP网络预测
5、结果分析
现用一个实际的例子,来预测2015年和2016年某地区的人口数。
已知2009年——2014年某地区人口数分别为3583、4150、5062、4628、5270、5340万人
执行BP_main程序,得到
[ 2015,  5128.631704710423946380615234375]
[ 2016, 5100.5797325642779469490051269531]
代码及图形如下。

如何建立bp神经网络预测 模型

8. BP神经网络模型各个参数的选取问题

样本变量不需要那么多,因为神经网络的信息存储能力有限,过多的样本会造成一些有用的信息被丢弃。如果样本数量过多,应增加隐层节点数或隐层数目,才能增强学习能力。

一、隐层数
一般认为,增加隐层数可以降低网络误差(也有文献认为不一定能有效降低),提高精度,但也使网络复杂化,从而增加了网络的训练时间和出现“过拟合”的倾向。一般来讲应设计神经网络应优先考虑3层网络(即有1个隐层)。一般地,靠增加隐层节点数来获得较低的误差,其训练效果要比增加隐层数更容易实现。对于没有隐层的神经网络模型,实际上就是一个线性或非线性(取决于输出层采用线性或非线性转换函数型式)回归模型。因此,一般认为,应将不含隐层的网络模型归入回归分析中,技术已很成熟,没有必要在神经网络理论中再讨论之。
二、隐层节点数
在BP 网络中,隐层节点数的选择非常重要,它不仅对建立的神经网络模型的性能影响很大,而且是训练时出现“过拟合”的直接原因,但是目前理论上还没有一种科学的和普遍的确定方法。 目前多数文献中提出的确定隐层节点数的计算公式都是针对训练样本任意多的情况,而且多数是针对最不利的情况,一般工程实践中很难满足,不宜采用。事实上,各种计算公式得到的隐层节点数有时相差几倍甚至上百倍。为尽可能避免训练时出现“过拟合”现象,保证足够高的网络性能和泛化能力,确定隐层节点数的最基本原则是:在满足精度要求的前提下取尽可能紧凑的结构,即取尽可能少的隐层节点数。研究表明,隐层节点数不仅与输入/输出层的节点数有关,更与需解决的问题的复杂程度和转换函数的型式以及样本数据的特性等因素有关。
最新文章
热门文章
推荐阅读