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

我在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

  # 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中打开了一个问题。一旦得到响应,我也将在此处发表评论。