Validierungsfehler kleiner als Trainingsfehler?


57

Ich habe hier und hier zwei Fragen zu diesem Problem gefunden, aber es gibt noch keine offensichtliche Antwort oder Erklärung. Ich erzwinge dasselbe Problem, bei dem der Überprüfungsfehler geringer ist als der Trainingsfehler in meinem Convolution Neural Network. Was bedeutet das?


Ich denke nicht, dass diese Frage beantwortet werden kann, ohne die absolute Anzahl von Trainings (cv) und Testfällen sowie die Varianz zu kennen, die für MSE sowohl für die Kreuzvalidierung als auch für den Test beobachtet wurde.
cbeleites unterstützt Monica


Was schließen wir daraus? Ja, es wird aus einem dichten Netzwerk mit Dropout- und Batchnorm-Layern generiert. ! [Bildbeschreibung hier eingeben ] ( i.stack.imgur.com/KX1Fz.png )
Srinath

Antworten:


69

Es ist schwierig, ohne Kenntnis Ihrer tatsächlichen Methodik (z. B. Kreuzvalidierungsmethode, Leistungsmetrik, Datenaufteilungsmethode usw.) sicher zu sein.

Im Allgemeinen wird ein Trainingsfehler Ihren Validierungsfehler jedoch fast immer unterschätzen . Es ist jedoch möglich, dass der Validierungsfehler geringer ist als das Training. Sie können sich das auf zwei Arten vorstellen:

  1. Ihr Trainingsset hatte viele 'schwierige' Fälle zu lernen
  2. Ihr Validierungssatz war größtenteils "leicht" vorherzusagen

Aus diesem Grund ist es wichtig, dass Sie Ihre Modellschulungsmethodik wirklich evaluieren. Wenn Sie Ihre Daten für das Training nicht richtig aufteilen, führen Ihre Ergebnisse zu verwirrenden, wenn nicht sogar falschen Schlussfolgerungen.

Ich denke an die Modellbewertung in vier verschiedenen Kategorien:

  1. Underfitting - Validierungs- und Trainingsfehler hoch

  2. Überanpassung - Der Validierungsfehler ist hoch, der Trainingsfehler niedrig

  3. Gute Passform - Validierungsfehler niedrig, etwas höher als der Trainingsfehler

  4. Unbekannter Fit - Validierungsfehler niedrig, Trainingsfehler hoch

Ich sage "unbekannte" Passform, weil das Ergebnis der Funktionsweise des maschinellen Lernens widerspricht. Die Essenz von ML besteht darin, das Unbekannte vorherzusagen. Wenn Sie das Unbekannte besser vorhersagen können als das, was Sie "gelernt" haben, müssen die AFAIK-Daten zwischen Training und Validierung in irgendeiner Weise unterschiedlich sein. Dies kann bedeuten, dass Sie entweder Ihre Datenaufteilungsmethode neu bewerten, weitere Daten hinzufügen oder möglicherweise Ihre Leistungsmetrik ändern müssen (messen Sie tatsächlich die gewünschte Leistung?).

BEARBEITEN

Um den Verweis des OP auf eine frühere Python- Lasagne-Frage anzusprechen .

Dies deutet darauf hin, dass Sie über ausreichende Daten verfügen, um keine Kreuzvalidierung zu erfordern, und lediglich über Ihre Teilmengen von Trainings-, Validierungs- und Testdaten verfügen. Wenn Sie sich das Lasagne-Tutorial ansehen, sehen Sie, dass das gleiche Verhalten oben auf der Seite zu sehen ist. Ich würde es schwer finden zu glauben, dass die Autoren solche Ergebnisse veröffentlichen würden, wenn es seltsam wäre, aber anstatt nur anzunehmen, dass sie korrekt sind, schauen wir weiter. Der Abschnitt, der uns hier am meisten interessiert, befindet sich im Abschnitt mit den Trainingsschleifen . Unmittelbar über dem unteren Rand sehen Sie, wie die Verlustparameter berechnet werden.

Der Trainingsverlust wird über den gesamten Trainingsdatensatz berechnet . Ebenso wird der Validierungsverlust über den gesamten Validierungsdatensatz berechnet . Der Trainingssatz ist in der Regel mindestens viermal so groß wie die Validierung (80-20). Angesichts der Tatsache, dass der Fehler für alle Stichproben berechnet wird, können Sie mit einem bis zu vierfachen Verlust des Validierungssatzes rechnen. Sie werden jedoch feststellen, dass sich der Trainingsverlust und der Validierungsverlust im weiteren Verlauf des Trainings annähern. Dies ist so gewollt, als ob Ihr Trainingsfehler geringer wird als Ihr Validierungsfehler. Sie würden anfangen, Ihr Modell zu überrüsten !!!

