首页 > 解决方案 > 在 Julia 中导航自动微分生态系统

问题描述

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

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

标签: juliaautomatic-differentiation

解决方案


我也很想听听对此的知情回答。更多可能感兴趣的链接。

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

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


推荐阅读