Errore di convalida inferiore all'errore di addestramento?


58

Ho trovato due domande qui e qui su questo problema, ma non c'è ancora una risposta o spiegazione ovvia. Faccio valere lo stesso problema in cui l'errore di convalida è inferiore all'errore di addestramento nella mia rete neurale di convoluzione. Cosa significa?


Non credo che si possa rispondere a questa domanda senza conoscere il numero assoluto di training (cv) e casi di test, nonché la varianza osservata per MSE sia per la validazione incrociata che per il test.
cbeleites supporta Monica il

shuffle i dati
user0

Cosa deduciamo da questo? Sì, è generato da una fitta rete con livelli di dropout e batchnorm. ! [inserisci la descrizione dell'immagine qui ] ( i.stack.imgur.com/KX1Fz.png )
Srinath il

Risposte:


70

È difficile essere certi senza conoscere la propria metodologia effettiva (ad esempio metodo di convalida incrociata, metrica delle prestazioni, metodo di suddivisione dei dati, ecc.).

In generale, tuttavia, l'errore di allenamento sottostimerà quasi sempre l'errore di convalida. Tuttavia, è possibile che l'errore di convalida sia inferiore alla formazione. Puoi pensarci in due modi:

  1. Il tuo set di allenamento aveva molti casi "difficili" da imparare
  2. Il set di convalida aveva principalmente casi "facili" da prevedere

Ecco perché è importante valutare davvero la metodologia di training del modello. Se non dividi i tuoi dati per allenarti correttamente, i risultati porteranno a conclusioni confuse, se non semplicemente errate.

Penso alla valutazione del modello in quattro diverse categorie:

  1. Underfitting: errore di convalida e formazione elevato

  2. Overfitting - Errore di convalida alto, errore di addestramento basso

  3. Buona vestibilità - Errore di convalida basso, leggermente superiore all'errore di addestramento

  4. Sconosciuto: errore di convalida basso, errore di addestramento "alto"

Dico adattamento 'sconosciuto' perché il risultato è contro intuitivo al funzionamento dell'apprendimento automatico. L'essenza di ML è predire l'ignoto. Se sei più bravo a prevedere l'ignoto di quello che hai "appreso", AFAIK i dati tra formazione e validazione devono essere in qualche modo diversi. Ciò potrebbe significare che è necessario rivalutare il metodo di suddivisione dei dati, aggiungere più dati o eventualmente modificare la metrica delle prestazioni (si sta effettivamente misurando le prestazioni desiderate?).

MODIFICARE

Per affrontare il riferimento del PO a una precedente domanda di lasagne in pitone .

Ciò suggerisce che si dispone di dati sufficienti per non richiedere la convalida incrociata e di disporre semplicemente dei sottoinsiemi di dati di addestramento, convalida e test. Ora, se guardi il tutorial sulle lasagne , puoi vedere che lo stesso comportamento è visibile nella parte superiore della pagina. Troverei difficile credere che gli autori pubblicherebbero tali risultati se fosse strano ma invece di supporre che siano corretti guardiamo oltre. La sezione di maggior interesse per noi qui è nella sezione del ciclo di allenamento , appena sopra la parte inferiore vedrai come vengono calcolati i parametri di perdita.

La perdita di allenamento viene calcolata sull'intero set di dati di allenamento . Allo stesso modo, la perdita di convalida viene calcolata sull'intero set di dati di convalida . Il set di training è in genere almeno 4 volte più grande della validazione (80-20). Dato che l'errore viene calcolato su tutti i campioni, è possibile prevedere fino a circa 4 volte la misura di perdita del set di convalida. Noterai, tuttavia, che la perdita di addestramento e la perdita di convalida si stanno avvicinando mentre la formazione continua. Questo è intenzionale come se il tuo errore di allenamento iniziasse a diminuire rispetto al tuo errore di validazione, inizieresti a sovrautilizzare il tuo modello !!!

Spero che questo chiarisca questi errori.


2
Bella risposta. Esiste anche la possibilità che nel codice sia presente un bug che rende possibile che l'addestramento non si sia convertito alla soluzione ottimale sul set di addestramento. Oppure, se l'obiettivo di addestramento non è convesso e l'algoritmo di addestramento converge a un minimo locale che risulta essere buono per il set di validazione.
Sobi,

@cdeterman grazie. Uso RMSE come metrica delle prestazioni. Ho diviso i miei dati in 20% per test e 80% per training e validazione (il 20% dei dati di training è validato per calcolare l'errore di validazione). In realtà, l'errore di convalida è basso, leggermente inferiore all'errore di addestramento. L'errore del test è superiore agli errori di addestramento e di convalida. Possiamo trovare un caso simile in MNISTdataset per il riconoscimento della grafia stats.stackexchange.com/questions/178371/…
Bido,

@Bido mi rivolge la mia modifica più recente?
cdeterman,

@cdeterman Grazie. Ho appena notato che hai modificato la tua risposta. È chiaro e utile.
Bido,

Grande spiegazione, se potessi aggiungere alcuni grafici - sarebbe il migliore possibile
Taras Matsyk,

109

Una possibilità: se si utilizza il livello di regolarizzazione degli abbandoni nella propria rete, è ragionevole che l'errore di convalida sia inferiore all'errore di addestramento. Perché di solito il dropout è attivato durante l'allenamento ma disattivato durante la valutazione sul set di validazione. In quest'ultimo caso ottieni una funzione più regolare (di solito significa migliore).


12
Che risposta semplice e ragionevole!
rajb245,

4
Sì, questo dovrebbe essere contrassegnato come risposta corretta in effetti.
Simanas,

2
Ho rimosso il mio livello di abbandono, ma inizialmente vedo ancora una perdita di validazione inferiore alla perdita di allenamento! (Non sto specificando alcuna regolarizzazione sui livelli!)
Josiah Yoder il

Si adatta al mio caso. Usando molti abbandoni.
André Christoffer Andersen,

@JosiahYoder - hai altro da condividere su questo? Ho 1650 funzioni di input. quando mantengo la rete piccola (1650, 50, 1) dropout o nessun dropout, l'errore di training nelle epoche iniziali è maggiore dell'errore di validazione. Quando utilizzo reti di grandi dimensioni (1650, 1200, 800, 100 ..... circa 10 strati di 100 con attivazione selu), lo strano modello di maggiore precisione di convalida viene in qualche modo mitigato.
MiloMinderbinder,

19

Non ho abbastanza punti per commentare la risposta di @DK, ma questa è ora una risposta come FAQ sulla documentazione di Keras:

"Perché la perdita di allenamento è molto superiore alla perdita di test?

Un modello di Keras ha due modalità: allenamento e test. I meccanismi di regolarizzazione, come Dropout e L1 / L2, vengono disattivati ​​al momento del test.

Inoltre, la perdita di allenamento è la media delle perdite su ogni lotto di dati di allenamento. Poiché il modello sta cambiando nel tempo, la perdita rispetto ai primi lotti di un'epoca è generalmente maggiore rispetto agli ultimi lotti. D'altra parte, la perdita di prova per un'epoca viene calcolata usando il modello così com'è alla fine dell'epoca, con conseguente perdita inferiore. "


1
Anche questo non risponde interamente alla domanda. Con il dropout disattivato, vedo ancora la perdita di convalida circa la metà della perdita di allenamento per diverse epoche consecutive!
Josiah Yoder,

I tuoi dati di allenamento sono rappresentativi dei dati di sviluppo?
Dter

Ho diviso casualmente il set di dati in addestramento e test. Visivamente sembrava essere un buon campione. Stavo lavorando a un problema di regressione in cui i migliori classificatori erano solo leggermente migliori di prevedere sempre il valore medio.
Josiah Yoder,

La tua risposta non parla del fatto che la perdita di allenamento sia maggiore della perdita di validazione che è la domanda che è stata posta. Sei più concentrato sulla perdita di allenamento e sulla perdita del test
enjal

6

i miei 2 centesimi: ho avuto lo stesso problema anche senza i livelli di abbandono. Nel mio caso, i livelli sono stati i livelli norma batch. Quando li ho cancellati, la perdita di allenamento è diventata simile alla perdita di validazione. Probabilmente, ciò è accaduto perché durante l'addestramento batch-norm usa media e varianza del batch di input dato, che potrebbe essere diverso da batch a batch. Ma durante la valutazione la norma batch usa media e varianza correnti, entrambe le quali riflettono le proprietà dell'intero set di allenamento molto meglio della media e della varianza di un singolo lotto durante l'allenamento. Almeno, è così che viene implementata la norma batch in pytorch


1
Grazie a @ Mans007, questo mi era successo e stavo usando Keras. Gli strati batch-norma erano la causa.
Roei Bahumi,

4

Un'altra possibilità che combina in qualche modo la risposta di @cdeterman e @DK è se si utilizza un meccanismo di aumento dei dati. L'aumento dei dati di fatto viene generalmente eseguito solo sul set di allenamento e non sul set di convalida (come per la regolarizzazione del dropout), e ciò può portare a un set di validazione contenente casi "più facili" da prevedere rispetto a quelli nel set di training.


2

Ho ottenuto risultati simili (la perdita del test era significativamente inferiore alla perdita dell'allenamento). Una volta rimossa la regolarizzazione del dropout, entrambe le perdite sono diventate quasi uguali.


0

@cdeterman e @DK hanno buone spiegazioni. Vorrei un'altra ragione - data leakage. Alcune parti dei dati del tuo treno sono "strettamente correlate" con i dati del test.

Esempio potenziale: immagina di avere 1000 cani e 1000 gatti con 500 immagini simili per animale domestico (alcuni proprietari adorano fotografare i loro animali domestici in posizioni molto simili), ad esempio sullo sfondo. Quindi, se si esegue una suddivisione casuale 70/30, si otterrà una perdita di dati dei dati del treno nei dati di test.


0

In poche parole, se la perdita di allenamento e la perdita di validazione sono calcolate correttamente, è impossibile che la perdita di allenamento sia superiore alla perdita di validazione. Questo perché la retropropagazione riduce DIRETTAMENTE l'errore calcolato sul set di addestramento e solo INDIRETTAMENTE (nemmeno garantito!) Riduce l'errore calcolato sul set di validazione.

Ci devono essere alcuni fattori aggiuntivi che sono diversi durante l'allenamento e durante la convalida. L'abbandono è buono, ma possono essercene altri. Assicurati di controllare la documentazione di qualsiasi libreria che stai utilizzando. Modelli e livelli possono in genere avere impostazioni predefinite a cui comunemente non prestiamo attenzione.


0

Una convalida inferiore all'errore di addestramento può essere causata da fluttuazioni associate a dropout o altro, ma se persiste nel lungo periodo ciò può indicare che i set di dati di addestramento e validazione non sono stati effettivamente ricavati dagli stessi insiemi statistici. Ciò potrebbe accadere se i tuoi esempi provengono da una serie e se non hai randomizzato correttamente i set di dati di addestramento e convalida.


0

In questo momento, i metodi basati sul gradiente stocastico sono quasi sempre l'algoritmo di scelta per l'apprendimento profondo. Ciò significa che i dati arrivano come batch, i gradienti vengono calcolati e i parametri aggiornati. Ciò significa che è anche possibile calcolare la perdita sui dati quando viene selezionato ciascun batch. In questo quadro, ci sono due modi in cui viene calcolata la perdita a cui posso pensare, che può portare a questo fenomeno che l'errore di addestramento è maggiore dell'errore di validazione. Di seguito, mostro che Keras, in effetti, sembra calcolare gli errori nel campione in questi modi.

1.) L' errore di allenamento è calcolato in media su tutta l'epoca, piuttosto tutto in una volta alla fine dell'epoca, ma l'errore di validazione è solo alla fine dell'epoca. Si noti che l'errore di convalida ha il vantaggio di essere completamente aggiornato, mentre l'errore di addestramento include calcoli di errori con meno aggiornamenti. Naturalmente, asintoticamente questo effetto dovrebbe generalmente scomparire.

2.) L' errore di addestramento viene calcolato prima dell'aggiornamento batch. In un metodo basato sul gradiente stocastico, c'è del rumore nel gradiente. Mentre si sta salendo una collina, c'è un'alta probabilità che si stia riducendo la perdita globale calcolata su tutti i campioni di allenamento. Tuttavia, quando ci si avvicina molto alla modalità, la direzione di aggiornamento sarà negativa rispetto ai campioni nel batch. Ma poiché stiamo rimbalzando attorno a una modalità, ciò significa in media che dobbiamo scegliere una direzione positiva rispetto ai campioni fuoridi batch. Ora, se stiamo per aggiornare rispetto ai campioni in un determinato batch, ciò significa che sono stati respinti da potenzialmente molti aggiornamenti batch in cui non sono stati inclusi, calcolando la loro perdita prima dell'aggiornamento, questo è quando lo stocastico i metodi hanno spinto i parametri più a favore degli altri campioni nel set di dati, dandoci in tal modo una leggera distorsione verso l'alto nella perdita attesa.

Nota che mentre asintoticamente, l'effetto di (1) scompare, (2) no! Di seguito mostro che Keras sembra fare sia (1) che (2).

(1) Dimostrando che la metrica viene calcolata in media su ciascun lotto in epoca, piuttosto che tutti contemporaneamente alla fine. Notare l'enorme differenza nella precisione nel campione rispetto a val_accuracy che favorisce val_accuracy alla primissima epoca. Questo perché alcuni errori nel campione calcolati con pochissimi aggiornamenti batch.

>>> 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) La visualizzazione dell'errore viene calcolata prima dell'aggiornamento per ciascun batch. Si noti che per l'epoca 1, quando utilizziamo batch_size = nRows(cioè tutti i dati in un batch), l'errore nel campione è di circa 0,5 (ipotesi casuali) per l'epoca 1, ma l'errore di convalida è 0,82. Pertanto, l'errore nel campione è stato calcolato prima dell'aggiornamento batch, mentre l'errore di convalida è stato calcolato dopo l'aggiornamento batch.

>>> 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
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.