在 Julia 中使用 ForwardDiff 进行自动微分
Automatic differentiation with ForwardDiff in Julia
我在 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)
不幸的是,这失败了,我在屏幕上看到:
ERROR: MethodError: convert
has no method matching
convert(::Type{Float64}, ::ForwardDiff.Dual{2,Float64}) This may have
arisen from a call to the constructor Float64(...), since type
constructors fall back to convert methods. Closest candidates are:
call{T<:AbstractFloat}(::Type{T<:AbstractFloat}, ::Real,
::RoundingMode{T}) call{T}(::Type{T}, ::Any)
convert(::Type{Float64}, ::Int8) ... in likelihood at none:10 in
anonymous at none:1
我做错了什么?提前谢谢。
我刚刚被告知这是我这边粗心的错误,尽管对于未经训练的人来说有点难以发现。
调用 zeros 时出错:
aux = zeros(N)
将其更改为
aux = zeros(eltype(mu),N)
问题解决。希望这对其他人有用。
我在 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)
不幸的是,这失败了,我在屏幕上看到:
ERROR: MethodError:
convert
has no method matching convert(::Type{Float64}, ::ForwardDiff.Dual{2,Float64}) This may have arisen from a call to the constructor Float64(...), since type constructors fall back to convert methods. Closest candidates are:
call{T<:AbstractFloat}(::Type{T<:AbstractFloat}, ::Real, ::RoundingMode{T}) call{T}(::Type{T}, ::Any)
convert(::Type{Float64}, ::Int8) ... in likelihood at none:10 in anonymous at none:1
我做错了什么?提前谢谢。
我刚刚被告知这是我这边粗心的错误,尽管对于未经训练的人来说有点难以发现。
调用 zeros 时出错:
aux = zeros(N)
将其更改为
aux = zeros(eltype(mu),N)
问题解决。希望这对其他人有用。