Haskell中与我最近相关的实现是http://hackage.haskell.org/packages/archive/fad/1.0/doc/html/Numeric-FAD.html处的转发模式。
最近的相关相关研究似乎是另一种与http://www.bcl.hamilton.ie/~qobi/stalingrad/上的Scheme相关的功能语言的反向模式。
我认为Haskell中的反向模式对于许多任务来说都是一种圣杯,希望它可以使用Haskell的嵌套数据并行性来获得大量数值优化的加速。
答案 0 :(得分:54)
在回答这个问题时,我已经将一个名为ad的软件包上传到Hackage,用于处理Haskell中的反向模式自动区分。
在内部,它利用Andy Gill的Kansas Lava的技巧来观察它为回传传播而录制的磁带中的共享,并使用类型级别的品牌来避免混淆敏感。
我试图保持API与Barak Pearlmutter和Jeffrey Mark Siskind的时尚包相对接近,但我无法抗拒在这里和那里进行一些小调整以获得一般性。
我仍然需要经历并完成剩余的未实现的时尚组合,找出一个很好的方法来构建一个反向模式AD塔,验证我没有搞砸我对基本微积分的回忆,并提供了一个很好的使用这种方法在其他正向模式AD程序中获取本地反向模式检查点的API,但我对目前为止的进展非常满意。
答案 1 :(得分:5)
我们有一堆正向模式AD实现(我甚至在我的monoids库中有一个!),但所有Haskell的反向模式AD似乎都是难以处理的。
可悲的是,当Pearlmutter和Siskind为lambda演算提供翻译时,它并没有映射到你可以为任意Haskell lambdas做的事情,你没有得到正确的内省属性并且给出了类型变化的方式在翻译中,你没有得到适合被包装成monad,arrow或其他控制结构的东西。
我通过与Pearlmutter的一系列电子邮件交流获得了它,但最终我能够获得的最好是针对Haskell中的小型EDSL的反向模式AD解决方案,而不是Haskell本身的解决方案。
答案 2 :(得分:2)
不是我知道的。我知道some Haskell folks are interested处于自动区分状态,但是一些快速挖掘只是提到了反向模式;我希望你已经找到了我做的相同材料。
我还注意到,您找到的fad
软件包和Stalingrad项目实际上是同一个two people的工作,至少Pearlmutter教授已发布到{ {3}}邮件列表。您可能需要考虑直接与他联系以了解他的工作 - 他可能正在进行某些工作,或在尝试实施反向模式AD时遇到严重障碍。
抱歉,我无法提出更有用的内容;如果其他人想进一步挖掘,至少上面的链接是一个起点。
答案 3 :(得分:2)
我认为前进是Haskell的发展方向。爱德华指出,你不应该对任意函数进行反向模式。但是您回答说您应该能够在某些受约束的函数上执行此操作。并且所述约束可以很容易地导致前进模式。例如。如果你有一个功能:
foo :: Num a => a -> a -> a
然后,您可以使用可微类型实例化a
,从而在正向模式下区分foo
。
请参阅Hackage上的vector-space库,了解非常优雅的前向模式自动区分。一开始可能不完全清楚如何使用它。阅读Conal Elliott撰写的有关它的文章Beautiful Differentiation。