前面几节里我们使用了小批量随机梯度下降的优化算法来训练模型。在实现中,我们只提供了模型的正向传播(forward propagation)的计算,即对输入计算模型输出,然后通过autograd模块来调用系统自动生成的backward函数计算梯度。基于反向传播(back-propagation)算法的自动求梯度极大简化了深度学习模型训练算法的实现。本节我们将使用数学和计算图(computational graph)两个方式来描述正向传播和反向传播。具体来说,我们将以带3.14 正向传播、反向传播和计算图 - 图1范数正则化的含单隐藏层的多层感知机为样例模型解释正向传播和反向传播。

3.14.1 正向传播

正向传播是指对神经网络沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量(包括输出)。为简单起见,假设输入是一个特征为3.14 正向传播、反向传播和计算图 - 图2的样本,且不考虑偏差项,那么中间变量

3.14 正向传播、反向传播和计算图 - 图3%7D%20%5Cboldsymbol%7Bx%7D%2C%0A#card=math&code=%5Cboldsymbol%7Bz%7D%20%3D%20%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D%20%5Cboldsymbol%7Bx%7D%2C%0A)

其中3.14 正向传播、反向传播和计算图 - 图4%7D%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bh%20%5Ctimes%20d%7D#card=math&code=%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bh%20%5Ctimes%20d%7D)是隐藏层的权重参数。把中间变量3.14 正向传播、反向传播和计算图 - 图5输入按元素运算的激活函数3.14 正向传播、反向传播和计算图 - 图6后,将得到向量长度为3.14 正向传播、反向传播和计算图 - 图7的隐藏层变量

3.14 正向传播、反向传播和计算图 - 图8.%0A#card=math&code=%5Cboldsymbol%7Bh%7D%20%3D%20%5Cphi%20%28%5Cboldsymbol%7Bz%7D%29.%0A)

隐藏层变量3.14 正向传播、反向传播和计算图 - 图9也是一个中间变量。假设输出层参数只有权重3.14 正向传播、反向传播和计算图 - 图10%7D%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bq%20%5Ctimes%20h%7D#card=math&code=%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bq%20%5Ctimes%20h%7D),可以得到向量长度为3.14 正向传播、反向传播和计算图 - 图11的输出层变量

3.14 正向传播、反向传播和计算图 - 图12%7D%20%5Cboldsymbol%7Bh%7D.%0A#card=math&code=%5Cboldsymbol%7Bo%7D%20%3D%20%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D%20%5Cboldsymbol%7Bh%7D.%0A)

假设损失函数为3.14 正向传播、反向传播和计算图 - 图13,且样本标签为3.14 正向传播、反向传播和计算图 - 图14,可以计算出单个数据样本的损失项

3.14 正向传播、反向传播和计算图 - 图15.%0A#card=math&code=L%20%3D%20%5Cell%28%5Cboldsymbol%7Bo%7D%2C%20y%29.%0A)

根据3.14 正向传播、反向传播和计算图 - 图16范数正则化的定义,给定超参数3.14 正向传播、反向传播和计算图 - 图17,正则化项即

3.14 正向传播、反向传播和计算图 - 图18%7D%5C%7C_F%5E2%20%2B%20%5C%7C%5Cboldsymbol%7BW%7D%5E%7B(2)%7D%5C%7C_F%5E2%5Cright)%2C%0A#card=math&code=s%20%3D%20%5Cfrac%7B%5Clambda%7D%7B2%7D%20%5Cleft%28%5C%7C%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D%5C%7C_F%5E2%20%2B%20%5C%7C%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D%5C%7C_F%5E2%5Cright%29%2C%0A)

其中矩阵的Frobenius范数等价于将矩阵变平为向量后计算3.14 正向传播、反向传播和计算图 - 图19范数。最终,模型在给定的数据样本上带正则化的损失为

3.14 正向传播、反向传播和计算图 - 图20

我们将3.14 正向传播、反向传播和计算图 - 图21称为有关给定数据样本的目标函数,并在以下的讨论中简称目标函数。

3.14.2 正向传播的计算图

