У меня возникли проблемы с правильной настройкой пакета ForwardDiff в Julia. Мне удалось изолировать мою проблему в следующем фрагменте кода.Автоматическая дифференциация с ForwardDiff в Julia
Короче говоря, я определить функцию:
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
Что я делаю неправильно? Заранее спасибо.
В ходе дальнейшего расследования мне удалось воспроизвести эту ошибку в еще более простой версии вышеприведенного кода. Я открыл проблему в GIDUB ForwardDiff. Я также отправлю комментарий здесь, как только я получу ответ. – user1438310