Arbeiten mit neuronalen Netzen: Checkliste zur Fehlersuche

Arbeiten mit neuronalen Netzen: Checkliste zur Fehlersuche

Der Code von Softwareprodukten für maschinelles Lernen ist häufig komplex und recht verworren. Die Entdeckung und Behebung von Fehlern erfordert erhebliche Ressourcen. Selbst einfachste Neuronen-Netze mit direkter Verknüpfung benötigen einen ernsthaften Ansatz für die Netzwerkarchitektur, die Initialisierung der Gewichte und die Netzwerkoptimierung. Ein kleiner Fehler kann unangenehme Probleme verursachen.

Dieser Artikel ist einem Algorithmus gewidmet, der Ihnen bei der Fehlersuche in Ihren neuronalen Netzen helfen soll.

Skillbox empfiehlt: Praktischer Kurs Python-Entwickler von Grund auf.

Wir erinnern daran: alle Leser von „Habr“ erhalten einen Rabatt von 10.000 Rubel bei der Anmeldung zu einem beliebigen Kurs von Skillbox mit dem Aktionscode „Habr“.

Der Algorithmus besteht aus fünf Phasen:

  • ein einfacher Start;
  • Bestätigung der Verluste;
  • Überprüfung der Zwischenergebnisse und Verbindungen;
  • Diagnose der Parameter;
  • Überwachung der Funktion.

Wenn Ihnen etwas interessanter erscheint als anderes, können Sie sofort zu diesen Abschnitten wechseln.

Ein einfacher Start

Es ist schwieriger, ein neuronales Netzwerk mit komplexer Architektur, Regularisierung und Lernratenplanung zu debuggen als ein gewöhnliches. Hier sind wir ein wenig clever, da dieser Punkt nur indirekt mit der Fehlersuche zu tun hat, aber es ist trotzdem eine wichtige Empfehlung.

Ein einfacher Start besteht darin, ein vereinfachtes Modell zu erstellen und es an einem Datensatz (Punkt) zu trainieren.

Zuerst erstellen wir ein vereinfachtes Modell

Für den schnellen Start erstellen wir ein kleines Netzwerk mit einer versteckten Schicht und überprüfen, dass alles korrekt funktioniert. Dann komplexifizieren wir das Modell schrittweise und überprüfen jeden neuen Aspekt seiner Struktur (zusätzliche Schicht, Parameter usw.), bevor wir weitermachen.

Wir trainieren das Modell mit einem einzigen Datensatz (Punkt).

Zur schnellen Überprüfung der Funktionsfähigkeit Ihres Projekts können Sie zum Training einen oder zwei Datenpunkte verwenden, um zu bestätigen, dass das System korrekt funktioniert. Das neuronale Netzwerk sollte eine Genauigkeit von 100% beim Training und der Prüfung zeigen. Wenn dies nicht der Fall ist, ist entweder das Modell zu klein oder es gibt einen Fehler.

Selbst wenn alles gut aussieht, bereiten Sie das Modell darauf vor, einen oder mehrere Epochen durchlaufen zu können, bevor Sie fortfahren.

Loss-Bewertung

Die Loss-Bewertung ist die grundlegendste Methode zur Verfeinerung der Modellleistung. Sie müssen sicherstellen, dass der Verlust mit der Aufgabe übereinstimmt und die Verlustfunktionen auf einer korrekten Skala bewertet werden. Wenn Sie mehr als einen Verlusttyp verwenden, stellen Sie sicher, dass sie alle vom gleichen Maßstab sind und korrekt skaliert sind.

Es ist wichtig, auf die anfänglichen Verluste zu achten. Prüfen Sie, wie nah das tatsächliche Ergebnis an den erwarteten Werten liegt, wenn das Modell mit einer zufälligen Annahme gestartet wurde. In der Arbeit von Andrey Karpaty wird Folgendes vorgeschlagen: „Stellen Sie sicher, dass Sie die Ergebnisse erhalten, die Sie erwarten, wenn Sie mit einer geringen Anzahl von Parametern beginnen. Es ist besser, die Datenverluste sofort zu überprüfen (mit einem Regularisierungsgrad von null). Zum Beispiel für CIFAR-10 mit einem Softmax-Klassifikator erwarten wir, dass die anfänglichen Verluste 2,302 betragen, weil die erwartete diffuse Wahrscheinlichkeit 0,1 für jede Klasse beträgt (da es 10 Klassen gibt), und der Softmax-Verlust ist die negative logarithmische Wahrscheinlichkeit der korrekten Klasse, die –ln (0,1) = 2,302 beträgt.“

