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?
machine-learning
python
deep-learning
Raghuram
quelle
quelle
Antworten:
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
loss
Wert 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):
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:
Mögliche Lösungen:
quelle
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).
quelle
Zur Antwort hinzufügen von @ dk14. Wenn Sie nach der ordnungsgemäßen Regularisierung Ihres Modells weiterhin Schwankungen feststellen , können folgende Gründe vorliegen:
quelle
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.
quelle
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 .
quelle
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
quelle
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.
quelle