一、链式法则
反向传播算法是一种利用链式法则计算微分的算法。
在一维的情况下,链式法则为: 。
在多维情况下,设: , 为 到 的映射且满足 , 为 到 的映射且满足 。则有:
使用向量记法,可以等价地写作:
其中: 为 的 阶雅可比矩阵, 为 对 的梯度, 为 对 的梯度:
反向传播算法由很多这样的雅可比矩阵与梯度的乘积操作组成。
1.1 张量链式法则
链式法则不仅可以作用于向量,也可以应用于张量:
- 首先将张量展平为一维向量。
- 然后计算该向量的梯度。
- 然后将该梯度重新构造为张量。
记 为 对张量 的梯度。 现在有多个索引(如:二维张量有两个索引),可以使用单个变量 来表示 的索引元组(如 表示:一个二维张量的索引,每个维度三个元素)。
这就与向量中的索引方式完全一致: 。
如:
则有:
设 ,用单个变量 来表示 的索引元组。则张量的链式法则为:
如:
则有:
.
1.2 重复子表达式
给定计算图以及计算图中的某个标量 ,根据链式法则可以很容易地写出 对于产生 的任意节点的梯度的数学表达式。
但是在计算该表达式的时候,许多子表达式可能在计算整个梯度表达式的过程中重复很多次。
如图中:
可以看到 被计算多次。
在复杂的计算图中,可能存在指数量级的重复子表达式,这使得原始的链式法则几乎不可实现。
一个解决方案是:计算 一次并将它存储在 中,然后采用 来计算梯度。
这也是反向传播算法采用的方案:在前向传播时,将节点的中间计算结果全部存储在当前节点上。其代价是更高的内存开销。
有时候必须重复计算子表达式。这是以较高的运行时间为代价,来换取较少的内存开销。