深度学习中正向传播和反向传播原理(基于pytorch)

477 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

1.反向传播的用处在哪?

之前我们普遍使用的是小批量随机梯度下降的优化算法来训练模型,我们只使用了模型的正向传播,即对输入计算模型输出,然后通过autograd模块来调用系统自动生成的backward函数计算梯度。而反向传播的使用就是利用其自动求梯度来大大简化深度学习模型训练算法的实现。

2.什么是正向传播?

正向传播是指对神经网络沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量(包括输出)。

image.png 这是正向传播的计算图,如图所示:

  1. W代表隐藏层的权重参数
  2. h代表隐藏层变量
  3. o代表输出层变量
  4. L代表单个数据样本的损失项
  5. s代表正则化项
  6. J代表给定数据样本的目标函数。

图中,左下角是输入,右上角是输出,其中方框代表变量,圆圈代表运算符。

3.什么是反向传播?

反向传播指的是计算神经网络参数梯度的方法。总的来说,反向传播依据微积分中的链式法则,沿着从输出层到输入层的顺序,依次计算并存储目标函数有关神经网络各层的中间变量以及参数的梯度。

反向传播的链式法则并不难,但过程过于复杂,仅做了解。

4.训练深度模型时该如何使用

在训练深度学习模型时,正向传播和反向传播之间相互依赖。

一方面,正向传播的计算可能依赖于模型参数的当前值,而这些模型参数是在反向传播的梯度计算后通过优化算法迭代的。例如,计算正则化项的当前值,而这些当前值是优化算法最近一次根据反向传播算出梯度后迭代得到的。

另一方面,反向传播的梯度计算可能依赖于各变量的当前值,而这些变量的当前值是通过正向传播计算得到的。举例来说,参数梯度的计算需要依赖隐藏层变量的当前值。这个当前值是通过从输入层到输出层的正向传播计算并存储得到的。

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

5.总结

  1. 正向传播沿着从输入层到输出层的顺序,依次计算并存储神经网络的中间变量。
  2. 反向传播沿着从输出层到输入层的顺序,依次计算并存储神经网络中间变量和参数的梯度。