看到深度学习如此火爆,神经网络相关资料层出不穷,不禁想起研究生阶段上过的神经网络课程,似懂非懂。这次兴起,仔细看了下应用最广泛的神经网络之一的 BP 神经网络,介绍如下文所示。
简介
BP (back propagation) 神经网络是1986年由 Rumelhart 和 McClelland 为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络。
基本原理
BP 神经网络是一种按误差反向传播训练的多层前馈网络,其算法称为 BP 算法。利用梯度下降法,调整神经网络中的权重参数,以期使网络的实际输出值和期望输出值的误差均方差为最小,即使得预测输出跟踪给定输出。
计算过程
BP 神经网络的计算包括两个过程:正向计算和反向计算。
- 正向计算:输入层数据经隐含层逐层处理,最终转向输出层,得出实际输出;
- 反向计算:将实际输出与期望输出间的误差信号沿着网络连接通路反向传播,辅助修正各神经元的权重,以期误差信号最小。
现在以一个典型的三层神经网络为例说明参数的计算推理调整过程。
如图所示三层神经网络:输入层 Layer1、隐含层 Layer2、输出层 Layer3.输入层包括三个神经元,即输入为 x={x1,x2,x3},输出为 y={o1,o2}.样本数据集为 D={(xi,yi)}mi=1,xi∈R3,yi∈R2,目标输出为 oT1 和 oT2.ωLkij 为第 k−1 层的第 i 个神经元到第 k 层的第 j 个神经元之间的权重.bLk={bLki} 为第 k 层神经元偏移量集合,bLki 为第 k 层第 i 个神经元的偏移量.netLki 表示第 k 层网络的第 i 个神经元的输入,oLki 表示第 k 层网络的第 i 个神经元的输出,fLki(⋅) 表示第 k 层网络的第 i 个神经元的激活函数.
假设采用常见的激活函数 sigmoid 函数: f(x)=11+e−x
对于 Layer2 层第 j 个神经元的输入:
netL2j=3∑i=1ωL1ij×xi+bL2j对于 Layer3 层的第 j 个神经元的输入:
netL3j=3∑i=1ωL2ij×oL2i+bL3j第 Li 层的第 j 个神经元的输出:
oLij=fLij(netLij)=11+e−netLij输出的总误差为:
ETotal=122∑j=1(oTj−oL3j)2=12((oT1−oL31)2+(oT2−oL32)2)总误差为是关于 oL31 和 oL32 的函数.
BP 算法基于梯度下降(gradient descent)策略,以目标的负梯度方向对参数进行调整.它是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习 规则对参数进行更新估计,任一参数 v 的更新估计式为
v←v+ΔvA.Layer2 与 Layer3 间参数调整
调整 Layer2 与 Layer3 间的权重 ωL2ij.总误差对 ωL2ij 的偏导数为:
∂ETotal∂ωL2ij=∂ETotal∂oL3j⋅∂oL3j∂netL3j⋅∂netL3j∂ωL2ij=−(oTj−oL3j)⋅fL3j(netL3j)(1−fL3j(netL3j))⋅oL2i=−(oTj−oL3j)⋅oL3j(1−oL3j)⋅oL2i令 δL2ij 表示 Layer2 层第 i 个神经元与 Layer3 层第 j 个神经元间权重的梯度项,则
δL2ij=∂ETotal∂oL3j⋅∂oL3j∂netL3j=−(oTj−oL3j)⋅oL3j(1−oL3j)可以看出, Layer2 层第 i 个神经元与 Layer3 层第 j 个神经元间权重的梯度项是与 i 无关的,故连接至 Layer3 层第 j 个神经元相对应的权重的梯度项均为 δL2ij,用 δL2⋅j 表示,
δL2⋅j=δL2ij=−(oTj−oL3j)⋅oL3j(1−oL3j)则整体误差 ETotal 对 ωL2ij 的偏导数公式写作:
∂ETotal∂ωL2ij=δL2⋅j⋅oL2i则权重 ωL2ij 的学习公式为:
ˆωL2ij=ωL2ij−η⋅∂ETotal∂ωL2ij=ωL2ij−η⋅δL2⋅j⋅oL2i其中,η 为学习速率.
调整 Layer3 的偏移量参数.Layer3 的第 j 个神经元的偏移量 bL3j 的梯度为:
∂ETotal∂bL3j=∂ETotal∂oL3j⋅∂oL3j∂netL3j⋅∂netL3j∂bL3j=−(oTj−oL3j)⋅fL3j(netL3j)(1−fL3j(netL3j))⋅1=−(oTj−oL3j)⋅oL3j(1−oL3j)=δL2⋅j偏移 bL3j 的学习公式为:
ˆbL3j=bL3j−η⋅∂ETotal∂bL3j=bL3j−η⋅δL2⋅j例如,依据公式(12),对于权重 ωL211 的更新学习公式为:
ˆωL211=ωL211−η⋅∂ETotal∂ωL211=ωL211−η⋅δL211⋅oL21=ωL211−η⋅(−(oT1−oL31)⋅oL31(1−oL31))⋅oL21=ωL211+η⋅(oT1−oL31)⋅oL31(1−oL31)⋅oL21例如,依据公式(14),对于偏移 bL31 的更新学习公式为:
ˆbL31=bL31−η⋅∂ETotal∂bL31=bL31+η⋅(oT1−oL31)⋅oL31(1−oL31)B.Layer1 与 Layer2 间参数调整
调整 Layer1 与 Layer2 间的权重 ωL1ij.总体误差对 ωL1ij 的偏导数为:
∂ETotal∂ωL1ij=(2∑k=1∂ETotal∂oL3k∂oL3k∂netL3k∂netL3k∂oL2j)⋅∂oL2j∂netL2j⋅∂netL2j∂ωL1ij=(2∑k=1δLayer2⋅kωL23k)⋅fL2j(netL2j)(1−fL2j(netL2j))⋅xi=(2∑k=1δLayer2⋅kωL23k)⋅oL2j(1−oL2j)⋅xi令 δL1ij 表示 Layer1 层第 i 个神经元与 Layer2 层第 j 个神经元间权重的梯度项,则
δL1ij=(2∑k=1∂ETotal∂oL3k∂oL3k∂netL3k∂netL3k∂oL2j)⋅∂oL2j∂netL2j=(2∑k=1δLayer2⋅kωL23k)⋅oL2j(1−oL2j)可以看出, Layer1 层第 i 个神经元与 Layer2 层第 j 个神经元间权重的梯度项是与 i 无关的,故连接至 Layer2 层第 j 个神经元相对应的权重的梯度向均为 δL1ij,用 δL1⋅j 表示,
δL1⋅j=δL1ij=(2∑k=1δLayer2⋅kωL23k)⋅oL2j(1−oL2j)则整体误差 ETotal 对 ωL1ij 的偏导数公式写作:
∂ETotal∂ωL1ij=δL1⋅j⋅xi则权重 ωL1ij 的学习公式为:
ˆωL1ij=ωL1ij−η⋅∂ETotal∂ωL1ij=ωL1ij−η⋅δL1⋅j⋅xi整体误差 ETotal 对 bL2j 的偏导数公式写作:
∂ETotal∂bL2j=(2∑k=1∂ETotal∂oL3k∂oL3k∂netL3k∂netL3k∂oL2j)⋅∂oL2j∂netL2j⋅∂netL2j∂bL2j=(2∑k=1δLayer2⋅kωL23k)⋅fL2j(netL2j)(1−fL2j(netL2j))⋅1=(2∑k=1δLayer2⋅kωL23k)⋅oL2j(1−oL2j)=δL1⋅j偏移 bL2j 的学习公式为:
ˆbL2j=bL2j−η⋅∂ETotal∂bL2j=bL2j−η⋅δL1⋅j例如,依据公式(19)对于权重 ωL123 的更新学习公式为:
ˆωL123=ωL223−η⋅∂ETotal∂ωL123=ωL223−η⋅((2∑j=1∂ETotal∂oL3j∂oL3j∂netL3j∂netL3j∂oL23)⋅∂oL23∂netL23⋅∂netL23∂ωL123)=ωL223−η⋅(2∑j=1δLayer2⋅jωL23j)⋅fL23(netL23)(1−fL23(netL23))⋅x2=ωL223−η⋅(2∑j=1δLayer2⋅jωL23j)⋅oL23(1−oL23)⋅x2例如,依据公式(21),对于偏移 bL23 的更新学习公式为:
ˆbL23=bL31−η⋅∂ETotal∂bL23=bL23−η⋅((2∑j=1∂ETotal∂oL3j∂oL3j∂netL3j∂netL3j∂oL23)⋅∂oL23∂netL23⋅∂netL23∂bL23)=bL23−η⋅(2∑j=1δLayer2⋅jωL23j)⋅fL23(netL23)(1−fL23(netL23))⋅1=bL23−η⋅(2∑j=1δLayer2⋅jωL23j)⋅oL23(1−oL23)需要指出的是学习率 η∈(0,1) 控制着算法每一轮迭代中的更新步长,若太多则容易震荡;太小则收敛速录又会过慢.并且公式(12)、(14)、(19)和(21)中的学习率也未必相等.
C.误差反向传播算法
结合上述公式,根据样本参数计算总体误差;根据总体误差,更新神经网络参数;这样,实现信号的正向传递,误差的反向传播,参数的自适应.如此,不停的进行迭代直至满足停止条件.
具体而言,BP 算法执行以下操作:先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差,再将误差逆向传播至隐层神经元,最后根据隐层神经元的误差来别连接权和偏移进行调整.该法代过程循环进行,直到达到某些停止条件为止,例如训练误差己达到一个很小的值.具体操作流程如下所示.
输入:训练集 D={(xi,yi)}mi=1
学习率 η
过程:
- 在 (0,1) 范围内随机初始化网络中所有连接权重和偏移量
- repeat
- for all (xk,yk)∈D do
- 根据当前参数和式(5)计算当前样本的输出oL3j
- 根据式(10)计算输出层神经元的梯度项 δL2⋅j
- 根据式(17)计算隐含层各神经元的梯度项 δL1⋅j
- 根据式(12)和(14)更新连接权重 ωL3ij 和偏移 bL3j
- 根据式(19)和(21)更新连接权重ωL2ij 和偏移 bL2j
- end for
- until 达到停止条件
- 输出:连接权重与偏移量确定的多层前馈神经网络
扩展
上面介绍为“标准 BP 算法”,每次仅针对一个训练样例更新权重和偏移,也就是说,算法的更新规则是基于单个的样本的误差推导而得.
如果类似地推导出基于累积误差最小化的更新规则,就得到了累积误差逆传播(accumulated error backpropagation)算法.累积 BP 算法与标准 BP 算法都很常用.一般来说,标准 BP 算法每次更新只针对单个样例,参数更新得非常频繁,而且对不同样例进行更新的效果可能出现“抵消”现象.因此,为了达到同样的累积误差极小点,标准 BP 算法往往需进行更多次数的法代.累积 BP 算法直接针对累积误差最小化,它在读取整个训练集 D 一遍后才对参数进行更新,其参数更新的频率低得多.但在很多任务中,累积误差下降到一定程度之后,进一步下降会非常缓慢,这时标准 BP 往往会更快获得较好的解,尤其是在训练集 D 非常大时更明显.