Back Propagation Neural Networks
Table of Contents
1. 反向传播算法和 BP 网络简介
“误差反向传播算法(Error Back Propagation)”的提出,使得多层感知器的模型中神经元的参数的计算变得简单可行。
误差反向传播算法简称反向传播算法(即 BP 算法)。反向传播算法于 1986 年由 David E. Rumelhart 和 James L. McClelland 发表于书籍 Parallel Distributed Processing 中。使用反向传播算法的多层感知器又称为 BP 神经网络 。
BP 算法是一个迭代算法,它的基本思想为:(1) 先计算每一层的状态和激活值,直到最后一层(即信号是前向传播的);(2) 计算每一层的误差,误差的计算过程是从最后一层向前推进的(这就是反向传播算法名字的由来);(3) 更新参数(目标是误差变小),迭代前面两个步骤,直到满足停止准则(比如相邻两次迭代的误差的差别很小)。
参考:Parallel Distributed Processing (1986, by David E. Rumelhart, James L. McClelland), Chapter 8 Learning Internal Representations by Error Propagation: http://psych.stanford.edu/~jlm/papers/PDP/Volume%201/Chap8_PDP86.pdf
本文的记号说明:
表示第 层神经元的个数; 表示神经元的激活函数; 表示第 层到第 层的权重矩阵; 是权重矩阵 中的元素,表示第 层第 个神经元到第 层第 个神经元的连接的权重(注意标号的顺序); 表示 层到第 层的偏置; 表示 层神经元的状态; 表示 层神经元的激活值(即输出值)。
关于记号的特别注意 :不同的文献所采用的记号可能不同,这将导致不同文献的公式结论可能不同。如 Andrew Ng的教程 中用
下面以三层感知器(即只含有一个隐藏层的多层感知器)为例介绍“反向传播算法(BP 算法)”。
三层感知器如图 1 所示。例子中,输入数据
Figure 1: 三层感知器实例
2. 信息前向传播
显然,图 1 所示神经网络的第 2 层神经元的状态及激活值可以通过下面的计算得到:
类似地,第 3 层神经元的状态及激活值可以通过下面的计算得到:
可总结出,第
对于
3. 误差反向传播
“信息前向传播”讲的是已知各个神经元的参数后,如何得到神经网络的输出。但怎么得到各个神经元的参数呢?“误差反向传播”算法解决的就是这个问题。
假设训练数据为
对某一个训练数据
说明 1:
说明 2:代价函数中的系数
说明 3:以图 1 所示神经网络为例,
显然,所有训练数据的总体(平均)代价可写为:
我们是目标就是调整权重和偏置使总体代价(误差)变小,求得总体代价取最小值时对应的各个神经元的参数(即权重和偏置)。
如果采用梯度下降法(这里其实是“批量梯度下降法”,除此外还可以采用“随机梯度下降法”),可以用下面公式更新参数
由上面公式知,只需求得每一个训练数据的代价函数
为简单起见,在下文的推导中,我们去掉
下面将介绍用“反向传播算法”求解单个训练数据误差对参数的偏导数
参考:
How the backpropagation algorithm works: http://neuralnetworksanddeeplearning.com/chap2.html
Backpropagation Algorithm: http://deeplearning.stanford.edu/wiki/index.php/Backpropagation_Algorithm
3.1. 输出层的权重参数更新
把
由求导的链式法则,对“输出层神经元的权重参数”求偏导,有:
如果我们把
则
其中:
对于输出层神经元的其它权重参数,同样可求得:
其中,
说明: 之所以要引入记号
推广到一般情况,假设神经网络共
如果把上面两式表达为矩阵(向量)形式,则为:
注:符号
向量式子
3.2. 隐藏层的权重参数更新
对“隐藏层神经元的权重参数”求偏导,利用
其中
上面式子中为什么有
上面的推导过程可以从图 2 中更清楚地展示出来。
Figure 2: 由
看一个简单的特例,如在图 1 所示神经网络中,有
由于
上式是 BP 算法最核心的公式。它利用
利用上面推导出来的隐藏层通用公式,对于图 1 所示神经网络,有:
通过把
上式中,
3.3. 输出层和隐藏层的偏置参数更新
对应的矩阵(向量)形式为:
3.4. BP 算法四个核心公式
前面已经完整地介绍了误差反向传播算法,可总结为下面四个公式:
这四个公式可以写成对应的矩阵(向量)形式:
或者表示为:
3.5. BP 算法计算某个训练数据的代价函数对参数的偏导数
BP 算法四个核心公式就是求某个训练数据的代价函数对参数的偏导数,它的具体应用步骤总结如下:
第一步,初始化参数
一般地,把
注意:不要把
第二步,利用下面的“前向传播”公式计算每层的状态和激活值:
第三步,计算
首先,利用下面公式计算输出层的
其中,
然后,利用下面公式从第
第四步,按下面公式求这个训练数据的代价函数对参数的偏导数:
工程实现中注意事项:
在前面传播的过程中,我们已经计算出了所有的
假设使用的激活函数为
3.5.1. 反向传播中偏导数计算实例
3.6. BP 算法总结:用“批量梯度下降”算法更新参数
“批量梯度下降”算法更新参数的总结如下:
(1) 用 BP 算法四个核心公式求得每一个训练数据的代价函数对参数的偏导数;
(2) 按下面公式更新参数:
(3) 迭代执行第(1),(2)步,直到满足停止准则(比如相邻两次迭代的误差的差别很小,或者直接限制迭代的次数)。
说明:每对参数进行一次更新都要遍历整个训练数据集,当训练数据集不大时这不是问题,当训练数据集非常巨大时,可以采用“随机梯度下降法”(每次仅使用一个训练数据来更新参数)。
4. 梯度消失问题及其解决办法
前面介绍过,误差反向传播有下面迭代公式:
其中用到了激活函数
如果我们使用
可以看到,它们的导数的值域都会小于 1。这样,误差经过每一层传递都会不断地衰减。 当网络导数比较多时,梯度不断地衰减,甚至消失,这使得整个网络很难训练。这就是梯度消失问题(Vanishing gradient problem)。
减轻梯度消失问题的一个方法是使用线性激活函数(比如 rectifier 函数)或近似线性函数(比如 softplus 函数)。这样,激活函数的导数为 1,误差可以很好地传播,训练速度会提高。
参考:
神经网络与深度学习讲义(邱锡鹏)