Ich hoffe das klärt diese Fehler.


2
Gute Antwort. Es besteht auch die Möglichkeit, dass der Code einen Fehler enthält, der möglicherweise dazu führt, dass das Training nicht zur optimalen Lösung des Trainingssatzes konvergiert. Oder wenn das Trainingsziel nicht konvex ist und der Trainingsalgorithmus zu einem lokalen Minimum konvergiert, das für den Validierungssatz gut ist.
Sobi

Ich verwende RMSE als Leistungsmetrik. Ich habe meine Daten für Testzwecke in 20% und für Training und Validierung in 80% unterteilt (20% der Trainingsdaten werden zur Berechnung des Validierungsfehlers kreuzvalidiert). Tatsächlich ist der Validierungsfehler niedrig und geringfügig niedriger als der Trainingsfehler. Der Testfehler ist höher als Trainings- und Validierungsfehler. In MNISTdataset finden wir einen ähnlichen Fall für die Handschrifterkennung stats.stackexchange.com/questions/178371/…
Bido

@Bido stellt meine letzte Bearbeitungsadresse Ihre Frage?
Determan

@ cdeterman Danke. Ich habe gerade bemerkt, dass Sie Ihre Antwort bearbeitet haben. Es ist klar und hilfreich.
Bido

Tolle Erklärung, wenn Sie ein paar Grafiken hinzufügen könnten - es wäre die beste
Taras Matsyk

109

Eine Möglichkeit: Wenn Sie die Dropout-Regularisierungsschicht in Ihrem Netzwerk verwenden, ist es vernünftig, dass der Validierungsfehler kleiner als der Trainingsfehler ist. Denn in der Regel wird der Abbruch beim Training aktiviert, beim Auswerten des Validierungssatzes jedoch deaktiviert. Im letzteren Fall erhalten Sie eine glattere (normalerweise bessere) Funktion.


12
Was für eine einfache, vernünftige Antwort!
rajb245

4
Ja, dies sollte in der Tat als richtige Antwort markiert werden.
Simanas

2
Ich habe meine Dropout-Schicht entfernt, aber der Validierungsverlust ist immer noch niedriger als der anfängliche Trainingsverlust! (Ich gebe auch keine Regularisierung für die Ebenen an!)
Josiah Yoder

Passt zu meinem Koffer. Mit viel Dropout.
André Christoffer Andersen

@JosiahYoder - hast du noch etwas zu erzählen? Ich habe 1650 Eingabefunktionen. Wenn ich das Netzwerk klein halte (1650, 50, 1) oder kein Ausfall, ist der Trainingsfehler in den anfänglichen Epochen höher als der Validierungsfehler. Wenn ich große Netzwerke verwende (1650, 1200, 800, 100 ... ungefähr 10 Schichten von 100 mit Selu-Aktivierung), wird das seltsame Muster einer höheren Validierungsgenauigkeit etwas gemildert.
MiloMinderbinder

19

Ich habe nicht genug Punkte, um die Antwort von @ DK zu kommentieren, aber dies wird jetzt als FAQ zu Keras 'Dokumentation beantwortet:

"Warum ist der Trainingsverlust viel höher als der Testverlust?

Ein Keras-Modell verfügt über zwei Modi: Training und Testen. Regularisierungsmechanismen wie Dropout- und L1 / L2-Gewichtsregulierung werden zum Testzeitpunkt deaktiviert.

Außerdem ist der Trainingsverlust der Durchschnitt der Verluste über jeden Stapel von Trainingsdaten. Da sich Ihr Modell im Laufe der Zeit ändert, ist der Verlust über die ersten Chargen einer Epoche im Allgemeinen höher als über die letzten Chargen. Andererseits wird der Testverlust für eine Epoche unter Verwendung des Modells wie am Ende der Epoche berechnet, was zu einem geringeren Verlust führt. "


1
Auch dies beantwortet die Frage nicht vollständig. Bei deaktiviertem Abbruch sehe ich immer noch den Validierungsverlust, etwa die Hälfte des Trainingsverlusts für mehrere aufeinanderfolgende Epochen!
Josiah Yoder

Sind Ihre Trainingsdaten repräsentativ für die Entwicklerdaten?
17.

