Haskell是否有反向模式自动微分的工作实现?

Haskell是否有反向模式自动微分的工作实现?,haskell,automatic-differentiation,Haskell,Automatic Differentiation,我在Haskell中看到的最接近的相关实现是位于的forward模式 最近的相关研究似乎是与Scheme at相关的另一种函数式语言的反向模式 我认为Haskell中的反向模式对于很多任务来说都是一个圣杯,希望它能利用Haskell的嵌套数据并行性在大规模数值优化中获得很好的加速。我不知道。我确实知道在自动区分中,但一些快速挖掘发现,除了提到反向模式的短旁白外,没有什么更多;我想你已经找到和我一样的材料了 我还注意到,你发现的fad软件包和斯大林格勒项目实际上是同一个项目的工作,至少Pearlm

我在Haskell中看到的最接近的相关实现是位于的forward模式

最近的相关研究似乎是与Scheme at相关的另一种函数式语言的反向模式


我认为Haskell中的反向模式对于很多任务来说都是一个圣杯,希望它能利用Haskell的嵌套数据并行性在大规模数值优化中获得很好的加速。

我不知道。我确实知道在自动区分中,但一些快速挖掘发现,除了提到反向模式的短旁白外,没有什么更多;我想你已经找到和我一样的材料了

我还注意到,你发现的
fad
软件包和斯大林格勒项目实际上是同一个项目的工作,至少Pearlmutter教授已经在邮件列表中发布了。你可能会想直接联系他关于他的工作——他可能有进展,或遇到严重障碍,而试图实现反向模式广告。
对不起,我找不到更有用的东西;如果其他人想进一步挖掘,至少上面的链接是一个起点。

我们有很多正向模式广告实现(我甚至在我的monoids库中有一个!),但Haskell所有人的反向模式广告似乎都很棘手

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


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

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

foo :: Num a => a -> a -> a
然后您可以用可微类型实例化
a
,从而在正向模式下区分
foo


有关非常优雅的正向模式自动区分,请参阅Hackage上的库。一开始可能并不完全清楚如何使用它。阅读由Conal Elliott撰写的关于此问题的论文。

为了回答这个问题,我上传了一个名为to Hackage的包,用于处理Haskell中的反向模式自动微分

在内部,它利用安迪·吉尔(Andy Gill)的《堪萨斯熔岩》(Kansas Lava)中的一个技巧来观察其录制的磁带中的共享情况,以便进行反向传播,并使用类型级品牌来避免混淆敏感度

我试图使API与巴拉克·珀尔穆特(Barak Pearlmutter)和杰弗里·马克·西斯金德(Jeffrey Mark Siskind)的时尚软件包保持相对接近,但为了通用性,我忍不住在这里和那里做了一些小的调整


我仍然需要完成剩下的未实现的fad组合器,找到一种构建反向模式广告塔的好方法,验证我没有忘记基本的演算,并提供一个很好的API来使用这种方法在其他正向模式广告程序中获取本地反向模式检查点,但我很高兴事情发展到目前为止。

你说的“哈斯克尔的一切”是什么意思?您不能期望区分所有函数。您只想区分写入特定接口的函数,例如
Num
。Pearlmutter指出了嵌套衍生品的一些问题,但这并不是实施反向广告的障碍,反向广告可以用来解决现实世界的问题。我在Haskell中发现的反向广告问题有所不同。为了提高效率,您需要在树中显式共享,并在扫描树时将状态存储在树中。这一切都可以用纯Haskell实现,但效率不高。我同意我不需要区分任何可能的Haskell程序——只需要更典型的数值目标函数。您是否在任何地方在线共享您的EDSL?它能区分哪些子问题?@Ian:我会考虑把它润色一下,等我停机时再发布@user207442:您可以通过多种方式使共享可见,我通常采用的方式是通过StableNames,这让我避免了使用显式一元或使用oleg样式显式let_u绑定的许多丑陋之处。我可能会再次尝试,因为我不得不在其他的设置中解决这些问题,因为我最后一次看到反向模式AD。一个可能的选择:我已经用一个AD.(代码是C++,但主要是用纯函数风格编写的)优化了大系统(例如10000维)。诀窍是利用我的问题的稀疏性,这样我就可以使用稀疏类型来表示导数。它比我的问题的反向广告版本快(再次用C++编写,但根本不纯粹)。真的吗?我想知道如何完成这样一件事。有线索吗?谢谢你的回复。你至少让我确信我没有错过什么;)谢谢,但是反向模式的主要优点是便宜的渐变。这在我的应用程序中非常重要,它需要1000个变量函数的梯度。我会看一看前进模式,看看它是否满足我的需要,但我并不乐观。好吧,我浏览了报纸,在上看了视频,我认为向量空间可能很有前景。但我仍然不知道如何用它来计算函数的导数。似乎缺少文档,或者我很慢。也许我会就此提出另一个问题,对于稠密的高维问题,前向模式I