Appearance
概念
在神经网络中,我们通常使用反向传播来求梯度,这需要求解微分。
使用计算机求解微分的方法有很多,如符号微分,首先将目标函数转换为closed-form表达式,再利用求导法则,对表达式自动计算,求解梯度。该方案计算结果精确,但是要求表达式为closed-form(限制了使用场景),且表达式较为复杂时,可能会产生表达式膨胀(Expression swell)的问题。
另一种典型的求微分方法如数值微分,通过差分逼近。该方法适用于各种情况,但是需要权衡截断误差(truncation error)和舍入误差(Rounding error),对高维度函数计算速度较慢。
自动微分不要求函数的表达式为closed-form,算法和符号微分相同精度,直接获得梯度结果而不得到导数表达式。
自动微分利用表达式追踪机制,记录每一次计算过程中的中间变量,再利用链式求导法则组合各部分中间变量,生成梯度结果。
自动微分有两个主要版本,Forward mode and Reverse mode
以下列的函数为例
接下来我们要求函数对
Forward Primal Trace如下
对于上述函数,自动微分方法分成 Forward mode 和 Reverse mode
Forward mode
Forward Tangent (Derivative) Trace如下
Reverse mode
定义与算法
这里我们首先定义
然后我们需要考虑Forward Primal Trace的树形图,利用如下性质,建立中间变量之间的依赖关系(有向图)
具体到本例中,有向图如下
我们得到如下计算式子,需要指出的是,以下是从下往上计算,也就是先有
详细流程
详细来说反向计算导数值时,顺序如下:
计算
对 的导数值,因为 ,所以 . 计算
对 的导数值,因为 在图上只有一个后续节点 ,并且 ,所以依据链式法则得到下式,并将结果写在 指向 的边上
- 计算
对 的导数值,因为 在图上只有一个后续节点 ,并且 。所以依据链式法则得到下式,并将结果写在 指向 的边上
- 计算
对 的导数值,因为 在图上只有一个后续节点 ,并且 ,所以依据链式法则得到下式,并将结果写在 指向 的边上
- 计算
对 的导数值,因为 在图上只有一个后续节点 ,并且 ,所以依据链式法则得到下式,并将结果写在 指向 的边上
接下来要计算
对 和 的导数值,因为 和 都是有两个后续节点,所以我们只能分开计算。 计算下式,并将结果写在
指向 的边上
- 计算下式,并将结果写在
指向 的边上
- 计算下式,并将结果写在
指向 的边上
- 计算下式,并将结果写在
指向 的边上
到日前为止,我们已经计算出来了所有步骤的偏导数的数值。现在需要计算
计算
从
·
·
因此,
从
·
·
因此,
Auto Diff 与 Jacobian
如果
其Jacobian矩阵如下
具体而言,我们有:
则每次Forward mode得到的将是Jacobian矩阵
每次Reverse mode得到的将是Jacobian矩阵
在实际的神经网络中,损失函数的输出为标量,但是参数矩阵很多。即如下形式
因此神经网络中通常选择Reverse mode.
相应的,如果输入维度小于输出维度,即Jacobian矩阵的行数大于列数,比如