Ich habe den Datensatz zufällig in Training und Testen aufgeteilt. Es schien visuell eine gute Probe zu sein. Ich arbeitete an einem Regressionsproblem, bei dem die besten Klassifikatoren nur geringfügig besser waren, als immer den Mittelwert vorherzusagen.
Josiah Yoder

In Ihrer Antwort geht es nicht darum, dass der Trainingsverlust größer ist als der Validierungsverlust, der die gestellte Frage ist. Sie konzentrieren sich mehr auf Trainingsverlust und Testverlust
bis

6

meine 2 cent: ich hatte auch das selbe problem ohne aussetzerschichten. In meinem Fall waren Chargennorm-Schichten die Schuldigen. Als ich sie löschte, wurde der Trainingsverlust dem Validierungsverlust ähnlich. Wahrscheinlich geschah dies, weil die Chargennorm während des Trainings den Mittelwert und die Varianz der angegebenen Input-Charge verwendet, die von Charge zu Charge unterschiedlich sein können. Bei der Bewertung werden jedoch der Laufmittelwert und die Varianz verwendet, die beide die Eigenschaften des gesamten Trainings widerspiegeln und viel besser als der Mittelwert und die Varianz eines einzelnen Loses während des Trainings sind. Zumindest wird die Chargennorm so in Pytorch implementiert


1
Danke @ Mans007, das war mir passiert und ich habe Keras benutzt. Die Chargennormschichten waren die Ursache.
Roei Bahumi

4

Eine andere Möglichkeit, die die Antwort von @cdeterman und @DK auf irgendeine Weise kombiniert , besteht darin, dass Sie einen Mechanismus zur Datenvergrößerung verwenden. Die Erweiterung der Infact-Daten wird normalerweise nur für den Trainingssatz und nicht für den Validierungssatz durchgeführt (wie bei der Dropout-Regularisierung). Dies kann zu einem Validierungssatz führen, der "leichter" vorhersagbare Fälle enthält als die im Trainingssatz.


2

Ich habe ähnliche Ergebnisse erhalten (der Testverlust war signifikant niedriger als der Trainingsverlust). Sobald ich die Dropout-Regularisierung entfernt hatte, waren beide Verluste fast gleich.


0

@cdeterman und @DK haben eine gute Erklärung. Ich möchte noch einen Grund nennen data leakage. Ein Teil Ihrer Zugdaten hängt "eng" mit den Testdaten zusammen.

Mögliches Beispiel: Stellen Sie sich vor, Sie haben 1000 Hunde und 1000 Katzen mit 500 ähnlichen Bildern pro Haustier (einige Besitzer fotografieren ihre Haustiere gern in sehr ähnlichen Positionen), etwa im Hintergrund. Wenn Sie also eine zufällige 70/30-Aufteilung vornehmen, werden die Zugdaten in die Testdaten übernommen.


0

Einfach ausgedrückt, wenn der Trainingsverlust und der Validierungsverlust korrekt berechnet werden, ist es unmöglich, dass der Trainingsverlust höher ist als der Validierungsverlust. Dies liegt daran, dass die Rückübertragung DIREKT den auf dem Trainingssatz berechneten Fehler reduziert und nur INDIREKT (nicht einmal garantiert!) Den auf dem Validierungssatz berechneten Fehler reduziert.

Während des Trainings und der Validierung müssen einige zusätzliche Faktoren unterschiedlich sein. Aussteiger sind gut, aber es kann auch andere geben. Überprüfen Sie unbedingt die Dokumentation der von Ihnen verwendeten Bibliothek. Modelle und Ebenen können normalerweise Standardeinstellungen haben, auf die wir normalerweise nicht achten.


0

Eine niedrigere Validierung als ein Trainingsfehler kann durch Fluktuationen verursacht werden, die mit dem Ausfall oder anderen Ursachen verbunden sind. Bleibt sie jedoch auf lange Sicht bestehen, kann dies darauf hinweisen, dass die Trainings- und Validierungsdatensätze nicht tatsächlich aus denselben statistischen Ensembles stammen. Dies kann vorkommen, wenn Ihre Beispiele aus einer Reihe stammen und Sie die Trainings- und Validierungsdatensätze nicht ordnungsgemäß randomisiert haben.


0

Derzeit sind stochastische gradientenbasierte Methoden fast immer der Algorithmus der Wahl für das Tiefenlernen. Dies bedeutet, dass Daten als Stapel eingehen, Verläufe berechnet und Parameter aktualisiert werden. Dies bedeutet, dass Sie auch den Verlust über die Daten berechnen können, wenn jeder Stapel ausgewählt wird. Unter diesem Rahmen gibt es zwei Arten, wie der Verlust berechnet wird, von denen ich mir vorstellen kann, dass sie zu dem Phänomen führen, dass der Trainingsfehler größer als der Validierungsfehler ist. Im Folgenden zeige ich, dass Keras tatsächlich die In-Sample-Fehler auf diese Weise zu berechnen scheint.

