李 璇

个人站

Whatever is worth doing at all is worth doing well


BP 神经网络之初步理解举例 (Backpropagation Neural Networks)

看到深度学习如此火爆,神经网络相关资料层出不穷,不禁想起研究生阶段上过的神经网络课程,似懂非懂。这次兴起,仔细看了下应用最广泛的神经网络之一的 BP 神经网络,介绍如下文所示。

简介

BP (back propagation) 神经网络是1986年由 Rumelhart 和 McClelland 为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络。

基本原理

BP 神经网络是一种按误差反向传播训练的多层前馈网络,其算法称为 BP 算法。利用梯度下降法,调整神经网络中的权重参数,以期使网络的实际输出值和期望输出值的误差均方差为最小,即使得预测输出跟踪给定输出。

计算过程

BP 神经网络的计算包括两个过程:正向计算和反向计算。

  • 正向计算:输入层数据经隐含层逐层处理,最终转向输出层,得出实际输出;
  • 反向计算:将实际输出与期望输出间的误差信号沿着网络连接通路反向传播,辅助修正各神经元的权重,以期误差信号最小。

现在以一个典型的三层神经网络为例说明参数的计算推理调整过程。

如图所示三层神经网络:输入层 Layer1、隐含层 Layer2、输出层 Layer3.输入层包括三个神经元,即输入为 x={x1,x2,x3},输出为 y={o1,o2}.样本数据集为 D={(xi,yi)}mi=1xiR3yiR2,目标输出为 oT1 和 oT2ωLkij 为第 k1 层的第 i 个神经元到第 k 层的第 j 个神经元之间的权重.bLk={bLki} 为第 k 层神经元偏移量集合,bLki 为第 k 层第 i 个神经元的偏移量.netLki 表示第 k 层网络的第 i 个神经元的输入,oLki 表示第 k 层网络的第 i 个神经元的输出,fLki() 表示第 k 层网络的第 i 个神经元的激活函数.

假设采用常见的激活函数 sigmoid 函数: f(x)=11+ex

其导数为: f(x)=f(x)(1f(x))

对于 Layer2 层第 j 个神经元的输入:

netL2j=3i=1ωL1ij×xi+bL2j

对于 Layer3 层的第 j 个神经元的输入:

netL3j=3i=1ωL2ij×oL2i+bL3j

第 Li 层的第 j 个神经元的输出:

oLij=fLij(netLij)=11+enetLij

输出的总误差为:

ETotal=122j=1(oTjoL3j)2=12((oT1oL31)2+(oT2oL32)2)

总误差为是关于 oL31 和 oL32 的函数.

BP 算法基于梯度下降(gradient descent)策略,以目标的负梯度方向对参数进行调整.它是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习 规则对参数进行更新估计,任一参数 v 的更新估计式为

vv+Δv

A.Layer2 与 Layer3 间参数调整

调整 Layer2 与 Layer3 间的权重 ωL2ij.总误差对 ωL2ij 的偏导数为:

ETotalωL2ij=ETotaloL3joL3jnetL3jnetL3jωL2ij=(oTjoL3j)fL3j(netL3j)(1fL3j(netL3j))oL2i=(oTjoL3j)oL3j(1oL3j)oL2i

令 δL2ij 表示 Layer2 层第 i 个神经元与 Layer3 层第 j 个神经元间权重的梯度项,则

δL2ij=ETotaloL3joL3jnetL3j=(oTjoL3j)oL3j(1oL3j)

可以看出, Layer2 层第 i 个神经元与 Layer3 层第 j 个神经元间权重的梯度项是与 i 无关的,故连接至 Layer3 层第 j 个神经元相对应的权重的梯度项均为 δL2ij,用 δL2j 表示,

δL2j=δL2ij=(oTjoL3j)oL3j(1oL3j)

则整体误差 ETotal 对 ωL2ij 的偏导数公式写作:

ETotalωL2ij=δL2joL2i

则权重 ωL2ij 的学习公式为:

ˆωL2ij=ωL2ijηETotalωL2ij=ωL2ijηδL2joL2i

其中,η 为学习速率.

调整 Layer3 的偏移量参数.Layer3 的第 j 个神经元的偏移量 bL3j 的梯度为:

ETotalbL3j=ETotaloL3joL3jnetL3jnetL3jbL3j=(oTjoL3j)fL3j(netL3j)(1fL3j(netL3j))1=(oTjoL3j)oL3j(1oL3j)=δL2j

偏移 bL3j 的学习公式为:

ˆbL3j=bL3jηETotalbL3j=bL3jηδL2j

例如,依据公式(12),对于权重 ωL211 的更新学习公式为:

ˆωL211=ωL211ηETotalωL211=ωL211ηδL211oL21=ωL211η((oT1oL31)oL31(1oL31))oL21=ωL211+η(oT1oL31)oL31(1oL31)oL21

例如,依据公式(14),对于偏移 bL31 的更新学习公式为:

ˆbL31=bL31ηETotalbL31=bL31+η(oT1oL31)oL31(1oL31)

B.Layer1 与 Layer2 间参数调整

调整 Layer1 与 Layer2 间的权重 ωL1ij.总体误差对 ωL1ij 的偏导数为:

