Julia中ForwardDiff的自动微分
我在Julia中正确使用ForwardDiff包时遇到一些问题。我已经成功地在下面的代码块中隔离了我的问题 简而言之,我定义了函数:Julia中ForwardDiff的自动微分,julia,automatic-differentiation,Julia,Automatic Differentiation,我在Julia中正确使用ForwardDiff包时遇到一些问题。我已经成功地在下面的代码块中隔离了我的问题 简而言之,我定义了函数: using ForwardDiff function likelihood(mu,X) N = size(X,2) # Calculate likelihood aux = zeros(N) for nn=1:N aux[nn] = exp(-0.5 * (X[:,nn]-mu)' * (X[:,nn]-mu))[1] end
using ForwardDiff
function likelihood(mu,X)
N = size(X,2)
# Calculate likelihood
aux = zeros(N)
for nn=1:N
aux[nn] = exp(-0.5 * (X[:,nn]-mu)' * (X[:,nn]-mu))[1]
end
# return log-likelihood
return sum(log(aux))
end
然后检查该功能是否工作:
# Check if function works at all
X = randn(2,3) # some random data
mu = [1.0;2.0] # arbitrary mean
@show likelihood(mu,X) # works fine for me
然后,我尝试使用以下方法获得梯度:
ForwardDiff.gradient( ARG -> likelihood(ARG, X), mu)
不幸的是,这失败了,我在屏幕上看到:
错误:MethodError:转换
没有方法匹配
转换(::Type{Float64},::ForwardDiff.Dual{2,Float64})这可能有
由调用构造函数Float64(…)引起,因为类型
构造函数返回到转换方法。最接近的候选人是:打电话{T我刚被告知,这是我方面的一个粗心错误,尽管用未经训练的眼睛看有点难发现 调用零时出错:
aux = zeros(N)
将此更改为
aux = zeros(eltype(mu),N)
解决了问题。希望这对其他人有用。在进一步的调查中,我已成功地在上述代码的更简单版本中重现了此错误。我在ForwardDiff github中打开了一个问题。一旦得到响应,我也将在此处发表评论。