我们通常绘制计算图来可视化运算符和变量在计算中的依赖关系。图3.6绘制了本节中样例模型正向传播的计算图,其中左下角是输入,右上角是输出。可以看到,图中箭头方向大多是向右和向上,其中方框代表变量,圆圈代表运算符,箭头表示从输入到输出之间的依赖关系。

3.14_forward.svg

3.14.3 反向传播

反向传播指的是计算神经网络参数梯度的方法。总的来说,反向传播依据微积分中的链式法则,沿着从输出层到输入层的顺序,依次计算并存储目标函数有关神经网络各层的中间变量以及参数的梯度。对输入或输出3.14 正向传播、反向传播和计算图 - 图23为任意形状张量的函数3.14 正向传播、反向传播和计算图 - 图24#card=math&code=%5Cmathsf%7BY%7D%3Df%28%5Cmathsf%7BX%7D%29)和3.14 正向传播、反向传播和计算图 - 图25#card=math&code=%5Cmathsf%7BZ%7D%3Dg%28%5Cmathsf%7BY%7D%29),通过链式法则,我们有

3.14 正向传播、反向传播和计算图 - 图26%2C%0A#card=math&code=%5Cfrac%7B%5Cpartial%20%5Cmathsf%7BZ%7D%7D%7B%5Cpartial%20%5Cmathsf%7BX%7D%7D%20%3D%20%5Ctext%7Bprod%7D%5Cleft%28%5Cfrac%7B%5Cpartial%20%5Cmathsf%7BZ%7D%7D%7B%5Cpartial%20%5Cmathsf%7BY%7D%7D%2C%20%5Cfrac%7B%5Cpartial%20%5Cmathsf%7BY%7D%7D%7B%5Cpartial%20%5Cmathsf%7BX%7D%7D%5Cright%29%2C%0A)

其中3.14 正向传播、反向传播和计算图 - 图27运算符将根据两个输入的形状,在必要的操作(如转置和互换输入位置)后对两个输入做乘法。

回顾一下本节中样例模型,它的参数是3.14 正向传播、反向传播和计算图 - 图28%7D#card=math&code=%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D)和3.14 正向传播、反向传播和计算图 - 图29%7D#card=math&code=%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D),因此反向传播的目标是计算3.14 正向传播、反向传播和计算图 - 图30%7D#card=math&code=%5Cpartial%20J%2F%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D)和3.14 正向传播、反向传播和计算图 - 图31%7D#card=math&code=%5Cpartial%20J%2F%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D)。我们将应用链式法则依次计算各中间变量和参数的梯度,其计算次序与前向传播中相应中间变量的计算次序恰恰相反。首先,分别计算目标函数3.14 正向传播、反向传播和计算图 - 图32有关损失项3.14 正向传播、反向传播和计算图 - 图33和正则项3.14 正向传播、反向传播和计算图 - 图34的梯度

3.14 正向传播、反向传播和计算图 - 图35

其次,依据链式法则计算目标函数有关输出层变量的梯度3.14 正向传播、反向传播和计算图 - 图36

3.14 正向传播、反向传播和计算图 - 图37%0A%3D%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D.%0A#card=math&code=%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D%0A%3D%20%5Ctext%7Bprod%7D%5Cleft%28%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20L%7D%2C%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D%5Cright%29%0A%3D%20%5Cfrac%7B%5Cpartial%20L%7D%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D.%0A)

接下来,计算正则项有关两个参数的梯度:

3.14 正向传播、反向传播和计算图 - 图38%7D%7D%20%3D%20%5Clambda%20%5Cboldsymbol%7BW%7D%5E%7B(1)%7D%2C%5Cquad%5Cfrac%7B%5Cpartial%20s%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B(2)%7D%7D%20%3D%20%5Clambda%20%5Cboldsymbol%7BW%7D%5E%7B(2)%7D.%0A#card=math&code=%5Cfrac%7B%5Cpartial%20s%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D%7D%20%3D%20%5Clambda%20%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D%2C%5Cquad%5Cfrac%7B%5Cpartial%20s%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D%7D%20%3D%20%5Clambda%20%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D.%0A)

现在,我们可以计算最靠近输出层的模型参数的梯度3.14 正向传播、反向传播和计算图 - 图39%7D%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bq%20%5Ctimes%20h%7D#card=math&code=%5Cpartial%20J%2F%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bq%20%5Ctimes%20h%7D)。依据链式法则,得到

