Perché l'accuratezza della convalida fluttua?


31

Ho una CNN a quattro strati per prevedere la risposta al cancro usando i dati della risonanza magnetica. Uso le attivazioni ReLU per introdurre non linearità. L'accuratezza e la perdita del treno aumentano e diminuiscono monotonicamente rispettivamente. Ma la precisione del mio test inizia a fluttuare selvaggiamente. Ho provato a cambiare il tasso di apprendimento, ridurre il numero di livelli. Ma non ferma le fluttuazioni. Ho anche letto questa risposta e ho provato a seguire le indicazioni in quella risposta, ma non di nuovo fortuna. Qualcuno potrebbe aiutarmi a capire dove sto sbagliando?

Immagine dello schermo



Sì, ho letto quella risposta. Mescolare i dati di validazione non ha aiutato
Raghuram

4
Perché non hai condiviso il tuo frammento di codice, quindi non posso dire molto di ciò che è sbagliato nella tua architettura. Ma nella schermata, vedendo la tua formazione e l'accuratezza della convalida, è chiaro che la tua rete è troppo adatta. Sarebbe meglio se condividi il tuo frammento di codice qui.
Nain

quanti campioni hai? forse la fluttuazione non è davvero significativa. Inoltre, l'accuratezza è una misura orribile
rep_ho

Qualcuno può aiutarmi a verificare se l'uso di un approccio ensemble è buono quando l'accuratezza della convalida è fluttuante? perché sono stato in grado di gestire la mia fluttuante validation_accuracy da ensemble ad un buon valore.
Sri2110

Risposte:


27

Se capisco correttamente la definizione di accuratezza, l'accuratezza (% dei punti dati classificati correttamente) è meno cumulativa di quanto diciamo MSE (errore quadratico medio). Ecco perché vedi che il tuo losssta rapidamente aumentando, mentre la precisione sta fluttuando.

Intuitivamente, ciò significa sostanzialmente che una parte degli esempi viene classificata in modo casuale , il che produce fluttuazioni, poiché il numero di ipotesi casuali corrette fluttua sempre (immagina la precisione quando la moneta dovrebbe sempre restituire "teste"). Fondamentalmente la sensibilità al rumore (quando la classificazione produce risultati casuali) è una definizione comune di overfitting (vedi Wikipedia):

In statistica e apprendimento automatico, uno dei compiti più comuni è quello di adattare un "modello" a un insieme di dati di addestramento, in modo da poter fare previsioni affidabili su dati generali non addestrati. In caso di overfitting, un modello statistico descrive errori casuali o rumore invece della relazione sottostante

Un'altra prova del sovradimensionamento è che la tua perdita sta aumentando, la perdita è misurata in modo più preciso, è più sensibile alla previsione rumorosa se non viene schiacciata da sigmoidi / soglie (che sembra essere il tuo caso per la perdita stessa). Intuitivamente, puoi immaginare una situazione in cui la rete è troppo sicura dell'output (quando è sbagliata), quindi fornisce un valore molto lontano dalla soglia in caso di classificazione errata casuale.

Per quanto riguarda il tuo caso, il tuo modello non è adeguatamente regolarizzato, possibili ragioni:

  • punti dati insufficienti, troppa capacità
  • ordinazione
  • ridimensionamento / normalizzazione delle funzioni no / errato
  • tasso di apprendimento: è troppo grande, quindi SGD salta troppo lontano e manca l'area vicino ai minimi locali. Questo sarebbe un caso estremo di "inadeguatezza" (insensibilità ai dati stessi), ma potrebbe generare (tipo di) rumore "a bassa frequenza" sull'uscita rimescolando i dati dall'input - contrariamente all'intuizione di overfitting, sarebbe come indovinare sempre le teste quando si prevede una moneta. Come sottolineato da @JanKukacka, l'arrivo nell'area "troppo vicino a" un minimo potrebbe causare un eccesso di adattamento, quindi se è troppo piccolo diventerebbe sensibile al rumore "ad alta frequenza" nei tuoi dati. dovrebbe trovarsi nel mezzo.αα ααα

