Zero tangents (`NoTangent`, `ZeroTangent`, `nothing`) for tracked arguments throw a `MethodError` in `@grad`/`@grad_from_chainrules`
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 84/100
Direzione di ricerca
Inizia in src/macros.jl, da _add_to_deriv!, la funzione indicata nell’issue, e leggi le sue funzioni chiamanti e i test correlati. Riproduci gli esempi forniti con @grad e @grad_from_chainrules, quindi verifica che le tangenti nulle non causino un MethodError. Il lavoro è completato quando gli esempi restituiscono i gradienti attesi e i test pertinenti passano.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
If a rule returns a zero tangent for a tracked argument, the reverse pass throws a MethodError. This affects NoTangent() and ZeroTangent() from an rrule imported with @grad_from_chainrules, and nothing from a @grad pullback.
using ReverseDiff, ChainRulesCore
f(x, y) = sum(x)
ChainRulesCore.rrule(::typeof(f), x, y) = f(x, y), Δ -> (NoTangent(), fill(Δ, size(x)), ZeroTangent())
ReverseDiff.@grad_from_chainrules f(x::ReverseDiff.TrackedArray, y::ReverseDiff.TrackedArray)
ReverseDiff.gradient((x, y) -> f(x, y), ([1.0, 2.0], [3.0, 4.0]))
ERROR: MethodError: no method matching increment_deriv!(::ReverseDiff.TrackedArray{Float64, Float64, 1, Vector{Float64}, Vector{Float64}}, ::ZeroTangent, ::Int64)
A tracked scalar fails the same way:
h(x, y) = x
ChainRulesCore.rrule(::typeof(h), x, y) = h(x, y), Δ -> (NoTangent(), Δ, NoTangent())
ReverseDiff.@grad_from_chainrules h(x::ReverseDiff.TrackedReal, y::ReverseDiff.TrackedReal)
ReverseDiff.gradient(z -> h(z[1], z[2]), [1.0, 2.0])
ERROR: MethodError: no method matching increment_deriv!(::ReverseDiff.TrackedReal{Float64, Float64, ReverseDiff.TrackedArray{…}}, ::NoTangent)
So does @grad with nothing:
g(x, y) = sum(x)
g(x::ReverseDiff.TrackedArray, y::ReverseDiff.TrackedArray) = ReverseDiff.track(g, x, y)
ReverseDiff.@grad function g(x, y)
return sum(ReverseDiff.value(x)), Δ -> (fill(Δ, size(x)), nothing)
end
ReverseDiff.gradient((x, y) -> g(x, y), ([1.0, 2.0], [3.0, 4.0]))
ERROR: MethodError: no method matching increment_deriv!(::ReverseDiff.TrackedArray{Float64, Float64, 1, Vector{Float64}, Vector{Float64}}, ::Nothing, ::Int64)
Expected: ([1.0, 1.0], [0.0, 0.0]) and [1.0, 0.0]. ChainRules uses NoTangent()/ZeroTangent() routinely for arguments a function doesn't depend on, so any such rule breaks as soon as that argument happens to be tracked.
Cause: _add_to_deriv! unthunks thunks but passes every other tangent straight to increment_deriv!, which only accepts Reals and AbstractArrays. AbstractZero (and nothing for @grad) should be a no-op.
ReverseDiff master (b796032, v1.18.4), Julia 1.13.1.
- Lingua principale
- Julia
- Stelle
- 396
- Fork
- 61
- Merge medio
- 23h 18m
- PR unite (30g)
- 16
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di JuliaDiff/ReverseDiff.jl
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
JuliaDiff/ReverseDiff.jl#318 ·
I maintainer di solito rispondono entro 1 giorno
-
`@grad`/`@grad_from_chainrules` silently reuse a tangent if a pullback returns too few tangentsAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
JuliaDiff/ReverseDiff.jl#315 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 56/100
JuliaDiff/ReverseDiff.jl#321 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 72/100
JuliaDiff/ReverseDiff.jl#320 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 68/100
JuliaDiff/ReverseDiff.jl#319 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di JuliaDiff/ReverseDiff.jl
Issue simili
-
Chains resumed from `initial_state` take `num_warmup + 1` warm-up stepsForse già presa @thevolatilebit l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 80/100
TuringLang/AbstractMCMC.jl#220 ·
-
found-by-agent
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
exanauts/SparseDirectSolver.jl#92 ·
I maintainer di solito rispondono entro 1 giorno
-
`inv` of a dense matrix fails for arrays whose `parent` is not an array of the same kindForse già presa @devmotion l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
JuliaLang/LinearAlgebra.jl#1740 ·
I maintainer di solito rispondono entro 2 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 90/100
NumericalEarth/Breeze.jl#1051 ·
I maintainer di solito rispondono entro 1 giorno