Warum schwankt die Validierungsgenauigkeit?

30

Ich habe ein vierschichtiges CNN, um die Reaktion auf Krebs mithilfe von MRT-Daten vorherzusagen. Ich benutze ReLU-Aktivierungen, um Nichtlinearitäten einzuführen. Die Zuggenauigkeit und der Verlust nehmen monoton zu bzw. ab. Aber meine Testgenauigkeit beginnt wild zu schwanken. Ich habe versucht, die Lernrate zu ändern und die Anzahl der Schichten zu reduzieren. Aber es stoppt die Schwankungen nicht. Ich habe diese Antwort sogar gelesen und versucht, den Anweisungen in dieser Antwort zu folgen, aber kein Glück mehr. Könnte mir jemand helfen, herauszufinden, wo ich falsch liege?

Bildschirmfoto

Raghuram
quelle
Ja, ich habe diese Antwort gelesen. Das Mischen der Validierungsdaten hat nicht geholfen
Raghuram
4
Da Sie Ihr Code-Snippet nicht freigegeben haben, kann ich nicht viel darüber sagen, was an Ihrer Architektur nicht stimmt. In Ihrem Screenshot wird jedoch deutlich, dass Ihr Netzwerk überlastet ist, wenn Sie die Genauigkeit Ihrer Schulung und Validierung sehen. Es wäre besser, wenn Sie Ihr Code-Snippet hier teilen.
Nain
Wie viele Proben haben Sie? Vielleicht ist die Fluktuation nicht wirklich signifikant. Auch die Genauigkeit ist schrecklich
rep_ho
Kann mir jemand bei der Überprüfung helfen, ob die Verwendung eines Ensemble-Ansatzes bei schwankender Validierungsgenauigkeit sinnvoll ist? weil ich meine schwankende validation_accuracy von ensemble zu einem guten wert verwalten konnte.
Sri2110,

Antworten:

26

Wenn ich die Definition der Genauigkeit richtig verstehe, ist die Genauigkeit (% der richtig klassifizierten Datenpunkte) weniger kumulativ als beispielsweise MSE (Mean Squared Error). Das ist der Grund, warum Sie sehen, dass Ihr lossWert schnell ansteigt, während die Genauigkeit schwankt.

Intuitiv bedeutet dies im Grunde, dass ein Teil der Beispiele nach dem Zufallsprinzip klassifiziert wird , was zu Schwankungen führt, da die Anzahl der richtigen Zufallsschätzungen immer schwankt (stellen Sie sich Genauigkeit vor, wenn die Münze immer "Köpfe" zurückgeben sollte). Grundsätzlich ist die Empfindlichkeit gegenüber Lärm (wenn die Klassifizierung ein zufälliges Ergebnis liefert) eine gebräuchliche Definition der Überanpassung (siehe Wikipedia):

In der Statistik und beim maschinellen Lernen besteht eine der häufigsten Aufgaben darin, ein "Modell" an eine Reihe von Trainingsdaten anzupassen, um verlässliche Vorhersagen für allgemeine, nicht geschulte Daten treffen zu können. Bei der Überanpassung beschreibt ein statistisches Modell zufällige Fehler oder Störungen anstelle der zugrunde liegenden Beziehung

Ein weiterer Beweis für eine Überanpassung ist, dass Ihr Verlust zunimmt. Der Verlust wird genauer gemessen und reagiert empfindlicher auf die lauten Vorhersagen, wenn er nicht durch Sigmoide / Schwellenwerte unterdrückt wird (was für den Verlust selbst der Fall zu sein scheint). Intuitiv können Sie sich eine Situation vorstellen, in der das Netzwerk bei der Ausgabe zu sicher ist (wenn sie falsch ist), sodass bei einer zufälligen Fehlklassifizierung ein Wert angegeben wird, der weit vom Schwellenwert entfernt liegt.

In Bezug auf Ihren Fall ist Ihr Modell nicht ordnungsgemäß reguliert, mögliche Gründe:

  • Nicht genügend Datenpunkte, zu viel Kapazität
  • Bestellung
  • Keine / falsche Merkmalsskalierung / Normalisierung
  • ααα

Mögliche Lösungen:

  • mehr Datenpunkte erhalten (oder die Menge der vorhandenen künstlich erweitern)
  • Spiel mit Hyperparametern (z. B. Kapazität erhöhen / verringern oder Regularisierungsbegriff)
  • Regularisierung : versuchen Sie es mit Abbruch, frühzeitigem Anhalten usw.
