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

fortran - 有没有办法阻止 Fortran 编译器检查是否将负参数传递给 SQRT 函数?

我正在尝试使用第三方自动微分模块ADF95,它使用表达式-sqrt(asin(-1.0_dpr))在特定情况下返回非数字(NaN),其中dpr使用integer, parameter :: dpr = KIND(1.D0).

在尝试使用mod_adf95命令编译一个使用该模块的简单测试程序时gfortran mod_adf95.f90 main.f90 -o test.exe,我收到了几个错误,例如:

显然,负数的平方根real是未定义的,所以我明白他们为什么会尝试使用这个表达式来获得 NaN。那么有没有办法告诉编译器忽略这些错误呢?

0 投票
1 回答
91 浏览

julia - 双数范围

我在处理范围内的双数时遇到问题。具体来说:

问题似乎是[end]使用lastwhich then what's 来计算步数,所以有些东西试图转换为 anInteger并失败。有谁知道解决这个问题的方法?

0 投票
1 回答
209 浏览

pyomo - 直接访问pyomo内部的自动微分

是否可以直接访问pyomo自带的自动微分模块?我的意思是,我可以使用 pyomo 计算任何目标函数(在 pyomo 的接口内定义或未定义)的导数吗?

0 投票
2 回答
1122 浏览

keras - 在深度学习模型中,如何获取输出相对于输入的偏导数?

我想在 keras 中创建自己的损失函数,其中包含导数。例如,

被定义,并且

现在因为输入是二维的,

必须是二维向量。但是,我不知道如何获得渐变中的每个标量。我最终想要的是 y_pred 关于 x 的所有二阶导数。有没有方便的方法来获得这个?


它与这篇文章类似,但这篇文章将二维变量分成了两个一维变量。有没有其他方法可以在不分离输入的情况下获得梯度?

0 投票
1 回答
193 浏览

python - 为什么自动微分和渐变磁带需要使用上下文管理器?

上下文管理器可以将两个两个相关的操作合二为一。例如:

上面的代码等价于:

但在https://www.tensorflow.org/tutorials/eager/custom_training_walkthrough#define_the_loss_and_gradient_function 我发现:

它相当于什么?

0 投票
1 回答
408 浏览

tensorflow - 计算图与(计算机代数)符号表达式

我正在阅读Baydin 等人的《机器学习中的自动微分:一项调查》,2018 年( Arxiv ),其中区分了符号微分自动微分 (AD)。然后它说:

AD 不是符号区分。符号微分是[符号]表达式的自动操作。

AD 可以被认为是对计算机程序执行非标准解释,其中这种解释涉及通过计算各种导数来增加标准计算。

评估痕迹构成了 AD 技术的基础。[计算图 (Bauer, 1974)在评估跟踪中可视化(输入、工作、输出)变量的依赖关系。]

然后继续描述如何用 AD 计算导数(在前向或后向模式下)。该描述基本上是在转换评估跟踪/计算图。

Autograd、Chainer 和 PyTorch 提供通用反向模式 AD。

它还讨论了 Theano、TensorFlow 等,但它基本上比较了定义运行/静态计算图(Theano,TF)与运行定义/动态计算图(PyTorch,TF Eager)。(在我的理解中,这与如何执行 AD 的问题是正交的,或者主要只是改变了 AD 的实施方式,但不是 AD 的概念。)

Theano 是一个计算图优化器和编译器 [...],它目前以高度优化的符号微分形式处理导数。结果可以解释为符号微分和反向模式 AD 的混合,但 Theano 没有使用我们在本文中描述的通用反向累加。(与作者的个人交流。)

我不确定作者是否暗示 Theano/TF 不提供通用反向模式 AD(我的理解是错误的)。

我不完全理解 Theano 是如何不使用通用反向累积的。

此外,鉴于此定义,我不明白符号差异与 AD 有何不同。

或者:符号表达式与计算图有何不同?

相关的也是可微分编程

由功能块组装而成的可微有向图

我再次看不到计算图的区别。

反向传播(BP)

得到的算法本质上等效于在反向模式AD下转换由目标函数组成的网络评估函数,正如我们将看到的,这实际上是对反向传播思想的推广。

我看不出反向模式 AD 比反向传播更通用。是吗?如何?

Schmidhuber,神经网络中的深度学习:概述,2014 年(第 5.5 节)()指出:

BP也被称为自动微分的反向模式(Griewank,2012)

0 投票
2 回答
226 浏览

