Verständnis des frühen Stopps in neuronalen Netzen und seiner Auswirkungen bei der Verwendung der Kreuzvalidierung

8

Ich bin ein bisschen beunruhigt und verwirrt über die Idee, wie die Technik des frühen Stoppens definiert wird. Wenn Sie sich Wikipedia ansehen , ist es wie folgt definiert:

  1. Teilen Sie die Trainingsdaten in einen Trainingssatz und einen Validierungssatz auf, z. B. im Verhältnis 2 zu 1.
  2. Trainieren Sie nur auf dem Trainingssatz und bewerten Sie ab und zu den Fehler pro Beispiel auf dem Validierungssatz, z. B. nach jeder fünften Epoche.
  3. Beenden Sie das Training, sobald der Fehler im Validierungssatz höher ist als beim letzten Überprüfen.
  4. Verwenden Sie die Gewichte, die das Netzwerk in diesem vorherigen Schritt als Ergebnis des Trainingslaufs hatte.

Ich habe die Methode selbst in meinen Experimenten verwendet (mit 10-facher Kreuzvalidierung). Ich überprüfe den Validierungsfehler in jeder Epoche (und berechne auch die Validierungsgenauigkeit) und setze einen Geduldsparameter von 2. Das heißt, wenn der Validierungsfehler für 2 Epochen hintereinander zunimmt -> Training beenden. Dann habe ich die Ergebnisse der letzten Epoche verwendet, als das Modell fertig war.

Ian Goodfellow verwendet eine andere Definition in seinem Deep Learning-Buch . Als vierten Schritt schlägt er vor, die Gewichte des besten Arbeitsmodells zu verwenden (dh das Modell jedes Mal zu speichern, wenn der Validierungsfehler überprüft wird).

Ich brauche das gespeicherte Modell nicht, ich brauche nur die Ergebnisse für meine Arbeit. Für mich würde der vorgeschlagene vorzeitige Stopp bei Goodfellow bedeuten, dass ich nur die höchste Validierungsgenauigkeit nehme, die ich für mein Endergebnis erreicht habe? Irgendwie scheint das nicht legitim zu sein. Ich habe diese Informationen nicht in einer realen Situation, in der es keinen Entwicklungssatz gibt. Aber was ist in diesem Fall der Grund, überhaupt früh zu stoppen? Bestimmen Sie die Anzahl der Epochen, indem Sie beispielsweise die Anzahl der Epochen für die Falten mitteln und später für den Testlauf verwenden?

V1nc3nt
quelle
Normalerweise verfügen Sie über separate Testdaten, mit denen Sie eine unvoreingenommene Schätzung Ihrer Modellleistung erhalten.
Aaron
Ja. Ich habe Training, Entwicklung und Test Split. Aber ein frühes Stoppen des Test-Split wäre Betrug. Daher kann ich die Methode zum frühen Stoppen des Testsatzes für den letzten Lauf nicht verwenden. In diesem Fall wäre ein vorzeitiges Anhalten nur nützlich, um herauszufinden, wie viele Epochen auf dem Testsatz ausgeführt werden müssen (um eine Überanpassung zu verhindern). Soweit ich es inzwischen verstehe.
V1nc3nt
Es sollte darauf hingewiesen werden, dass es eine ähnliche Frage gibt , aber da es sich bei dieser Frage hier um ein einzelnes Modell handelt, bezieht sich die frühere Frage auf eine Art Mischung von Modellen (oder so glaube ich - um ehrlich zu sein, sowohl die Frage als auch die Antwort es sind für mich ziemlich schwer zu verstehen). Ich habe daher nicht das Gefühl, dass die frühere Frage Antworten auf die von OP hier aufgeworfenen Fragen enthält.
fnl

Antworten:

7

Bestimmen Sie die Anzahl der Epochen, indem Sie beispielsweise die Anzahl der Epochen für die Falten mitteln und später für den Testlauf verwenden?

Kürzeste Antwort: Ja! Aber lassen Sie mich einen Kontext hinzufügen ...

Ich glaube, Sie beziehen sich auf Abschnitt 7.8, Seite 246ff, über das frühe Stoppen im Deep Learning-Buch. Das dort beschriebene Verfahren unterscheidet sich jedoch erheblich von Ihrem. Goodfellow et al. Schlagen Sie vor, Ihre Daten zuerst in drei Sätze aufzuteilen : einen Trainings-, Entwickler- und Testsatz. Dann trainieren Sie (am Trainingssatz), bis der Fehler dieses Modells zunimmt (am Entwicklersatz). An diesem Punkt hören Sie auf. Schließlich verwenden Sie das trainierte Modell mit dem niedrigsten Entwicklungsfehler und bewerten es im Testsatz. Es ist überhaupt keine Kreuzvalidierung erforderlich.