Possibili soluzioni:

  • ottenere più punti dati (o espandere artificialmente l'insieme di quelli esistenti)
  • gioca con iperparametri (aumentare / ridurre la capacità o il termine di regolarizzazione per esempio)
  • regolarizzazione : prova l'abbandono, l'arresto anticipato, ecc

Per quanto riguarda: "La perdita viene misurata in modo più preciso, è più sensibile alla previsione rumorosa perché non è schiacciata da sigmoidi / soglie", concordo senza limiti, ma se si utilizza ad esempio entropia binaria incrociata come funzione di perdita, il sigmoide continua a suonare un ruolo.
Zhubarb,

1
Per quanto riguarda il tasso di apprendimento e la mancanza dei minimi: raggiungere il minimo significherebbe molto probabilmente un overfitting (perché è il minimo sul set di addestramento)
Jan Kukacka,

@Berkmeister vero, ho riformulato un po '(vedi modifica). Pensavo che l'aumento della perdita fosse un segno della funzione non schiacciata utilizzata.
dk14,

@ JanKukacka intendi minimi globali? Ho insinuato i minimi locali (in realtà vicino ai minimi locali), nel senso che se fosse troppo lontano da qualsiasi minimo, allora sarebbe inadeguato. Probabilmente, dovrei descriverlo più attentamente (vedi modifica), grazie.
dk14,

@ dk14 Presumo che il minimo globale non possa essere in pratica raggiunto, quindi intendo piuttosto minimi locali. Se sei troppo lontano, potresti essere inadeguato, ma se sei troppo vicino, molto probabilmente ti stai adattando troppo. C'è un lavoro interessante di Moritz Hardt "Allenati più velocemente, generalizza meglio: stabilità della discesa gradiente stocastica" ( arxiv.org/abs/1509.01240 ) ponendo limiti al rapporto tra allenamento e errore di test durante l'allenamento con SGD.
Jan Kukacka,

6

Questa domanda è vecchia, ma pubblica questo dato che non è stato ancora sottolineato:

Possibilità 1 : stai applicando una sorta di pre-elaborazione (significato zero, normalizzazione, ecc.) Al tuo set di allenamento o set di validazione, ma non all'altro .

Possibilità 2 : se hai creato alcuni livelli che funzionano diversamente durante l'allenamento e l'inferenza da zero, il tuo modello potrebbe essere implementato in modo errato (ad esempio, spostando la media e spostando la deviazione standard per la normalizzazione batch vengono aggiornati durante l'allenamento? Se si utilizza il dropout, i pesi vengono ridimensionati correttamente durante inferenza?). Questo potrebbe essere il caso se il tuo codice implementa queste cose da zero e non utilizza le funzioni integrate di Tensorflow / Pytorch.

Possibilità 3: Overfitting, come tutti hanno sottolineato. Trovo che le altre due opzioni siano più probabili nella tua situazione specifica poiché la tua precisione di convalida è bloccata al 50% dall'epoca 3. In generale, sarei più preoccupato per il sovradimensionamento se ciò accadesse in una fase successiva (a meno che tu non abbia un problema molto specifico a mano).


Sto riscontrando un problema simile, ma non del tutto, maggiori dettagli qui: stackoverflow.com/questions/55348052/… Nel mio caso, ho effettivamente un'elevata precisione costante con i dati dei test e durante l'addestramento, l'accuratezza della convalida "(non perdita) è superiore alla precisione dell'allenamento. Ma il fatto che non converga e non oscilli mai mi fa pensare a un eccesso di adattamento, mentre alcuni suggeriscono che non è il caso, quindi mi chiedo se lo è e qual è la giustificazione se non lo è.
dusa,

1
Questa è di gran lunga la spiegazione più plausibile delle risposte fornite. Si noti che un elevato slancio di normalizzazione in lotti (ad es. 0.999 o persino il valore predefinito di Keras 0.99) in combinazione con un alto tasso di apprendimento può anche produrre un comportamento molto diverso nell'allenamento e nella valutazione poiché le statistiche dei livelli sono molto indietro. In tal caso, ridurre lo slancio a qualcosa come 0,9 dovrebbe fare il trucco. Ho avuto un problema simile a OP e questo ha funzionato.
kristjan,

5

Aggiungendo alla risposta di @ dk14. Se vedi ancora fluttuazioni dopo aver regolarizzato correttamente il tuo modello, questi potrebbero essere i possibili motivi:

  • Utilizzo di un campione casuale dal set di convalida: significa che il set di convalida in ogni fase della valutazione è diverso, così come la perdita di convalida.
  • Utilizzo di una funzione di perdita ponderata (che viene utilizzata in caso di problemi di classe altamente squilibrati). Nella fase del treno, pesate la vostra funzione di perdita in base ai pesi di classe, mentre nella fase di sviluppo calcolate semplicemente la perdita non ponderata. In tal caso, sebbene la tua rete stia entrando nella convergenza, potresti vedere molte fluttuazioni nella perdita di validazione dopo ogni passaggio del treno. Ma se aspetti un quadro più ampio, puoi vedere che la tua rete sta effettivamente convergendo a minimi con fluttuazioni che si consumano (vedi le immagini allegate per uno di questi esempi).inserisci qui la descrizione dell'immagineinserisci qui la descrizione dell'immagine

2

Decisamente troppo adatto. Il divario tra l'accuratezza dei dati di allenamento e i dati di test mostra che hai superato la formazione. Forse la regolarizzazione può aiutare.


1

L'accuratezza della convalida su un problema di classificazione binaria (presumo) è "fluttuante" di circa il 50%, il che significa che il tuo modello fornisce previsioni completamente casuali (a volte indovina correttamente qualche campione in più, a volte qualche campione in meno). In generale, il tuo modello non è meglio di lanciare una moneta.

{0;1}

Comunque, come altri hanno già sottolineato, il tuo modello sta vivendo un grave overfitting. La mia ipotesi è che il tuo problema sia troppo complicato , vale a dire che è molto difficile estrarre le informazioni desiderate dai tuoi dati e che tale semplice conv-net a 4 strati addestrata end2end non ha alcuna possibilità di impararla .


0

Ci sono alcuni modi per provare nella tua situazione. In primo luogo, cerca di aumentare le dimensioni del lotto, il che aiuta il SGD mini-batch a vagare meno selvaggiamente. In secondo luogo sintonizzare il tasso di apprendimento, probabilmente ridurlo. In terzo luogo, prova diversi ottimizzatori, ad esempio Adam o RMSProp che sono in grado di adattare i tassi di apprendimento per le funzionalità wrt. Se possibile, prova ad aumentare i tuoi dati. Infine, prova le reti neurali bayesiane tramite approssimazione a dropout, un lavoro molto interessante di Yarin Gal https://arxiv.org/abs/1506.02158


0

Hai provato una rete più piccola? Considerando che la precisione dell'allenamento può raggiungere> 0,99, la tua rete sembra avere connessioni sufficienti per modellare completamente i tuoi dati, ma potresti avere connessioni estranee che stanno imparando in modo casuale (es. Overfitting).

Nella mia esperienza, ho ottenuto l'accuratezza della convalida del controllo per stabilizzarmi con una rete più piccola provando varie reti come ResNet, VGG e reti ancora più semplici.

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.