13

我见过的 Haskell 中最相关的实现是http://hackage.haskell.org/packages/archive/fad/1.0/doc/html/Numeric-FAD.html的转发模式。

最接近的相关研究似乎是与 Scheme 相关的另一种功能语言的反向模式,网址为http://www.bcl.hamilton.ie/~qobi/stalingrad/

我将 Haskell 中的反向模式视为许多任务的圣杯,希望它可以使用 Haskell 的嵌套数据并行性在大量数值优化中获得很好的加速。

4

4 回答 4

56

针对这个问题,我上传了一个名为ad的包到 Hackage,用于在 Haskell 中处理反向模式自动微分。

在内部,它利用了来自 Andy Gill 的 Kansas Lava 的技巧来观察其记录的磁带中的共享以用于反向传播,并使用类型级别的品牌来避免混淆敏感性。

我试图保持 API 与 Barak Pearlmutter 和 Jeffrey Mark Siskind 的时尚包的 API 相对接近,但为了通用性,我忍不住在这里和那里进行了一些小的调整。

我仍然需要完成剩余未实现的时尚组合器,找出构建反向模式 AD 塔的好方法,验证我没有搞砸我对基本微积分的回忆,并提供一个很好的 API 用于使用这种在其他正向模式 AD 程序中获取本地反向模式检查点的方法,但我对到目前为止的进展情况感到非常满意。

于 2010-05-16T04:39:53.267 回答
5

我们有一堆正向模式 AD 实现(我什至在我的 monoids 库中有一个!),但所有 Haskell 的反向模式 AD 似乎都难以处理。

可悲的是,虽然 Pearlmutter 和 Siskind 给出了 lambda 演算的翻译,但它并没有映射到你可以为任意 Haskell lambda 做的事情,你没有得到正确的内省属性,并且考虑到类型的形状在翻译中的变化方式你不会得到适合被打包到单子、箭头或其他控制结构中的东西。

我通过与 Pearlmutter 的一系列电子邮件交流尝试了一下,但最终我能获得的最好结果是针对 Haskell 中的小型 EDSL 的反向模式 AD 解决方案,而不是针对 Haskell 本身的解决方案。

于 2010-04-30T15:16:17.797 回答
2

我认为前进是 Haskell 的发展方向。正如 Edward 指出的那样,您不应该对任意函数执行反向模式。但是您回答说您应该能够在某些受约束的功能上做到这一点。并且所述约束可以很容易地导致前进模式。例如。如果你有一个功能:

foo :: Num a => a -> a -> a

a然后您可以使用可微分类型进行实例化,从而foo在前向模式下进行微分。

有关非常优雅的前向模式自动微分,请参阅Hackage 上的向量空间库。一开始可能并不完全清楚如何使用它。阅读有关它的论文,Conal Elliott 的美丽差异化。

于 2010-05-01T00:22:55.603 回答
2

不是我知道的。我确实知道一些 Haskell 对自动微分 感兴趣,但一些快速挖掘发现只是提到反向模式的简短旁白。我希望您已经找到了与我相同的材料。

我还注意到,fad您找到的包和斯大林格勒项目实际上是同一个人的作品 并且至少 Pearlmutter 教授已将其发布到haskell -cafe邮件列表中。您可能要考虑直接联系他以了解他的工作——他可能正在进行某些工作,或者在尝试实施反向模式 AD 时遇到严重障碍。

抱歉,我找不到更有用的东西;如果其他人想进一步挖掘,至少上面的链接是一个起点。

于 2010-04-30T15:16:06.317 回答