Use ChainRules for operators
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 25/100
- Tipo di issue
- Refactoring
- Chiarezza
- Da chiarire
- Stato di attività
- Ferma
- Stack tecnologico
- julia
- Ambito
- machine-learning
Direzione di ricerca
Inizia leggendo src/Nonlinear/univariate_expressions_generator.jl e il dispatch degli operatori attorno a src/Nonlinear/operators.jl:570-582. Traccia il modo in cui ReverseAD rappresenta gli operatori classici, registrati e definiti dall’utente, quindi confronta questo flusso con il dispatch e il fallback proposti nello stile di ChainRules. Il lavoro sarà completato quando saranno disponibili un design deciso, una gestione aggiornata degli operatori e prove che i casi supportati evitano gli attuali problemi di instabilità dei tipi.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Currently, the approach in ReverseAD is to generate the symbolic expression of the first and second-order derivatives for classical univariate functions using Calculus
https://github.com/jump-dev/MathOptInterface.jl/blob/100eab2e669e73689e1dc214391d97c24402e35c/src/Nonlinear/univariate_expressions_generator.jl
Then, given a representation of the operator as an Int, we do an hard-coded binary search to evaluate a O(log(n)) number of Int comparison instead of a O(n) number of comparison:
https://github.com/jump-dev/MathOptInterface.jl/blob/100eab2e669e73689e1dc214391d97c24402e35c/src/Nonlinear/operators.jl#L570-L582
I'm wondering whether we could get closer to ChainRules instead like other Julia AD framework.
The naive way to do this would be
op = :tanh
f = eval(op)
value_and_derivative(f, 1)
The issue is that, because the value of op is discovered at run-time, the type of f is type-unstable.
But we can use the same trick with the if-else and do
if op == :tanh
value_and_derivative(tanh, x)
elseif op == :tan
value_and_derivative(tan, x)
elseif ...
else
value_and_derivative(eval(op), x)
end
Again, we can do a binary search instead of just a list of if-else.
So, for a fixed number of symbols, we avoid the type-instability thanks to the if-else and we have a fallback for the other ones with the eval.
That would also mean that for registered functions, we need to implement a method and just rely on multiple dispatch instead of adding an operators to the list of user-defined operators, user-defined operators already trigger a type-instability when they are called anyway.
- Lingua principale
- Julia
- Stelle
- 6
- Fork
- 0
- Merge medio
- 6g 22h
- PR unite (30g)
- 3
Preparare l'ambiente
Non abbiamo ancora controllato i file di configurazione di questo progetto. 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 blegat/ArrayDiff.jl
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
blegat/ArrayDiff.jl#83 ·
-
Building matrixAperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
blegat/ArrayDiff.jl#13 ·
Tutte le issue di blegat/ArrayDiff.jl
Issue simili
-
CPU `∇maxpool` sends the gradient to a non-maximal element when another is within `≈` of the maxAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 86/100
I maintainer di solito rispondono entro 1 giorno
-
convenience question
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
JuliaPhysics/SolidStateDetectors.jl#648 ·
I maintainer di solito rispondono entro 1 giorno
-
Register ServerMetrics.jlAperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100