I meet an AD problem in Flux.Tracker. Basically one cannot backprop x^a
when x
is negative, no matter whether or not a is even or odd.
Tracker.gradient((x) -> x^2, -2.0)
ERROR: DomainError with log:
-2.0 will only return a complex result if called with a complex argument. Try -2.0(Complex(x)).
Stacktrace:
[1] throw_complex_domainerror(::Float64, ::Symbol) at ./math.jl:31
[2] log(::Float64) at ./special/log.jl:285
[3] _forward at /Users/kai/.julia/packages/Flux/UHjNa/src/tracker/scalar.jl:55 [inlined]
[4] #track#1 at /Users/kai/.julia/packages/Flux/UHjNa/src/tracker/Tracker.jl:50 [inlined]
[5] track at /Users/kai/.julia/packages/Flux/UHjNa/src/tracker/Tracker.jl:50 [inlined]
[6] log at /Users/kai/.julia/packages/Flux/UHjNa/src/tracker/scalar.jl:57 [inlined]
[7] #218 at /Users/kai/.julia/packages/Flux/UHjNa/src/tracker/scalar.jl:66 [inlined]
[8] back_(::Flux.Tracker.Grads, ::Flux.Tracker.Call{getfield(Flux.Tracker, Symbol("##218#219")){Flux.Tracker.TrackedReal{Float64},Int64},Tuple{Flux.Tracker.Tracked{Float64},Nothing}}, ::Int64) at /Users/kai/.julia/packages/Flux/UHjNa/src/tracker/back.jl:103
[9] back(::Flux.Tracker.Grads, ::Flux.Tracker.Tracked{Float64}, ::Int64) at /Users/kai/.julia/packages/Flux/UHjNa/src/tracker/back.jl:118
[10] #6 at /Users/kai/.julia/packages/Flux/UHjNa/src/tracker/back.jl:131 [inlined]
[11] (::getfield(Flux.Tracker, Symbol("##9#11")){getfield(Flux.Tracker, Symbol("##6#7")){Flux.Tracker.Params,Flux.Tracker.TrackedReal{Float64}}})(::Int64) at /Users/kai/.julia/packages/Flux/UHjNa/src/tracker/back.jl:140
[12] gradient(::Function, ::Float64) at /Users/kai/.julia/packages/Flux/UHjNa/src/tracker/back.jl:152
[13] top-level scope at none:0
.
BTW ForwardDiff doesn't seem to have this problem.