反向传播不是新算法,只是链式法则的记账方式
把计算图画出来,每个节点的局部导数乘上上游传来的梯度,就是全部。
上一篇写到 是一个投影方向。这一篇回答:几百万个参数,梯度怎么一次算完。
前向时存下中间量
设有两层:
前向传播算出 ,同时把 、、 留着。留着它们不是为了省一次计算,而是因为反向时每个局部导数都要用到这些值。
反向只是从右往左乘
我们想要 和 。先算最右边:
然后往前推一步。,所以对 的梯度是 乘上游:
注意这里出现的转置——它不是技巧,纯粹是形状对上了: 是 维, 是 ,只有乘 才能得到 维。
整个反向传播就是在做这件事,一路把 维梯度变成 维梯度。没有别的内容。
局部导数表
| 运算 | 前向 | 梯度怎么往回传 |
|---|---|---|
| 矩阵乘 | 一次乘法 | |
| 加法 | 相加 | 原样复制给两边 |
| 逐元素 | 逐元素 | 乘 |
| 求和 | 求和 | 广播回每个分量 |
这张表记住之后,看任何框架的自动微分文档都会变简单。所谓”框架帮你求导”,就是自动按这张表逐项往回传。
下一讲:动量法,以及为什么它能把扁平曲面上的震荡压掉。
相关
- 用线性代数看懂梯度下降
把梯度下降还原成"在曲面上找最低点"这件事,需要的数学其实只有投影和一点线性代数。