3.14 正向传播、反向传播和计算图 - 图40%7D%7D%0A%3D%20%5Ctext%7Bprod%7D%5Cleft(%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D%2C%20%5Cfrac%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B(2)%7D%7D%5Cright)%20%2B%20%5Ctext%7Bprod%7D%5Cleft(%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20s%7D%2C%20%5Cfrac%7B%5Cpartial%20s%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B(2)%7D%7D%5Cright)%0A%3D%20%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D%20%5Cboldsymbol%7Bh%7D%5E%5Ctop%20%2B%20%5Clambda%20%5Cboldsymbol%7BW%7D%5E%7B(2)%7D.%0A#card=math&code=%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D%7D%0A%3D%20%5Ctext%7Bprod%7D%5Cleft%28%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D%2C%20%5Cfrac%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D%7D%5Cright%29%20%2B%20%5Ctext%7Bprod%7D%5Cleft%28%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20s%7D%2C%20%5Cfrac%7B%5Cpartial%20s%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D%7D%5Cright%29%0A%3D%20%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D%20%5Cboldsymbol%7Bh%7D%5E%5Ctop%20%2B%20%5Clambda%20%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D.%0A)

沿着输出层向隐藏层继续反向传播,隐藏层变量的梯度3.14 正向传播、反向传播和计算图 - 图41可以这样计算:

3.14 正向传播、反向传播和计算图 - 图42%0A%3D%20%7B%5Cboldsymbol%7BW%7D%5E%7B(2)%7D%7D%5E%5Ctop%20%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D.%0A#card=math&code=%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bh%7D%7D%0A%3D%20%5Ctext%7Bprod%7D%5Cleft%28%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D%2C%20%5Cfrac%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D%7B%5Cpartial%20%5Cboldsymbol%7Bh%7D%7D%5Cright%29%0A%3D%20%7B%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D%7D%5E%5Ctop%20%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bo%7D%7D.%0A)

由于激活函数3.14 正向传播、反向传播和计算图 - 图43是按元素运算的,中间变量3.14 正向传播、反向传播和计算图 - 图44的梯度3.14 正向传播、反向传播和计算图 - 图45的计算需要使用按元素乘法符3.14 正向传播、反向传播和计算图 - 图46

3.14 正向传播、反向传播和计算图 - 图47%0A%3D%20%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bh%7D%7D%20%5Codot%20%5Cphi’%5Cleft(%5Cboldsymbol%7Bz%7D%5Cright).%0A#card=math&code=%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bz%7D%7D%0A%3D%20%5Ctext%7Bprod%7D%5Cleft%28%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bh%7D%7D%2C%20%5Cfrac%7B%5Cpartial%20%5Cboldsymbol%7Bh%7D%7D%7B%5Cpartial%20%5Cboldsymbol%7Bz%7D%7D%5Cright%29%0A%3D%20%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bh%7D%7D%20%5Codot%20%5Cphi%27%5Cleft%28%5Cboldsymbol%7Bz%7D%5Cright%29.%0A)

最终,我们可以得到最靠近输入层的模型参数的梯度3.14 正向传播、反向传播和计算图 - 图48%7D%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bh%20%5Ctimes%20d%7D#card=math&code=%5Cpartial%20J%2F%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D%20%5Cin%20%5Cmathbb%7BR%7D%5E%7Bh%20%5Ctimes%20d%7D)。依据链式法则,得到

