自动分化何时便宜?


12

自动微分使我们能够对特定输入上的程序的派生进行数值评估。有一个定理,这种计算的成本不到运行原始程序的成本的五倍。这个五分之一是一个上限。

在什么情况下可以进一步降低成本?许多现场派生代码以接近原始程序的速度运行。如何获得这种加速?

可以利用原始程序的哪些特征来加快计算速度?

可以采用哪些软件工程技巧来加快计算速度?


1
当然,人们想利用函数的导数的特殊属性,例如指数函数和三角函数。那里有很多潜在的常见子表达式。
JM

您是在询问反向模式还是正向模式?
杰德·布朗

我的(有限的)理解是正向和反向模式的成本大致相似。
MRocklin

Answers:


6

我对AD的有限理解与Matt所说的相似。为了加快导数的计算,表达式图的结构必须利用Jacobian矩阵集中的稀疏性和稀缺性。(有关更多的了解,请参阅Griewank的本文。)软件工程上的技巧很可能是在AD代码本身中,以重新构造表达式图,以利用Jacobian矩阵集中的这些属性。知道AD代码如何从您正在编写的代码中生成表达式图,反过来可以帮助您更好地了解如何编写需要较少计算量的代码。任何好的AD代码都应该已经利用了带有公共子表达式的内在函数,但是好的AD代码却很难编写。

该领域的标准参考是《评估微分:算法微分的原理和技术》(第二版,由Andreas Griewank和Andrea Walther撰写),并应提供有关如何减少评估程序的微分所需的计算数量的更多详细信息。


3

任何AD仍然需要提供这些内在函数,因此我看不到与表达式的一般复杂性有什么关系。我猜您可以通过表达式图中的路径数对复杂度进行分类,因为您用这种方式表达了AD的意思。安德鲁·里昂(Andrew Lyons)在这里进行了一系列平行图的出色研究。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.