反向传播(Backpropagation) 是训练神经网络的一种常见手段。在 神经网络基础 这一节里,我们提到,确定好每个神经节点的权重(weight)与偏差(bias)之后,就能通过前馈(feedforward)确定神经网络的输出,但这只是输出预测值。我们还需要根据预测值,来 反推 各个权重与偏差需要如何调整,以使得预测值和期望值误差更小。这就是反向传播所做的事情。
要弄明白反向传播是如何工作的,以一个具体例子计算是最简单直接的。假设现有一个 3 层的神经网络如下:
假设现有一样本,输入为 0.1、0.5,期望输出为 0.9、0.1。我们初始权重、初始偏差如图所示:
接下来我们通过这个样本的训练,来调整初始权重。
前馈
首先我们通过前馈来确定神经网络的输出,也就是预测值。回顾一下神经节点的输入输出,它的输入是上一层各个节点通过权重与偏差计算的结果,我们记为 z;它的输出是 z 经过 激活函数(activation functions)产生的输出,记为 a。通式如下:
其中,激活函数定义为
先不用过于纠结公式的各个字符的含义,暂时只需要知道计算方法即可。
带入得:
同理算出输出层:
这样我们完成了一次前馈的计算,得到了神经网络的两个预测值(output),但这和样本的期望值(target)有一定的误差。我们使用 平方误差函数(squared error function)计算误差 C,通式为:
带入值为:
也就是说,神经网络的预测值与实际值有 0.248076212 误差,我们的目标就是通过调节权重和偏差,让这个误差更小。
反向传播
反向传播实际上就是一个求导的过程。如果我们要知道如何通过改变 ,使得总误差能变小,这其实就是求总误差 C 对 求偏导。根据链式法则
这个公式的含义实际上就是 的改变能对 C 造成的影响,接下来分别求等式右边的三个部分。
首先因为
其中 与 无关,所以 C 对 求偏导为
接下来求 ,而
所以
又
所以带入可得
最后,我们再看 ,因为
所以
综上,
为了使误差更小,我们使用 减去这个数,这里引入一个较小的 学习速率(learning rate),用来控制梯度下降的速度,这里取 0.5,则:
另外,计算偏差也是一样的道理,以 b3 举例
而
所以
则
所以
同理,我们可以计算出新的 、、、、,再根据公式计算出新的 、、、、、。这样,我们就完成了一次反向传播。