问题标签 [automatic-differentiation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
688 浏览

language-agnostic - 高阶函数的导数

这是在自动微分的背景下——这样的系统将如何处理类似的功能map,或者filter——甚至是SKI 组合器之一?

示例:我有以下功能:

它的衍生物是什么?AD 系统会产生什么结果?(此函数在实数输入上定义明确)。

0 投票
4 回答
2682 浏览

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

我见过的 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 的嵌套数据并行性在大量数值优化中获得很好的加速。

0 投票
3 回答
3485 浏览

c# - C# 和 F# 中的自动微分

我在让自动微分在 C# 和 F# 之间工作时遇到问题。

在 C# 中,我有一个接受双精度并返回双精度的函数,例如:

我专门选择了这个函数,因为 Math.pow 非常禁止,并且只允许使用 double 或 int 作为其参数。

我想使用自动微分来区分这个功能。我在 F# 中为此编写了方法:

不幸的是,我需要将类型 Diff 输入到我的 Price(..) 函数中以生成类型 Diff,然后将其输入到我的 Differente(..) 函数中以返回另一种类型 Diff。

然而,我的 C# 函数仅适用于双打(我希望它保持这种状态,因为它在我的 C# 程序的其他地方使用)。

我能想到解决这个问题的唯一方法是将每个函数编写两次,这显然很糟糕:

1)我还不如每次都写一个差异化的版本 2)这不是一个非常可扩展的模型

