Frage:
Kostenfunktion wird nach einer bestimmten Anzahl von Iterationen zu Nan
Umberto
2018-01-28 17:34:45 UTC
view on stackexchange narkive permalink

Ich habe eine Frage und würde gerne hören, was die Community zu sagen hat. Angenommen, Sie trainieren ein tief lernendes neuronales Netzwerk. Die Implementierungsdetails sind für meine Frage nicht relevant. Ich weiß sehr gut, dass Sie, wenn Sie eine zu große Lernrate wählen, eine Kostenfunktion erhalten, die möglicherweise zu Nan wird (wenn Sie beispielsweise die Sigmoid-Aktivierungsfunktion verwenden). Angenommen, ich verwende die Kreuzentropie als Kostenfunktion. Typisches Problem mit der binären Klassifizierung (oder sogar mit mehreren Klassen mit Softmax). Ich weiß auch, warum das passiert. Ich beobachte oft folgendes Verhalten: Meine Kostenfunktion nimmt gut ab, aber nach einer bestimmten Anzahl von Epochen wird sie nan. Wenn Sie die Lernrate reduzieren, geschieht dies später (also nach weiteren Epochen). Liegt das wirklich daran, dass sich der (zum Beispiel) Gradientenabstieg nach Annäherung an das Minimum nicht stabilisieren kann und wild herumspringt? Ich dachte, dass der Algorithmus nicht genau auf das Minimum konvergiert, sondern um ihn herum schwingen sollte und dort mehr oder weniger stabil bleibt ... Gedanken?

Ich hatte das gleiche Problem.Nachdem ich viele im Web verfügbare Vorschläge durchgesehen und implementiert hatte (ich weiß nicht genau, welche), stellte ich fest, dass dies aufgrund einer Faltungsschicht geschah, die eine Eingabe erhielt, die außerhalb der beabsichtigten Eingabe liegt.Die Einführung der Batch-Normalisierung auf der Eingabeebene löste das Problem für mich.
Ich bin auch auf das gleiche Problem gestoßen, bei dem sich die Kostenfunktion als "Nan" -Wert herausstellt. Der Grund für die "Nan" -Werte können ungültige Werte innerhalb der logarithmischen Funktion wie Null oder negative Werte sein.Versuchen Sie, die Lernrate für Ihre Funktion zu reduzieren.
Ich löse nur das gleiche Problem.In meinem Fall handelt es sich um eine manuelle Normalisierung während des Forward Computing.Achten Sie bei der Berechnung von $ y = x / {\ parallel x \ parallel} _2 $ stärker auf die Teilung und die sqrt-Operationen.Wenn der Operand nahe bei 0 liegt, könnten die bp-Gradienten Nan sein.Sie können ein kleines Epsilon hinzufügen, um diese Operationen stabiler zu machen.
Drei antworten:
andfor
2018-01-31 16:15:28 UTC
view on stackexchange narkive permalink

Wenn Sie NaN-Werte in Ihrer Kostenfunktion erhalten, bedeutet dies, dass sich die Eingabe außerhalb des Funktionsbereichs befindet. Z.B. der Logarithmus von 0. Oder er könnte analytisch in der Domäne liegen, aber aufgrund numerischer Fehler erhalten wir das gleiche Problem (z. B. wird ein kleiner Wert auf 0 gerundet). Es hat nichts mit der Unfähigkeit zu tun, sich "niederzulassen".

Sie müssen also die nicht zulässigen Funktionseingabewerte für Ihre angegebene Kostenfunktion bestimmen. Dann müssen Sie feststellen, warum Sie diese Eingabe für Ihre Kostenfunktion erhalten. Möglicherweise müssen Sie die Skalierung der Eingabedaten und die Gewichtsinitialisierung ändern. Oder Sie müssen nur eine adaptive Lernrate haben, wie von Avis vorgeschlagen, da die Kostenfunktionslandschaft möglicherweise ziemlich chaotisch ist. Oder es könnte an etwas anderem liegen, beispielsweise an numerischen Problemen mit einer Ebene in Ihrer Architektur.

