这一章主要是讲了反向模式的自动微分
数值计算和符号推导
使用公式直接计算偏导的微分方式容易出现数值错误,以及效率太低,通常是用来作为检验方法(也就是采用具体数值来求出对应位置的微分,like this:
或者这种:
采用符号推导的方式浪费算力,也就是我们常用的数学推导方式,比如链式法则之类的:
如果遇到连乘,计算所有偏导的开销是
因此进一步提出了计算图:
前向自动微分
首先介绍了前向模式的自动微分。同上图,记
然后向前一步一步计算
但是这只是针对
反向自动微分
同样的计算图:
记
按照完全相反的拓扑顺序来计算各个节点的
针对多路情况的求导,也就是说一个输入作为了多个输入,如下图
可以得到:
这里把
可以解释为计算图中每个节点的伴随等于它所有与下一个节点邻接边的部分伴随之和。因此只需要计算所有的部分伴随,要求伴随的时候给他们求和就好。
伪代码表示如下:
具体实现过程可参考CMU-深度学习系统-第五章&hw1 | Shuyu Zhang’s Blog
通过扩展计算图的反向自动微分
按照上面的伪代码过程,针对这个计算图:
首先是对
这个id实际上就是一个占位符,不太重要。进一步计算
进一步考虑
但如果是传统的反向自动微分,计算图是这样的:
传统的反向自动微分是第一代深度学习框架使用的方法,如caffe, cuda-convnet;现代的深度学习框架使用扩展的计算图。这样的计算图有利于进一步计算二阶偏导,也更有利于优化
针对tensor的反向模式的自动求导也是一样的。对于计算图:
定义
最后说的这个在数据结构上的反向自动微分我没看懂?我理解大概是讲的如果正向的时候是对数据结构里面的某个元素进行传递,反向依然是针对同一个元素?