confused by this root finding example
Maintainer antworten meist innerhalb von 1 Tag
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 32/100
Rechercherichtung
Reproduziere die MWE-Einstiegspunkte g1, g2 und ForwardDiff.derivative mit den in der Issue gezeigten Roots-, ForwardDiff- und FiniteDiff-Aufrufen. Vergleiche, wie sich die beiden find_zero-Grenzen auf die Differentiation auswirken, und bestimme, ob die unterschiedlichen Ableitungen erwartbar sind; abgeschlossen bedeutet, die Ursache zu dokumentieren oder eine gezielte Korrektur zu identifizieren.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
I have some code which calls a root finding step, via the Roots package that I'd like to be able to differentiate. It appears that whether ForwardDiff "works" in this setting depends on some subtlety that I don't quite understand.
For an MWE, consider finding the (unique) root of the cubic function f(x, k) = (x-k)^3 which has a root at x = k. Let g1(k) = find_zero(x -> f(x, k), [k-1.0,k+1.0]) and similarly let g2(k) = find_zero(x -> f(x, k), [10.0,+10.0]). Note that for values of k between -10 to +10, g1(k) == g2(k). In this range, the only difference between g1 and g2 is that the root finding step in g1 is "aware" of the value of k to look for, via the bounds I have provided, whereas it is ignorant of them in g2. For values of k in this range, the derivatives of g1 and g2 are identical, and equal to 1.0. However, I am seeing that ForwardDiff thinks the derivative of g2 is zero, while it finds the derivative of g1 to be 1.0:
Using Roots, ForwardDiff, FiniteDiff
g0(x,k) = (x-k)^3
g1(k) = find_zero(x -> g0(x,k), [-10.0, +10.0])
g2(k) = find_zero(x -> g0(x,k), [-1.0 * k, +1.0 * k])
Julia reports that the functions are the same, and do vary with the input in the expected way:
ulia> g1(3)
3.0
julia> g2(3)
3.0
julia> g1(4)
4.0
julia> g2(4)
4.0
However, the ForwardDiff gradients are different:
julia> ForwardDiff.derivative(g1, 3.0)
0.0
julia> ForwardDiff.derivative(g2, 3.0)
1.0
Note that FiniteDiff works fine here (up to numerical approximation):
julia> FiniteDiff.finite_difference_derivative(g1, 3.0)
0.9999999999991082
julia> FiniteDiff.finite_difference_derivative(g2, 3.0)
0.9999999999991082
Thanks in advance for any suggestions the ForwardDiff team has in understanding this difference.
- Vorherrschende Sprache
- Julia
- Sterne
- 1k
- Forks
- 165
- Ø Merge
- 6 Std. 34 Min.
- Gemergte PRs (30 T.)
- 1
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/ForwardDiff.jl
-
missing floatmin, floatmax, and issubnormal for DualEvtl. vergeben @devmotion hat das vor 29 Tagen übernommen. Offen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 68/100
JuliaDiff/ForwardDiff.jl#852 · 6 Kommentare ·
Maintainer antworten meist innerhalb von 1 Tag
-
`min` does not return the minimum with respect to `isless` when values tieEvtl. vergeben @devmotion hat das vor 3 Tagen übernommen. Offen
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 55/100
JuliaDiff/ForwardDiff.jl#868 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Third-order derivatives of `x / y` are `Inf` or `NaN` for small `y`, e.g. in gradients of Laplace approximationsEvtl. vergeben @devmotion hat das vor 4 Tagen übernommen. Offen
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 65/100
JuliaDiff/ForwardDiff.jl#866 ·
Maintainer antworten meist innerhalb von 1 Tag
-
`fma` and `muladd` ignore NaN-safe modeEvtl. vergeben @devmotion hat das vor 15 Tagen übernommen. Offen
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 55/100
JuliaDiff/ForwardDiff.jl#860 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Enable NaN-safe mode by defaultEvtl. vergeben @devmotion hat das vor 17 Tagen übernommen. Offen
Schwierigkeit 5/5 Über eine Woche Anfängerfreundlichkeit 25/100
JuliaDiff/ForwardDiff.jl#857 · 1 Reaktion ·
Maintainer antworten meist innerhalb von 1 Tag
Alle Issues in JuliaDiff/ForwardDiff.jl
Ähnliche Issues
-
mul! with a Symmetric or Hermitian factor throws for a matrix view whose columns are not contiguousOffen
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
JuliaLang/LinearAlgebra.jl#1829 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
MagneticResonanceImaging/MRIReco.jl#320 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
rfordatascience/tidytuesday#1098 ·
-
ci system:windows test
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 76/100
Maintainer antworten meist innerhalb von 1 Tag
-
Single-column TKE example: boundary-layer depth description doesn't match Han & Bretherton (2019)Offen
Schwierigkeit 1/5 1-3 Stunden Anfängerfreundlichkeit 82/100
NumericalEarth/Breeze.jl#1143 ·
Maintainer antworten meist innerhalb von 1 Tag