BackPropagate 反向传播
这一节请参考 Backpropagate
反向传播可以计算一次运算的导数,再加上链式法则,就可以计算两个连续运算的导数,以至于任意一系列运算的导数。
可以发现我们的计算图是一个有向无环图,这意味着我们可以使用拓扑排序来依次计算每个节点
反向传播应该运行以下算法:
- 调用拓扑排序以获取一个有序队列
- 创建一个标量和当前导数的字典
- 对于倒序的每个节点,从队列中取出一个完成的标量和导数:
a. 如果标量是叶节点,添加其最终导数(累积导数)并循环到(1)
b. 如果标量不是叶节点,1)在最后一个函数上调用 .chain_rule,带入
dout
2)遍历链式法则产生的所有标量+导数 3)在字典中为标量累积导数
最后注意:只有叶标量应该有非 None 的 .derivative
值。所有中间标量应该只在字典中保持他们当前的导数值。这有点烦人,但它遵循了 PyTorch 的行为。