在 Julia 中导航自动微分生态系统

cbk*_*cbk 5 automatic-differentiation julia

Julia 有一个有点庞大的 AD 生态系统,据我所知,现在可能有十多个不同的包,正向模式(ForwardDiff.jlForwardDiff2.jl ),反向模式(ReverseDiff.jlNabla 。 jlAutoGrad.jl)和源到源(Zygote.jlYota.jlEnzyme.jl,可能还有即将推出的 Diffractor.jl)在编译管道的几个不同步骤,以及更奇特的东西像NiLang.jl

在这些包之间,对不同语言结构(控制流、变异等)的支持是什么,是否有关于如何为给定任务选择给定 AD 的经验法则?我相信在某个时候在 Julia Slack 上有一个比较和对比表,但我似乎无法在相关的话语线索或其他可能的地方 ( 1 , 2 ) 中找到为后代复制的任何内容

Kip*_*ros 3

我也很想听到对此的知情答案。还有一些可能感兴趣的链接。

Diffractor 现在有一个Github 存储库,其中列出了实施计划。读完那里的文字后,我的看法是,在 Diffractor 投入生产之前,需要进行长期的实施工作。另一方面,有一种感觉,Zygote 在等待 Diffractor 时可能处于“维护模式”。至少从远处看,情况显得有些尴尬。好消息是ChainRules.jl生态系统似乎可以在自动差异系统之间轻松交换。

截至 2021 年 9 月,Yota似乎正在迅速发展。0.5 版本带来了对 ChainRules 的支持,这似乎将其解锁以供生产使用。此发布线程中有很多有趣的讨论。通过阅读这些线程,我的理解是,与 Zygote 相比,Yota 的范围更加有限(例如,不支持通过突变进行自动差异)。这种有限范围的优点是提供了优化机会,例如预分配和内核融合,这在更通用的自动差异系统中可能是不可能的。因此,Yota 可能更适合填补 PyTorch 类型建模等领域的空白。