BP神经网络概述——反向传播算法

By | 2016年11月5日

本文主要是对BP算法进行一个初级的介绍和认知,没有过多涉及其中的计算公式,如果想要进行深入的学习,可以看另一篇文章——BP算法到底是如何进行误差反向传播的?

1.BP算法的思想

BP神经网络由 Rumelhard 和 McClelland 于1986年提出,从结构上讲,它是一种典型的多层前向型神经网络,具有一个输入层、多个隐藏层(可以是多层,也可以是一层)和一个输出层。层与层之间采用全连接的方式,而同一层的神经元之间不存在相互连接。理论上已经证明,具有一个隐藏层的三层网络可以逼近任意非线性函数。

BP实际上并不是一种网络结构,只是一种学习算法,而跟神经网络没有太大的关系,只是我们在这个神经网络中用的是BP算法。BP算法通常是与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络。BP算法对网络中所有权值计算损失函数的梯度,这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数

BP算法要求有对每个输入值想得到的已知输出,来计算损失函数梯度。因此,它通常被认为是一种有监督学习方法,虽然它也用在一些无监督网络(如自动编码器)中。BP要求神经元(或节点)的激励函数可微

总的来说,BP算法的基本思想是:对一定数量的样本对(输入和期望输出)进行学习,即将样本的输入送至网络输入层的各个神经元,经隐含层和输出层的计算后,输出层各个神经元输出对应的预测值。若预测值和期望值之间的误差不满足精度要求,则从输出层反向传播该误差,从而进行权值和阈值的调整,使得网络的输出和期望输出间的误差逐渐减小,直至满足精度要求

BP网络的精髓是:将网络的输出与期望输出间的误差归结为权值和阈值的“过错”,通过反向传播把误差“分摊”给各个神经元的权值和阈值。

BP网络学习算法的指导思想是:权值和阈值的调整要沿着误差函数下降最快的方向——负梯度方向。

2.BP算法的过程

首先,我们对BP算法的整体过程进行一个大体上的了解。

下面是一个含有2个隐藏层的神经网络,一共4层。

qq%e6%88%aa%e5%9b%be20161225104736

对于每个神经元,我们可以将计算分解为两步:

  1. 加权和:e=x1w1 + x2w2
  2. 非线性函数映射:y=f(e)

qq%e6%88%aa%e5%9b%be20161225105033

所以说,针对给定的一组输入,我们就可以算出每个神经元的输出。比如计算第一个隐藏层的第一个神经元f1(e):

qq%e6%88%aa%e5%9b%be20161225105440

接着,前面隐藏层的输出又作为后面隐藏层的输入,比如计算第二个隐藏层的第一个神经元f4(e):

qq%e6%88%aa%e5%9b%be20161225105623

其它神经元同理。当所有神经元都计算完之后,我们就会得到该网络的最终输出y,它和我们的期望输出z之间的差值δ就可以算出来了。(期望输出z 就是网络对于输入x应该输出的值)

qq%e6%88%aa%e5%9b%be20161225105817

这个误差δ就会作为一个修正依据,反过来调整网络的权值w和偏差b。比如说 最终输出层的误差为 δ,那么上一个隐藏层的神经元f4(e) 的误差就可以表示成下图所示:

qq%e6%88%aa%e5%9b%be20161225105828

其它神经元的误差同理:

qq%e6%88%aa%e5%9b%be20161225110720

所有误差都计算完之后,就可以利用梯度下降法的权值更新的公式,对网络中每个神经元的权值进行更新。这里的参数η是学习率,可以是变化的,也可以是不变的,根据不同的要求自己设定。δ就是刚刚计算出来的误差。f1(e)是激活函数,这里是对激活函数求微分(所以要求激活函数是可微的)。W(x1)1是原来的权值,W’(x1)1是更新后的权值,x1、x2是输入样本。

需要注意的是,更新第二层及以后层的权值时,不再乘以输入样本x1、x2,而是乘以第一层神经元的输出y1,y2,y3,后续类似。

qq%e6%88%aa%e5%9b%be20161225110907    qq%e6%88%aa%e5%9b%be20161225111034

那么,以上过程就是BP神经网络的一个整体思想和原理了。

总结一下,BP算法主要分为以下 2 个过程:

 Phase1:激励传播

  1. (前向传播阶段)将训练集输入网络,经过各层得到输出
  2. (反向传播阶段)将输出与训练集对应的目标输出求差,从而获得隐层和输出层的响应误差

Phase2:权值更新

  1. 对于每个权值,将输入激励和响应误差相乘,从而获得权重的梯度
  2. 将这个梯度乘上一个比例并取反后加到权重上。这个比例(百分比)将会影响到训练过程的速度和效果,因此称为“训练因子”。梯度的方向指明了误差扩大的方向,因此在更新权重的时候需要对其取反,从而减小权重引起的误差。

第1和第2阶段可以反复循环迭代,直到网络对输入的响应达到满意的预定目标范围为止。

3.对BP算法的理解

我们先考虑一个有两个输入单元、一个输出单元、没有隐藏单元的简单神经网络。每个神经元都使用输入的加权和作为线性输出。在训练之前,会随机分配权重,之后神经元根据训练实例进行学习,从而更新权重。

