反向传播算法(Backpropagation Algorithm,简称BP算法)是深度学习的重要思想基础,本文将介绍该算法的原理。
上图是一个简单的神经网络,我们用它来实现二分类。我们给它一个输入样本(, ),通过前向运算得到输出 ,输出值的值域为[0,1],例如的值越接近0,代表该样本是"0"类的可能性越大,反之是"1"类的可能性大。
一、首先我们来看看前向传播的过程:
输入的样本为:
1、第一层隐藏层:
第一层有三个神经元,,。该层的输入为: ,故此可得:
假设第一层的激活函数为f(x)(上图中的激活函数都标了一个下标,一般情况下,同一层的激活函数都一样,不同层可以选择不同的激活函数),那么第一层的输出为:,,。
2、第二层隐藏层:
第二层有两个神经元,。该层的输入为: ,即第二层的输入是第一层的输出乘以第二层的权重,再加上第二层的偏置,所以第二层两个神经元的输入为:
所以第二层的输出为:和。
3、输出层:
输出层只有一个神经元。该层的输入为: 即:。
因为该网络要解决一个二分类的问题,所以输出层的激活函数也可以使用一个sigmoid型函数,神经网络最后的输出为:。
二、反向传播的过程
上面我们已经知道了数据沿着神经网络前向传播的过程,现在我们来看看反向传播的过程。反向传播算法会对特定样本的预测输出和理想输出进行比较,然后确定网络的每个权重的更新幅度。假设我们使用随机梯度下降的方式来学习神经网络的参数,损失函数定义为,其中y是该样本的真实列表。使用梯度下降进行参数学习,我们需要计算出损失函数关于神经网络中各层参数(权重w和偏置b)的偏导数。
假设我们要对第k层隐藏层的参数和求偏导数,即求和。
假设代表第k层神经元的输入,即,其中为前一层神经元的输出,根据链式法则有: 。
因此,我们只需要分别计算偏导数,和。
1、计算偏导数和
上式中,代表第k层神经元的权重矩阵的第m行,代表第k层神经元的权重矩阵的第m行中的第n列。
偏置b是一个常数项,因此偏导数的计算也很简单:
得到计算结果是单位矩阵。
2、计算偏导数
偏到数又称为误差项(也称“灵敏度”),一般用表示,例如是第一层神经元的误差项,其值的大小代表了第一层神经元对于最终总误差的影响大小。
根据前向计算,我们知道第k+1层的输入与第k层输出的关系为:
又因为,根据链式法则,我们可以得到为:
由上式我们可以知道,第k层神经元的误差项是由第k+1层的误差项乘以第k+1层的权重,再乘以第k层激活函数的导数(梯度)得到的。这就是误差的反向传播。
到这里,我们可以分别计算出损失函数关于权重和偏置的偏导数了:
有了上面两个偏导数,我们就能够利用随机梯度下降算法来更新参数。
这里有google教程里面讲的BP算法的推算过程:https://google-developers.appspot.com/machine-learning/crash-course/backprop-scroll/?hl=zh-cn。