ETotalωL1ij=(2k=1ETotaloL3koL3knetL3knetL3koL2j)oL2jnetL2jnetL2jωL1ij=(2k=1δLayer2kωL23k)fL2j(netL2j)(1fL2j(netL2j))xi=(2k=1δLayer2kωL23k)oL2j(1oL2j)xi

令 δL1ij 表示 Layer1 层第 i 个神经元与 Layer2 层第 j 个神经元间权重的梯度项,则

δL1ij=(2k=1ETotaloL3koL3knetL3knetL3koL2j)oL2jnetL2j=(2k=1δLayer2kωL23k)oL2j(1oL2j)

可以看出, Layer1 层第 i 个神经元与 Layer2 层第 j 个神经元间权重的梯度项是与 i 无关的,故连接至 Layer2 层第 j 个神经元相对应的权重的梯度向均为 δL1ij,用 δL1j 表示,

δL1j=δL1ij=(2k=1δLayer2kωL23k)oL2j(1oL2j)

则整体误差 ETotal 对 ωL1ij 的偏导数公式写作:

ETotalωL1ij=δL1jxi

则权重 ωL1ij 的学习公式为:

ˆωL1ij=ωL1ijηETotalωL1ij=ωL1ijηδL1jxi

整体误差 ETotal 对 bL2j 的偏导数公式写作:

ETotalbL2j=(2k=1ETotaloL3koL3knetL3knetL3koL2j)oL2jnetL2jnetL2jbL2j=(2k=1δLayer2kωL23k)fL2j(netL2j)(1fL2j(netL2j))1=(2k=1δLayer2kωL23k)oL2j(1oL2j)=δL1j

偏移 bL2j 的学习公式为:

ˆbL2j=bL2jηETotalbL2j=bL2jηδL1j

例如,依据公式(19)对于权重 ωL123 的更新学习公式为:

ˆωL123=ωL223ηETotalωL123=ωL223η((2j=1ETotaloL3joL3jnetL3jnetL3joL23)oL23netL23netL23ωL123)=ωL223η(2j=1δLayer2jωL23j)fL23(netL23)(1fL23(netL23))x2=ωL223η(2j=1δLayer2jωL23j)oL23(1oL23)x2

例如,依据公式(21),对于偏移 bL23 的更新学习公式为:

ˆbL23=bL31ηETotalbL23=bL23η((2j=1ETotaloL3joL3jnetL3jnetL3joL23)oL23netL23netL23bL23)=bL23η(2j=1δLayer2jωL23j)fL23(netL23)(1fL23(netL23))1=bL23η(2j=1δLayer2jωL23j)oL23(1oL23)

需要指出的是学习率 η(0,1) 控制着算法每一轮迭代中的更新步长,若太多则容易震荡;太小则收敛速录又会过慢.并且公式(12)、(14)、(19)和(21)中的学习率也未必相等.

C.误差反向传播算法

结合上述公式,根据样本参数计算总体误差;根据总体误差,更新神经网络参数;这样,实现信号的正向传递,误差的反向传播,参数的自适应.如此,不停的进行迭代直至满足停止条件.

具体而言,BP 算法执行以下操作:先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差,再将误差逆向传播至隐层神经元,最后根据隐层神经元的误差来别连接权和偏移进行调整.该法代过程循环进行,直到达到某些停止条件为止,例如训练误差己达到一个很小的值.具体操作流程如下所示.


输入:训练集 D={(xi,yi)}mi=1

   学习率 η

过程

  1. 在 (0,1) 范围内随机初始化网络中所有连接权重和偏移量
  2. repeat
  3.   for all (xk,yk)D do
  4.     根据当前参数和式(5)计算当前样本的输出oL3j
  5.     根据式(10)计算输出层神经元的梯度项 δL2j 
  6.     根据式(17)计算隐含层各神经元的梯度项 δL1j
  7.     根据式(12)和(14)更新连接权重 ωL3ij 和偏移 bL3j
  8.     根据式(19)和(21)更新连接权重ωL2ij 和偏移 bL2j 
  9.   end for
  10. until 达到停止条件
  11. 输出:连接权重与偏移量确定的多层前馈神经网络

扩展

上面介绍为“标准 BP 算法”,每次仅针对一个训练样例更新权重和偏移,也就是说,算法的更新规则是基于单个的样本的误差推导而得.

如果类似地推导出基于累积误差最小化的更新规则,就得到了累积误差逆传播(accumulated error backpropagation)算法.累积 BP 算法与标准 BP 算法都很常用.一般来说,标准 BP 算法每次更新只针对单个样例,参数更新得非常频繁,而且对不同样例进行更新的效果可能出现“抵消”现象.因此,为了达到同样的累积误差极小点,标准 BP 算法往往需进行更多次数的法代.累积 BP 算法直接针对累积误差最小化,它在读取整个训练集 D 一遍后才对参数进行更新,其参数更新的频率低得多.但在很多任务中,累积误差下降到一定程度之后,进一步下降会非常缓慢,这时标准 BP 往往会更快获得较好的解,尤其是在训练集 D 非常大时更明显.