Autograd无法正确计算正常CDF衍生物

时间:2018-06-12 21:41:58

标签: python numerical-methods derivative differentiation autograd

对于Autograd来说,我是一个全新的人,所以我觉得我可能做的事情显然是错误的。但是,我花了整整一天时间在这方面苦苦挣扎。

我正在尝试计算包含普通cdf的函数的导数。我没有成功使用Autograd,因此我将其分解为越来越小的部分,直到我将错误源隔离为普通CDF。这是一个最小的工作示例:

import autograd.numpy as np
from autograd.misc.optimizers import adam, rmsprop, sgd
from autograd import grad
from autograd.scipy.stats import norm

def test_func(x,t):
    return norm.cdf(x)

grad_test = grad(test_func)

def callback(params, t, g):
    print(params, " Gradient: ", g, " Derivative: ", norm.pdf(params))

print(adam(grad_test, 0.0 ,num_iters = 10, step_size= 0.1, callback = callback))

我知道优化CDF没有意义,我这样做是为了从回调获得输出,如下所示:

0.0  Gradient:  0.24197072451914337  Derivative:  0.398942280401
-0.09999999586726883  Gradient:  0.26608524890906193  Derivative:  0.396952547641
-0.20013469787000787  Gradient:  0.2897227684832687  Derivative:  0.391032156046
-0.30048876968878535  Gradient:  0.31236074851454854  Derivative:  0.38133185077
-0.40113882898768705  Gradient:  0.33345215596996947  Derivative:  0.368102181121
-0.5021500752550674  Gradient:  0.35244319911051986  Derivative:  0.351686233767
-0.6035729426432459  Gradient:  0.3687944858147128  Derivative:  0.332508890217
-0.7054397817605528  Gradient:  0.38200507149861374  Derivative:  0.311062576619
-0.8077615706004915  Gradient:  0.391638389745137  Derivative:  0.287889684926
-0.910524672771251  Gradient:  0.3973485394632615  Derivative:  0.263562137446

Autograd计算的梯度与理论导数不匹配,由普通PDF表示。

我是否错误地执行了此操作?我觉得这样一个广泛使用的包装不太可能有这样的漏洞。我如何使用Autograd(或Python中的其他包)来获得输出标量的函数的有效数值导数。

0 个答案:

没有答案