Für das binäre Beispiel wird eine ähnliche Berechnung für jede der Klassen vorgenommen. Hier sind zum Beispiel die Daten: 20 % 0's und 80 % 1's. Der erwartete anfängliche Verlust beträgt bis zu –0,2ln (0,5) –0,8ln (0,5) = 0,693147. Wenn das Ergebnis größer als 1 ist, könnte das darauf hindeuten, dass die Gewichte des neuronalen Netzwerks nicht richtig ausbalanciert sind oder die Daten nicht normalisiert sind.

Überprüfen wir die Zwischenergebnisse und Verbindungen

Um ein neuronales Netzwerk zu debuggen, ist es wichtig, die Dynamik der Prozesse innerhalb des Netzwerks und die Rolle der einzelnen Zwischenschichten zu verstehen, da sie miteinander verbunden sind. Hier sind typische Fehler, auf die Sie stoßen können:

  • falsche Ausdrücke für die Gradientenaktualisierungen;
  • Gewichtsaktualisierungen werden nicht angewendet;
  • verschwinden oder explodieren die Gradienten (exploding gradients).

Wenn die Gradientenwerte null sind, bedeutet dies, dass die Lernrate im Optimierer zu gering ist oder dass Sie auf einen falschen Ausdruck für die Gradientenaktualisierung gestoßen sind.

Darüber hinaus müssen die Werte der Aktivierungsfunktionen, Gewichte und Aktualisierungen jeder Schicht überwacht werden. Zum Beispiel sollte die Größe der Parameteraktualisierungen (Gewichte und Biases) 1-e3 betragen..

Es gibt ein Phänomen, das als „Dying ReLU“ oder „das Problem verschwindender Gradienten“bekannt ist, wenn ReLU-Neuronen nach dem Erlernen eines hohen negativen Wertes (Bias) für ihre Gewichte Null ausgeben. Diese Neuronen werden in keinem Datensatz jemals wieder aktiviert.

Sie können die Gradientenüberprüfung nutzen, um diese Fehler zu identifizieren, indem Sie den Gradienten mit einer numerischen Methode approximieren. Wenn er den berechneten Gradienten nahe kommt, wurde das Backpropagation-Verfahren korrekt umgesetzt. Um eine Gradientenüberprüfung zu erstellen, schauen Sie sich diese großartigen Ressourcen aus CS231 an. hier und hier, sowie dem Tutorial von Andrew Nga zu diesem Thema.

Faizan Sheikh beschreibt drei Hauptmethoden zur Visualisierung neuronaler Netzwerke:

  • Voranalyse – einfache Methoden, die uns die allgemeine Struktur des trainierten Modells zeigen. Dazu gehören die Ausgabe von Formen oder Filtern einzelner Schichten des neuronalen Netzwerks sowie die Parameter in jeder Schicht.
  • Aktivierungsbasiert. Dabei entschlüsseln wir die Aktivierungen einzelner Neuronen oder Gruppen von Neuronen, um ihre Funktionen zu verstehen.
  • Gradientenbasiert. Diese Methoden neigen dazu, mit Gradienten zu arbeiten, die aus dem Vorwärts- und Rückwärtsdurchlauf beim Training des Modells entstehen (einschließlich Wichtigkeitskarten und Klassenaktivierungskarten).

Es gibt mehrere nützliche Werkzeuge zur Visualisierung von Aktivierungen und Verbindungen einzelner Schichten, wie zum Beispiel ConX und Tensorboard.

Arbeiten mit neuronalen Netzen: Checkliste zur Fehlersuche

Diagnose der Parameter

Neuronale Netzwerke haben eine Vielzahl von Parametern, die miteinander interagieren, was die Optimierung erschwert. Tatsächlich ist dieser Abschnitt Gegenstand aktiver Forschung von Fachleuten, sodass die nachfolgenden Vorschläge nur als Ratschläge und Ausgangspunkte betrachtet werden sollten.

Paketgröße (Batch-Größe) — es ist notwendig, dass die Größe des Batches groß genug ist, um genaue Schätzungen des Gradientenfehlers zu erhalten, aber klein genug, damit der stochastische Gradientenabstieg (SGD) Ihr Netzwerk ordnen kann. Kleine Batch-Größen führen zu einer schnellen Konvergenz durch Rauschen im Lernprozess und später zu Optimierungsschwierigkeiten. Weitere Informationen finden Sie hier.

