Cosa devo fare quando la mia rete neurale non si generalizza bene?


37

Sto allenando una rete neurale e la perdita di allenamento diminuisce, ma la perdita di validazione non lo fa, o diminuisce molto meno di quanto mi aspetterei, sulla base di riferimenti o esperimenti con architetture e dati molto simili. Come posso risolvere questo problema?


Per quanto riguarda la domanda

Cosa devo fare quando la mia rete neurale non impara?

a cui questa domanda si ispira, la domanda viene lasciata intenzionalmente generale in modo che altre domande su come ridurre l'errore di generalizzazione di una rete neurale fino a un livello che si è dimostrato realizzabile , possano essere chiuse come duplicati di questa.

Vedi anche il thread dedicato su Meta:

C'è una domanda generica a cui possiamo reindirizzare domande del tipo "perché la mia rete neurale non si generalizza bene?"


4
Se stai pianificando di pubblicare la tua risposta completa, potrebbe essere una buona idea pubblicare contemporaneamente la Q e la A (l'interfaccia utente lo consente). Altrimenti stai incoraggiando altre persone a scrivere le risposte e potremmo finire con diverse risposte che si duplicano parzialmente a vicenda ... Comunque, non vedo l'ora di avere la tua risposta.
ameba dice Reinstate Monica il

@amoeba ah, non lo sapevo: l'interfaccia utente apre un pop-up quando provo a rispondere alla domanda, quindi ho pensato che le domande e risposte non potessero essere postate insieme .... Beh, se qualcuno scrive un meglio / altro risposta completa rispetto a ciò che stavo per scrivere, eviterò semplicemente di aggiungere un duplicato.
DeltaIV

Risposte:


37

Prima di tutto, menzioniamo cosa significa "la mia rete neurale non si generalizza bene" e qual è la differenza nel dire "la mia rete neurale non funziona bene" .

Durante l'addestramento di una rete neurale, la si valuta costantemente su un set di dati etichettati chiamato set di addestramento . Se il tuo modello non funziona correttamente e non sembra apprendere dal set di formazione, non hai ancora un problema di generalizzazione, fai riferimento a questo post . Tuttavia, se il modello è raggiungere una performance soddisfacente sul training set, ma non può funzionare bene su dati precedentemente invisibili (ad esempio di validazione set / prova), allora si fare avere un problema generalizzazione.

Perché il tuo modello non si sta generalizzando correttamente?

La parte più importante è capire perché la tua rete non si generalizza bene. I modelli di Machine Learning ad alta capacità hanno la capacità di memorizzare il set di addestramento, il che può portare a un overfitting .

L'overfitting è lo stato in cui uno stimatore ha iniziato ad apprendere il set di training così bene che ha iniziato a modellare il rumore nei campioni di training (oltre a tutte le relazioni utili).

Ad esempio, nell'immagine qui sotto possiamo vedere come la linea blu si sia chiaramente adattata.

Ma perché è così male?

Quando si tenta di valutare il nostro modello su dati nuovi, mai visti prima (ad es. Validazione / set di test), le prestazioni del modello saranno molto peggiori di quanto ci aspettiamo.

Come prevenire l'adattamento eccessivo?

All'inizio del post ho insinuato che la complessità del tuo modello è ciò che sta effettivamente causando il sovradimensionamento, in quanto consente al modello di estrarre relazioni inutili dal set di addestramento, che mappano il suo rumore intrinseco. Il modo più semplice per ridurre il sovradimensionamento è essenzialmente limitare la capacità del modello. Queste tecniche sono chiamate tecniche di regolarizzazione .

  • Penalità alle norme sui parametri . Questi aggiungono un termine aggiuntivo alla funzione di aggiornamento del peso di ciascun modello, che dipende dalla norma dei parametri. Lo scopo di questo termine è quello di contrastare l'aggiornamento effettivo (ovvero limitare la quantità di aggiornamento di ciascun peso). Ciò rende i modelli più robusti rispetto a valori anomali e rumore. Esempi di tali regolarizzazioni sono le regolarizzazioni L1 e L2 , che si possono trovare sui regressori Lasso , Ridge e Elastic Net .
    Poiché ogni livello (completamente connesso) in una rete neurale funziona in modo molto simile a una semplice regressione lineare, questi vengono utilizzati nelle reti neurali. L'uso più comune è di regolarizzare ogni strato individualmente.
    implementazione di keras .

  • Arresto anticipato . Questa tecnica tenta di interrompere prematuramente la fase di addestramento di uno stimatore, nel punto in cui ha imparato a estrarre tutte le relazioni significative dai dati, prima di iniziare a modellarne il rumore. Ciò avviene monitorando la perdita di convalida (o una metrica di convalida di propria scelta) e terminando la fase di addestramento quando questa metrica smette di migliorare . In questo modo diamo allo stimatore abbastanza tempo per apprendere le informazioni utili ma non abbastanza per imparare dal rumore.
    implementazione di keras .

  • Regolarizzazioni specifiche della rete neurale . Alcuni esempi sono:
    • Dropout . Il dropout è una tecnica interessante che funziona sorprendentemente bene. Il dropout viene applicato tra due livelli successivi in ​​una rete. Ad ogni iterazione viene eliminata una determinata percentuale delle connessioni (selezionate casualmente), che collega i due livelli . Questo fa sì che il livello successivo si basi su tutte le sue connessioni al livello precedente.
      implementazione di keras
    • Trasferisci l'apprendimento . Questo è particolarmente usato nel Deep Learning. Questo viene fatto inizializzando i pesi della rete su quelli di un'altra rete con la stessa architettura pre-addestrata su un set di dati generico di grandi dimensioni.
    • Altre cose che possono limitare il overfitting nelle reti neurali profonde sono: la normalizzazione in lotti , che può fungere da regolatore e in alcuni casi (ad esempio i moduli di avvio) funziona così come il dropout; lotti di dimensioni relativamente ridotte in SGD, che possono anche prevenire un eccesso di adattamento; aggiungendo un piccolo rumore casuale ai pesi negli strati nascosti.

Un altro modo per prevenire un overfitting, oltre a limitare la capacità del modello, è migliorare la qualità dei dati. La scelta più ovvia sarebbe la rimozione anomala / del rumore , tuttavia in pratica la loro utilità è limitata. Un modo più comune (soprattutto nelle attività relative alle immagini) è l'aumento dei dati . Qui tentiamo di trasformare casualmente gli esempi di addestramento in modo che, sebbene appaiano diversi nel modello, trasmettano le stesse informazioni semantiche (ad esempio, sfogliando le immagini da sinistra a destra).
Panoramica sull'aumento dei dati

Suggerimenti pratici:

  • La tecnica di regolarizzazione di gran lunga più efficace è l' abbandono , il che significa che dovrebbe essere il primo che dovresti usare. Tuttavia, non è necessario (e probabilmente non dovrebbe) inserire dropout ovunque! I layer più soggetti a overfitting sono i layer Fully Connected (FC), poiché contengono la maggior parte dei parametri. Il dropout deve essere applicato a questi livelli (influendo sulle loro connessioni al livello successivo).
  • La normalizzazione in lotti , oltre ad avere un effetto di regolarizzazione, aiuta il tuo modello in molti altri modi (ad esempio, accelera la convergenza, consente l'uso di tassi di apprendimento più elevati). Dovrebbe essere usato anche negli strati FC.
  • Come accennato in precedenza, può anche essere utile arrestare il modello prima nella fase di addestramento del previsto. Il problema con l' arresto anticipato è che non esiste alcuna garanzia che, in un dato momento, il modello non ricomincerà a migliorare. Un approccio più pratico rispetto all'arresto anticipato è la memorizzazione dei pesi del modello che ottengono le migliori prestazioni sul set di validazione. Fai attenzione, tuttavia, poiché non si tratta di una stima imparziale delle prestazioni del tuo modello (semplicemente migliore del set di allenamento). È possibile anche OVERFIT sul set di validazione. Ne parleremo più avanti.
    implementazione di keras
  • In alcune applicazioni (ad es. Attività correlate all'immagine), si consiglia vivamente di seguire un'architettura già consolidata (ad es. VGG, ResNet, Inception) per la quale è possibile trovare pesi ImageNet. La natura generica di questo set di dati consente alle funzioni di essere a loro volta abbastanza generiche da poter essere utilizzate per qualsiasi attività relativa all'immagine. Oltre ad essere robusto per il sovradimensionamento, ciò ridurrà notevolmente i tempi di allenamento.
    Un altro uso del concetto simile è il seguente: se l'attività non ha molti dati, ma è possibile trovare un'altra attività simile che lo fa, è possibile utilizzare l' apprendimento di trasferimento per ridurre il sovrautilizzo. Prima di tutto addestra la tua rete per l'attività che ha il set di dati più grande, quindi prova a perfezionareil modello a quello che inizialmente desideravi. L'addestramento iniziale, nella maggior parte dei casi, renderà il tuo modello più robusto rispetto al sovradimensionamento.
  • Aumento dei dati . Mentre aiuta sempre ad avere un set di dati più grande, le tecniche di aumento dei dati hanno i loro difetti. Più specificamente, devi stare attento a non aumentare troppo , poiché ciò potrebbe rovinare il contenuto semantico dei dati. Ad esempio, per aumentare l'immagine se si traduce / sposta / ridimensiona o si regola eccessivamente la luminosità / contrasto dell'immagine, si perde gran parte delle informazioni in essa contenute. Inoltre, gli schemi di aumento devono essere implementati per ogni attività in modo ad hoc (ad es. Nel riconoscimento delle cifre scritto a mano le cifre sono generalmente allineate e non devono essere ruotate troppo; inoltre, non dovrebbero essere ruotate in nessuna direzione, in quanto non sono simmetrici in senso orizzontale / verticale. Lo stesso vale per le immagini mediche).
    0

9

Esistono numerose prove empiriche che reti neurali abbastanza profonde possono memorizzare etichette casuali su enormi set di dati (Chiyuan Zhang, Samy Bengio, Moritz Hardt, Benjamin Recht, Oriol Vinyals, "Comprendere l'apprendimento profondo richiede ripensare la generalizzazione"). Quindi, in linea di principio, ottenendo un NN abbastanza grande, possiamo sempre ridurre l' errore di addestramento a valori estremamente piccoli, limitati nella pratica dall'accuratezza numerica, non importa quanto sia insignificante il compito.

Le cose sono abbastanza diverse per l' errore di generalizzazione . Non possiamo essere sicuri che per ogni problema di apprendimento, esista un modello NN apprendibile che può produrre un errore di generalizzazione tanto basso quanto desiderato. Per questo motivo il primo passo è

1. Imposta le tue aspettative correttamente

Trova un riferimento affidabile che ti dica che esiste un'architettura che può raggiungere l'errore di generalizzazione che stai cercando, sul tuo set di dati o su quello più simile per il quale puoi trovare riferimenti. Ad esempio, guarda qui

Quali sono le reti neurali convoluzionali attuali?

per trovare le prestazioni attuali (al momento delle risposte) SOTA (State Of The Art) per le CNN su vari compiti. È una buona idea provare a riprodurre tali risultati su questi set di dati di riferimento, prima di allenarsi sul proprio set di dati, come test per verificare che tutta la propria infrastruttura sia correttamente installata.

2. Assicurarsi che la procedura di allenamento sia impeccabile

Tutti i controlli descritti nelle risposte alla domanda

Cosa devo fare quando la mia rete neurale non impara?

per assicurarsi che la procedura di allenamento sia corretta, sono un prerequisito per una corretta riduzione dell'errore di generalizzazione (se il tuo NN non sta imparando, non può imparare a generalizzare). Questi controlli includono, tra le altre cose:

  • test unitari
  • controlli del set di dati (dai un'occhiata ad alcuni campioni casuali di input / etichette sia per il set di allenamento che per il set di test e controlla che le etichette siano corrette; controlla la larghezza e la dimensione delle immagini di input; mescola i campioni nel set di allenamento / test e vedi se influisce risultati; ecc.)
  • test di randomizzazione
  • standardizzare le versioni di pre-elaborazione e pacchetto
  • tenere un diario di esperimenti numerici

3. Cerca di ottenere la superconvergenza

"Super-convergenza: formazione molto rapida di reti neurali che utilizzano grandi tassi di apprendimento" di Leslie N. Smith e Nicholay Topin mostra che in alcuni casi la combinazione di grandi tassi di apprendimento con il metodo ciclico del tasso di apprendimento di Leslie N. Smith funge da regolarizzatore , accelerando la convergenza di un ordine di grandezza e riducendo la necessità di un'ampia regolarizzazione. Quindi questa è una buona cosa da provare prima

4. Impostazione della regolarizzazione su MAXXX

La regolarizzazione spesso aumenta il tempo di allenamento (cattivo), aumenta l'errore di allenamento e riduce l'errore di generalizzazione (buono), ma troppa regolarizzazione può effettivamente aumentare entrambi gli errori (insufficiente). Per questo motivo, e a causa dell'aumento del tempo di allenamento, è spesso meglio introdurre le varie tecniche di regolarizzazione una alla volta, dopo aver superato con successo il set di allenamento. Si noti che la regolarizzazione di per sé non implica necessariamente che l'errore di generalizzazione si riduca: il modello deve avere una capacità sufficiente per ottenere buone proprietà di generalizzazione. Questo spesso significa che hai bisogno di una rete sufficientemente profonda, prima di poter vedere i vantaggi della regolarizzazione.

I metodi di regolarizzazione più antichi sono probabilmente l'arresto anticipato e la riduzione del peso. Alcuni degli altri:

  • ridurre le dimensioni del lotto: le dimensioni del lotto più piccole sono generalmente associate a un errore di generalizzazione più piccolo, quindi è qualcosa da provare. Tuttavia, si noti che alcuni contestano l'utilità dei minibatch: nella mia esperienza, aiutano (a condizione che non si debbano usare piccole dimensioni folli comem=16), ma Elad Hoffer, Itay Hubara, Daniel Soudry Train più a lungo, generalizzano meglio: colmare il divario di generalizzazione nella formazione di grandi lotti di reti neurali non è d'accordo. Si noti che se si utilizza la norma batch (vedere di seguito), i minibatch troppo piccoli saranno piuttosto dannosi.
  • usa SGD piuttosto che ottimizzatori adattivi: questo è già stato trattato da @shimao, quindi lo cito solo per completezza
  • usa dropout: se usi LSTM, usa il dropout standard solo per le unità di input e output di un layer LSTM. Per le unità ricorrenti (le porte) utilizzare l'abbandono ricorrente, come mostrato per la prima volta da Yarin Gal nel suo dottorato di ricerca. tesi . Tuttavia, se si utilizzano CNN, il dropout viene utilizzato meno frequentemente ora. Invece, tendi a ...
  • ... usa la normalizzazione batch: le architetture CNN più recenti evitano il dropout a favore della normalizzazione batch. Questo potrebbe essere solo una mania, o potrebbe essere dovuto al fatto che apparentemente l'abbandono e la normalizzazione in lotti non giocano bene insieme (Xiang Li, Shuo Chen, Xiaolin Hu, Jian Yang, Comprensione della disarmonia tra dropout e normalizzazione in lotti da parte della varianza Maiusc ). Poiché la norma batch è più efficace del dropout quando si hanno enormi set di dati, questo potrebbe essere un motivo per cui il dropout è caduto in disgrazia per le architetture della CNN. Se si utilizza la normalizzazione batch, verificare che la distribuzione di pesi e distorsioni per ogni strato appaia approssimativamente normale. Per gli RNN, l'implementazione della norma batch è complicata: normalizzazione del peso (Tim Salimans, Diederik P. Kingma,Normalizzazione del peso: una semplice rigenerazione per accelerare l'allenamento delle reti neurali profonde ) è una valida alternativa.
  • usa l'aumento dei dati: ha anche un effetto regolarizzante.

5. Ricerca iperparametro / architettura

Se nient'altro aiuta, dovrai testare più impostazioni di iperparametro diverse (l'ottimizzazione bayesiana può aiutare qui) o più modifiche architettoniche diverse (ad es. Forse nell'architettura GAN e per il set di dati su cui stai lavorando, la norma batch funziona solo nel generatore, ma se aggiunto anche al discriminatore peggiora le cose). Assicurati di tenere traccia dei risultati di questi lunghi e noiosi esperimenti in un registro ben ordinato.

PS per un GAN non ha molto senso parlare di un errore di generalizzazione: l'esempio sopra era inteso solo come un'indicazione che c'è ancora molta alchimia in Deep Learning e cose che ti aspetteresti di funzionare bene, a volte don o viceversa qualcosa che ha funzionato bene molte volte, improvvisamente ti prende in giro per un nuovo set di dati.


5

Un elenco di tecniche di regolarizzazione comunemente usate che ho visto in letteratura sono:

  1. Usando la normalizzazione batch, che è un regolarizzatore sorprendentemente efficace al punto che raramente vedo più il dropout, perché semplicemente non è necessario.
  2. Una piccola quantità di decadimento del peso.
  3. Alcune tecniche di regolarizzazione più recenti includono Shake-shake ("regolarizzazione Shake-Shake" di Xavier Gastaldi) e Cutout ("Miglioramento della regolarizzazione delle reti neurali convoluzionali con intaglio" di Terrance DeVries e Graham W. Taylor). In particolare, la facilità con cui Cutout può essere implementato lo rende molto attraente. Credo che funzionino meglio dell'abbandono, ma non ne sono sicuro.
  4. Se possibile, preferire architetture convoluzionali rispetto a architetture con strati completamente collegati. Confronta VGG-16, che ha 100 milioni di parametri in un singolo livello completamente connesso, con Resnet-152, che ha un numero di livelli 10 volte superiore e ancora meno parametri.
  5. Preferisci SGD ad altri ottimizzatori come Rmsprop e Adam. È stato dimostrato che generalizza meglio. ("Migliorare le prestazioni di generalizzazione passando da Adam a SGD" di Nitish Shirish Keskar e Richard Socher)

0

Mi sento come Djib2011, dare ottimi punti sui metodi automatizzati, ma in realtà non affrontano il problema di fondo di come facciamo a sapere se il metodo impiegato per ridurre il sovradimensionamento ha fatto il suo lavoro. Quindi, come nota a piè di pagina importante della risposta DeltaIV, ho voluto includerlo sulla base di ricerche recenti degli ultimi 2 anni. Il sovradimensionamento per le reti neurali non riguarda solo l'eccessiva memorizzazione del modello, ma anche l'incapacità dei modelli di apprendere cose nuove o affrontare anomalie.

Rilevamento di overfitting nel modello Black Box: l' interpretazione di un modello è direttamente legata alla capacità di generalizzazione di un modello. Pertanto, molti grafici interpretabili sono metodi per rilevare un eccesso di adattamento e possono dirti quanto stanno funzionando tutti i metodi suggeriti sopra. I grafici di interpretabilità lo rilevano direttamente soprattutto se si confrontano i grafici di validazione e dei risultati del test. I capitoli 5 e 6 di questo libro inedito parlano dei recenti progressi nella rilevazione sul campo del overfitting: modellistica interpretabile

Sulla base di questo libro, vorrei menzionare altri tre metodi per rilevare e rimuovere il sovradimensionamento, che potrebbe essere ovvio per alcuni, ma personalmente trovo che le persone li dimentichino troppo spesso. Quindi vorrei enfatizzarli se non una mente:

  1. Rilevamento selezione funzionalità : minore è il numero di parametri e meno funzionalità ha il modello. Quindi, se includi solo l'importante dei 100 milioni (forse ne hai 75 milioni), avrai un modello generalizzabile migliore. Il problema è che molte reti neurali non sono perfette nella selezione delle funzionalità, specialmente quando è presente il numero 2. Fondamentalmente Bootstrap o Boosting non possono risolvere entrambi (solo una versione chiamata wild bootstrap può). In parole povere, se dai dati spazzatura alla tua rete neurale, ti darà spazzatura. (La normalizzazione L2 sopra menzionata è molto utile per aiutare con questo)

  2. Rilevamento e gestione delle anomalie: meno "valori anomali" sono più generalizzabile il modello. Per "valori anomali" non intendiamo solo valori anomali nei dati. I valori anomali nei dati (come quelli che vedi con un diagramma a riquadri) sono una definizione troppo ristretta per le reti neurali. È necessario considerare anche i valori anomali dell'errore in un modello, che viene definito influenza, nonché altre anomalie. Pertanto è importante rilevare anomalie prima di eseguire la rete. Una rete neurale può essere robusta contro un tipo di anomalia, ma robusta non contro tutti gli altri tipi. I metodi Counter Counter, i metodi Criticism e Adversarial example e i grafici Influence sono ottimi per aiutarti a scoprire i valori anomali e quindi a capire come tenerli in considerazione (ad esempio, modificare i parametri o persino rimuovere alcuni dei dati)

  3. Campionamento stratificato, sovracampionamento e sottocampionamento basati su considerazioni statistiche o etiche : vorrei essere un esperto di sottocampionamento e sovracampionamento, ma non lo sono ma conosco il campionamento stratificato. Raggruppare fattori importanti come (razza, sesso, genere) e quindi fare campionamenti stratificati da parte del cluster è vitale per non esagerare quando si considerano i big data. Quando si esegue il rilevamento di immagini, il campionamento stratificato in combinazione con il clustering è legalmente richiesto in alcuni campi per evitare discriminazioni razziali. Il libro sopra linkato parla brevemente di un metodo per farlo.

PS Dovrei includere più collegamenti?

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.