我们假设有一个输入(x1,x2,t),其中 x1,x2 是网络的输入,t 是正确输出(即网络的预期输出)。但是网络在输入 x1,x2 后,会给出一个实际输出 y,y 很可能与 t 不同(因为权重最初是随机分配的)。

File:A simple neural network with two input units and one output unit.png           File:Error surface of a linear neuron for a single training case.png

衡量期望输出 t 与实际输出 y 之间的差异的一个常见方法是采用平方误差测度:E=(t-y)^2,其中E为误差或差异。现在若将实际输出 y 画在x轴,误差 E 画在 y 轴,得出的将是一条抛物线。抛物线的极小值对应输出 y,此时误差 E 最小。对于单一训练实例,极小值还会接触到 x 轴,这意味着误差为零,网络可以产生与期望输出 t 完全匹配的输出 y。因此,把输入映射到输出的问题就化为了一个找到一个能产生最小误差的函数的最优化问题

然而,一个神经元的输出取决于其所有输入的加权总和:y=w1x1+w2x2,其中w1,w2是从输入层到输出层的权重。因此,误差取决于输入到该神经元的权重,也是网络需要学习的。若每个权重都画在一个水平的轴上,而误差画在垂直轴上,得出的就是一个抛物面(若一个神经元有k个权重,则误差曲面的维度就是k+1)

File:Error surface of a linear neuron with two input weights.png

反向传播算法的目的就是找到一组能最大限度地减小误差的权重。寻找抛物线或任意维度中的任何函数的极大值的方法有若干种,反向传播算法使用的是梯度下降法。(关于梯度下降法的学习见此文

4.MATLAB对BP神经网络的实现

MATLAB神经网络工具箱中,包含了许多用于BP神经网络分析与设计的函数,下面将简要说明几个主要函数的功能、调用格式、参数意义及注意事项等。MATLAB版本为R2010b版本以后。

4.1 BP神经网络创建函数

函数feedforwardnet()用于创建一个前向传播神经网络。

net = feedforwardnet(hiddenSizes,trainFcn)

其中,hiddenSizes为一个行向量,表征一个或多个隐含层所包含的神经元个数(默认为10,即仅有一个包含10个神经元的隐含层);trainFcn为网络训练函数(默认为trainlm)。

可以发现,新版本的BP神经网络创建函数无需给定输入和输出向量的信息,使得在内存管理上更加高效。而且,输入参数明显减少并均有默认值,用户调用该函数时甚至无需给出任何参数。

4.2 BP神经网络训练函数

函数train()用于训练已经创建好的BP神经网络。

[net,tr] = train(net,P,T,Pi,Ai,EW)

其中,第二个net为训练前的网络;P为网络输入向量;T为网络目标向量(默认为0);Pi为初始的输入层延迟条件(默认为0);Ai为初始的输出层延迟条件(默认为0);EW为新版本中添加的输入参数,用户可以通过设置该参数调整输出目标向量中各个元素的重要程度。

tr为训练记录,包含步数及性能;第一个net为训练后的网络。

4.3 BP神经网络预测函数

函数sim()用于利用已经训练好的BP神经网络进行仿真预测。

[Y,Pf,Af,E,perf] = sim(net,P,Pi,Ai,T)

其中,net为训练好的网络;P为网络输入向量;Pi为初始的输入层延迟条件(默认为0);Ai为初始的隐含层延迟条件(默认为0);T为网络目标向量(默认为0)。

Y为网络输出向量;Pf为最终的输入层延迟条件;Af为最终的隐含层延迟条件;E为网络误差向量;perf为网络的性能。

在新版本中,除了上述方式,还可以做如下调用

y = net(P,Pi,Ai)

5.关于BP算法的讨论

  1. 推导过程可见反向传播算法维基百科
  2. 在更新权值时,之所以需要取反,是因为要更新误差函数极小值而不是极大值的方向。
  3. 结果可能会收敛到极值。如果有且只有一个极小值,梯度下降的“爬山”策略一定可以起作用。然而,误差曲面往往有许多局部最小值和最大值。如果梯度下降的起始点恰好介于局部最大值和局部最小值之间,则沿着梯度下降最大的方向会到达局部最小值
  4. 通过反向传播来获得收敛,速度很慢。
  5. 反向传播学习不需要输入向量的标准化。但是,标准化可提高性能。
  6. 隐含层神经元个数对BP神经网络的性能影响较大。若隐含层神经元的个数较少,则网络不能充分描述输出和输入变量之间的关系;相反,若隐含层神经元的个数较多,则会导致网络的学习时间变长,甚至会出现过拟合的问题。一般地,确定隐含层神经元个数的方法是在经验公式的基础上,对比隐含层不同神经元个数对模型性能的影响,从而进行选择。

参考文献:

  1. 反向传播算法-wikipedia
  2. 郁磊,史峰等. MATLAB智能算法30个案例分析(第2版)
  3. 对BP算法更详细的推导及学习见an online book《Neural Networks and Deep Learning》chap2

One thought on “BP神经网络概述——反向传播算法

  1. Pingback: BP算法到底是如何进行误差反向传播的? – 安逸轩

发表评论

电子邮件地址不会被公开。 必填项已用*标注