Lernrate — eine zu niedrige Lernrate führt zu langsamer Konvergenz oder dem Risiko, in lokalen Minima stecken zu bleiben. Eine hohe Lernrate kann dagegen zur Divergenz der Optimierung führen, da die Gefahr besteht, dass Sie über einen tiefen, aber schmalen Teil der Verlustfunktion „springen“. Versuchen Sie, ein Lernraten-Scheduling zu verwenden, um die Lernrate während des Trainings des neuronalen Netzwerks zu senken. Im Kurs CS231n Es gibt einen großen Abschnitt, der sich mit diesem Thema beschäftigt..

Gradientenbeschneidung— ist das Zuschneiden der Gradientenparameter während des Rückwärtsdurchlaufs auf einen maximalen Wert oder eine Grenznorm. Nützlich zur Lösung von Problemen mit explodierenden Gradienten, die Sie im dritten Punkt antreffen können.

Batch-Normalisierung — wird verwendet, um die Eingabedaten jeder Schicht zu normalisieren, was hilft, das Problem des internen Kovariatenverschiebens zu lösen. Wenn Sie Dropout und Batch-Normalisierung zusammen verwenden, lesen Sie diesen Artikel.

Stochastischer Gradientabstieg (SGD) — es gibt mehrere Varianten von SGD, die Impuls, adaptive Lernraten und die Nesterov-Methode verwenden. Keine dieser Varianten hat jedoch einen klaren Vorteil hinsichtlich der Lernleistung oder der Generalisierung (detaillierte Informationen hier).

Regularisierung — ist entscheidend für den Aufbau eines generalisierbaren Modells, da sie eine Strafe für die Komplexität des Modells oder extreme Parameterwerte hinzufügt. Dies ist ein Weg, um die Varianz des Modells zu reduzieren, ohne die Verzerrung erheblich zu erhöhen. Mehr Details finden Sie hier.

Um alles selbst zu bewerten, müssen Sie die Regularisierung deaktivieren und den Gradienten des Datenverlusts selbst überprüfen.

Dropout ist eine weitere Methode zur Strukturierung Ihres Netzwerks, um Überlastung zu verhindern. Während des Trainings wird der Dropout nur durch das Halten der Aktivität eines Neurons mit einer bestimmten Wahrscheinlichkeit p (Hyperparameter) oder durch Setzen des Neurons auf null im anderen Fall umgesetzt. Infolgedessen muss das Netzwerk für jede Trainingspartie eine andere Teilmenge von Parametern nutzen, was die Veränderungen bestimmter Parameter verringert, die dominierend werden können.

Wichtig: Wenn Sie sowohl Dropout als auch Batch-Normalisierung verwenden, seien Sie vorsichtig mit der Reihenfolge dieser Operationen oder sogar mit deren gleichzeitiger Verwendung. All dies wird noch aktiv diskutiert und ergänzt. Hier sind zwei wichtige Diskussionen zu diesem Thema auf Stackoverflow und Arxiv.

Leistungsüberwachung

Es geht um die Dokumentation von Arbeitsabläufen und Experimenten. Wenn nichts dokumentiert wird, kann man leicht vergessen, welche Lernrate oder Gewichtung der Klassen verwendet wird. Durch strenge Kontrolle lassen sich frühere Experimente problemlos nachverfolgen und reproduzieren. Dies hilft, die Anzahl von doppelten Experimenten zu reduzieren.

Allerdings kann die manuelle Dokumentation zu einer schwierigen Aufgabe werden, wenn es um große Arbeitsmengen geht. Hier kommen Tools wie Comet.ml ins Spiel, die dabei helfen, Datensätze, Codeänderungen, die Historie von Experimenten und Produktionsmodelle automatisch zu protokollieren, einschließlich wichtiger Informationen über Ihr Modell (Hyperparameter, Leistungskennzahlen des Modells und Informationen zur Umgebung).

Neuronale Netzwerke können sehr empfindlich auf kleine Änderungen reagieren, was die Leistung des Modells beeinträchtigen kann. Das Tracking und die Dokumentation der Arbeit sind der erste Schritt, den Sie unternehmen sollten, um die Umgebung und das Modell zu standardisieren.

Arbeiten mit neuronalen Netzen: Checkliste zur Fehlersuche

Ich hoffe, dass dieser Beitrag der Ausgangspunkt sein kann, von dem aus Sie Ihre neuronalen Netze debuggen.

Skillbox empfiehlt:

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster