在Julia中浏览自动微分生态系统

10
朱莉娅拥有一个相当庞大的自动微分生态系统,可能现在已经有十几个不同的包涵盖了前向模式(ForwardDiff.jl, ForwardDiff2.jl),反向模式(ReverseDiff.jl, Nabla.jl, AutoGrad.jl)和源到源(Zygote.jl, Yota.jl, Enzyme.jl),以及一些更奇特的东西,如NiLang.jl。在这些包之间,对于不同的语言结构(控制流、变异等)有哪些支持,是否有任何规则来选择给定任务的自动微分呢?我相信在Julia Slack上曾经有一个比较和对比表,但我似乎无法在相关讨论线程或其他可能的地方找到类似于此的内容(1, 2)。
1个回答

3
我很乐意听到一个有见解的回答。以下是一些可能感兴趣的链接。
Diffractor现在有一个Github repo,其中列出了实现计划。阅读那里的文本后,我的看法是,在Diffractor准备好投入生产之前,它将需要长期的实现工作。另一方面,有一种感觉认为Zygote可能处于“维护模式”,同时等待Diffractor。至少从远处看,情况似乎有点尴尬。好消息是ChainRules.jl生态系统似乎使得轻松地在自动微分系统之间进行切换成为可能。
截至2021年9月,Yota似乎在快速发展。0.5版本增加了ChainRules支持,这似乎为其生产使用打开了大门。在此发布线程中有很多有趣的讨论。通过阅读这些帖子,我了解到Yota的范围与Zygote相比更为有限(例如,不支持通过突变进行自动微分)。这种有限的范围具有优势,可以开启优化机会,如预分配和内核融合,在更一般的自动微分系统中可能不可行。因此,Yota可能更适合填补PyTorch类型建模等领域的空白。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接