BP神经⽹络原理及matlab实例
上⼀次我们讲了,它实际上就是对单个神经元的⼀种建模,还不⾜以模拟⼈脑神经系统的功能。由这些⼈⼯神经元构建出来的⽹络,才能够具有学习、联想、记忆和模式识别的能⼒。BP⽹络就是⼀种简单的⼈⼯神经⽹络。
本⽂具体来介绍⼀下⼀种⾮常常见的神经⽹络模型——反向传播(Back Propagation)神经⽹络。
概述
BP(Back Propagation)神经⽹络是1986年由Rumelhart和McCelland为⾸的科研⼩组提出,参见他们发表在Nature上的论⽂  。
BP神经⽹络是⼀种按误差逆传播算法训练的多层前馈⽹络,是⽬前应⽤最⼴泛的神经⽹络模型之⼀。BP⽹络能学习和存贮⼤量的 输⼊-输出模式映射关系,⽽⽆需事前揭⽰描述这种映射关系的数学⽅程。它的学习规则是使⽤最速下降法,通过反向传播来不断 调整⽹络的权值和阈值,使⽹络的误差平⽅和最⼩。
BP算法的基本思想
上⼀次我们说到,多层感知器在如何获取隐层的权值的问题上遇到了瓶颈。既然我们⽆法直接得到隐层的权值,能否先通过输出层得到输出结果和期望输出的误差来间接调整隐层的权值呢?BP算法就是采⽤这样的思想设计出来的算法,它的基本思想是,学习过程由信号的正向传播与误差的反向传播两个过程组成。
正向传播时,输⼊样本从输⼊层传⼊,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出(教师信号)不符,则转⼊误差的反向传播阶段。
反向传播时,将输出以某种形式通过隐层向输⼊层逐层反传,并将误差分摊给各层的所有单元,从⽽获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。
这两个过程的具体流程会在后⽂介绍。
BP算法的信号流向图如下图所⽰
BP⽹络特性分析——BP三要素
我们分析⼀个ANN时,通常都是从它的三要素⼊⼿,即
1)⽹络拓扑结构;
2)传递函数;
3)学习算法。
每⼀个要素的特性加起来就决定了这个ANN的功能特性。所以,我们也从这三要素⼊⼿对BP⽹络的研究。
matlab求导3.1 BP⽹络的拓扑结构
上⼀次已经说了,BP⽹络实际上就是多层感知器,因此它的拓扑结构和多层感知器的拓扑结构相同。由于单隐层(三层)感知器已经能够解决简单的⾮线性问题,因此应⽤最为普遍。三层感知器的拓扑结构如下图所⽰。
⼀个最简单的三层BP:
3.2 BP⽹络的传递函数
BP⽹络采⽤的传递函数是⾮线性变换函数——(⼜称S函数)。其特点是函数本⾝及其导数都是连续的,因⽽在处理上⼗分⽅便。为什么要选择这个函数,等下在介绍BP⽹络的学习算法的时候会进⾏进⼀步的介绍。
单极性S型函数曲线如下图所⽰。
双极性S型函数曲线如下图所⽰。
3.3 BP⽹络的学习算法
BP⽹络的学习算法就是BP算法,⼜叫 δ 算法(在ANN的学习过程中我们会发现不少具有多个名称的术语), 以三层感知器为例,当⽹络输出与期望输出不等时,存在输出误差 E ,定义如下
将以上误差定义式展开⾄隐层,有
进⼀步展开⾄输⼊层,有
由上式可以看出,⽹络输⼊误差是各层权值、的函数,因此调整权值可改变误差 。 显然,调整权值的原则是使误差不断减⼩,因此应使权值与误差的梯度下降成正⽐,即
对于⼀般多层感知器,设共有  个隐层,按前向顺序各隐层节点数分别记为 ,各隐层输出分别记为 ,各层权值矩阵分别记为 ,则各层权值调整公式为
输出层
第  隐层
按以上规律逐层类推,则第⼀隐层权值调整公式
容易看出,BP学习算法中,各层权值调整公式形式上都是⼀样的,均由3个因素决定,即:
1. 学习率
2. 本层输出的误差信号
3. 本层输⼊信号 (或)
其中输⼊层误差信号与⽹络的期望输出与实际输出之差有关,直接反应了输出误差,⽽各隐层的误差信号与前⾯各层的误差信号有关,是从输出层开始逐层反传过来的。
可以看出BP算法属于δ学习规则类,这类算法常被称为误差的梯度下降算法。δ学习规则可以看成是Widrow-Hoff(LMS)学习规则的⼀般化(generalize)情况。LMS学习规则与神经元采⽤的变换函数⽆关,因⽽不需要对变换函数求导,δ学习规则则没有这个性质,要求变换函数可导。这就是为什么我们前⾯采⽤Sigmoid函数的原因。
综上所述,BP三要素如下图所⽰。
下⾯我们会介绍BP⽹络的学习训练的具体过程。
BP⽹络的训练分解
训练⼀个BP神经⽹络,实际上就是调整⽹络的权重和偏置这两个参数,BP神经⽹络的训练过程分两部分:
前向传输,逐层波浪式的传递输出值;
逆向反馈,反向逐层调整权重和偏置;
我们先来看前向传输。
前向传输(Feed-Forward前向反馈)
在训练⽹络之前,我们需要随机初始化权重和偏置,对每⼀个权重取的⼀个随机实数,每⼀个偏置取的⼀个随机实数,之后就开始进⾏前向传输。
神经⽹络的训练是由多趟迭代完成的,每⼀趟迭代都使⽤训练集的所有记录,⽽每⼀次训练⽹络只使
⽤⼀条记录,抽象的描述如下:
1. while 终⽌条件未满⾜:
2. for record:dataset:
3. trainModel(record)
1
2
3
⾸先设置输⼊层的输出值,假设属性的个数为100,那我们就设置输⼊层的神经单元个数为100,输⼊层的结点为记录第维上的属性值。对输⼊层的操作就这么简单,之后的每层就要复杂⼀些了,除输⼊层外,其他各层的输⼊值是上⼀层输⼊值按权重累加的结果值加上偏置,每个结点的输出值等该结点的输⼊值作变换
前向传输的输出层的计算过程公式如下:
对隐藏层和输出层的每⼀个结点都按照如上图的⽅式计算输出值,就完成前向传播的过程,紧接着是进⾏逆向反馈。
逆向反馈(Backpropagation)
逆向反馈从最后⼀层即输出层开始,我们训练神经⽹络作分类的⽬的往往是希望最后⼀层的输出能够描述数据记录的类别,⽐如对于⼀个⼆分类的问题,我们常常⽤两个神经单元作为输出层,如果输出层的第⼀个神经单元的输出值⽐第⼆个神经单元⼤,我们认为这个数据记录属于第⼀类,否则属于第⼆类。
还记得我们第⼀次前向反馈时,整个⽹络的权重和偏置都是我们随机取,因此⽹络的输出肯定还不能描述记录的类别,因此需要调整⽹络的参数,即权重值和偏置值,⽽调整的依据就是⽹络的输出层的输出值与类别之间的差异,通过调整参数来缩⼩这个差异,这就是神经⽹络的优化⽬标。对于输出层:
其中表⽰第个结点的误差值,表⽰第个结点的输出值,记录输出值,⽐如对于2分类问题,我们⽤01表⽰类标1,10表⽰类别2,如果⼀个记录属于类别1,那么其,。
中间的隐藏层并不直接与数据记录的类别打交道,⽽是通过下⼀层的所有结点误差按权重累加,计算公式如下:
其中表⽰当前层的结点到下⼀层的结点的权重值,下⼀层的结点的误差率。
计算完误差率后,就可以利⽤误差率对权重和偏置进⾏更新,⾸先看权重的更新:
其中表⽰表⽰学习速率,取值为0到1,学习速率设置得⼤,训练收敛更快,但容易陷⼊局部最优解,学习速率设置得⽐较⼩的话,收敛速度较慢,但能⼀步步逼近全局最优解。
更新完权重后,还有最后⼀项参数需要更新,即偏置:
⾄此,我们完成了⼀次神经⽹络的训练过程,通过不断的使⽤所有数据记录进⾏训练,从⽽得到⼀个分类模型。不断地迭代,不可能⽆休⽌的下去,总归有个终⽌条件
训练终⽌条件
每⼀轮训练都使⽤数据集的所有记录,但什么时候停⽌,停⽌条件有下⾯两种:
1. 设置最⼤迭代次数,⽐如使⽤数据集迭代100次后停⽌训练
2. 计算训练集在⽹络上的预测准确率,达到⼀定门限值后停⽌训练
BP⽹络运⾏的具体流程
⽹络结构
输⼊层有个神经元,隐含层有个神经元,输出层有个神经元。
变量定义
输⼊变量:
隐含层输⼊变量:
隐含层输出变量:
输出层输⼊变量:
输出层输出变量:
期望输出向量:
输⼊层与中间层的连接权值:
隐含层与输出层的连接权值:
隐含层各神经元的阈值:
输出层各神经元的阈值:
样本数据个数:
激活函数:
误差函数:
第⼀步:⽹络初始化
给各连接权值分别赋⼀个区间内的随机数,设定误差函数,给定计算精度值和最⼤学习次数。
第⼆步:随机选取
随机选取第个输⼊样本以及对应的期望输出
第三部:隐含层计算
计算隐含层各神经元的输⼊和输出