dk14
quelle
Hinsichtlich: "Der Verlust wird genauer gemessen, er reagiert empfindlicher auf verrauschte Vorhersagen, da er nicht durch Sigmoide / Schwellenwerte gequetscht wird", stimme ich keinem Schwellenwert zu, aber wenn Sie z eine Rolle.
Zhubarb
1
In Bezug auf die Lernrate und das Fehlen der Mindestanforderung: Das Erreichen der Mindestanforderung würde höchstwahrscheinlich eine Überanpassung bedeuten (da dies die Mindestanforderung für das Trainingsset ist)
Jan Kukacka
@ Berkmeister stimmt, ich habe ein bisschen umformuliert (siehe edit). Meiner Meinung nach ist ein erhöhter Verlust ein Zeichen dafür, dass die Funktion nicht gequetscht wird.
2.
@ JanKukacka meinst du globale Minima? Ich habe die lokalen Minima impliziert (tatsächlich in der Nähe von lokalen Minima) - in der Bedeutung, dass es dann unterpassend wäre, wenn es zu weit von irgendwelchen Minima entfernt ist. Wahrscheinlich sollte ich es genauer beschreiben (siehe Bearbeiten), danke.
2.
@dk14 Ich gehe davon aus, dass das globale Minimum in der Praxis nicht erreicht werden kann, also meine ich eher lokale Minima. Wenn Sie zu weit entfernt sind, sind Sie möglicherweise zu schwach, aber wenn Sie zu nah dran sind, sind Sie höchstwahrscheinlich übermäßig fit. Es gibt eine interessante Arbeit von Moritz Hardt: "Schneller trainieren , besser verallgemeinern: Stabilität des stochastischen Gefälles" ( arxiv.org/abs/1509.01240 ), die die Beziehung zwischen Training und Testfehler beim Training mit SGD einschränkt.
Jan Kukacka
6

Diese Frage ist alt, wurde jedoch noch nicht beantwortet:

Möglichkeit 1 : Sie wenden eine Art Vorverarbeitung (Nullbedeutung, Normalisierung usw.) auf Ihren Trainingssatz oder Validierungssatz an, jedoch nicht auf den anderen .

Möglichkeit 2 : Wenn Sie einige Ebenen erstellt haben, die während des Trainings anders ablaufen und von Grund auf neu erstellt wurden, ist Ihr Modell möglicherweise falsch implementiert (z. B. werden der gleitende Mittelwert und die gleitende Standardabweichung für die Chargennormalisierung während des Trainings aktualisiert? Wenn Sie Dropout verwenden, werden die Gewichte während des Trainings richtig skaliert Inferenz?). Dies kann der Fall sein, wenn Ihr Code diese Dinge von Grund auf neu implementiert und die in Tensorflow / Pytorch integrierten Funktionen nicht verwendet.

Möglichkeit 3: Überanpassung, wie jeder darauf hingewiesen hat. Ich finde die anderen beiden Optionen in Ihrer spezifischen Situation wahrscheinlicher, da Ihre Validierungsgenauigkeit bei 50% von Epoche 3 steckt. Im Allgemeinen würde ich mir mehr Sorgen über eine Überanpassung machen, wenn dies zu einem späteren Zeitpunkt passiert (es sei denn, Sie haben ein ganz bestimmtes Problem) zur Hand).

Soroush
quelle
Ich habe ein ähnliches, aber nicht ganz genaues Problem, mehr Details hier: stackoverflow.com/questions/55348052/… In meinem Fall habe ich tatsächlich eine gleichbleibend hohe Genauigkeit mit Testdaten und während des Trainings die Validierungsgenauigkeit "(kein Verlust) ist höher als die Trainingsgenauigkeit. Aber die Tatsache, dass es niemals konvergiert und oszilliert, lässt mich an eine Überanpassung denken, während einige vermuten, dass dies nicht der Fall ist. Ich frage mich, ob dies der Fall ist und was die Rechtfertigung ist, wenn dies nicht der Fall ist.
dusa
1
Dies ist bei weitem die plausibelste Erklärung für die gegebenen Antworten. Beachten Sie, dass ein hohes Moment der Batch-Normalisierung (z. B. 0,999 oder sogar der Keras-Standardwert 0,99) in Kombination mit einer hohen Lernrate auch zu einem sehr unterschiedlichen Verhalten beim Training und bei der Auswertung führen kann, da die Ebenenstatistik sehr weit zurückliegt. In diesem Fall sollte es ausreichen, den Impuls auf etwa 0,9 zu reduzieren. Ich hatte ein ähnliches Problem wie OP und dies hat den Trick getan.
Kristjan
5

