问题标签 [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 投票
1 回答
97 浏览

haskell - AD 反射 - 它是如何工作的?

我已经看过这个ad包,我理解它是如何通过提供不同的实例class Floating然后实现衍生规则来自动区分的。

但是在示例中

我们看到它可以将函数表示为ASTs 并将它们显示为带有变量名的字符串。

我想知道他们是怎么做到的,因为当我写的时候:

无论我提供什么实例,我都会得到一个函数 f :: Something -> Something 而不是像f :: AST, 或f :: String

实例无法“知道”参数是什么。

他们是如何做到的?

0 投票
1 回答
1197 浏览

deep-learning - pytorch autograd 是如何工作的?

我将此作为问题提交给cycleGAN pytorch implementation,但由于那里没有人回复我,我会在这里再次询问。

我主要对在一次向后传递之前调用多次向前传递这一事实感到困惑,请参见代码cycle_gan_model中的以下内容

在我看来,G_A 和 G_B 每个都有三个前向传递,两次接受真实数据(real_Areal_B),两次接受假数据(fake_Bfake_A)。

在张量流(我认为)中,向后传递总是根据最后一个输入数据计算。在这种情况下, 的反向传播loss_G将是错误的。相反,应该做三次向后传球,每次都紧跟在他们涉及的向前传球之后。

具体来说,netG_A的梯度来自loss_G_Awrtreal_A但其梯度来自loss_cycle_Bwrt fake_A

我认为这在 pytorch 中以某种方式得到了解决。但是模型如何知道它应该计算梯度的输入数据呢?

0 投票
2 回答
297 浏览

c - 前向模式自动与数字与符号微分的计算效率

我正在尝试使用 C 语言中的 Newton-Raphson (NR) 方法来解决查找函数根的问题。我想在其中找到根的函数主要是多项式函数,但也可能包含三角函数和对数函数。

NR 方法需要找到函数的微分。实现差异化的方法有3种:

  • 象征性的
  • 数字
  • 自动(子类型为正向模式和反向模式。对于这个特定问题,我想专注于正向模式)

我有数千个这样的功能,所有这些功能都需要在尽可能快的时间内找到根源。

据我所知,自动微分通常比符号更快,因为它更有效地处理“表达膨胀”问题。

因此,我的问题是,在所有其他条件相同的情况下,哪种微分方法的计算效率更高:自动微分(更具体地说,正向模式)还是数值微分?

0 投票
1 回答
817 浏览

c++ - 结合 Eigen 和 CppAD

我想在 Eigen 线性代数中使用 CppAD 提供的自动微分机制。一个示例类型是 Eigen::Matrix<CppAD::AD,-1,-1>。由于 CppAD::AD 是自定义数字类型,因此必须提供此类型的 NumTraits。CppAD 在文件cppad/example/cppad_eigen.hpp中提供了这些。这使得以下最小示例编译:

一旦使用了一些更复杂的表达式,例如提到的

代码无法编译:

如果我手动将双矩阵转换为 AD,它可以工作。然而,这不是一个解决方案,因为类型提升实际上在 Eigen 中无处不在。

在我看来,CppAD 提供的 NumTraits 似乎不足以应对这种情况。后续错误消息支持这一点:

其他用例会导致错误消息,例如:

有人能指出我正确的方向吗?NumTraits 可能适用于旧的 Eigen 版本。我正在使用当前主分支中的 3.3.2 和 CppAD。

0 投票
1 回答
140 浏览

haskell - 在 Haskell 中使用 Numeric.AD 时如何正确匹配类型?

我正在尝试使用ad包实现 Newton–Raphson 寻根算法,但我无法正确匹配函数类型。我知道有一个类似问题的正确答案,这是由广告的创建者自己回答的,但自 1.0.6 版(当前版本为 4.3.4)以来,该软件包发生了很大变化。

当我迭代它时,第一个最小示例编译并工作:

但是,如果我尝试抽象函数,如下所示:

GHC 返回以下错误:

如果我使用Numeric.AD.Rank1.Forward而不是Numeric.AD,编译器会说它不能匹配awith Forward a,而不是awith AD s (Forward a)。我还尝试了几种创建双数的方法,x将其传递给f,例如snd . unbundle . f $ bundle x 1,但它只有在我g' x使用它创建一个新数字时才有效,就像在第一种情况下一样。在内部使用它newton也不起作用。

Numeric.AD, diff :: Num a => (forall s. AD s (Forward a) -> AD s (Forward a)) -> a -> a. 在 中Numeric.AD.Rank1.Forward,它是diff :: Num a => (Forward a -> Forward a) -> a -> a。那么为什么他们a -> a在第一种情况下接受类型函数,而在第二种情况下不接受呢?除了使用多态函数之外,在创建要使用的函数时我是否应该特别小心Numeric.AD?最后,我应该如何更改我的代码以使其工作?我知道这个包已经有一个 find root 的功能,但我还不想使用(因为我还在学习 Haskell),看着文档试图解决这个问题,感觉就像在绕圈子。

0 投票
2 回答
129 浏览

haskell - 为什么需要“包装”函数类型才能满足类型检查器的要求?

以下程序类型检查:

但是这个程序失败了:

出现类型错误:

直观地说,后一个程序看起来是正确的。毕竟,以下看似等效的程序确实有效:

它看起来像是 GHC 类型系统的一个限制。我想知道是什么导致了失败,为什么存在这个限制,以及除了包装函数(Fun如上所述)之外的任何可能的解决方法。

(注意:这不是由单态限制引起的;编译 withNoMonomorphismRestriction没有帮助。)

0 投票
1 回答
3274 浏览

python - 使用 Autograd 的偏导数

我有一个接受多元参数 x 的函数。这里 x = [x1,x2,x3]。假设我的函数看起来像: f(x,T) = np.dot(x,T) + np.exp(np.dot(x,T) 其中 T 是一个常数。

我有兴趣找到 df/dx1、df/dx2 和 df/dx3 函数。

我使用 scipy diff 取得了一些成功,但我有点怀疑,因为它使用了数值差异。昨天,我的同事给我指了 Autograd (github)。由于它似乎是一个流行的包,我希望这里有人知道如何使用这个包进行部分区分。我对这个库的初步测试表明 grad 函数只对第一个参数进行区分。我不确定如何将其扩展到其他论点。任何帮助将不胜感激。

谢谢。

0 投票
0 回答
50 浏览

optimization - 如果我可以计算梯度和 Hessian,牛顿法会显着优于 BFGS/L-BFGS 吗?

我有 3 参数估计问题(所以维度很低,内存不是问题),其中目标函数和梯度 + hessians 的评估速度很慢,因为它是蒙特卡洛模拟的结果。但是,我的代码已实现,因此我可以使用自动微分获得梯度 + hessian,这应该比基于有限差分的近似更好。

因此,我想做尽可能少的迭代,也就是。函数和梯度/粗麻布评估尽可能达到最佳。那么 Newton-Raphson 方法会成为使用 AD 生成粗麻布的方法吗?

0 投票
1 回答
159 浏览

python - pyadolc 安装:避免“ImportError: No module named _adolc”

我正在运行 Ubuntu 16.04。在获得要求并按照此处的 pyadolc 安装步骤后,我附加了

/home/我的名字/pyadolc

到我的 ~/.profile 文件中的 PYTHONPATH 变量。

现在,跑步

返回以下消息:

无论我运行命令的位置如何,消息都是相同的。

从 pyadolc 的根文件夹运行此命令时,Github 自述文件会警告此错误。

我尝试重新安装 pyadolc,预先添加目录而不是将其附加到 PYTHONPATH,并通过sys.path.append()暂时将目录附加到 PYTHONPATH,但没有成功。关于出了什么问题的任何想法?

0 投票
2 回答
44223 浏览

neural-network - 变量的backward()方法中的参数retain_graph是什么意思?

我正在阅读神经传输 pytorch 教程retain_variable,并且对(已弃用,现在称为)的使用感到困惑retain_graph。代码示例显示:

文档

retain_graph (bool, optional) -- 如果为 False,用于计算 grad 的图将被释放。请注意,几乎在所有情况下都不需要将此选项设置为 True,并且通常可以以更有效的方式解决。默认为 create_graph 的值。

因此,通过设置retain_graph= True,我们不会释放为向后传递的图形分配的内存。保留这个内存有什么好处,我们为什么需要它?