Neuronales Netz divergiert statt konvergiert

9

Ich habe ein neuronales Netzwerk (mit CUDA) mit 2 Schichten implementiert. (2 Neuronen pro Schicht). Ich versuche, 2 einfache quadratische Polynomfunktionen mithilfe der Backpropagation zu lernen .

Aber anstatt zu konvergieren, divergiert es (die Ausgabe wird unendlich)

Hier sind einige weitere Details zu dem, was ich versucht habe:

  • Ich hatte die Anfangsgewichte auf 0 gesetzt, aber da es divergierte, habe ich die Anfangsgewichte randomisiert (Bereich: -0,5 bis 0,5).
  • Ich habe gelesen, dass ein neuronales Netzwerk möglicherweise abweicht, wenn die Lernrate zu hoch ist, und habe die Lernrate auf 0,000001 reduziert
  • Die zwei Funktionen, die ich zum Hinzufügen bringen möchte, sind: 3 * i + 7 * j + 9 und j * j + i * i + 24 (ich gebe die Ebene i und j als Eingabe)
  • Ich hatte es zuvor als einzelne Schicht implementiert und das könnte die Polynomfunktionen besser approximieren als jetzt
  • Ich denke darüber nach, Momentum in diesem Netzwerk zu implementieren, bin mir aber nicht sicher, ob es beim Lernen helfen würde
  • Ich benutze eine lineare (wie in no) Aktivierungsfunktion
  • Am Anfang gibt es eine Schwingung, aber der Ausgang beginnt zu divergieren, sobald eines der Gewichte größer als 1 wird

Ich habe meinen Code überprüft und erneut überprüft, aber es scheint kein Problem damit zu geben.

Hier ist meine Frage: Was läuft hier falsch?

Jeder Zeiger wird geschätzt.

Shayan RC
quelle

Antworten:

8
  1. Bei neuronalen Netzen müssen Sie Ihre Gewichte immer zufällig initialisieren, um die Symmetrie zu brechen.
  2. Wenn Sie in den versteckten Einheiten keine nichtlineare Aktivierungsfunktion verwenden, können Sie auch bei einer einzelnen Ebene bleiben. Ihr Netzwerk besteht jetzt nur noch aus zwei linearen Funktionen, was natürlich nur eine weitere lineare Funktion ist.
  3. Diese Lernrate scheint zu gering. Wenn ich eine feste Lernrate verwende, finde ich normalerweise einen Wert zwischen 0,1 und 0,0001, der für die meisten Probleme gut funktioniert. Dies ist offensichtlich problemabhängig, also nimm meine Erfahrung als das, was es ist.
  4. Neben der Überprüfung Ihres Codes anhand der von Ihnen erlernten Mathematik kann es bei der gradientenbasierten Optimierung sehr hilfreich sein, die erforderlichen Gradienten mithilfe endlicher Differenzen analytisch zu berechnen und mit den Werten zu vergleichen, die Sie in Ihrem Code berechnen. Sehen Sie hier für eine Diskussion darüber , wie Sie dies tun können. Ich habe auf diese Weise viele Fehler festgestellt, und wenn ich sehe, dass diese Arten von Tests bestanden werden, bin ich mir der Codekorrektheit immer viel sicherer.
Alt
quelle