《动手学深度学习pytorch》部分学习笔记,仅用作自己复习。
正向传播、反向传播和计算图
在实现中,只提供模型正向传播(forward propagation)的计算,即对输⼊计算模型输出,然后通过 autograd 模块来调⽤用系统自动生成的 backward 函数计算梯度。
基于反向传播(back-propagation)算法的⾃动求梯度极大简化了深度学习模型训练算法的实现。本节我们将使⽤数学和计算图(computational graph)两个方式来描述正向传播和反向传播。具体来说,我们将以带L2 范数正则化的含单隐藏层的多层感知机为样例模型解释正向传播和反向传播。
正向传播
正向传播是指对神经网络沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量(包括输出)。
正向传播的计算图
我们通常绘制计算图来可视化运算符和变量在计算中的依赖关系。下图绘制了本节中样例模型正向传播的计算图,其中左下⻆角是输⼊,右上⻆是输出。可以看到,图中箭头方向⼤多是向右和向上,其中⽅框代表变量,圆圈代表运算符,箭头表示从输⼊到输出之间的依赖关系。
反向传播
反向传播指的是计算神经网络参数梯度的方法。总的来说,反向传播依据微积分中的链式法则,沿着从输出层到输⼊层的顺序,依次计算并存储目标函数有关神经网络各层的中间变量以及参数的梯度。对输⼊或输出 x y z为任意形状张量的函数 Y=f(x)和 z=g(y),通过链式法则,我们有
训练深度学习模型
在训练深度学习模型时,正向传播和反向传播之间相互依赖。
因此,在模型参数初始化完成后,我们交替地进⾏正向传播和反向传播,并根据反向传播计算的梯度迭代模型参数。既然我们在反向传播中使⽤了正向传播中计算得到的中间变量来避免重复计算,那么这个复用也导致正向传播结束后不能⽴即释放中间变量量内存。这也是训练要比预测占⽤更多内存的一个重要原因。另外需要指出的是,这些中间变量量的个数大体上与⽹络层数线性相关,每个变量的⼤小跟批量大小和输入个数也是线性相关的,它们是导致较深的神经网络使用较大批量训练时更容易超内存的主要原因。
小结
- 正向传播沿着从输⼊层到输出层的顺序,依次计算并存储神经网络的中间变量。
- 反向传播沿着从输出层到输⼊层的顺序,依次计算并存储神经网络中间变量和参数的梯度。
- 在训练深度学习模型时,正向传播和反向传播相互依赖。