GNNLux GATConv/GATv2Conv initialize the attention vector `a` without the setup rng, so it's identical for every seed
I maintainer di solito rispondono entro 2 giorni
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 76/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- julia
- Ambito
- machine-learning
Direzione di ricerca
La issue indica GNNLux/src/layers/conv.jl, agli inizializzatori GATConv e GATv2Conv, intorno alle righe 901 e 1058. Leggi quei costruttori e confronta come gli altri layer di GNNLux passano l’RNG di setup a init_weight; l’esempio minimo della issue mostra come verificare il comportamento con seed diverse e con un inizializzatore che usa solo un RNG. Il lavoro è completato quando entrambi i vettori di attenzione usano l’RNG fornito e l’esempio non segnala più vettori uguali tra seed diverse.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
In GNNLux, GATConv and GATv2Conv create the attention parameter a without passing the rng given to initialparameters:
a = l.init_weight(ein > 0 ? 3out : 2out, l.heads) # GATConv
a = l.init_weight(out, l.heads) # GATv2Conv
With the default glorot_uniform, the rng-less WeightInitializers method falls back to its internal fixed Xoshiro(1234), so a comes out the same no matter which rng is passed to Lux.setup. Every GAT layer with the same shape therefore starts with an identical attention vector, and changing the seed (e.g. for multiple runs or an ensemble) doesn't change it. A custom init_weight that only has an (rng, dims...) method would also fail here with a MethodError.
Minimal example
using GNNLux, Lux, Random
for L in (GATConv(3 => 4; heads = 2), GATv2Conv(3 => 4; heads = 2))
p0 = Lux.setup(Xoshiro(0), L)[1]
p1 = Lux.setup(Xoshiro(1), L)[1]
println(nameof(typeof(L)), ": a equal across seeds = ", p0.a == p1.a,
", first Dense weight equal across seeds = ", first(values(p0)).weight == first(values(p1)).weight)
end
# init_weight is called without an rng for `a`
calls = Any[]
myinit(rng::AbstractRNG, dims::Integer...) = (push!(calls, (typeof(rng), dims)); zeros(Float32, dims...))
myinit(dims::Integer...) = (push!(calls, ("no rng", dims)); zeros(Float32, dims...))
Lux.setup(Xoshiro(0), GATv2Conv(3 => 4; heads = 2, init_weight = myinit))
println(calls)
Output (Julia 1.13.3, GNNLux 0.3.0, Lux 1.31.6, WeightInitializers 1.3.5, CPU):
GATConv: a equal across seeds = true, first Dense weight equal across seeds = false
GATv2Conv: a equal across seeds = true, first Dense weight equal across seeds = false
Any[(Xoshiro, (8, 3)), (Xoshiro, (8, 3)), ("no rng", (4, 2))]
The Dense sublayers react to the seed, but a doesn't. The two lines above are unchanged on current master (54025c6), so I expect the same behaviour there, though I ran the example against the registered 0.3.0.
Expected
a should be drawn from the rng passed to initialparameters, i.e. l.init_weight(rng, ...), like the other GNNLux layers (GCNConv, GMMConv, NNConv, ...).
Related (smaller)
In GNNLux GATConv, dense_x and dense_e are built as Dense(... , use_bias = false) without passing init_weight (L888-889), so a custom init_weight only affects a. GATv2Conv passes init_weight to its dense_i/dense_j/dense_e. Happy to split this into a separate issue if you prefer.
- Lingua principale
- Julia
- Stelle
- 312
- Fork
- 76
- Merge medio
- 2g 19h
- PR unite (30g)
- 13
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 JuliaGraphs/GraphNeuralNetworks.jl
-
gnngraphs
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
JuliaGraphs/GraphNeuralNetworks.jl#733 ·
I maintainer di solito rispondono entro 2 giorni
-
maintainance
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
JuliaGraphs/GraphNeuralNetworks.jl#725 ·
I maintainer di solito rispondono entro 2 giorni
-
GCNConv fails to compile with Reactant - MethodErrorForse già presa @DHAKED440 l’ha presa 8 giorni fa. Apertagnnlib lux
Difficoltà 3/5 1-2 giorni Idoneità per principianti 68/100
JuliaGraphs/GraphNeuralNetworks.jl#710 ·
I maintainer di solito rispondono entro 2 giorni
-
flux gnngraphs gnnlib
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
JuliaGraphs/GraphNeuralNetworks.jl#702 · 1 commento ·
I maintainer di solito rispondono entro 2 giorni
-
maintainance
Difficoltà 5/5 Più di una settimana Idoneità per principianti 20/100
JuliaGraphs/GraphNeuralNetworks.jl#655 · 12 commenti ·
I maintainer di solito rispondono entro 2 giorni
Tutte le issue di JuliaGraphs/GraphNeuralNetworks.jl
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
MagneticResonanceImaging/MRIReco.jl#366 ·
I maintainer di solito rispondono entro 3 giorni
-
`AdamW` gives `NaN` for zero-gradient entries of `Float16` parameters (epsilon underflows to 0)Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 79/100
FluxML/Optimisers.jl#253 ·
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
I maintainer di solito rispondono entro 1 giorno
-
`poissonians` is not public, unlike `brownians` and `jumps`Forse già presa @isaacsas l’ha presa oggi. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 86/100
SciML/ModelingToolkit.jl#5389 ·
I maintainer di solito rispondono entro 2 giorni
-
`lower_throw!` treats any function whose name contains `jl_error` etc. as a throw (kernel becomes a trap / segfault)Forse già presa @sasmith-14 l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
JuliaGPU/GPUCompiler.jl#1088 ·
I maintainer di solito rispondono entro 1 giorno