Bei tiefen Netzwerken ist es sehr schwierig zu sagen, aber ich schlage vor, dass Sie sich mit dem Fortschritt der Eingabewerte zu Ihrer Kostenfunktion (der Ausgabe Ihrer Aktivierungsschicht) befassen und versuchen, eine Ursache zu ermitteln.

Vielen Dank.Ich habe alles getan, was Sie vorgeschlagen haben, und ich kenne die Ursache dafür ... Genau das, was Sie beschreiben ... Ich wollte nur mit anderen sprechen, ob ich etwas verpasst habe ...
Anu
2019-03-21 23:02:59 UTC
view on stackexchange narkive permalink

Hier sind einige der Dinge, die Sie tun könnten:

  • Bei Verwendung der SoftMax-Kreuzentropiefunktion:

    Der SoftMax-Zähler sollte aufgrund des Exponentials niemals Nullwerte haben. Aufgrund der Gleitkommapräzision kann der Zähler jedoch ein sehr kleiner Wert sein, z. B. exp (-50000), der im Wesentlichen Null ergibt ( ref.)

    • Schnellkorrekturen können darin bestehen, entweder die Genauigkeit Ihres Modells zu erhöhen (64-Bit-Gleitkommazahlen anstelle von vermutlich 32-Bit-Gleitkommazahlen zu verwenden) oder einfach eine Funktion einzuführen, die Ihre Werte begrenzt, sodass alles, was unter Null oder genau Null liegt, gerecht ist gemacht, um nahe genug an Null zu sein, damit der Computer nicht ausflippt. Verwenden Sie beispielsweise X = np.log (np.max (x, 1e-9)), bevor Sie in den Softmax wechseln ( ref.)
  • Sie können Methoden wie "FastNorm" verwenden, die die numerische Stabilität verbessern und die Genauigkeitsvarianz verringern, eine höhere Lernrate ermöglichen und eine bessere Konvergenz bieten. ( Ref.)

  • Gewichtungsinitialisierung prüfen: Wenn Sie sich nicht sicher sind, verwenden Sie die Xavier- oder He-Initialisierung. Außerdem führt Ihre Initialisierung möglicherweise zu einem schlechten lokalen Minimum. Versuchen Sie also eine andere Initialisierung und prüfen Sie, ob dies hilfreich ist.

  • Verringern Sie die Lernrate, insbesondere wenn Sie in den ersten 100 Iterationen NaNs erhalten.

  • NaNs können durch Division durch Null oder natürliches Protokoll von Null oder negativer Zahl entstehen.

  • Versuchen Sie, Ihr Netzwerk Schicht für Schicht zu bewerten, und sehen Sie, wo die NaNs erscheinen.

Einige der Vorschläge stammen aus den Referenzen der beiden großartigen Beiträge zu StackOverflow & auf KDnuggests

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert.- [From Review] (/ review / minderwertige Beiträge / 220836)
@jbowman, danke, dass Sie es hervorgehoben haben.Ich habe meinen Beitrag bearbeitet und alle relevanten Antworten auf die Frage mit entsprechenden URL-Referenzen hinzugefügt.
Weitere Überprüfungen finden Sie hier: https://stackoverflow.com/questions/33962226/common-causes-of-nans-during-training
Avis
2018-01-31 13:17:51 UTC
view on stackexchange narkive permalink

Mögliche Gründe:

  1. Gradienten explodieren
  2. Ihre Eingabe enthält nan (oder unerwartete Werte)
  3. Verlustfunktion nicht richtig implementiert
  4. Numerische Instabilität im Deep Learning Framework
  5. ol>

    Sie können überprüfen, ob es immer nan wird, wenn es mit einer bestimmten Eingabe gespeist wird, oder ob es völlig zufällig ist.

    Üblicherweise wird die Lernrate nach jeweils wenigen Iterationen schrittweise reduziert.

Danke für die Vorschläge.Die Lernrate zu reduzieren ist das, was ich tue ;-) Ich wollte die Leute hier nur fragen, ob es andere Ursachen gibt als die, die Sie erwähnt haben.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...