Ich habe Probleme mit der Verwendung der ForwardDiff-Paket in Julia. Ich habe es geschafft, mein Problem in den folgenden Code zu isolieren.Automatische Differenzierung mit ForwardDiff in Julia
Kurz gesagt, definiere ich die Funktion:
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
ich dann prüfen, ob die Funktion funktioniert:
# 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
ich dann versuchen, den Gradienten zu erhalten, unter Verwendung von:
ForwardDiff.gradient(ARG -> likelihood(ARG, X), mu)
Leider schlägt das fehl und ich sehe auf meinem Bildschirm:
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
Was mache ich falsch? Danke im Voraus.
In weiteren Untersuchungen habe ich es geschafft, diesen Fehler in einer noch einfacheren Version des obigen Codes zu reproduzieren. Ich habe ein Problem im ForwardDiff Github geöffnet. Ich werde hier auch einen Kommentar schreiben, sobald ich eine Antwort bekomme. – user1438310