Heim >Backend-Entwicklung >Python-Tutorial >Optimierung Ihrer neuronalen Netze
Letzte Woche habe ich einen Artikel darüber gepostet, wie man einfache neuronale Netze aufbaut, insbesondere mehrschichtige Perzeptrone. In diesem Artikel gehen wir tiefer auf die Besonderheiten neuronaler Netze ein, um zu diskutieren, wie wir die Leistung eines neuronalen Netzes durch Optimierung seiner Konfigurationen maximieren können.
Wenn Sie ein Modell trainieren, denken Sie vielleicht, dass das Modell fehlerfrei wird, wenn Sie es ausreichend trainieren. Das mag wahr sein, aber das gilt nur für den Datensatz, auf dem trainiert wurde. Wenn Sie ihm einen anderen Datensatz mit unterschiedlichen Werten geben, könnte das Modell tatsächlich völlig falsche Vorhersagen ausgeben.
Um dies besser zu verstehen, nehmen wir an, dass Sie jeden Tag für Ihre Fahrerprüfung geübt haben, indem Sie geradeaus gefahren sind, ohne das Lenkrad zu bewegen. (Bitte tun Sie das nicht.) Während Sie auf dem Drag Strip wahrscheinlich sehr gute Leistungen erbringen würden, würde es passieren, dass Sie stattdessen in ein STOP-Schild geraten, wenn Ihnen bei der eigentlichen Prüfung gesagt würde, dass Sie links abbiegen sollen.
Dieses Phänomen wird als Überanpassung bezeichnet. Ihr Modell kann alle Aspekte und Muster der Daten lernen, anhand derer es trainiert wird. Wenn es jedoch ein Muster lernt, das sich zu sehr an den Trainingsdatensatz anlehnt, wird die Leistung Ihres Modells bei einem neuen Datensatz schlecht sein. Wenn Sie Ihr Modell jedoch nicht ausreichend trainieren, ist Ihr Modell nicht in der Lage, Muster in anderen Datensätzen richtig zu erkennen. In diesem Fall wären Sie unterpassend.
Im obigen Beispiel wäre es eine gute Position, das Training Ihres Modells dann zu beenden, wenn der Validierungsverlust sein Minimum erreicht. Dies ist mit frühzeitigem Stoppen möglich, das das Training stoppt, sobald nach einer beliebigen Anzahl von Trainingszyklen (Epochen) keine Verbesserung des Validierungsverlusts eintritt.
Beim Training Ihres Modells geht es darum, ein Gleichgewicht zwischen Über- und Unteranpassung zu finden und bei Bedarf frühzeitiges Stoppen zu nutzen. Aus diesem Grund sollte Ihr Trainingsdatensatz so repräsentativ wie möglich für Ihre Gesamtpopulation sein, damit Ihr Modell genauere Vorhersagen zu Daten treffen kann, die es nicht gesehen hat.
Vielleicht ist eine der wichtigsten Trainingskonfigurationen, die optimiert werden können, die Verlustfunktion, die die „Ungenauigkeit“ zwischen den Vorhersagen Ihres Modells und ihren tatsächlichen Werten darstellt. Die „Ungenauigkeit“ kann mathematisch auf viele verschiedene Arten dargestellt werden, eine der häufigsten ist mittlerer quadratischer Fehler (MSE):
wo yichˉ ist die Vorhersage des Modells und yi ist der wahre Wert. Es gibt eine ähnliche Variante namens mittlerer absoluter Fehler (MAE)
Was ist der Unterschied zwischen diesen beiden und welches ist besser? Die eigentliche Antwort ist, dass es von einer Vielzahl von Faktoren abhängt. Betrachten wir ein einfaches Beispiel einer zweidimensionalen linearen Regression.
In vielen Fällen kann es Datenpunkte geben, die Ausreißer sind, also Punkte, die weit von anderen Datenpunkten entfernt sind. Bezogen auf die lineare Regression bedeutet dies, dass es einige Punkte gibt xy -Flugzeug, das weit vom Rest entfernt ist. Wenn Sie sich aus Ihrem Statistikunterricht erinnern, sind es Punkte wie diese, die die berechnete lineare Regressionslinie erheblich beeinflussen können.
Wenn Sie sich eine Linie vorstellen wollten, die alle vier Punkte schneiden könnte, dann y=x wäre eine gute Wahl, da diese Linie durch alle Punkte gehen würde.
Nehmen wir jedoch an, ich beschließe, einen weiteren Punkt hinzuzufügen (5,1) . Wie sollte nun die Regressionslinie aussehen? Nun, es stellt sich heraus, dass es völlig anders ist: y=0,2x 1,6
Angesichts der vorherigen Datenpunkte würde die Linie erwarten, dass der Wert von j Wann x=5 ist 5, aber aufgrund des Ausreißers und seines MSE wird die Regressionslinie deutlich „nach unten gezogen“.
Dies ist nur ein einfaches Beispiel, aber das wirft eine Frage auf, über die Sie als Entwickler maschinellen Lernens nachdenken müssen: Wie empfindlich sollte mein Modell gegenüber Ausreißern sein? Wenn Sie möchten Soll das Modell empfindlicher auf Ausreißer reagieren, dann würden Sie eine Metrik wie MSE wählen, da in diesem Fall Fehler mit Ausreißern aufgrund der Quadrierung stärker ausgeprägt sind und Ihr Modell sich selbst anpasst, um dies zu minimieren. Andernfalls würden Sie eine Metrik wie MAE wählen, die sich nicht so sehr um Ausreißer kümmert.
In meinem vorherigen Beitrag habe ich auch das Konzept der Backpropagation und des Gradientenabstiegs besprochen und wie sie funktionieren, um den Verlust des Modells zu minimieren. Der Gradient ist ein Vektor, der in die Richtung der größten Veränderung zeigt. Ein Gradientenabstiegsalgorithmus berechnet diesen Vektor und bewegt sich in die genau entgegengesetzte Richtung, sodass er schließlich ein Minimum erreicht.
Die meisten Optimierer haben eine bestimmte Lernrate, die üblicherweise als bezeichnet wird α an die sie sich halten. Dies stellt im Wesentlichen dar, wie weit sich der Algorithmus bei jeder Berechnung des Gradienten in Richtung des Minimums bewegt. Achten Sie darauf, dass Sie Ihre Lernrate nicht zu hoch einstellen! Ihr Algorithmus erreicht möglicherweise nie das Minimum, da die erforderlichen großen Schritte wiederholt das Minimum überspringen könnten.
Um noch einmal auf den Gradientenabstieg zurückzukommen: Dieser ist zwar wirksam bei der Minimierung von Verlusten, kann jedoch den Trainingsprozess erheblich verlangsamen, da die Verlustfunktion für den gesamten Datensatz berechnet wird. Es gibt mehrere Alternativen zum Gefälleabstieg, die effizienter sind, aber ihre jeweiligen Nachteile haben.
Eine der beliebtesten Alternativen zum standardmäßigen Gradientenabstieg ist eine Variante namens stochastischer Gradientenabstieg (SGD). Wie beim Gradientenabstieg hat SGD eine feste Lernrate. Aber anstatt wie bei einem Gradientenabstieg den gesamten Datensatz zu durchlaufen, nimmt SGD eine kleine Stichprobe, die zufällig ausgewählt wird, und die Gewichte Ihres neuronalen Netzwerks werden stattdessen basierend auf der Stichprobe aktualisiert. Schließlich konvergieren die Parameterwerte zu einem Punkt, der die Verlustfunktion ungefähr (aber nicht genau) minimiert. Dies ist einer der Nachteile von SGD, da es nicht immer das genaue Minimum erreicht. Darüber hinaus bleibt es, ähnlich wie beim Gradientenabstieg, empfindlich gegenüber der von Ihnen eingestellten Lernrate.
Der Name Adam leitet sich von der adaptiven Momentenschätzung ab. Es kombiniert im Wesentlichen zwei SGD-Varianten, um die Lernrate für jeden Eingabeparameter basierend darauf anzupassen, wie oft er während jeder Trainingsiteration aktualisiert wird (adaptive Lernrate). Gleichzeitig werden vergangene Gradientenberechnungen als gleitender Durchschnitt verfolgt, um Aktualisierungen zu glätten (Momentum). Aufgrund seiner Impulscharakteristik kann die Konvergenz jedoch manchmal länger dauern als bei anderen Algorithmen.
Jetzt ein Beispiel!
Ich habe auf Google Colab eine beispielhafte Komplettlösung erstellt, die PyTorch verwendet, um ein neuronales Netzwerk zu erstellen, das eine einfache lineare Beziehung lernt.
Wenn Sie Python noch nicht kennen, machen Sie sich keine Sorgen! Ich habe einige Erklärungen beigefügt, die besprechen, was in den einzelnen Abschnitten vor sich geht.
Obwohl dies natürlich nicht alles über die Optimierung neuronaler Netze abdeckt, wollte ich zumindest einige der wichtigsten Konzepte abdecken, die Sie beim Training Ihrer eigenen Modelle nutzen können. Hoffentlich haben Sie diese Woche etwas gelernt und vielen Dank fürs Lesen!
Das obige ist der detaillierte Inhalt vonOptimierung Ihrer neuronalen Netze. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!