Python人工智能
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 反向传播

在反向传播方法中,采用梯度下降学习方法训练神经网络,其中混合权重向量W经过多次迭代更新,公式为

式中,η是学习率,分别是第t+1和第t次迭代时的权重向量;为损失函数(Cost Function)或残差函数(Error Function)针对权值矩阵W在第t次迭代时的梯度。权重或偏置的算法可表示为

通过公式可看到,梯度下降学习方法的核心依赖针对每个权值对损失函数或残差函数的梯度计算。

由微分链式法则可知,如果,那么下面的公式成立。

这个公式可以扩展用于任意个数的变量。现在,来看一个非常简单的神经网络来理解反向传播算法,反向传播网络如图3-13所示。

图3-13 反向传播网络

假设网络的输入是一个二维向量,对应的标记输出和预测输出分别为y。同时,假设这个神经网络中的所有激活函数都是Sigmoid。设连接第l-1层的第i个单元和第l层的第j个单元的权值为,第l层的第i个单元的偏置为。下面推导一个数据点的梯度;总梯度可以对训练(或者一个小批量)中使用的所有数据点求和得到。如果输出值是连续的,那么损失函数C可以选择使用预测误差的平方表示。

神经网络中的权值和偏置(累积表示为向量W)可以通过最小化损失函数得到。

为了通过梯度下降迭代得到最小化损失函数,需要计算损失函数相对于每个权值wW的梯度。

现在有了所需的一切,下面来计算损失函数C相对于权重的梯度。根据微分的链式法则,得到

我们来看一下这个公式:

由前面的公式可以发现,导数仅仅是预测的误差。在通常情况下,对于回归问题,输出单元的激活函数是线性的,因此下面的等式成立:

因此,如果要计算损失函数相对于总输入的梯度,它会是。这依然等价于输出的预测误差。输出单元的总输入作为输入的权值和激活函数,可以表示为

这意味着,和损失函数对权重的导数通过以下公式作为输出层的输入。

可以看出,在计算损失函数相对于最终输出层上一层权重的导数过程中,误差被反向传播。当计算损失函数相对于泛化权重的梯度的时候,这一过程将会更加明显。当使用j=1和k=2的权值时,损失函数C相对于这个权值的梯度为

现在,,这意味着

因此,如果计算出损失函数相对于神经元总输入的梯度为,则可以通过简单乘以该权重关联的激活函数z来得到影响总输入s的任意权重w的梯度。

损失函数相对于总输入的梯度可通过链式法则推导如下:

由于神经网络中的所有单元(除了输出单元)都是Sigmoid激活函数,因此下面的公式成立:

结合以上公式,可得

在推导的梯度公式中可以看出,预测的误差与对应的激活函数和权值组合,以计算每一层权值的梯度被反向传播。这就是反向传播算法名称的由来。

【例3-6】 利用Python实现反向传播神经网络。

运行程序,输出如下: