【TF/Guide笔记】 07. Advanced autodiff
跳过了tensor slicing,感觉没啥值得记的。
这一章感觉更偏向ml的数学,和底层的关系不大,但是看了这个我才发现tf的autodiff有他天然的优势,就是可以算高阶导数。
正因为tape内部关于梯度计算的部分是独立在原始的计算图之外的,所以自然也可以把梯度这部分同样看作计算图,在它的基础上外挂一套tape,来实现对x的二阶导,而我们以前的那种data/diff的做法,在框架层面上限制了只能算出来一阶导。
依稀记得曾经在tf的白皮书上看到过一个有关延迟运行的说明,用户声明的计算图其实可以一直攒着,直到不得不运行的时候再跑起来,这样看来,在function体系下,也许在用户调用tape.gradient的时候框架并没有做真正的计算,他只是在计算图上不断的累加,直到后续的print才会真正运行起来。
延迟运行就解决了之前提过的autodiff的问题,也就是分开了两次运行和冗余的计算,看来认为自己能在某一点上超过tf还是有点天真了。
延迟运行这件事我们曾经考虑过,但是这个问题难在设计而不是实现,什么样的规则可以清晰明确的划分出是否需要运行计算图,总不能枚举吧,而且我们以前用的是mpi式的分布式结构,运行时间不够明确是一件很让人头疼的事。这个东西如果从设计理念上不理解的话,看代码就更不可能看的出来了。