È possibile che si verifichi un overfitting anche con la perdita di convalida ancora in calo?


12

Ho un modello convoluzionale + LSTM in Keras, simile a questo (rif 1), che sto usando per un contest di Kaggle. L'architettura è mostrata di seguito. L'ho addestrato sul mio set etichettato di 11000 campioni (due classi, la prevalenza iniziale è ~ 9: 1, quindi ho ricampionato gli 1 a circa un rapporto 1/1) per 50 epoche con divisione del 20% di convalida. per un po ', ma ho pensato che fosse sotto controllo con livelli di rumore e dropout.

Il modello sembrava allenarsi meravigliosamente, alla fine ha ottenuto il 91% sull'intero set di addestramento, ma dopo i test sul set di dati di test, immondizia assoluta.

Perdita per epoca

Accuratezza della convalida per epoca

Avviso: l'accuratezza della convalida è superiore all'accuratezza dell'allenamento. Questo è l'opposto del sovradimensionamento "tipico".

La mia intuizione è che, data la suddivisione della convalida piccola, il modello sta ancora riuscendo a adattarsi troppo al set di input e perdere la generalizzazione. L'altro indizio è che val_acc è maggiore di acc, che sembra sospetto. È quello lo scenario più probabile qui?

Se si tratta di un overfitting, l'aumento della suddivisione della convalida lo mitigherebbe affatto, o mi imbatterò nello stesso problema, poiché in media, ogni campione vedrà ancora metà delle epoche totali?

Il modello:

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

Ecco la chiamata per adattarsi al modello (il peso della classe è in genere di 1: 1 poiché ho ricampionato l'input):

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 ha una regola sciocca che non posso pubblicare più di 2 link fino a quando il mio punteggio è più alto, quindi ecco l'esempio nel caso in cui tu sia interessato: Rif 1: machinelearningmastery DOT com SLASH sequenza-classificazione-lstm-recurrent-neural-networks- python-keras

Risposte:


8

Non sono sicuro che il set di validazione sia bilanciato o meno. Hai un grave problema di squilibrio dei dati. Se esegui il campionamento equamente e in modo casuale da ciascuna classe per addestrare la tua rete e quindi una percentuale di ciò che hai campionato viene utilizzata per convalidare la tua rete, ciò significa che ti alleni e convalidi utilizzando un set di dati bilanciato. Nel test hai utilizzato un database sbilanciato. Ciò significa che i set di validazione e test non sono equivalenti. In tal caso, potresti avere un'elevata precisione di convalida e una bassa accuratezza dei test. Si prega di trovare questo riferimento che parla principalmente del problema dello squilibrio dei dati per DNN, è possibile verificare come eseguono il campionamento per eseguire l'addestramento, la convalida e i test https://pdfs.semanticscholar.org/69a6/8f9cf874c69e2232f47808016c2736b90c35.pdf


1
Il set di convalida viene estratto dallo stesso set di training. Non sono sicuro al 100%, ma credo che Keras prenda il taglio di validazione prima di mescolarlo e addestrarlo (cioè se gli dai dati non mescolati, la divisione di validazione taglia via parte della tua distribuzione). Quindi bilancio e rimescolo manualmente prima di passare a Keras. L'unico problema potrebbe essere che sto duplicando gli 1 e aggiungendo il rumore gaussiano, il che potrebbe migliorare l'overfit.
DeusXMachina,

2
Penso che non sia necessario dipendere da Keras per eseguire la convalida, è possibile dividere i dati in tre parti. Formazione, validazione e test. Prova i dati di allenamento e addestra la tua rete. Non giocare con la distribuzione nei set di validazione e test. Ottimizza la tua rete sul set di convalida e quindi controlla il set di test. Ho modificato la mia risposta per aggiungere un utile riferimento
Bashar Haddad,

5

Se la perdita di allenamento è inferiore alla perdita di convalida, ci si sta adattando in modo eccessivo , anche se la convalida continua a cadere.

È il segno che la tua rete sta apprendendo modelli nel treno che non sono applicabili in quello di validazione


Comprendo che la perdita di addestramento va meno della perdita di convalida: questo è semplicemente un adattamento al set di addestramento. Ma l' accuratezza della convalida è superiore all'accuratezza dell'allenamento . Questa è la parte strana!
DeusXMachina,

Non se i tuoi set sono sbilanciati. Ad esempio, in un classificatore binario, se hai meno 1 in proporzione nel set di validazione e il tuo modello produce solo 0s, avresti una maggiore precisione di validazione
grassetto
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.