Numerische Gradientenprüfung: Wie nah ist nah genug?

8

Ich habe ein neuronales Faltungsnetzwerk erstellt und wollte mithilfe der numerischen Gradientenprüfung überprüfen, ob meine Gradienten korrekt berechnet werden. Die Frage ist, wie nah ist nah genug?

Meine Überprüfungsfunktion spuckt nur die berechnete Ableitung, die numerisch angenäherte Ableitung, die Differenz zwischen den beiden aus und ob die beiden Werte das gleiche Vorzeichen haben (einer ist positiv und der andere ist negativ, ist ein großes Nein-Nein) Gewicht.

Das Hauptanliegen, das ich habe, ist, dass für alle vollständig verbundenen Schichten und alle Faltungsschichten mit Ausnahme der ersten die Unterschiede ähnlich aussehen - die ersten 9-13 Zeichen der beiden Zahlen stimmen überein. Das hört sich gut an, oder? Aber für Gewichte der ersten Faltungsschicht bekomme ich manchmal bis zu 12 Dezimalstellen, aber es kann auch nur 3 sein. Ist das genug oder könnte es einen möglichen Fehler geben?

Eine gute Sache zu beachten ist, dass das Vorzeichen der beiden Werte immer übereinstimmt, was gut ist, so dass das Netzwerk immer Bewegungen in die richtige Richtung ausführt, auch wenn die Größe der Bewegung etwas abweicht. Aber das ist die Frage ... gibt es eine Chance, dass es aus ist?

Frobot
quelle

Antworten:

9

Das, was ich am ehesten gesehen habe, war das Stanford UFLDL-Tutorial im Abschnitt zur Softmax-Regression . Kopieren der Schlüsselanweisung:

Die Norm der Differenz zwischen dem numerischen Gradienten und Ihrem analytischen Gradienten sollte klein sein und in der Größenordnung von .109

In Python würde der Code ungefähr so ​​aussehen:

norm(gradients - numericalGradients)/norm(gradients + numericalGradients)

Wo gradientssind Sie Ergebnisse aus der Ableitung und numericalGradientssind die angenäherten Gradienten.

cdeterman
quelle
Danke, was ist, wenn meine Verläufe in einer 2D-Array-Matrix gespeichert sind? Wie soll ich die Norm der resultierenden "Differenz" -Matrix bewerten, nachdem ich 2 Matrizen voneinander subtrahiert habe?
Kari
1
@Kari Ich würde sie zu Vektoren reduzieren und den oben gezeigten Code verwenden. Wenn Sie beispielsweise ein Numpy-Array haben, können Sie einfach die flattenMethode verwenden.
Cdeterman
7

Hintergrundtheorie, die hilfreich ist

Eine kleine Tatsache, anhand derer Sie besser verstehen können, ob eine numerische Ableitung korrekt berechnet wurde oder nicht, ist der Cauchy-Rest der Taylor-Erweiterung. Das ist,

f(x+h)=f(x)+hf(x)+h22f(ξ) für einigeξ[x,x+h]

Dies ist hilfreich, da Sie Ihre erste Ableitung wahrscheinlich durch angenähert haben

f(x)f(x+h)f(xh)2h

mit einem kleinen (ich benutze normalerweise , aber ich bin mir sicher, dass ich eines Tages auf einen Fall stoßen werde, in dem das nicht angemessen ist).h104

Nach einer kleinen Algebra können wir den Cauchy-Rest verwenden, um zu sehen, dass unsere numerische Approximation theoretisch innerhalb von von .hf(ξ),ξ[xh,x+h]f(x)

Tatsächlich können Sie es tatsächlich durch wobei und ... was äquivalent zu , .h(f(ξ1)f(ξ2))ξ1[xh,x]ξ2[x,x+h]h2f(ξ)ξ[xh,x+h]

Probleme in der Praxis

Okay, wir haben eine schöne Theorie, die den Fehler der numerischen Ableitung begrenzt. Es gibt jedoch zwei Lücken beim direkten Versuch, diese Ergebnisse zu verwenden:

1.) Wir kennen (und wollen wahrscheinlich nicht die Zeit damit verbringen, es zu approximieren)f(x)

2.) als , leidet unter numerischer Instabilitäth0f(x+h)f(xh)2h

Wenn ich also meine analytischen Ableitungen überprüfe (was möglicherweise nicht der beste Weg ist), schreibe ich die numerische Ableitungsfunktion als Funktion von . Wenn ich nicht sagen kann, ob der Unterschied zwischen der numerischen und der analytischen Ableitung auf einen Codierungsfehler oder nur auf eine numerische Approximation zurückzuführen ist, kann ich reduzieren und prüfen, ob sich meine numerische Ableitung meiner analytischen Ableitung nähert, bevor ich unter numerischer Instabilität leide (wenn dies passiert, Ihre numerischen Näherungen werden weniger konsistent, wenn kleiner wird. Beachten Sie, dass der Term quadratisch verschwinden sollte, wenn mein Fehler also ungefähr mit beträgthhhf(ξ)0.01h=104 , sollte bei wobei vorausgesetzt, die numerische Instabilität ist noch nicht eingetreten .0.0001h=105

Leider gibt es keine feste Richtlinie, um diese Dinge immer zu bestimmen. es hängt sehr davon ab, wie stabil die Funktion ist (und ich meine sowohl in Bezug auf die numerische Stabilität als auch in Bezug auf höhere Ableitungen). Aber in meinen Erfahrungen habe ich noch nie einen Fall gesehen, in dem der Fehler von nicht definitiv auf 0 ging (dh die Verwendung von ergab praktisch die gleiche Antwort wie ) zu dem Zeitpunkt, als die numerische Instabilität von .h2f(ξ)h=104h=105h0

Cliff AB
quelle
5

Weitere Informationen finden Sie in diesem Tutorial unter http://cs231n.github.io/neural-networks-3/#ensemble . Der Abschnitt "Verlaufsprüfung" ist sehr detailliert und hilfreich.

Wie von Gung vorgeschlagen, füge ich die Hauptpunkte dieses Links hinzu:

  • Verwenden Sie die Näherung , wobei .f(w+h)f(wh)2hh105

  • Überwachen Sie den Bruchteil von , wobei ist der analytische Gradient und ist der numerisch angenäherte Gradient. Normalerweise sollte der bevorzugte Bereich dieser Fraktion .|fa(w)fn(w)|max(|fa(w)|,|fn(w)|)fa(w)fn(w)<102

  • Verwenden Sie doppelte Genauigkeit anstelle von Float.

  • Denken Sie an Knicke in Aktivierungsfunktionen, z. B. wenn Sie ReLU verwenden. Wenn es gibt, muss man die Werte von und überwachen . Wenn sich diese beiden Werte auf zwei Seiten eines Knicks befinden, sollte diese Gradientenprüfung ausgeschlossen werden.x=0xhx+h

  • Verwenden Sie wenige Datenpunkte.

  • Führen Sie keine Gradientenprüfung zu Beginn des Trainingsprozesses durch.

  • Überprüfen Sie zuerst das Modell ohne Regularisierung und dann damit.

  • Schalten Sie den Ausfall und den umgekehrten Ausfall aus, wenn Sie die Verlaufsprüfung durchführen.

  • Überprüfen Sie nur zufällig einige Dimensionen.

Fengchong Wang
quelle