Wie kann ich überprüfen, ob eine Implementierung eines neuronalen Netzwerks ordnungsgemäß funktioniert?

10

Ich frage mich, welche nützlichen Techniken es gibt, um zu überprüfen, ob eine Implementierung eines neuronalen Netzwerks korrekt funktioniert.

Im Folgenden sind einige mir bekannte Schecks aufgeführt. Es würde mich interessieren, mehr davon zu erfahren:

  1. Zeichnen einiger Metriken (F1-Punktzahl, Genauigkeit, Kosten usw.) im Zug / Test / gültigen Sets gegen die Chargen- oder Epochennummer.
  2. Betrachtung der Entwicklung der Matrixgewichte über die Epoche hinweg.
  3. Entfernen Sie bei mehreren Ebenen einige Ebenen und prüfen Sie, ob noch etwas gelernt wird.
  4. Verwenden des Netzwerks für einige Datensätze, die es lernen sollte (obwohl mir keine gute Liste von Referenzdatensätzen zum Testen neuronaler Netzwerkimplementierungen bekannt ist , die eine wertvolle Ressource darstellen würden, schneller als das Suchen nach Referenzpunkten in der Literatur .)
  5. Durchführen von Gradienten Prüfung .
  6. Überprüfen Sie, ob der Farbverlauf nicht explodiert oder verschwindet.

Einige Diagramme, die die vorherigen Überprüfungen veranschaulichen:

  1. Zeichnungszug / Test / gültiger Satz gegen Epochennummer:

Gut (zwar schnell überpassend, aber zumindest kann das Netzwerk lernen):

Geben Sie hier die Bildbeschreibung ein

Schlecht:

Geben Sie hier die Bildbeschreibung ein

  1. Betrachtet man die Entwicklung der Matrixgewichte über die Epoche hinweg:

Epoche 0:

Geben Sie hier die Bildbeschreibung ein

Epoche 50:

Geben Sie hier die Bildbeschreibung ein

Schwer zu sagen, ob die Änderungen in der Gewichtsmatrix gut oder schlecht sind (ohne die Kosten zu berücksichtigen), aber zumindest die meisten von ihnen haben sich geändert und sie bleiben nicht bei 0 hängen.

Franck Dernoncourt
quelle
1
+1 schwierige Frage. Der schwierige Teil ist: Selbst wenn wir etwas durcheinander bringen (zum Beispiel einen falschen Gradienten haben), würde die Implementierung immer noch "funktionieren", dh der Ansatz 1-4 funktioniert möglicherweise nicht.
Haitao Du

Antworten:

4

Zunächst möchte ich festhalten, dass die Implementierung im Kontext neuronaler Netze (meiner Meinung nach) ein zweifelhaftes Wort ist. Ich denke, Sie haben die meisten Ansätze aufgelistet, aber so bin ich kürzlich zum Testen gekommen.

Die erste Interpretation ist die tatsächliche Implementierung in einem Quellcode. In diesem Fall sind meiner Meinung nach die wichtigsten Methoden zum Testen dieses Teils:

  1. Überprüfen Sie, ob die grundlegenden Operationen korrekt sind. Insbesondere bei der Verwendung von Matrixoperationen haben Sie möglicherweise übersehen, dass *es sich tatsächlich um eine elementweise Multiplikation und nicht um ein Punktprodukt handelt, oder Sie haben nicht übereinstimmende Dimensionen.
  2. Führen Sie eine Gradientenprüfung durch. Ich mache es gerne für mehrere Derivate. Es beginnt mit der Ableitung der Aktivierungsfunktion und der Gesamtableitung der Kostenfunktion für Gewichte. Wenn dort ein Problem auftreten würde, können Sie es auf die abgeleiteten Wrt-Eingänge (dies sollte sich auf die Aktualisierung der Vorspannung beziehen) oder die Ausgänge (die gewichtete Summe der Fehler in der nachfolgenden Schicht) anwenden.
  3. Ich mag es auch, künstliche, triviale Lernaufgaben zu erstellen. Zum Beispiel für ein vollständig verbundenes Netzwerk lasse ich ein Single-Layer-Netzwerk die Summe der Eingaben oder irgendetwas lernen, für das ich weiß, wie die Gewichte sein sollten. Für mehrschichtige Netzwerke ist dies etwas schwieriger, aber Sie können etwas Ähnliches tun, ohne bestimmte Gewichte zu erwarten. Dies ist praktisch die gleiche Idee wie bei der Verwendung einiger Referenzdatensätze.

Die zweite Interpretation für die Implementierung eines neuronalen Netzwerks könnte die Wahl von Hyperparametern sein. Der wichtigste dieser Hyperparameter ist wahrscheinlich die Lernrate. Sie haben einige Techniken erwähnt, die in meinen Augen eher zur Auswahl der richtigen Hyperparameter gehören.

  1. Das Zeichnen Ihres Ziels als Funktion der Epochen für Zug- / Gültigkeits- / Testdaten ist eine gute Möglichkeit, um eine Vorstellung davon zu bekommen, ob Ihr Netzwerk über- oder unterpasst ist, indem Sie Zug- / Test- / gültige Fehler vergleichen. Im Falle einer Überanpassung könnten Sie die Anzahl der Schichten / Neuronen reduzieren und im Falle einer Unteranpassung könnten Sie einige hinzufügen. Wenn Sie scheinbar nichts lernen, liegt dies wahrscheinlich an einer zu hohen Lernrate (Versuchen Sie, die quadratische Funktion mit Schritten von 2 ab 1 zu minimieren).
  2. Wenn Sie unter einem explodierenden oder verschwindenden Gradienten leiden, benötigen Sie wahrscheinlich eine andere Aktivierungsfunktion oder eine andere Lernrate.

Ich denke nicht, dass das Betrachten der Gewichte so nützlich ist. Bei CNNs ist es hilfreich zu erkennen, welche Art von Kerneln Sie lernen oder ob Sie eine Form des Gewichtsabfalls implementieren, bei dem Sie einige Gewichte wirklich auf Null setzen möchten.

Es trägt wahrscheinlich nicht viel zu dem bei, was Sie bereits wissen, und ich vergesse hier viel, aber dies wäre meine Antwort für das, was es wert ist ...

Herr Tsjolder
quelle
2

Sie können auch die Lernkurve (siehe Abschnitt 3.3 im folgenden Link) darstellen, bei der es sich um den Fehler (sowohl Trainingsfehler als auch Kreuzvalidierungsfehler) gegenüber der Größe des Trainingssatzes handelt. Anhand der Lernkurve können Sie erkennen, ob Ihr Modell unter einer hohen Verzerrung oder einer hohen Varianz leidet.

http://www.astroml.org/sklearn_tutorial/practical.html

Yuqian
quelle