Sie scheinen jedoch zu versuchen, sowohl das frühe Stoppen (ES) als auch die Kreuzvalidierung (CV) sowie die Modellbewertung alle auf demselben Satz durchzuführen. Das heißt, Sie scheinen alle Ihre Daten für den Lebenslauf zu verwenden, bei jedem Split mit ES zu trainieren und dann die durchschnittliche Leistung über diese CV-Splits als endgültige Bewertungsergebnisse zu verwenden. Wenn dies der Fall ist, ist dies in der Tat eine starke Überanpassung (und sicherlich nicht das, was von Goodfellow et al. Beschrieben wird), und Ihr Ansatz liefert Ihnen genau das gegenteilige Ergebnis dessen, wofür ES gedacht ist - als Regularisierungstechnik für um dies verhindernüberpassend. Wenn nicht klar ist, warum: Weil Sie bei Ihren endgültigen Bewertungsinstanzen während der Trainingszeit einen "Höhepunkt" erreicht haben, um herauszufinden, wann ("früh") das Training abgebrochen werden muss; Das heißt, optimieren Sie gegen die Bewertungsinstanzen während des Trainings, das ist (Über-) passend zu Ihrem Modell (auf diesen Auswertungsdaten), per Definition.

Ich hoffe, dass ich jetzt Ihre anderen [zwei] Fragen beantwortet habe.

Die Antwort des Higgs Broson (auf Ihre letzte Frage, wie oben zitiert) bietet bereits eine sinnvolle Möglichkeit, CV und ES zu kombinieren, um Ihnen Zeit für das Training zu sparen: Sie können Ihre vollständigen Daten nur in zwei Sätze aufteilen - einen Entwickler- und einen Testsatz - und verwenden Sie das Entwicklungsset, um einen Lebenslauf zu erstellen, während Sie ES auf jeden Split anwenden. Das heißt, Sie trainieren bei jeder Aufteilung Ihres Entwicklungssatzes und stoppen, sobald der niedrigste Fehler in den Trainingsinstanzen, die Sie für die Bewertung dieser Aufteilung reserviert haben, erreicht wurde [1]. Dann mitteln Sie die Anzahl der Epochen, die erforderlich sind, um den niedrigsten Fehler aus jeder Aufteilung zu erreichen, und trainieren mit dem vollständigen Entwicklungssatz für diese (gemittelte) Anzahl von Epochen. Schließlich validieren Sie das Ergebnis des Test-Sets, das Sie beiseite gelegt und noch nicht berührt haben.

[1] Im Gegensatz zum Higgs Broson würde ich empfehlen, nach jeder Epoche zu bewerten . Zwei Gründe dafür: (1) Im Vergleich zum Training wird die Evaluierungszeit vernachlässigbar sein. (2), stell dir deine min. Der Fehler liegt in Epoche 51, aber Sie bewerten in Epoche 50 und 60. Es ist nicht unwahrscheinlich, dass der Fehler in Epoche 60 geringer ist als in Epoche 50; Sie würden jedoch 60 als Epochenparameter wählen, was eindeutig nicht optimal ist und sogar ein wenig gegen den Zweck verstößt, ES überhaupt zu verwenden.

fnl
quelle
Vielen Dank für Ihre Antwort. Ich habe meine Daten bereits in dev und test aufgeteilt. Ich habe das Testset nie berührt. Ich teile das Entwickler-Set weiter in 10 Falten und mache den Lebenslauf darauf. 9-faches Training, 1-faches Dev. Die Entwicklungsfalte wird für ES verwendet und hat bereits jede Epoche überprüft. Da ich nicht näher darauf eingegangen bin, wie ich meine Trennung mache (sorry!); mache ich schon das, was du mir vorgeschlagen hast oder habe ich dich irgendwo falsch verstanden?
V1nc3nt
Gut gemacht - du machst schon alles richtig, würde ich sagen!
fnl
Am Ende ist frühes Stoppen also nur eine Möglichkeit, den Hyperparameter "Anzahl der Epochen" einzustellen. Ich habe es unter dem falschen Eindruck verwendet und hatte Angst, dass ich noch einmal von vorne anfangen und alle meine Tests wiederholen musste, weil ich es falsch verwendet habe. Aber ich kann es reibungslos integrieren. Danke für Ihre Hilfe.
V1nc3nt
3

Die Art und Weise, wie Sie mithilfe der Kreuzvalidierung die optimale Anzahl von Epochen bestimmen können, um mit frühem Stopp zu trainieren, ist folgende: Angenommen, wir haben für 1 bis 100 Epochen trainiert. Trainieren Sie für jede Falte Ihr Modell und zeichnen Sie den Validierungsfehler beispielsweise alle 10 Epochen auf. Speichern Sie diese Trajektorien des Validierungsfehlers im Verhältnis zur Anzahl der trainierten Epochen und mitteln Sie sie über alle Falten zusammen. Dies ergibt eine Kurve "Durchschnittlicher Testfehler gegen Epoche". Der zu verwendende Haltepunkt ist die Anzahl der Epochen, die den durchschnittlichen Testfehler minimieren. Sie können dann Ihr Netzwerk auf dem vollständigen Trainingssatz (keine Kreuzvalidierung) für so viele Epochen trainieren.