3.14 正向传播、反向传播和计算图 - 图49%7D%7D%0A%3D%20%5Ctext%7Bprod%7D%5Cleft(%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bz%7D%7D%2C%20%5Cfrac%7B%5Cpartial%20%5Cboldsymbol%7Bz%7D%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B(1)%7D%7D%5Cright)%20%2B%20%5Ctext%7Bprod%7D%5Cleft(%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20s%7D%2C%20%5Cfrac%7B%5Cpartial%20s%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B(1)%7D%7D%5Cright)%0A%3D%20%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bz%7D%7D%20%5Cboldsymbol%7Bx%7D%5E%5Ctop%20%2B%20%5Clambda%20%5Cboldsymbol%7BW%7D%5E%7B(1)%7D.%0A#card=math&code=%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D%7D%0A%3D%20%5Ctext%7Bprod%7D%5Cleft%28%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bz%7D%7D%2C%20%5Cfrac%7B%5Cpartial%20%5Cboldsymbol%7Bz%7D%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D%7D%5Cright%29%20%2B%20%5Ctext%7Bprod%7D%5Cleft%28%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20s%7D%2C%20%5Cfrac%7B%5Cpartial%20s%7D%7B%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D%7D%5Cright%29%0A%3D%20%5Cfrac%7B%5Cpartial%20J%7D%7B%5Cpartial%20%5Cboldsymbol%7Bz%7D%7D%20%5Cboldsymbol%7Bx%7D%5E%5Ctop%20%2B%20%5Clambda%20%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D.%0A)

3.14.4 训练深度学习模型

在训练深度学习模型时,正向传播和反向传播之间相互依赖。下面我们仍然以本节中的样例模型分别阐述它们之间的依赖关系。

一方面,正向传播的计算可能依赖于模型参数的当前值,而这些模型参数是在反向传播的梯度计算后通过优化算法迭代的。例如,计算正则化项3.14 正向传播、反向传播和计算图 - 图50%20%5Cleft(%5C%7C%5Cboldsymbol%7BW%7D%5E%7B(1)%7D%5C%7C_F%5E2%20%2B%20%5C%7C%5Cboldsymbol%7BW%7D%5E%7B(2)%7D%5C%7C_F%5E2%5Cright)#card=math&code=s%20%3D%20%28%5Clambda%2F2%29%20%5Cleft%28%5C%7C%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D%5C%7C_F%5E2%20%2B%20%5C%7C%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D%5C%7C_F%5E2%5Cright%29)依赖模型参数3.14 正向传播、反向传播和计算图 - 图51%7D#card=math&code=%5Cboldsymbol%7BW%7D%5E%7B%281%29%7D)和3.14 正向传播、反向传播和计算图 - 图52%7D#card=math&code=%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D)的当前值,而这些当前值是优化算法最近一次根据反向传播算出梯度后迭代得到的。

另一方面,反向传播的梯度计算可能依赖于各变量的当前值,而这些变量的当前值是通过正向传播计算得到的。举例来说,参数梯度3.14 正向传播、反向传播和计算图 - 图53%7D%20%3D%20(%5Cpartial%20J%20%2F%20%5Cpartial%20%5Cboldsymbol%7Bo%7D)%20%5Cboldsymbol%7Bh%7D%5E%5Ctop%20%2B%20%5Clambda%20%5Cboldsymbol%7BW%7D%5E%7B(2)%7D#card=math&code=%5Cpartial%20J%2F%5Cpartial%20%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D%20%3D%20%28%5Cpartial%20J%20%2F%20%5Cpartial%20%5Cboldsymbol%7Bo%7D%29%20%5Cboldsymbol%7Bh%7D%5E%5Ctop%20%2B%20%5Clambda%20%5Cboldsymbol%7BW%7D%5E%7B%282%29%7D)的计算需要依赖隐藏层变量的当前值3.14 正向传播、反向传播和计算图 - 图54。这个当前值是通过从输入层到输出层的正向传播计算并存储得到的。

因此,在模型参数初始化完成后,我们交替地进行正向传播和反向传播,并根据反向传播计算的梯度迭代模型参数。既然我们在反向传播中使用了正向传播中计算得到的中间变量来避免重复计算,那么这个复用也导致正向传播结束后不能立即释放中间变量内存。这也是训练要比预测占用更多内存的一个重要原因。另外需要指出的是,这些中间变量的个数大体上与网络层数线性相关,每个变量的大小跟批量大小和输入个数也是线性相关的,它们是导致较深的神经网络使用较大批量训练时更容易超内存的主要原因。

小结

  • 正向传播沿着从输入层到输出层的顺序,依次计算并存储神经网络的中间变量。
  • 反向传播沿着从输出层到输入层的顺序,依次计算并存储神经网络中间变量和参数的梯度。
  • 在训练深度学习模型时,正向传播和反向传播相互依赖。

注:本节与原书基本相同,原书传送门