问题标签 [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 - AD 反射 - 它是如何工作的?
我已经看过这个ad
包,我理解它是如何通过提供不同的实例class Floating
然后实现衍生规则来自动区分的。
但是在示例中
我们看到它可以将函数表示为AST
s 并将它们显示为带有变量名的字符串。
我想知道他们是怎么做到的,因为当我写的时候:
无论我提供什么实例,我都会得到一个函数 f :: Something -> Something
而不是像f :: AST
, 或f :: String
实例无法“知道”参数是什么。
他们是如何做到的?
deep-learning - pytorch autograd 是如何工作的?
我将此作为问题提交给cycleGAN pytorch implementation,但由于那里没有人回复我,我会在这里再次询问。
我主要对在一次向后传递之前调用多次向前传递这一事实感到困惑,请参见代码cycle_gan_model中的以下内容
在我看来,G_A 和 G_B 每个都有三个前向传递,两次接受真实数据(real_A
或real_B
),两次接受假数据(fake_B
或fake_A
)。
在张量流(我认为)中,向后传递总是根据最后一个输入数据计算。在这种情况下, 的反向传播loss_G
将是错误的。相反,应该做三次向后传球,每次都紧跟在他们涉及的向前传球之后。
具体来说,netG_A
的梯度来自loss_G_A
wrtreal_A
但其梯度来自loss_cycle_B
wrt fake_A
。
我认为这在 pytorch 中以某种方式得到了解决。但是模型如何知道它应该计算梯度的输入数据呢?
c - 前向模式自动与数字与符号微分的计算效率
我正在尝试使用 C 语言中的 Newton-Raphson (NR) 方法来解决查找函数根的问题。我想在其中找到根的函数主要是多项式函数,但也可能包含三角函数和对数函数。
NR 方法需要找到函数的微分。实现差异化的方法有3种:
- 象征性的
- 数字
- 自动(子类型为正向模式和反向模式。对于这个特定问题,我想专注于正向模式)
我有数千个这样的功能,所有这些功能都需要在尽可能快的时间内找到根源。
据我所知,自动微分通常比符号更快,因为它更有效地处理“表达膨胀”问题。
因此,我的问题是,在所有其他条件相同的情况下,哪种微分方法的计算效率更高:自动微分(更具体地说,正向模式)还是数值微分?
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。
haskell - 在 Haskell 中使用 Numeric.AD 时如何正确匹配类型?
我正在尝试使用ad包实现 Newton–Raphson 寻根算法,但我无法正确匹配函数类型。我知道有一个类似问题的正确答案,这是由广告的创建者自己回答的,但自 1.0.6 版(当前版本为 4.3.4)以来,该软件包发生了很大变化。
当我迭代它时,第一个最小示例编译并工作:
但是,如果我尝试抽象函数,如下所示:
GHC 返回以下错误:
如果我使用Numeric.AD.Rank1.Forward
而不是Numeric.AD
,编译器会说它不能匹配a
with Forward a
,而不是a
with 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),看着文档试图解决这个问题,感觉就像在绕圈子。
haskell - 为什么需要“包装”函数类型才能满足类型检查器的要求?
以下程序类型检查:
但是这个程序失败了:
出现类型错误:
直观地说,后一个程序看起来是正确的。毕竟,以下看似等效的程序确实有效:
它看起来像是 GHC 类型系统的一个限制。我想知道是什么导致了失败,为什么存在这个限制,以及除了包装函数(Fun
如上所述)之外的任何可能的解决方法。
(注意:这不是由单态限制引起的;编译 withNoMonomorphismRestriction
没有帮助。)
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 函数只对第一个参数进行区分。我不确定如何将其扩展到其他论点。任何帮助将不胜感激。
谢谢。
optimization - 如果我可以计算梯度和 Hessian,牛顿法会显着优于 BFGS/L-BFGS 吗?
我有 3 参数估计问题(所以维度很低,内存不是问题),其中目标函数和梯度 + hessians 的评估速度很慢,因为它是蒙特卡洛模拟的结果。但是,我的代码已实现,因此我可以使用自动微分获得梯度 + hessian,这应该比基于有限差分的近似更好。
因此,我想做尽可能少的迭代,也就是。函数和梯度/粗麻布评估尽可能达到最佳。那么 Newton-Raphson 方法会成为使用 AD 生成粗麻布的方法吗?
python - pyadolc 安装:避免“ImportError: No module named _adolc”
我正在运行 Ubuntu 16.04。在获得要求并按照此处的 pyadolc 安装步骤后,我附加了
/home/我的名字/pyadolc
到我的 ~/.profile 文件中的 PYTHONPATH 变量。
现在,跑步
返回以下消息:
无论我运行命令的位置如何,消息都是相同的。
从 pyadolc 的根文件夹运行此命令时,Github 自述文件会警告此错误。
我尝试重新安装 pyadolc,预先添加目录而不是将其附加到 PYTHONPATH,并通过sys.path.append()暂时将目录附加到 PYTHONPATH,但没有成功。关于出了什么问题的任何想法?
neural-network - 变量的backward()方法中的参数retain_graph是什么意思?
我正在阅读神经传输 pytorch 教程retain_variable
,并且对(已弃用,现在称为)的使用感到困惑retain_graph
。代码示例显示:
从文档
retain_graph (bool, optional) -- 如果为 False,用于计算 grad 的图将被释放。请注意,几乎在所有情况下都不需要将此选项设置为 True,并且通常可以以更有效的方式解决。默认为 create_graph 的值。
因此,通过设置retain_graph= True
,我们不会释放为向后传递的图形分配的内存。保留这个内存有什么好处,我们为什么需要它?