BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是应用最广泛的神经网络。
1.BP神经网络工作信号正向传递
BP网络由输入层、隐层、输出层组成。 神经元是以生物研究及大脑的响应机制而建立的拓扑结构网络,模拟神经冲突的过程,多个树突的末端接受外部信号,并传输给神经元处理融合,最后通过轴突将神经传给其它神经元或者效应器。
神经元的拓扑结构如图:
图中x1~xn是从其他神经元传来的输入信号,wij表示表示从神经元j到神经元i的连接权值,θ表示一个阈值 ( threshold ),或称为偏置( bias )。则神经元i的输出与输入的关系表示为:
图中 yi表示神经元i的输出,函数f称为激活函数 ( Activation Function )或转移函数 ( Transfer Function ) ,net称为净激活(net activation)。若将阈值看成是神经元i的一个输入x0的权重wi0,例如wi0=-1,x0=θ,则上面的式子可以简化为:
若用X表示输入向量,用W表示权重向量,即:X = [ x0 , x1 , x2 , … , xn ]
则神经元的输出可以表示为向量相乘的形式:
若神经元的净激活net为正,称该神经元处于激活状态或兴奋状态(fire),若净激活net为负,则称神经元处于抑制状态。
图1中的这种“阈值加权和”的神经元模型称为M-P模型 ( McCulloch-Pitts Model ),也称为神经网络的一个处理单元( PE, Processing Element )。
2. 常用激活函数
激活函数的选择是构建神经网络过程中的重要环节,下面简要介绍常用的激活函数。
(1) 线性函数 ( Liner Function )
(2) 斜面函数 ( Ramp Function )
(3) 阈值函数 ( Threshold Function )
以上3个激活函数都属于线性函数,下面介绍两个常用的非线性激活函数。
(4) S形函数 ( Sigmoid Function )
该函数的导函数:
(5) 双极S形函数
该函数的导函数:
S形函数与双极S形函数的图像如下:
双极S形函数与S形函数主要区别在于函数的值域,双极S形函数值域是(-1,1),而S形函数值域是(0,1)。
由于S形函数与双极S形函数都是可导的(导函数是连续函数),因此适合用在BP神经网络中。(BP算法要求激活函数可导)
3. 隐层节点数的选择
在BP神经网络中,输入层和输出层的节点个数都是确定的,而隐层节点个数不确定,那么应该设置为多少才合适呢?实际上,隐层节点个数的多少对神经网络的性能是有影响的,有一个经验公式可以确定隐层节点数目,如下
其中h为隐含层节点数目,m为输入层节点数目,n为输出层节点数目,α为1~10之间的调节常数。
4. 误差信号反向传递
在BP神经网络中,误差信号反向传递过程比较复杂,它是基于Widrow-Hoff学习规则的。假设输出层的结果为dj,误差函数如下
而BP神经网络的主要目的是反复修正权值和阀值,使得误差函数值达到最小。Widrow-Hoff学习规则是通过沿着相对误差平方和的最速下降方向,连续调整网络的权值和阀值,根据梯度下降法,权值矢量的修正正比于当前位置上E(w,b)的梯度,对于第j个输出节点有
求得梯度后,再更新参数的值。
5. BP反向传递计算实例
以上图三层BP神经网络为例,首先求得输出y1和y2的值。
该BP神经网络的激活函数选用的是softmax函数,为的是使得输出节点满足概率和为1的分布,适用于多分类问题。
该BP神经网络的误差计算使用下图所示公式1计算。
得到误差损失后,我们需要使用梯度下降法更新参数,以图中w11(2)为例,求出误差对w11(2)求偏导得到的梯度。
求得梯度后,更新为新的值。