Gradients with respect to dictionaries don't work
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 35/100
- Issue-Typ
- Bug
- Klarheit
- Größtenteils klar
- Aktivitätsstatus
- Veraltet
- Tech-Stack
- julia
- Bereich
- machine-learning
Rechercherichtung
Beginne damit, beide Dictionary-Gradient-Beispiele aus dem Issue zu reproduzieren, untersuche dann die gemeldeten Diffractor-Stack-Frames in src/stage1/generated.jl und den Tangentenfehler von ChainRulesCore. Verfolge, wie die Dictionary-Konstruktion und der Lookup differenziert werden; abgeschlossen ist die Aufgabe, wenn beide Beispiele fehlerfrei ausgeführt werden und Dictionary-Gradienten zurückgeben, die dem demonstrierten Verhalten von Zygote entsprechen.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
In Julia 1.7.3:
julia> Zygote.gradient(x -> x["foo"]["bar"]^2, Dict("foo" => Dict("bar" => 5)))
(Dict{Any, Any}("foo" => Dict{Any, Any}("bar" => 10)),)
julia> Diffractor.gradient(x -> x["foo"]["bar"]^2, Dict("foo" => Dict("bar" => 5)))
ERROR: ArgumentError: Tangent for the primal Dict{String, Int64} should be backed by a AbstractDict type, not by NamedTuple{(:vals,), Tuple{Vector{Int64}}}.
Stacktrace:
[1] _backing_error(P::Type, G::Type, E::Type)
@ ChainRulesCore C:\Users\anhin\.julia\packages\ChainRulesCore\ctmSK\src\tangent_types\tangent.jl:62
[2] ChainRulesCore.Tangent{Dict{String, Int64}, NamedTuple{(:vals,), Tuple{Vector{Int64}}}}(backing::NamedTuple{(:vals,), Tuple{Vector{Int64}}})
@ ChainRulesCore C:\Users\anhin\.julia\packages\ChainRulesCore\ctmSK\src\tangent_types\tangent.jl:33
[3] (::Diffractor.var"#162#164"{Symbol, DataType})(Δ::Vector{Int64})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:309
[4] (::Diffractor.EvenOddOdd{1, 1, Diffractor.var"#162#164"{Symbol, DataType}, Diffractor.var"#163#165"{Symbol}})(Δ::Vector{Int64})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:289
[5] ∂⃖¹₁getproperty
@ .\none:1
and
julia> pars = Dict(:x=>0f0, "y"=>4f0, 8=>-3f0)
Dict{Any, Float32} with 3 entries:
"y" => 4.0
8 => -3.0
:x => 0.0
julia> function my_map(my_f, my_dict)
new_dict = Dict()
for k in keys(my_dict)
new_dict[k] = my_f(my_dict[k])
end
new_dict
end
my_map (generic function with 1 method)
julia> function my_sum(my_dict)
s = 0f0
for k in keys(my_dict)
s += my_dict[k]
end
s
end
my_sum (generic function with 1 method)
julia> my_sum(my_map(x->x^2, pars))
25.0f0
julia> Zygote.gradient(pars -> my_sum(my_map(x->x^2, pars)), pars)
(Dict{Any, Any}("y" => 8.0f0, 8 => -6.0f0, :x => 0.0f0),)
julia> Diffractor.gradient(pars -> my_sum(my_map(x->x^2, pars)), pars)
ERROR: MethodError: no method matching (::Diffractor.∂⃖recurse{1})(::typeof(Core.sizeof), ::Int64)
Closest candidates are:
(::Diffractor.∂⃖recurse)(::Any...) at C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:406
Stacktrace:
[1] macro expansion
@ C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:0 [inlined]
[2] (::Diffractor.∂⃖recurse{1})(::typeof(Core.sizeof), ::Int64)
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:415
[3] (::∂⃖{1})(f::typeof(Core.sizeof), args::Int64)
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:216
[4] is_top_bit_set
@ .\boot.jl:616 [inlined]
[5] (::∂⃖{1})(f::typeof(Core.is_top_bit_set), args::Int64)
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:216
[6] check_top_bit
@ .\boot.jl:626 [inlined]
[7] (::Diffractor.∂⃖recurse{1})(::typeof(Core.check_top_bit), ::Type{UInt64}, ::Int64)
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:0
[8] (::∂⃖{1})(::typeof(Core.check_top_bit), ::Type, ::Vararg{Any})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:216
[9] toUInt64
@ .\boot.jl:737 [inlined]
[10] (::Diffractor.∂⃖recurse{1})(::typeof(Core.toUInt64), ::Int64)
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:0
[11] (::∂⃖{1})(f::typeof(Core.toUInt64), args::Int64)
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:216
[12] UInt64
@ .\boot.jl:767 [inlined]
[13] (::Diffractor.∂⃖recurse{1})(::Type{UInt64}, ::Int64)
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:0
[14] (::∂⃖{1})(f::Type{UInt64}, args::Int64)
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:216
[15] convert
@ .\number.jl:7 [inlined]
[16] (::Diffractor.∂⃖recurse{1})(::typeof(convert), ::Type{UInt64}, ::Int64)
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:0
[17] (::∂⃖{1})(::typeof(convert), ::Type, ::Vararg{Any})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:216
[18] Dict
@ .\dict.jl:90 [inlined]
[19] (::Diffractor.∂⃖recurse{1})(args::Type{Dict{Any, Any}})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:0
[20] (::∂⃖{1})(::Type{Dict{Any, Any}})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:216
[21] Dict
@ .\dict.jl:118 [inlined]
[22] (::Diffractor.∂⃖recurse{1})(args::Type{Dict})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:0
[23] (::∂⃖{1})(::Type{Dict})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:216
[24] my_map
@ .\REPL[20]:2 [inlined]
[25] (::Diffractor.∂⃖recurse{1})(::typeof(my_map), ::var"#14#16", ::Dict{Any, Float32})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:0
[26] (::∂⃖{1})(::typeof(my_map), ::Function, ::Vararg{Any})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:216
[27] #13
@ .\REPL[24]:1 [inlined]
[28] (::Diffractor.∂⃖recurse{1})(::var"#13#15", ::Dict{Any, Float32})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:0
[29] (::∂⃖{1})(f::var"#13#15", args::Dict{Any, Float32})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\stage1\generated.jl:216
[30] ∂⃖(::Function, ::Vararg{Any})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\interface.jl:25
[31] (::Diffractor.∇{var"#13#15"})(args::Dict{Any, Float32})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\interface.jl:123
[32] Diffractor.∇(::Function, ::Dict{Any, Float32})
@ Diffractor C:\Users\anhin\.julia\packages\Diffractor\WrKGJ\src\interface.jl:130
[33] top-level scope
@ REPL[24]:1
- Vorherrschende Sprache
- Julia
- Sterne
- 453
- Forks
- 33
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Entwicklungsumgebung
Dieses Projekt bietet weder Dev-Container noch Dockerfile noch Beitragsleitfaden – die Einrichtung liegt bei Ihnen. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus JuliaDiff/Diffractor.jl
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 25/100
JuliaDiff/Diffractor.jl#302 · 2 Kommentare ·
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 52/100
JuliaDiff/Diffractor.jl#294 ·
-
bug
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
JuliaDiff/Diffractor.jl#293 ·
-
bug
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 35/100
JuliaDiff/Diffractor.jl#290 · 8 Kommentare ·
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 35/100
JuliaDiff/Diffractor.jl#280 · 1 Kommentar ·
Alle Issues in JuliaDiff/Diffractor.jl
Ähnliche Issues
-
enhancement good first issue help wanted
Schwierigkeit 2/5 Ein halber Tag Anfängerfreundlichkeit 82/100
-
Precompilation fails on Julia 1.14 nightly: HessenbergQ lmul! methods overwrite LinearAlgebra'sOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
JuliaLinearAlgebra/GenericLinearAlgebra.jl#183 · 1 Kommentar ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
JuliaGPU/KernelAbstractions.jl#897 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
oscar-system/GAP.jl#1455 ·
Maintainer antworten meist innerhalb von 1 Tag