问题标签 [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.
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 的嵌套数据并行性在大量数值优化中获得很好的加速。
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() 。
抱歉,如果这完全模糊或无法理解。如果不清楚,我将在评论中回答任何问题。
我希望有一个解决方案!提前致谢,
阿什利
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,但我的代码产生了一些奇怪的结果:
找不到错误,请指教!提前谢谢了!
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)
替换为它的函数体,用x
和y
以一种卫生的方式替换任何对参数的提及,这将是很好的。有没有?
此外,以上都没有解决向量值函数相对于向量值参数微分时出现的复杂性......这是大多数自微分实现所针对的。
haskell - Numeric.AD 和打字问题
我正在尝试使用 Numeric.AD 和自定义 Expr 类型。我希望计算用户输入表达式的符号梯度。使用常量表达式的第一个试验效果很好:
这有效:
但是,如果我将表达式作为参数提取出来:
我明白了
我如何让 ghc 接受这个?
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
,还是需要多态版本?
(标题受这个类似问题的启发)
probability - 自动概率密度
我发现在编写数学软件时自动微分非常有用。我现在必须处理随机变量和随机变量的函数,在我看来,类似自动微分的方法也可以用于此。
这个想法是从具有给定多元分布的基本随机向量开始,然后您想要处理随机向量分量函数的隐含概率分布。这个想法是定义运算符,当您添加、相乘、除以两个随机变量时自动适当地组合两个概率分布,并在您应用诸如取幂之类的标量函数时适当地转换分布。然后,您可以结合这些来构建原始随机变量所需的任何函数,并自动获得相应的概率分布。
这听起来可行吗?如果不是,为什么不呢?如果是这样,并且由于它不是一个特别原始的想法,有人可以指出我现有的实现,最好是在 C 中
haskell - Haskell 广告包
我想使用广告自动微分包来学习 Haskell 中的神经网络权重。我发现了一些可能只是我需要的函数,但是我无法弄清楚它们期望的第一个参数是什么。一定是要优化的功能,具体是什么形式我不知道。他们有这样的签名:
我发现forall s.
意思是一个名为存在量词的东西,仅此而已。我的问题是,我怎样才能将带有签名的成本函数cost :: [Double] -> Double
(它需要权重列表)传递给这个库?
haskell - Haskell 无法推断类型相等
我有以下代码,无法编译:
我想使用 Trainable 类型来表示可通过梯度下降训练的机器学习系统。第一个参数是传递函数,第二个参数是成本函数,a 是输入类型,b 是输出/目标类型,列表包含可学习的参数。编译器抱怨这个:
基本概念对吗?如果是,我怎样才能使代码编译?