Fork me on GitHub

机器学习西瓜书——神经网络中的误差逆传播算法(BP算法)

神经网络

神经网络(neural networks)由神经元(neuron)组成,神经元是一种具有多输入、单输出的模型,该模型的结构可以用下图表示:

其中,x1~xn为神经元的多个输入,w1~wn为各个输入的权重(weight)。可以看到最下面有个值为1的输入,其权重为θ,实际上θ是该神经元的阈值(threshold)。SUM为所有输入和偏置的加权和,公式为:

最后通过sum到输出y的一个映射f得到神经元输出,f称为神经元的激活函数(activation function),公式为:

img

我们都知道神经网络由神经元组成下面三层神经网络的结构:

第一层神经元称为输入层(input layer),最后一层称为输出层(output layer),中间层统称为隐含层(hidden layer)。当隐含层不止一层时,便形成了深层前馈神经网络:

图源:西瓜书

为了训练多层网络,我们需要调整整个神经网络的权重、阈值,梯度下降算法可以达到这个目的。

梯度下降方法

通过调整神经网络中的参数,最终训练出最佳模型,达到学习的目的。我们可以假设一个代价函数(costing function)反映当前模型对于理想模型的误差,通过不断减少代价函数,从而无限接近理想模型。

其中a为理想输出值,也称为神经元的带权输入,函数C我们称为二次代价函数。假设代价函数的空间图形如下:

图源:Wikipedia

我们可以通过将代价函数C对所有权重w、阈值θ求偏导,得到代价函数在当前点的梯度,然后将w、θ按梯度反方向调整,从而降低代价函数的值,则得到一个比前一个更加接近理想的神经网络模型。

那么问题来了,如果每调整一次权重后,都需要重新求得代价函数C对权重w、阈值θ的偏导,如果按照求导定义来算:

假设有1000000个权重与阈值,现在统称权重与阈值为参数,对每个参数需要计算一次ΔC,共1000000次,即1000000次向前传播然后需要求一次C,共1000001次。然而有一种十分快速的方法,只需要两次传播就可以得到所有偏导,那就是可以说是神经网络基石的反向传播算法。

反向传播算法(BP算法)

首先我们进行一次向前传播得到了整个网络神经元的带权输入和输出,然后,我们来从神经网络的输出层入手,尝试找到一些进展。

记β为b层到y层的带权输入即上面说的SUM,bh为b层第h个神经元的输出,ŷ为y层神经元的输出。

可以很容易地推出,b层第h个神经元到y层第j个神经元的权重whj的偏导:

根据二次代价函数求偏导,我们把这部分看作一个整体:

并且β对权重whj的偏导很容易得到:

我们便可以首先得到代价函数对于倒数第二层权重的偏导了:

类似我们可以得到:

其中eh为:

α为x层的带权输入。

所以,BP算法只需要一次向前传播和一次向后传播,就可以得到整个神经网络中代价函数对于所有参数的偏导,它使得在当前硬件条件下对深度神经网络进行训练成为了可能,非常重要!

BJTU-HXS wechat
海内存知己,天涯若比邻。