1.) Der Trainingsfehler wird über die gesamte Epoche gemittelt, am Ende der Epoche auf einmal, der Validierungsfehler jedoch erst am Ende der Epoche. Beachten Sie, dass der Validierungsfehler den Vorteil hat, dass er vollständig aktualisiert wird, während der Trainingsfehler Fehlerberechnungen mit weniger Aktualisierungen enthält. Natürlich sollte dieser Effekt asymptotisch im Allgemeinen verschwinden.

2.) Der Trainingsfehler wird berechnet, bevor die Stapelaktualisierung abgeschlossen ist. Bei einer stochastischen gradientenbasierten Methode tritt Rauschen auf. Während man auf einen Hügel steigt, besteht eine hohe Wahrscheinlichkeit, dass man den über alle Trainingsmuster berechneten globalen Verlust verringert. Wenn Sie sich dem Modus jedoch sehr nähern, ist die Aktualisierungsrichtung in Bezug auf die Proben in Ihrem Stapel negativ . Aber da wir um einen Modus prallen, bedeutet dies im Durchschnitt müssen wir eine Richtung werden die Wahl, die in Bezug auf die Proben positiv ausder Charge. Wenn wir jetzt eine Aktualisierung in Bezug auf die Beispiele in einem bestimmten Stapel durchführen möchten, bedeutet dies, dass sie durch potenziell viele Stapelaktualisierungen, in denen sie nicht enthalten waren, verschoben wurden, indem der Verlust vor der Aktualisierung berechnet wurde Die Methoden haben die Parameter am meisten zugunsten der anderen Stichproben in Ihrem Dataset verschoben, sodass der erwartete Verlust leicht nach oben tendiert.

Beachten Sie, dass die Wirkung von (1) asymptotisch verschwindet, die von (2) jedoch nicht! Unten zeige ich, dass Keras sowohl (1) als auch (2) zu tun scheint.

(1) Zeigen, dass die Metriken über jede Charge in der Epoche gemittelt werden und nicht alle auf einmal am Ende. Beachten Sie den RIESIGEN Unterschied zwischen der Genauigkeit in der Stichprobe und der Genauigkeit von val_accuracy, der die Genauigkeit von val_accuracy in der ersten Epoche begünstigt. Dies liegt daran, dass einige In-Sample-Fehler mit sehr wenigen Batch-Aktualisierungen berechnet wurden.

>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = 100, 
...                 validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 8s 176us/sample 
- loss: 0.2320 - accuracy: 0.9216 
- val_loss: 0.1581 - val_accuracy: 0.9636
Epoch 2/3
46580/46580 [==============================] - 8s 165us/sample 
- loss: 0.1487 - accuracy: 0.9662 
- val_loss: 0.1545 - val_accuracy: 0.9677
Epoch 3/3
46580/46580 [==============================] - 8s 165us/sample 
- loss: 0.1471 - accuracy: 0.9687 
- val_loss: 0.1424 - val_accuracy: 0.9699
<tensorflow.python.keras.callbacks.History object at 0x17070d080>

(2) Der Anzeigefehler wird vor der Aktualisierung für jeden Stapel berechnet . Beachten Sie, dass für Epoche 1, wenn wir verwenden batch_size = nRows(dh alle Daten in einem Stapel), der In-Sample-Fehler für Epoche 1 etwa 0,5 (zufälliges Erraten) beträgt, der Validierungsfehler jedoch 0,82. Daher wurde der In-Sample-Fehler vor der Stapelaktualisierung berechnet , während der Validierungsfehler nach der Stapelaktualisierung berechnet wurde .

>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = nRows, 
...                 validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 9s 201us/sample 
- loss: 0.7126 - accuracy: 0.5088 
- val_loss: 0.5779 - val_accuracy: 0.8191
Epoch 2/3
46580/46580 [==============================] - 6s 136us/sample 
- loss: 0.5770 - accuracy: 0.8211 
- val_loss: 0.4940 - val_accuracy: 0.8249
Epoch 3/3
46580/46580 [==============================] - 6s 120us/sample 
- loss: 0.4921 - accuracy: 0.8268 
- val_loss: 0.4502 - val_accuracy: 0.8249
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.