Zur Antwort hinzufügen von @ dk14. Wenn Sie nach der ordnungsgemäßen Regularisierung Ihres Modells weiterhin Schwankungen feststellen , können folgende Gründe vorliegen:

  • Verwenden einer Zufallsstichprobe aus Ihrem Validierungssatz: Dies bedeutet, dass Ihr Validierungssatz bei jedem Evaluierungsschritt unterschiedlich ist, ebenso wie Ihr Validierungsverlust.
  • Verwendung einer Weighted-Loss-Funktion (die bei stark unausgeglichenen Klassenproblemen verwendet wird). Im Zugschritt wägen Sie Ihre Verlustfunktion anhand der Klassengewichte ab, während Sie im Entwicklungsschritt nur den ungewichteten Verlust berechnen. In einem solchen Fall kann es vorkommen, dass Ihr Netzwerk in die Konvergenz gerät und nach jedem Zugschritt viele Schwankungen beim Validierungsverlust auftreten. Wenn Sie jedoch auf ein größeres Bild warten, können Sie feststellen, dass Ihr Netzwerk tatsächlich mit abnehmenden Schwankungen auf ein Minimum zuläuft (siehe die angehängten Bilder für ein solches Beispiel).enter image description hereenter image description here
Bits pro Sekunde
quelle
2

Auf jeden Fall überpassend. Die Lücke zwischen der Genauigkeit der Trainingsdaten und den Testdaten zeigt, dass Sie zu viel trainiert haben. Vielleicht kann Regularisierung helfen.

keramat
quelle
1

Ihre Validierungsgenauigkeit bei einem Binärklassifizierungsproblem (ich nehme an) "schwankt" um 50%. Dies bedeutet, dass Ihr Modell vollständig zufällige Vorhersagen liefert (manchmal werden nur wenige Stichproben mehr und manchmal nur wenige Stichproben weniger richtig geschätzt). Im Allgemeinen ist Ihr Modell nicht besser als eine Münze zu werfen.

Der Grund, warum der Validierungsverlust stabiler ist, ist die kontinuierliche Funktion: Sie kann unterscheiden, dass die Vorhersage 0.9 für eine positive Probe korrekter ist als eine Vorhersage 0.51. Aus Gründen der Genauigkeit runden Sie diese fortlaufenden Logit-Vorhersagen auf{0;1}und berechnen Sie einfach den Prozentsatz der korrekten Vorhersagen. Nun, da Ihr Modell schätzt, sagt es höchstwahrscheinlich Werte nahe 0,5 für alle Stichproben voraus. Nehmen wir an, eine Stichprobe erhält nach einer Epoche 0,49 und in der nächsten 0,51. Aus der Verlustperspektive hat sich an der Unrichtigkeit der Vorhersage nicht viel geändert, während die Genauigkeit selbst für diese kleinen Unterschiede empfindlich ist.

Wie andere bereits betont haben, ist Ihr Modell auf jeden Fall einer schweren Überanpassung ausgesetzt. Meiner Meinung nach ist Ihr Problem zu kompliziert , dh es ist sehr schwierig, die gewünschten Informationen aus Ihren Daten zu extrahieren, und solch ein einfaches, end2end-geschultes 4-Schicht-Conv-Netz hat keine Chance, es zu lernen .

Jan Kukacka
quelle
0

In Ihrer Situation gibt es nur wenige Möglichkeiten, es zu versuchen. Versuchen Sie zunächst, die Chargengröße zu erhöhen, damit der SGD-Wert der Mini-Charge weniger wild wandert. Zweitens sollte die Lernrate kleiner eingestellt werden. Drittens probieren Sie verschiedene Optimierer aus, zum Beispiel Adam oder RMSProp, die in der Lage sind, die Lernraten für die Schreibfunktionen anzupassen. Wenn möglich, erweitern Sie Ihre Daten. Zuletzt versuchen Sie es mit Bayes'schen neuronalen Netzen mittels Dropout-Approximation, einer sehr interessanten Arbeit von Yarin Gal. Https://arxiv.org/abs/1506.02158

Pateheo
quelle
0

Haben Sie ein kleineres Netzwerk ausprobiert? In Anbetracht der Tatsache, dass Ihre Trainingsgenauigkeit> 0,99 erreichen kann, scheint Ihr Netzwerk über genügend Verbindungen zu verfügen, um Ihre Daten vollständig zu modellieren, aber Sie haben möglicherweise externe Verbindungen, die nach dem Zufallsprinzip lernen (dh Überanpassung).

Nach meiner Erfahrung konnte ich die Genauigkeit der Holdout-Validierung verbessern, um sie mit einem kleineren Netzwerk zu stabilisieren, indem ich verschiedene Netzwerke wie ResNet, VGG und noch einfachere Netzwerke ausprobierte.

teter123f
quelle