0

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

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

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

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

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

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

背景:

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

import autograd.numpy as np
from autograd import grad
import BILBY_TAYLORF2 # My own class that wraps Bilby

model = BILBY_TAYLORF2()

gradient_likelihood = grad(model.logLikelihood)

gradient_likelihood(np.array([10., 10.]))
TypeError: in method 'SimInspiralChooseFDWaveform', argument 3 of type 'REAL8'

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

4

1 回答 1

0

恐怕这个答案对于原始海报来说可能为时已晚,但如果其他人遇到它,这里有一些信息。

Autograd依赖于由其他已定义解析导数的函数构成的函数。在 autograd 的情况下,它知道标准运算符的导数,它还重新定义了许多 numpy 函数以包括它们的分析导数(或向量雅可比积)。它跟踪所有已组合在一起的功能/操作,并通过重复使用链式法则执行自动微分。

swig 包装的 lalsimulation 函数只返回一个波形。它们没有定义梯度函数(或波形与数据及其本身的点积的梯度,这在 bilby 中进行似然计算是必需的),因此 autograd 不知道如何处理它们。autograd 教程展示了如何定义primative函数、定义向量雅可比积并告诉 autograd 将两者与defvjp函数联系起来。因此,您必须创建自己的函数来包装似然函数并提供梯度函数。当您将 lalsimuation/似然函数视为黑匣子时,您不知道梯度函数的分析形式,因此它只需要使用像有限差分这样的简单方法得到梯度(也许有一些迭代)。在 PyMC3 的这个例子中给出了这类事情的一个例子,即为黑盒函数定义一个渐变,它可能适用于 autograd。

于 2020-05-17T21:59:02.317 回答