Der Zweck des frühen Anhaltens besteht darin, eine Überanpassung zu vermeiden. Sie verwenden die N-fache Kreuzvalidierung, um den Generalisierungsfehler Ihres Modells abzuschätzen, indem Sie N synthetische Zug- / Testsätze erstellen und (normalerweise) die Ergebnisse zusammen mitteln. Hoffentlich wird der Testsatz (auch bekannt als neue reale Daten), den Sie später erhalten, den synethetischen Testsätzen, die Sie mit CV generiert haben, ähnlich genug sein, sodass der zuvor gefundene Haltepunkt angesichts dieses neuen Tests nahezu optimal ist Daten.

der Higgs Broson
quelle
Was Sie in Ihrem ersten Absatz beschreiben, ist meiner Meinung nach nicht wirklich das "frühe Stoppen", da Sie Ihr Modell für diese 100 Epochen auf jeder Falte ausführen müssten, um die Ergebnisse zu vergleichen, oder? Aber normalerweise möchten Sie auch frühzeitig mit der Kreuzvalidierung aufhören, wenn ich das richtig verstehe (spart auch viel Zeit). Auf jeden Fall scheint es eine vernünftige Möglichkeit zu sein, herauszufinden, wie viele Epochen für den letzten Testlauf ausgeführt werden müssen. Aber würden Sie nicht lieber wie vorgeschlagen frühzeitig anhalten (auch für den Lebenslauf) und die Methode verwenden, die Sie in Ihrem ersten Absatz für das beste, endgültig abgestimmte Modell beschrieben haben?
V1nc3nt
1
Wie ich "frühes Stoppen" beschrieben habe, ist, wie (ich glaube) die meisten Leute es tun würden. Wenn man im CV Testfehler gegen Epochenkurven generiert, legt man normalerweise nur die Gesamtzahl der Epochen fest, für die man trainiert. Wenn Sie die maximale Anzahl zulässiger Epochen erreicht haben, ist die Fehlerkurve hoffentlich abgeflacht. Wenn nicht, gehen Sie zurück und wiederholen Sie den Vorgang mit einer größeren maximalen Epochengrenze. Wenn Ihr Programm Ihnen jedoch mitteilt, dass der Testfehler um 50 Epochen gestiegen ist, müssen Sie ihn nicht auf 100 trainieren. Das Ziel besteht darin, nur so viel zu trainieren, dass Ihr Testfehler aufhört Verbesserung.
der Higgs Broson
1
Ich möchte auch darauf hinweisen, dass ein weiterer Grund dafür, dass die maximale Anzahl der Trainingsepochen über Falten hinweg konsistent bleibt, darin besteht, dass sich der Testfehler in 1-fach bei 60 Epochen möglicherweise nicht mehr verbessert, in einem anderen Fall jedoch bei 80 Epochen. Wenn Sie alle Testfehlerkurven über Falten hinweg mitteln, um den tatsächlichen Haltepunkt zu bestimmen, benötigen Sie Testfehlerdaten in jeder Epoche für jede Falte. Wenn Sie das Training innerhalb einer Falte vorzeitig beenden, können Sie dies möglicherweise verhindern.
der Higgs Broson
Eigentlich habe ich angefangen, früh anzuhalten, weil das Training ewig dauert. Das Modell hat viele Parameter und Daten. Ich wollte also, dass es aufhört, sobald der Validierungsfehler zunimmt (für 2 Epochen hintereinander als sogenannter "Geduld" -Parameter). Ich kann es also nicht wirklich trainieren, bis das Lernen aufhört. Trotzdem kann ich das tun, was Sie für das endgültige Modell vorschlagen, und die Fehlerverläufe aus den Epochen aller Falten vergleichen und die Anzahl der Epochen mit dem niedrigsten gemittelten Fehler ermitteln. Habe ich Sie richtig verstanden? Natürlich kann ich nur das Minimum der berechneten Epochen aller Falten vergleichen.
V1nc3nt
1
Vincent, ich denke du verstehst das richtig. Wenn Sie die Fehlerkurven zusammen mitteln, müssen Sie tatsächlich bei der minimalen Epochenzahl über Falten anhalten. Um sicher zu gehen, würde ich empfehlen, zurück zu gehen und die Modelle in anderen Falten bis zur maximalen Stopp-Epoche zu trainieren.
der Higgs Broson