在本节中,我们将通过讲解反向传播算法中相关数学公式,使读者理解神经网络是如何通过学习高效获得权重的。每个人对数学表示方法的熟练程度不同,因此下面将要介绍的公式可能看起来会有些复杂。许多人喜欢自底向上的方法,通过公式的逐步讲解形成对算法的直观认识。不过,如果你喜欢自顶向下的方法,并且希望在不使用数学符号的情况下了解反向传播算法,建议读者先阅读下一节内容后再来学习本节内容。
在上一节中,我们学习了如何通过最后一层的激励以及目标类标之间的差异来计算代价。现在,我们将了解一下反向传播算法如何更新多层感知器模型的权重,_get_gradient方法已实现了该算法。回忆下本章开始时介绍的内容,我们首先需要通过正向传播来获得输出层的激励,可将其形式化为:
简单地说,我们只是按照下图所示,通过网络中的连接将输入向前传递:
在反向传播中,错误被从右至左传递。我们首先计算输出层的误差向量:
其中,y为真实类标的向量。
接下来,我们计算隐层的误差项:
请注意:星号(*)在此表示逐元素相乘。
虽然无需太过在意下面的公式,不过读者可能会好奇:激励函数的导数是如何得到的?在此逐步演示求导过程:
为了更好地理解δ(2)项的计算,我们对此进行更详细的讨论。在前面的公式中,我们将其与t×h维矩阵W(2)的转置(W(2))T相乘,t为输出类标的数量,而h为隐层单元的数量。现在,(W(2))T与t×1维向量δ(2)的乘积为h×t维矩阵。我们将(W(2))Tδ(3)与(a(2)*(1-a(2)))逐项相乘,结果也是一个t×1维的向量。最后,在得到δ后,我们可将代价函数的导数写作:
接下来,要计算偏导,我们需要将l层中的第j个节点的偏导与l+1层中第i个节点的误差进行累加:
请记住,我们需要计算训练集中每个样本的。因此,与前面实现多层感知器的代码类似,使用向量的表达方式会更容易一些:
在完成偏导的累加后,我们可以通过下列方式加入正则化项:
最终,在完成梯度的计算后,我们可以沿着梯度相反的方向更新权重了:
综上,我们通过下图对反向传播进行总结: