算法微分与具有分析导数的多个显式组件

Algorithmic Differentiation vs Multiple Explicit Components with Analytical Derivatives

我有一个由大约 6 个数学表达式组成的问题 - 即 (f(g(z(y(x))))),其中 x 是两个独立的数组。

我可以将这个表达式分解为多个具有解析导数的显式组件,或者使用算法微分方法来获得导数,从而将系统简化为单个显式组件。

据我所知,提前判断这两种方法之间可能存在的计算性能差异并不容易。 这可能取决于反向模式情况下的算法微分工具功能,但系统可能会非常大,具有多个显式组件,使用算法差异仍然可以。

我的问题是:

是算法差异。 developers/users 中任何一个正在使用的常用工具? 我发现 AlgoPY 但不确定其他 python 工具。

从 OpenMDAO v2.4 开始,OpenMDAO 开发团队还没有在任何纯 python 组件上大量使用 AD 工具。我们对它进行了一些试验,发现计算组件与手工区分组件相比增加了大约 2 倍。虽然预计会增加一些计算成本,但我不想表明我预计 2 倍是最终的经验法则。我们根本没有足够的数据来提供这样的估计。

Python 基于 AD 的工具远不如编译语言开发得好。动态类型和通用语言的灵活性都使编写好的 AD 工具更具挑战性。

我们已经将 OpenMDAO 与使用 AD 的编译代码(例如 CFD 和 FEA 工具)连接起来。在这些情况下,您总是使用 OpenMDAO 的无矩阵派生 API(apply_linearcompute_jacvec_product)。

如果您的组件足够小以适合内存并且速度足够快以 运行 在单个进程中,我建议您手动区分您的代码。这将为您提供目前最好的整体性能。

AD 对小型串行组件的支持是我们将来会考虑支持的内容,但我们近期无法为您提供任何东西(从 OpenMDAO v2.4 开始)