Kann es zu einer Überanpassung kommen, auch wenn der Validierungsverlust weiterhin sinkt?

12

Ich habe ein Faltungs + LSTM-Modell in Keras, ähnlich wie dieses (Ref. 1), das ich für einen Kaggle-Wettbewerb verwende. Die Architektur ist unten dargestellt. Ich habe es auf meinem etikettierten Satz von 11000 Proben trainiert (zwei Klassen, anfängliche Prävalenz ist ~ 9: 1, daher habe ich die 1 auf etwa 1/1 hochgerechnet) für 50 Epochen mit 20% Validierungssplit für eine Weile, aber ich dachte, es hat es unter Kontrolle gebracht mit Lärm und Dropout-Schichten.

Das Modell sah aus, als würde es wunderbar trainieren. Am Ende wurden 91% des gesamten Trainingssatzes erzielt, aber beim Testen des Testdatensatzes lag absoluter Müll vor.

Verlust durch Epoche

Validierungsgenauigkeit nach Epoche

Hinweis: Die Validierungsgenauigkeit ist höher als die Trainingsgenauigkeit. Dies ist das Gegenteil von "typischer" Überanpassung.

Ich habe die Intuition, dass das Modell angesichts der kleinen Teilung der Validierung immer noch zu stark in die Eingabemenge passt und die Generalisierung verliert. Der andere Hinweis ist, dass val_acc größer als acc ist, was faul zu sein scheint. Ist das hier das wahrscheinlichste Szenario?

Wenn dies überpassend ist, würde eine Erhöhung des Validierungssplits dies überhaupt abmildern, oder werde ich auf dasselbe Problem stoßen, da im Durchschnitt jede Stichprobe immer noch die Hälfte der gesamten Epochen aufweist?

Das Model:

Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
convolution1d_19 (Convolution1D) (None, None, 64)      8256        convolution1d_input_16[0][0]     
____________________________________________________________________________________________________
maxpooling1d_18 (MaxPooling1D)   (None, None, 64)      0           convolution1d_19[0][0]           
____________________________________________________________________________________________________
batchnormalization_8 (BatchNormal(None, None, 64)      128         maxpooling1d_18[0][0]            
____________________________________________________________________________________________________
gaussiannoise_5 (GaussianNoise)  (None, None, 64)      0           batchnormalization_8[0][0]       
____________________________________________________________________________________________________
lstm_16 (LSTM)                   (None, 64)            33024       gaussiannoise_5[0][0]            
____________________________________________________________________________________________________
dropout_9 (Dropout)              (None, 64)            0           lstm_16[0][0]                    
____________________________________________________________________________________________________
batchnormalization_9 (BatchNormal(None, 64)            128         dropout_9[0][0]                  
____________________________________________________________________________________________________
dense_23 (Dense)                 (None, 64)            4160        batchnormalization_9[0][0]       
____________________________________________________________________________________________________
dropout_10 (Dropout)             (None, 64)            0           dense_23[0][0]                   
____________________________________________________________________________________________________
dense_24 (Dense)                 (None, 2)             130         dropout_10[0][0]                 
====================================================================================================
Total params: 45826

Hier ist der Aufruf zum Anpassen des Modells (die Klassengewichtung liegt normalerweise bei 1: 1, da ich die Eingabe hochgerechnet habe):

class_weight= {0:1./(1-ones_rate), 1:1./ones_rate} # automatically balance based on class occurence
m2.fit(X_train, y_train, nb_epoch=50, batch_size=64, shuffle=True, class_weight=class_weight, validation_split=0.2 )

SE hat eine dumme Regel, die besagt, dass ich nicht mehr als 2 Links posten kann, bis meine Punktzahl höher ist. Hier ist das Beispiel, falls Sie interessiert sind: Ref 1: Maschinenlernen-Meisterschaft Python-Keras

DeusXMachina
quelle

Antworten:

8

Ich bin nicht sicher, ob der Validierungssatz ausgewogen ist oder nicht. Sie haben ein schwerwiegendes Problem mit dem Datenungleichgewicht. Wenn Sie aus jeder Klasse die gleiche und zufällige Stichprobe zum Trainieren Ihres Netzwerks ziehen und dann einen Prozentsatz der Stichprobe zur Validierung Ihres Netzwerks verwenden, bedeutet dies, dass Sie mit einem ausgeglichenen Datensatz trainieren und validieren. Beim Testen haben Sie eine unausgeglichene Datenbank verwendet. Dies bedeutet, dass Ihre Validierungs- und Testsätze nicht gleichwertig sind. In diesem Fall haben Sie möglicherweise eine hohe Validierungsgenauigkeit und eine niedrige Testgenauigkeit. Sie finden diese Referenz , dass die Gespräche in erster Linie um Daten Ungleichgewicht Problem für DNN, können Sie prüfen , wie sie die Ausbildung, Validierung zu tun , probieren und testen https://pdfs.semanticscholar.org/69a6/8f9cf874c69e2232f47808016c2736b90c35.pdf

Bashar Haddad
quelle
1
Der Validierungssatz wird aus demselben Satz wie der Trainingssatz gezogen. Ich bin nicht hundertprozentig sicher, aber ich glaube, dass Keras den Validierungsschnitt vor dem Mischen und Trainieren vornimmt (dh, wenn Sie nicht gemischte Daten eingeben, wird ein Teil Ihrer Distribution durch die Validierungsaufteilung abgeschnitten). Also balanciere und mische ich manuell, bevor ich zu Keras übergehe. Das einzige Problem könnte sein, dass ich die Einsen dupliziere und Gauß'sches Rauschen hinzufüge, was die Überanpassung verstärken kann.
DeusXMachina
2
Ich denke, Sie müssen sich nicht auf Keras verlassen, um die Validierung durchzuführen. Sie können Ihre Daten in drei Teile aufteilen. Schulung, Validierung und Prüfung. Probieren Sie die Trainingsdaten aus und trainieren Sie Ihr Netzwerk. Spielen Sie nicht mit der Verteilung in den Validierungs- und Testsätzen. Optimieren Sie Ihr Netzwerk auf dem Validierungssatz und überprüfen Sie dann den Testsatz. Ich habe meine Antwort bearbeitet, um eine nützliche Referenz hinzuzufügen
Bashar Haddad
5

Wenn Ihr Trainingsverlust unter Ihrem Validierungsverlust liegt, sind Sie überfordert , auch wenn die Validierung immer noch abfällt.

Dies ist das Zeichen dafür, dass Ihr Netzwerk Muster in der Zuggruppe lernt, die in der Validierungsgruppe nicht zutreffen

Fett gedruckt
quelle
Ich verstehe, dass der Trainingsverlust geringer ausfällt als der Validierungsverlust - dies ist nur eine Überanpassung des Trainingssatzes. Die Validierungsgenauigkeit ist jedoch höher als die Trainingsgenauigkeit . Das ist der seltsame Teil!
DeusXMachina
Nicht, wenn Ihre Sets nicht ausbalanciert sind. Wenn Sie beispielsweise in einem Binärklassifikator im Validierungssatz einen Anteil von weniger als 1 haben und Ihr Modell nur 0s ausgibt, haben Sie eine höhere Validierungsgenauigkeit
fettgedruckt vom