问题标签 [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.
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。那么有没有办法告诉编译器忽略这些错误呢?
julia - 双数范围
我在处理范围内的双数时遇到问题。具体来说:
问题似乎是[end]
使用last
which then what's 来计算步数,所以有些东西试图转换为 anInteger
并失败。有谁知道解决这个问题的方法?
pyomo - 直接访问pyomo内部的自动微分
是否可以直接访问pyomo自带的自动微分模块?我的意思是,我可以使用 pyomo 计算任何目标函数(在 pyomo 的接口内定义或未定义)的导数吗?
keras - 在深度学习模型中,如何获取输出相对于输入的偏导数?
我想在 keras 中创建自己的损失函数,其中包含导数。例如,
被定义,并且
现在因为输入是二维的,
必须是二维向量。但是,我不知道如何获得渐变中的每个标量。我最终想要的是 y_pred 关于 x 的所有二阶导数。有没有方便的方法来获得这个?
它与这篇文章类似,但这篇文章将二维变量分成了两个一维变量。有没有其他方法可以在不分离输入的情况下获得梯度?
python - 为什么自动微分和渐变磁带需要使用上下文管理器?
上下文管理器可以将两个两个相关的操作合二为一。例如:
上面的代码等价于:
它相当于什么?
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)。
julia - 在 Julia 中使用 ForwardDiff 时限制函数签名
我正在尝试在几乎所有函数都被限制为只能接收浮点数的库中使用 ForwardDiff。我想概括这些函数签名,以便可以使用 ForwardDiff,同时仍然具有足够的限制性,因此函数只接受数值而不是日期之类的东西。我有很多具有相同名称但类型不同的函数(即,将“时间”作为浮点数或具有相同函数名称的日期的函数)并且不想从头到尾删除类型限定符。
最小的工作示例
有没有办法限制函数只接受数值(整数和浮点数)以及 ForwardDiff 使用但不允许符号、日期等的任何双数结构。
python - 在具有自定义数据类型的 python 包装的 C 函数上使用 autograd
autograd 原则上可以在 python 包装的 C 函数上工作吗?
我想区分的 C 函数需要REAL8数据类型的参数,我可以通过给它一个或参数来成功地在 python 中调用它。float
np.float64
用我的调试器仔细检查后,我发现当 autograd 将or更改为 ArrayBox对象时,当它尝试评估渐变时,我得到了一个TypeError 。float
np.float64
有没有办法让 autograd 在这种情况下继续进行?
是否有其他策略可能更适合我的情况?
我可以编写任何原语来解决这个问题吗?
背景:
Bilby 是一个较新的 python 库,它包装了用 C 编写的旧代码(LALSIMULATION)。它提供了广泛的预编码引力波模型,我想在我的研究中使用这些预编码模型。我的首要任务是弄清楚如何计算这些模型的准确 Hessian 和梯度。由于其臭名昭著的数值准确性,我想使用自动微分来解决这个问题,但我被卡住了。
SimInspiralChooseFDWaveform 是第一次调用 C 代码以供参考。
tensorflow - Pytorch Autograd:运行时错误“只能为标量输出隐式创建grad”是什么意思
我正在尝试深入了解 Pytorch autograd;我想在通过如下 sigmoid 函数后观察一个简单张量的梯度:
我的目标是获得 D.grad() 但即使在调用它之前我也得到了运行时错误:
我看到另一篇有类似问题的帖子,但那里的答案不适用于我的问题。谢谢
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()
这是可行的,因为 typeA
和B
are of type (这里省略Eigen::Matrix<...>
了版本的其他排列)。make_coherent_impl()
但是,请考虑以下稍作修改的示例:
现在,当我们点击dynamic * scalar - fixed * scalar
并通过该make_coherent()
方法时,我们调用
相反, asA
和B
不再是类型Eigen::matrix<...>
,而是CwiseUnaryOp<Operation, DerivativeType>
.
这种类型最终还是一个矩阵,我想调整它的大小,但是这样做时,eigen 检测到它不是矩阵类型并调用一个无操作调整大小函数(在 DenseBase.h 中),因为它只允许调整矩阵和数组的大小(另见函数描述,这里CwiseUnaryOp
是一个表达式)
我用来调用resize函数的部分专用模板版本如下
有没有办法将它CwiseUnaryOp
转换为矩阵,以便我们可以再次调整它的大小,或者在这里实现相同目的的不同路线?我只CwiseUnaryOp
在这里展示,但它应该同样适用于CwiseBinaryOp