Häufige Ursachen von nans während der Ausbildung
Habe ich bemerkt, dass ein häufiges auftreten während der Ausbildung NAN
s eingeführt.
Oft scheint es eingeführt werden durch GEWICHTE im inneren-Produkt - /voll-angeschlossen oder convolution-Schichten Sprengung.
Ist, dass dies geschieht, weil die Gradienten-Berechnung ist die Sprengung? Oder ist es wegen des Gewichts der Initialisierung (wenn ja, warum wird das Gewicht der Initialisierung haben diese Wirkung)? Oder ist es wahrscheinlich verursacht durch die Art der input-Daten?
Die übergeordnete Frage ist hier einfach: Was ist der häufigste Grund für NANs zu, die während der Ausbildung? Und zweitens, was sind einige der Methoden für die Bekämpfung dieser (und warum Sie funktionieren)?
Ich glaube nicht, dass diese Frage matlab-spezifisch, sondern eher
caffe
im Zusammenhang.InformationsquelleAutor Aidan Gomez | 2015-11-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gute Frage.
Ich stieß auf dieses Phänomen mehrfach. Hier sind meine Beobachtungen:
Gradient blow-up
Grund: großen Steigungen werfen den Lernprozess off-track.
, Was Sie erwarten sollten: Blick auf die runtime anmelden, sollten Sie sich über den Verlust der Werte pro iteration. Sie werden bemerken, dass der Verlust beginnt zu wachsen deutlich von iteration zu iteration, schließlich wird der Verlust zu groß ist, um dargestellt werden, eine floating point-variable und es wird
nan
.Was du tun kannst: Abnahme der
base_lr
(in den solver.prototxt) um eine Größenordnung (mindestens). Wenn Sie mehrere Verlust-Schichten, Sie sollten überprüfen Sie das log, um zu sehen, welche Ebene ist verantwortlich für den Verlauf sprengen und verringern dieloss_weight
(in train_val.prototxt) für eine bestimmte Schicht, die anstelle des Allgemeinenbase_lr
.Bad learning rate policy und params
Grund: caffe schlägt zur Berechnung eines gültigen learning rate und bekommt
'inf'
oder'nan'
statt, diese ungültigen rate multipliziert alle updates und damit ungültig alle Parameter., Was Sie erwarten sollten: Blick auf die Laufzeitumgebung melden, Sie sollten sehen, dass die learning-rate selbst wird
'nan'
zum Beispiel:Was du tun kannst: fix alle Parameter, die die learning-rate in Ihrem
'solver.prototxt'
- Datei.Zum Beispiel, wenn Sie
lr_policy: "poly"
und Sie vergessen, zu definierenmax_iter
parameter, Sie werden am Ende mitlr = nan
...Für weitere Informationen über die learning-rate im caffe, siehe dieser thread.
Fehlerhafte Verlust-Funktion
Grund: Manchmal ist die Berechnung der Verluste in den Verlust Schichten Ursachen
nan
s zu erscheinen. Zum Beispiel, die FütterungInfogainLoss
layer mit nicht-normalisierten Werte mithilfe von benutzerdefinierten Verlust Schicht mit bugs, etc., Was Sie erwarten sollten: Blick auf die Laufzeit-Protokoll werden Sie wahrscheinlich nicht bemerken, dass etwas ungewöhnliches: Verlust verringert sich allmählich, und plötzlich ein
nan
erscheint.Was du tun kannst: Sehen, ob Sie den Fehler reproduzieren können, hinzufügen Ausdruck um den Verlust Schicht und Debuggen den Fehler.
Beispiel: Einmal habe ich eine Verlust, normalisiert sich die Strafe durch die Häufigkeit der Bezeichnung auftreten, die in einem batch. Es ist einfach so passiert, dass, wenn man von der Ausbildung Etiketten, die nicht in der batch überhaupt - der Verlust berechnet, produziert
nan
s. In diesem Fall arbeiten mit ausreichend großen Chargen (mit Bezug auf die Anzahl der Etiketten in dem Satz) war genug, um diesen Fehler zu vermeiden.Fehlerhafte Eingabe
Grund: Sie haben einen Eingang mit
nan
!, Was Sie erwarten sollten: sobald der Prozess des Lernens "trifft" diese fehlerhafte Eingabe - Ausgabe wird
nan
. Blick auf die Laufzeit-Protokoll werden Sie wahrscheinlich nicht bemerken, dass etwas ungewöhnliches: Verlust verringert sich allmählich, und plötzlich einnan
erscheint.Was du tun kannst: re-bauen Sie Ihre Eingabe-datasets (lmdb/leveldn/im HDF5...) stellen Sie sicher, dass Sie nicht haben schlechte Bild-Dateien in Ihrem Trainings - /Validierungsdaten. Für debug-Sie bauen ein einfaches Netz, das Lesen der input-Schicht, hat eine dummy-Verlust oben drauf und zieht sich durch alle Eingänge: wenn einer von Ihnen defekt ist, das dummy-net sollte auch produzieren
nan
.Schrittlänge größer als kernel-Größe in
"Pooling"
SchichtFür einige Grund, die Wahl
stride
>kernel_size
für eine Bündelung der Resultate können mitnan
s. Zum Beispiel:Ergebnisse mit
nan
s iny
.Instabilitäten in
"BatchNorm"
Es wurde berichtet, dass unter bestimmten Einstellungen
"BatchNorm"
Ebene möglicherweise, Ausgabenan
s aufgrund von numerischen Instabilitäten.Diese Problem wuchs in bvlc/caffe und PR #5136 versucht, es zu beheben.
Kürzlich, wurde mir bewusst,
debug_info
Flagge: Einstellungdebug_info: true
im'solver.prototxt'
machen caffe drucken zur Protokollierung von mehr debug-Informationen (einschließlich Steigung Größen und Aktivierungs-Werte), die während der Ausbildung: Diese Informationen können Hilfe in spotting-gradient blowups und anderen Problemen in der Ausbildung.das ist genau das, was diesem post ist alles über.
InformationsquelleAutor Shai
In meinem Fall, nicht die Einstellung der Neigung in die Faltung/Entfaltung Schichten war die Ursache.
Lösung: fügen Sie den folgenden, um die convolution-Schicht-Parameter.
bias_filler {
Typ: "konstant"
Wert: 0
}
InformationsquelleAutor izady
Diese Antwort ist nicht etwa eine Ursache für
nan
s, sondern schlägt vor, eine Möglichkeit zum Debuggen.Sie können das python-Ebene:
Hinzufügen, dass diese Schicht in Ihrer
train_val.prototxt
auf bestimmte Punkte, die Sie vermuten, kann Probleme verursachen:InformationsquelleAutor Shai
Ich habe versucht, bauen eine spärliche autoencoder und hatte mehrere Ebenen in es zu induzieren sparsity. Während der Ausführung meiner net, stieß ich auf die Nans. Auf entfernen Sie einige der Schichten (in meinem Fall, ich hatte tatsächlich zu entfernen 1), fand ich, dass die NaN ' s verschwunden. Also, ich denke zu viel sparsity führen kann NaN ' s (einige 0/0 Berechnungen kann aufgerufen worden sein!?)
nan
s und die Feste Konfiguration? welche Art von Schichten sind? welche Parameter?Ich hatte mehrere InnerProduct (lr_mult 1, decay_mult 1, lr_mult 2, decay_mult 0, xavier, std: 0.01) Schichten, jeweils gefolgt von aufgrund der Kr (außer der letzten). Ich arbeite mit der MNIST, und wenn ich mich richtig erinnere, wurde die Architektur 784 -> 1000 -> 500 -> 250 -> 100 -> 30 (und einem symmetrischen decoder phase); entfernen der 30-layer alongwith seine aufgrund der Kr aus den NaN ' s verschwinden.
InformationsquelleAutor LKB