julia - 在 Julia 中使用 ForwardDiff 时限制函数签名

我正在尝试在几乎所有函数都被限制为只能接收浮点数的库中使用 ForwardDiff。我想概括这些函数签名,以便可以使用 ForwardDiff,同时仍然具有足够的限制性,因此函数只接受数值而不是日期之类的东西。我有很多具有相同名称但类型不同的函数(即,将“时间”作为浮点数或具有相同函数名称的日期的函数)并且不想从头到尾删除类型限定符。

最小的工作示例

有没有办法限制函数只接受数值(整数和浮点数)以及 ForwardDiff 使用但不允许符号、日期等的任何双数结构。

0 投票
1 回答
170 浏览

python - 在具有自定义数据类型的 python 包装的 C 函数上使用 autograd

autograd 原则上可以在 python 包装的 C 函数上工作吗?

我想区分的 C 函数需要REAL8数据类型的参数,我可以通过给它一个或参数来成功地在 python 中调用它。floatnp.float64

用我的调试器仔细检查后,我发现当 autograd 将or更改为 ArrayBox对象时,当它尝试评估渐变时,我得到了一个TypeError 。floatnp.float64

有没有办法让 autograd 在这种情况下继续进行?

是否有其他策略可能更适合我的情况?

我可以编写任何原语来解决这个问题吗?

背景:

Bilby 是一个较新的 python 库,它包装了用 C 编写的旧代码(LALSIMULATION)。它提供了广泛的预编码引力波模型,我想在我的研究中使用这些预编码模型。我的首要任务是弄清楚如何计算这些模型的准确 Hessian 和梯度。由于其臭名昭著的数值准确性,我想使用自动微分来解决这个问题,但我被卡住了。

SimInspiralChooseFDWaveform 是第一次调用 C 代码以供参考。

0 投票
1 回答
4856 浏览

tensorflow - Pytorch Autograd:运行时错误“只能为标量输出隐式创建grad”是什么意思

我正在尝试深入了解 Pytorch autograd;我想在通过如下 sigmoid 函数后观察一个简单张量的梯度:

我的目标是获得 D.grad() 但即使在调用它之前我也得到了运行时错误:

我看到另一篇有类似问题的帖子,但那里的答案不适用于我的问题。谢谢

0 投票
0 回答
229 浏览

c++ - 为自动微分 (AD) 类型调整 CwiseUnaryOperation 产生的 Eigen::Matrix

此问题与调整 Eigen::Ref 大小的解决方法有关,但是,我没有尝试避免使用模板的限制(实际上,我希望有一个使用模板的解决方案)

我正在使用 eigen 库(版本 3.2.9,但 testet 具有最新版本的 eigen 以及相同的结果)进行一些自动微分(AD)计算,并遇到了这个已知的“错误”开发人员(另请参阅以下错误报告:错误报告 1错误报告 2错误报告 3)。TL;DR:这并不是一个真正的错误,但一个通用且干净的解决方法可能需要一些广泛的工作,并且因为 Eigen 不支持它,所以不追求(我猜......)。对我来说,我只对表达式的一个子集感兴趣,可以让它工作(至少现在是这样),可能有一个可接受的解决方法。

问题如下,考虑这个简化的代码,我们有一个固定和动态矩阵大小的 AD 类型

这很好用。当我们点击 时fixed - dynamic,Eigen 将首先调用重载operator-,它同时查看左侧和右侧,并通过该make_coherent_impl()方法相应地调整导数,这是一个模板专用版本make_coherent()

这是可行的,因为 typeABare of type (这里省略Eigen::Matrix<...>了版本的其他排列)。make_coherent_impl()

但是,请考虑以下稍作修改的示例:

现在,当我们点击dynamic * scalar - fixed * scalar并通过该make_coherent()方法时,我们调用

相反, asAB不再是类型Eigen::matrix<...>,而是CwiseUnaryOp<Operation, DerivativeType>.

这种类型最终还是一个矩阵,我想调整它的大小,但是这样做时,eigen 检测到它不是矩阵类型并调用一个无操作调整大小函数(在 DenseBase.h 中),因为它只允许调整矩阵和数组的大小(另见函数描述,这里CwiseUnaryOp是一个表达式)

我用来调用resize函数的部分专用模板版本如下

有没有办法将它CwiseUnaryOp转换为矩阵,以便我们可以再次调整它的大小,或者在这里实现相同目的的不同路线?我只CwiseUnaryOp在这里展示,但它应该同样适用于CwiseBinaryOp