那么有什么办法可以解决这个问题,或者可能将我的双重函数强制转换为 Diff 函数(最好在 F# 中)。理想情况下,我只想抛出一个 (double -> double) 函数并得到一个 Diff.ToString() 。

抱歉,如果这完全模糊或无法理解。如果不清楚,我将在评论中回答任何问题。

我希望有一个解决方案!提前致谢,

阿什利

0 投票
1 回答
7327 浏览

java - 用于 Java 中的微分方程系统的 Runge-Kutta (RK4)

这个方程主要是这个线程的结果:Java 中的微分方程
基本上,我尝试遵循 Jason S. 的建议并通过 Runge-Kutta 方法 (RK4) 实现微分方程的数值解。

大家好,我正在尝试用java创建一个简单的SIR-epidemics模型模拟程序。基本上,SIR 由三个微分方程组定义:
S'(t) = - lamda(t) * S(t)
I'(t) = lamda(t) * S(t) - gamma(t) * I(t)
R'(t) = gamma(t) * I(t)
S - 易感人群,I - 感染者,R - 康复者。lamda(t) = [c * x * I(t)] / N(T) c - 接触人数,x - 传染性(与病人接触后生病的概率),N(t) - 总人口(其中是恒定的)。
gamma(t) = 1 / 病程(常数)

在第一次不是很成功的尝试之后,我尝试用 Runge-KUtta 解决这个方程,这个尝试产生了以下代码:

这似乎不起作用,因为生病的人数(I)应该先增加,然后减少到大约0,并且恢复的人数应该严格增加。生病 + 健康 + 康复的总数应该是 100,但我的代码产生了一些奇怪的结果:

找不到错误,请指教!提前谢谢了!

0 投票
7 回答
3402 浏览

clojure - Scheme / Common Lisp / Clojure 中的自动微分库

我听说 McCarthy 发明 Lisp 的最初动机之一是编写一个用于自动区分的系统。尽管如此,我的谷歌搜索并没有产生任何库/宏来执行此操作。是否有任何 Scheme/Common Lisp/Clojure 库(宏)用于获取函数 F 并返回计算 F 导数的函数 dF/dx?

我希望它支持具有多个参数的 F。用户将选择其中哪个是要区分的 x。理想情况下,微分器甚至适用于向量值 F 和 x。

编辑:有几个人提到了符号分化。符号微分和自动微分之间的区别是一个微妙的区别,但它在维基百科中得到了很好的总结,尤其是在这张图片中。这种区别在 lisp 中没有那么明显,其中符号表达式可以按原样转换为工作程序,但仍然存在潜在的困难:

符号微分要求被微分的表达式由已知导数的运算组成。例如,有人提到了 SICP 的宏示例,该示例通过简单的性别来搅动(+ y (* (x y))),并使用链式法则,以及如何区分+和的知识*,返回代表导数的性别。我需要它来处理诸如(* (foo x y) (bar x)), where之类的表达式,foo并且bar可能反过来调用其他函数,这些函数的导数在微分时是未知的。

如果有一种方法可以将表达式 like(foo x y)替换为它的函数体,用xy以一种卫生的方式替换任何对参数的提及,这将是很好的。有没有?

此外,以上都没有解决向量值函数相对于向量值参数微分时出现的复杂性......这是大多数自微分实现所针对的。

0 投票
2 回答
246 浏览

haskell - Numeric.AD 和打字问题

我正在尝试使用 Numeric.AD 和自定义 Expr 类型。我希望计算用户输入表达式的符号梯度。使用常量表达式的第一个试验效果很好:

这有效:

但是,如果我将表达式作为参数提取出来:

我明白了

我如何让 ghc 接受这个?

0 投票
1 回答
400 浏览

haskell - Numeric.AD 函数中的可接受类型

围绕包装中涉及的类型的基本管道,我几乎没有成功ad。例如,以下工作完美:

哪里grad有类型:

ex如果我更改to的类型签名[Double] -> Double并尝试相同的事情,我会得到

当用实例化Double的 kind 替换看似任何类型的构造函数时,也会发生相同的行为。 *Num

Traversable f是列表时, 的第一个参数grad必须具有[AD s a] -> AD s a某些可接受的类型Mode- 例如,Reverse. 但显然用户grad不必处理AD构造函数或Mode直接处理。窥视这些内部结构让我有点困惑。具体来说,我无法按照种类/类型追踪来区分 usingNum a => [a] -> a[Double] -> Double.

为什么类型签名[Double] -> Double会导致问题grad?就普通的旧库使用而言:有什么方法可以使用 的[Double] -> Double版本ex,还是需要多态版本?

(标题受这个类似问题的启发)

0 投票
1 回答
148 浏览

probability - 自动概率密度

我发现在编写数学软件时自动微分非常有用。我现在必须处理随机变量和随机变量的函数,在我看来,类似自动微分的方法也可以用于此。

这个想法是从具有给定多元分布的基本随机向量开始,然后您想要处理随机向量分量函数的隐含概率分布。这个想法是定义运算符,当您添加、相乘、除以两个随机变量时自动适当地组合两个概率分布,并在您应用诸如取幂之类的标量函数时适当地转换分布。然后,您可以结合这些来构建原始随机变量所需的任何函数,并自动获得相应的概率分布。

这听起来可行吗?如果不是,为什么不呢?如果是这样,并且由于它不是一个特别原始的想法,有人可以指出我现有的实现,最好是在 C 中

0 投票
1 回答
514 浏览

haskell - Haskell 广告包

我想使用广告自动微分包来学习 Haskell 中的神经网络权重。我发现了一些可能只是我需要的函数,但是我无法弄清楚它们期望的第一个参数是什么。一定是要优化的功能,具体是什么形式我不知道。他们有这样的签名:

我发现forall s.意思是一个名为存在量词的东西,仅此而已。我的问题是,我怎样才能将带有签名的成本函数cost :: [Double] -> Double(它需要权重列表)传递给这个库?

0 投票
1 回答
322 浏览

haskell - Haskell 无法推断类型相等

我有以下代码,无法编译:

我想使用 Trainable 类型来表示可通过梯度下降训练的机器学习系统。第一个参数是传递函数,第二个参数是成本函数,a 是输入类型,b 是输出/目标类型,列表包含可学习的参数。编译器抱怨这个:

基本概念对吗?如果是,我怎样才能使代码编译?