rrule for casting LinearAlgebra.QRCompactWYQ into a Matrix
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
Línea de trabajo
Comienza con la reproducción usando Matrix(Q) y Q de una factorización qr incompleta; después inspecciona src/rulesets/Base/array.jl y la rrule existente de Matrix. Traza cómo ProjectTo y Array_pullback manejan el gradiente entrante de tamaño (6,4) frente al tamaño (6,6) de QRCompactWYQ. Se considera terminado cuando el pase hacia atrás para Matrix(Q) se completa sin DimensionMismatch y las llamadas de gradiente existentes siguen funcionando.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
I'm trying to work with the Q matrix from a qr-factorization within Zygote. In an incomplete QR factorization for m>=n,
the QRCompactWYQMatrix Q has size=(m,m) but only the first n columns are relevant: https://docs.julialang.org/en/v1/stdlib/LinearAlgebra/#LinearAlgebra.qr
Using this in Zygote behaves as follows:
using LinearAlgebra
using Zygote
using Random
Random.seed!(1234)
V = rand(Float32, (6,4))
Q, _ = qr(V)
Zygote.gradient(A -> sum(A), Matrix(Q))
Zygote.gradient(A -> sum(A), Q)
Zygote.gradient(A -> sum(Matrix(A)), Q)
ERROR: LoadError: DimensionMismatch("variable with size(x) == (6, 6) cannot have a gradient with size(dx) == (6, 4)")
Stacktrace:
[1] (::ChainRulesCore.ProjectTo{AbstractArray, NamedTuple{(:element, :axes), Tuple{ChainRulesCore.ProjectTo{Float32, NamedTuple{(), Tuple{}}}, Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}}}})(dx::FillArrays.Fill{Float32, 2, Tuple{Base.OneTo{Int64}, Base.OneTo{Int64}}})
@ ChainRulesCore ~/.julia/packages/ChainRulesCore/Voykb/src/projection.jl:209
[2] Array_pullback
@ ~/.julia/packages/ChainRules/qd40H/src/rulesets/Base/array.jl:9 [inlined]
[3] ZBack
@ ~/.julia/packages/Zygote/nsu1Y/src/compiler/chainrules.jl:140 [inlined]
[4] Pullback
@ ~/source/gpuplayground/src/qr_project_mwe.jl:16 [inlined]
[5] (::Zygote.var"#50#51"{typeof(∂(#5))})(Δ::Float32)
@ Zygote ~/.julia/packages/Zygote/nsu1Y/src/compiler/interface.jl:41
[6] gradient(f::Function, args::LinearAlgebra.QRCompactWYQ{Float32, Matrix{Float32}})
@ Zygote ~/.julia/packages/Zygote/nsu1Y/src/compiler/interface.jl:76
[7] top-level scope
The first two calls to gradient work fine. The last call fails because the incoming gradient is size=(6,4) but the matrix is of size=(6,6).
I tried modifying the rrule from here, https://github.com/JuliaDiff/ChainRules.jl/blob/master/src/rulesets/Base/array.jl line 7 like this:
function ChainRules.rrule(::typeof(Matrix), x::LinearAlgebra.QRCompactWYQ)
project_x = ProjectTo(x)
Array_pullback(ȳ) = (NoTangent(), project_x(ȳ))
return T(x), Array_pullback
end
but that didn't work. Is there a good way of making calls to Matrix(Q) in a backwards pass?
@mcabbott
- Lenguaje dominante
- Julia
- Estrellas
- 475
- Forks
- 98
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de JuliaDiff/ChainRules.jl
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
JuliaDiff/ChainRules.jl#844 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 55/100
JuliaDiff/ChainRules.jl#818 ·
-
refactoring
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
JuliaDiff/ChainRules.jl#815 ·
-
bug
Dificultad 3/5 1-2 días Aptitud para principiantes 45/100
JuliaDiff/ChainRules.jl#810 ·
-
stack overflow issueAbierto
Dificultad 4/5 3-5 días Aptitud para principiantes 30/100
JuliaDiff/ChainRules.jl#809 ·
Todos los issues de JuliaDiff/ChainRules.jl
Issues similares
-
Dificultad 2/5 Menos de una hora Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
CliMA/ClimaAtmos.jl#4891 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
tagbot-manual
Dificultad 1/5 Menos de una hora Aptitud para principiantes 75/100
tshort/StaticCompiler.jl#191 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
SciML/SciMLSensitivity.jl#1703 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
JuliaGPU/GPUCompiler.jl#1008 ·
Los mantenedores suelen responder en 1 día