1.4.2 使用链式法则实现反向传播

到目前为止,通过对权重进行少量更新计算出权重损失的梯度,然后计算出原有场景(权重不变时)的前馈损失与权重更新后前馈损失的差值。使用这种方式更新权重值的一个缺点是,当网络很大时,需要使用大量的计算来计算损失值(事实上要做两次计算,首先在权重值不变时计算损失值,然后在权重值少量更新时计算损失值)。这将导致需要更多的计算资源和计算时间。在这一节中,我们将学习使用链式法则计算梯度的方法。这种方法不需要我们通过手动计算损失值的方式获得与权重值相关的损失梯度。

在第一次迭代中(随机初始化权重),输出的预测值是1.235。

为得到理论公式,将权重、隐藏层值和隐藏层激活分别表示为wha,如图1-14所示。

图1-14

注意,在图1-14中,取了左图的每个分量值,并将其推广到右图中。

为了便于理解,这一节将介绍如何使用链式法则来计算仅关于w11的损失值的梯度。同样的方法可以推广到神经网络的所有权重和偏置项。我们鼓励你练习并将链式法则计算应用到剩下的权重和偏置项上。

本书的GitHub存储库Chapter01文件夹中的chain_rule.ipynb notebook包含了使用链式法则计算网络中所有关于权重参数和偏置项变化的梯度的方法。

此外,为了便于学习,我们这里只处理一个数据点,其中输入为{1,1},期望的输出为{0}。

假设正在使用w11计算损失值的梯度,可以通过图1-15理解所有在计算梯度时需要包含的中间分量(没有连接输出到w11的分量在图1-15中显示为灰色)。

图1-15

从图1-15中可以看到w11通过突出显示的路径——h11a11形成了损失值。

下面分别阐明如何获得h11a11

网络损失值计算公式如下:

预测输出值的计算公式如下:

隐藏层激活值(S型函数激活)的计算公式如下:

隐藏层值的计算公式如下:

h 11 =x 1 ×w 11 +x 2 ×w 21

现在已经写出了所有的计算公式,可以计算权重变化对损失值(C)变化的影响,具体计算公式如下:

这称为链式法则。它本质上是通过一系列的微分获得需要的微分。

注意,上述计算公式建立了一个关于链的偏微分方程,现在可以分别对四个组件进行偏微分,由此最终完成损失值关于权重值w11导数的计算。

上式中各个偏导数的计算方法如下:

❍ 损失值关于预测输出值的偏导数为

❍ 预测输出值关于隐藏层激活值a11的偏导数为

❍ 隐藏层激活值a11关于激活前隐藏层值h11的偏导数为

注意,上述等式中S型函数a的导数是(1va)。

❍ 激活前隐藏层值h11关于权重值w11的偏导数为

在此基础上,用上述计算结果替换相应的偏微分项,就可以算出损失值关于权重w11的梯度,具体计算公式如下:

从上述公式中可以看出,现在可以计算权重值的一个小变化(相对于权重的损失梯度)对损失值的影响,而不用再强行重新计算前向传播。

接下来,可以使用下列公式不断更新权重值:

更新后的权重=原始权重-学习率×损失关于权重的梯度

1)用链式法则确定梯度,然后更新权重;2)通过学习权重值小的变化对损失值的影响来实现权重值的更新。这两种方法获得的计算结果是相同的,见本书的GitHub存储库(https://tinyurl.com/mcvp-packt)Chapter01文件夹中的chain_rule.ipynb notebook。

在梯度下降中,依次执行权重更新过程(一次更新一个权重)。通过链式法则,可以找到一种替代方法来计算权重的变化对损失值的影响,从而为并行计算执行提供了可能性。

因为是跨所有层更新参数,所以参数更新的整个过程可以进行并行化计算。此外,考虑到现实场景中可能存在数百万个跨层参数,将这些参数分配到不同GPU内核上分别进行计算实现权重更新所花费的时间,显然比每次循环只计算一个权重实现更新所花费的时间少得多。

目前已经从直觉角度和利用链式法则的角度对反向传播有了很好的理解,在下一节中,我们将学习前向传播和反向传播如何通过协同工作获得最优权重值。