机器学习 - 反向传播算法(后向模式自动微分)
type
status
date
slug
summary
tags
category
icon
password
前面介绍了符号化求导,符号化求导不适合大规模表达式的求导(表达式爆炸问题,以及其他限制)。深度学习这种大规模“表达式”的求导中使用的其实是反向传播算法。
反向传播算法的原理
以函数 为例,对应的表达式结构是

首先是前向传播,给 分别赋值并计算各个节点的值(以分别为为例)

前向传播完成后各个节点的值就有了。然后开始后向传播。从终点开始计算每个节点对的梯度

- 对本身的梯度总是1
- 是这两个直接子节点的直接相加,所以对两个子节点的偏导数都是常数1
- 再从节点向他的两个子节点传播,节点对两个子节点和的梯度分别是2和1,分别乘以对节点的偏导数,就是对和的梯度了(链式求导法则)。

- 再从节点向他的两个子节点传播,也是同样的计算逻辑,对直接子节点的偏导乘以对当当前节点的偏导,就得到了f对两个直接子节点的偏导

- 此时貌似所有节点都有梯度值了,但其实节点计算了梯度值以后还没有向后传播,按照同样的逻辑继续向后传播,此时发现和节点上已经有梯度了。加上从节点传播过来的梯度,和就各有两个梯度了。

- 最终只需要将和节点上的梯度累加即可,这是链式求导法则决定的,换个角度理解,和各自有两条“通路”可以影响f,两条通路的影响累加就是最终对的影响

表达式图本质上是个有向无环图(DAG),实际计算梯度时会按照拓扑排序进行逐个求梯度的操作。可以确保每个节点的所有通路都被计算到
