我想知道下面的代码如何更快。目前,它似乎慢得离谱,我怀疑我可能用错了autogradapi。我期望的输出是timeline
的每个元素在f的jacobian处求值,我确实得到了它,但是它需要很长时间:
import numpy as np
from autograd import jacobian
def f(params):
mu_, log_sigma_ = params
Z = timeline * mu_ / log_sigma_
return Z
timeline = np.linspace(1, 100, 40000)
gradient_at_mle = jacobian(f)(np.array([1.0, 1.0]))
我预计会出现以下情况:
jacobian(f)
返回一个表示梯度向量w.r.t.参数的函数。在jacobian(f)(np.array([1.0, 1.0]))
是在点(1,1)处求值的雅可比。对我来说,这应该像一个矢量化的numpy函数,所以它应该执行得非常快,即使对于40k长度的数组也是如此。然而,这并不是正在发生的事情。在即使是像下面这样的东西也有同样糟糕的表现:
^{pr2}$
从https://github.com/HIPS/autograd/issues/439我发现有一个未记录的函数
autograd.make_jvp
,它以快速前进模式计算雅可比。在链接说明:
从你的例子来看:
输出:
^{pr2}$在google collab上运行大约0.005秒。在
编辑:
像
cdf
这样的函数还没有为常规的jvp
定义,但是您可以在定义它的地方使用另一个未记录的函数make_jvp_reversemode
。用法类似,只是输出只是列而不是函数的值:输出:
注意,
make_jvp_reversemode
将比make_jvp
稍微快一点,因为它使用了缓存。在相关问题 更多 >
编程相关推荐