Errror in accumulate when I have one argument as a tuple
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
調査の方向性
Julia 1.10 の例を再現し、rulesets/Base/mapreduce.jl の accumulate の逆方向ルールと、ChainRulesCore の structural_tangent.jl における接線の構築を調査します。tuple-state の例で勾配計算が成功し、その失敗をカバーするリグレッションテストが追加されれば作業完了です。
索引モデルが issue の本文から書いたものです。
説明
Hello,
I have been for educational purposes implementing RNN by hand and wanted to be fancy and use accumulate instead of recursion or for rule. But I run into an error, when one of the operands in accumulate is tuple.
A have carved out an MWE, which would look like this
using Zygote
x = [randn(Float32, 2) for i in 1:3]
h = randn(Float32, 2)
function f(α, h, x)
o = accumulate(x, init = h) do h, x
α * h + x
end
end
function g(α, h, x)
o = accumulate(x, init = (h, x[1])) do (h,_),x
(α * h + x, x)
end
first.(o)
end
gradient(α -> sum(sum(g(α, h, x))), 1f0)[1]
gradient(α -> sum(sum(f(α, h, x))), 1f0)[1]
While computing gradient of f succeeds, computing gradient of g crashes with
julia> gradient(α -> sum(sum(g(α, h, x))), 1f0)[1]
ERROR: MethodError: no method matching construct(::Type{Any}, ::Tuple{FillArrays.Fill{Float32, 1, Tuple{Base.OneTo{Int64}}}, ChainRulesCore.NoTangent})
Closest candidates are:
construct(::Type{T}, ::T) where T<:Tuple
@ ChainRulesCore ~/.julia/packages/ChainRulesCore/6DiyF/src/tangent_types/structural_tangent.jl:251
construct(::Type{T}, ::NamedTuple{L}) where {T, L}
@ ChainRulesCore ~/.julia/packages/ChainRulesCore/6DiyF/src/tangent_types/structural_tangent.jl:235
Stacktrace:
[1] +(a::ChainRulesCore.Tangent{Tuple{…}, Tuple{…}}, d::ChainRulesCore.Tangent{Any, Tuple{…}})
@ ChainRulesCore ~/.julia/packages/ChainRulesCore/6DiyF/src/tangent_arithmetic.jl:142
[2] (::ChainRules.var"#1699#1702")(::Tuple{…}, ::Tuple{…})
@ ChainRules ~/.julia/packages/ChainRules/FLsQJ/src/rulesets/Base/mapreduce.jl:541
[3] iterate(itr::Base.Iterators.Accumulate)
@ Base.Iterators ./iterators.jl:589 [inlined]
[4] collect_to!
@ ./array.jl:892 [inlined]
[5] collect_to_with_first!
@ ./array.jl:870 [inlined]
[6] _collect(c::Any, itr::Any, ::Base.EltypeUnknown, isz::Union{Base.HasLength, Base.HasShape})
@ Base ./array.jl:864 [inlined]
[7] collect(itr::Base.Generator)
@ Base ./array.jl:759 [inlined]
[8] #accumulate#893
@ ./accumulate.jl:281 [inlined]
[9] accumulate
@ ./accumulate.jl:278 [inlined]
[10] (::ChainRules.var"#decumulate#1701"{…})(dy::Vector{…})
@ ChainRules ~/.julia/packages/ChainRules/FLsQJ/src/rulesets/Base/mapreduce.jl:540
[11] ZBack
@ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/chainrules.jl:211 [inlined]
[12] (::Zygote.var"#kw_zpullback#53"{ChainRules.var"#decumulate#1701"{…}})(dy::Vector{Tuple{…}})
@ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/chainrules.jl:237
[13] g
@ ./REPL[43]:2 [inlined]
[14] (::Zygote.Pullback{Tuple{…}, Tuple{…}})(Δ::FillArrays.Fill{FillArrays.Fill{…}, 1, Tuple{…}})
@ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/interface2.jl:0
[15] #53
@ ./REPL[44]:1 [inlined]
[16] (::Zygote.Pullback{Tuple{…}, Tuple{…}})(Δ::Float32)
@ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/interface2.jl:0
[17] (::Zygote.var"#75#76"{Zygote.Pullback{Tuple{…}, Tuple{…}}})(Δ::Float32)
@ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/interface.jl:91
[18] gradient(f::Function, args::Float32)
@ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/interface.jl:148
[19] top-level scope
@ REPL[44]:1
Some type information was truncated. Use `show(err)` to see complete types.
Julia and environment
julia> versioninfo()
Julia Version 1.10.0-rc2
Commit dbb9c46795b (2023-12-03 15:25 UTC)
Build Info:
Official https://julialang.org/ release
Platform Info:
OS: macOS (x86_64-apple-darwin22.4.0)
CPU: 8 × Intel(R) Core(TM) i5-8279U CPU @ 2.40GHz
WORD_SIZE: 64
LIBM: libopenlibm
LLVM: libLLVM-15.0.7 (ORCJIT, skylake)
Threads: 1 on 8 virtual cores
(tmp) pkg> st
Status `/private/tmp/Project.toml`
[082447d4] ChainRules v1.63.0
[d360d2e6] ChainRulesCore v1.21.1
[26cc04aa] FiniteDifferences v0.12.31
[587475ba] Flux v0.14.11
[3bd65402] Optimisers v0.3.2
[eeda0dda] SafeTensors v1.0.0
[2913bbd2] StatsBase v0.34.2
[e88e6eb3] Zygote v0.6.69
Thanks for help
- 主要言語
- Julia
- スター
- 267
- フォーク
- 66
- 平均マージ
- 1日 1時間
- マージ済み PR(30日)
- 9
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
JuliaDiff/ChainRulesCore.jl のほかの issue
-
難易度 4/5 3〜5日 初心者へのやさしさ 28/100
JuliaDiff/ChainRulesCore.jl#712 ·
メンテナーはふだん 1 日以内に返信
-
variable scope of `@thunk`対応中かも @chengchingwen が 621 日前に担当しました。 オープン
難易度 4/5 3〜5日 初心者へのやさしさ 32/100
JuliaDiff/ChainRulesCore.jl#684 ·
メンテナーはふだん 1 日以内に返信
-
good first issue Structural Tangent
難易度 2/5 1〜3時間 初心者へのやさしさ 55/100
JuliaDiff/ChainRulesCore.jl#669 ·
メンテナーはふだん 1 日以内に返信
-
難易度 5/5 1週間以上 初心者へのやさしさ 20/100
JuliaDiff/ChainRulesCore.jl#668 · コメント 6 件 ·
メンテナーはふだん 1 日以内に返信
-
breaking
難易度 3/5 1〜2日 初心者へのやさしさ 35/100
JuliaDiff/ChainRulesCore.jl#665 ·
メンテナーはふだん 1 日以内に返信
JuliaDiff/ChainRulesCore.jl の issue をすべて見る
似ている issue
-
backport 1.14 GC
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
JuliaDiff/TaylorSeries.jl#445 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 84/100
SciML/PETScDiffEq.jl#362 ·
メンテナーはふだん 1 日以内に返信
-
dependencies
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
Open-MBEE/OpenSysML#1951 · コメント 3 件 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
🕷️ bug
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
CliMA/ClimaSeaIce.jl#203 ·
メンテナーはふだん 3 日以内に返信