Scheme/Common Lisp/Clojure中的自动差异库

Sup*_*ric 12 lisp scheme clojure automatic-differentiation numerical-methods

我听说McCarthy发明Lisp的原始动机之一是编写一个自动区分系统.尽管如此,我的Google搜索还没有为此做出任何库/宏.是否有任何Scheme/Common Lisp/Clojure库(宏)用于获取函数F并返回计算F的导数的函数dF/dx?

我希望它能用多个参数支持F'.用户可以选择哪个是x来区分.理想情况下,微分器甚至可以用于矢量值F和x.

编辑:有几个人提到了象征性的差异化.符号微分和自动微分之间的区别是微妙的,但它在维基百科中得到了很好的总结,特别是在这张图片中.这种区别在lisp中并不那么强烈,其中符号表达式可以按原样转换为工作程序,但仍存在潜在的困难:

符号微分要求表达式被区分为由具有已知衍生物的操作组成.例如,有人提到了SICP的一个宏的例子,它通过简单的性行为进行搅拌(+ y (* (x y))),并使用链规则,以及如何区分+*返回代表衍生物的性别的知识.我需要使用表达式,例如(* (foo x y) (bar x)),where foobarmay可以依次调用其微分时间不知道其衍生物的其他函数.

如果有采取类似的表达方式,这将是罚款(foo x y),并以其函数体替换,替换参数中的任何提及与xy在卫生型的方式.在那儿?

此外,上述任何一个都没有解决在将向量值函数与向量值参数区分开来时出现的复杂情况......这是大多数自动微分实现的适应性.

小智 7

Alexey Radul写道:

嗯,Scmutils中有自动分化系统

http://groups.csail.mit.edu/mac/users/gjs/6946/linux-install.htm

(巧合的是,它也具有象征性的差异性).我不知道任何其他已发布的实现,但您可以查看http://autodiff.org/.

关于如何在经典力学的结构和解释的附录中自己实现它也有一个很好的解释

http://mitpress.mit.edu/sicm/

以及学术文献.特别是前进模式并不难,但你必须小心避免扰动混乱.您可以参考Barak Pearlmutter和Jeffrey Mark Siskind的出版物,他们正在合作开发包含AD的高性能Lisp变体,并且已经发布了有关周围问题的文章.

http://scholar.google.com/scholar?q=Barak+Pearlmutter+and+Jeffrey+Mark+Siskind

  • 好吧,我自己从这篇论文中找到了答案:http://eprints.nuim.ie/archive/00000566/01/Perturbation.pdf“当微分运算符应用于函数本身使用该运算符。这个问题的根本原因是扰动混淆,无法区分微分运算符的不同调用所引入的不同扰动。然后我们讨论如何避免扰动混淆。” (2认同)

小智 4

还有另外两个包,都用于Scheme 中的自动微分。第二个是基于第一个,但被重新设计为鸡蛋。它们支持正向和反向模式。