Che cos’è il dropout? Riduci l’overfitting nelle tue reti neurali

Ultimo aggiornamento del 17 dicembre 2019

Quando addestri le reti neurali, il tuo obiettivo è produrre un modello che funzioni davvero bene.

Questo ha perfettamente senso, poiché non ha senso usare un modello che non funziona.

Tuttavia, c’è un equilibrio relativamente stretto che dovrai mantenere quando cerchi di trovare un modello che funzioni perfettamente bene.

E’ l’equilibrio tra underfitting e overfitting.

Per evitare l’underfitting (avere una performance predittiva peggiore del possibile), potete continuare ad allenarvi, fino a quando non sperimentate l’altro problema – l’overfitting, ovvero essere troppo sensibili ai vostri dati di allenamento. Entrambi ostacolano le prestazioni del modello.

A volte, l’intervallo in cui il vostro modello non è underfit né overfit è davvero piccolo. Fortunatamente, può essere esteso applicando ciò che è noto come un regolarizzatore – una tecnica che regolarizza il comportamento del modello durante l’addestramento, per ritardare l’overfitting per un certo tempo.

Dropout è una tecnica di regolarizzazione. In questo post del blog, ne parliamo, dando un’occhiata ad un paio di cose. In primo luogo, ci immergiamo nella differenza tra underfitting e overfitting in modo più dettagliato, in modo da ottenere una comprensione più profonda dei due. In secondo luogo, introduciamo Dropout basato su lavori accademici e vi diciamo come funziona. In terzo luogo, daremo un’occhiata se funziona davvero, descrivendo i vari esperimenti fatti con questa tecnica. Infine, confronteremo il Dropout tradizionale con il Dropout gaussiano – e come cambia l’addestramento del vostro modello.

Pronto? Andiamo! 😎

Come si comporta il tuo modello? Underfitting e overfitting

Diamo prima un’occhiata a cosa sono l’underfitting e l’overfitting.

Quando si inizia il processo di formazione, i pesi dei neuroni sono probabilmente inizializzati a caso o con qualche altra strategia di inizializzazione. Questo significa che il tasso di errore, o valore di perdita, sarà molto alto durante le prime epoche. Date un’occhiata a questo diagramma, dove la perdita diminuisce molto rapidamente durante le prime epoche:

Quando sia la perdita di addestramento che la validazione diminuiscono, si dice che il modello è underfit: può ancora essere addestrato per fare previsioni migliori, cioè per guadagnare nel suo potere predittivo.

L’azione da intraprendere allora è di continuare l’addestramento.

Tuttavia, questo non può continuare per sempre. L’ottimizzazione di un modello implica la generazione di previsioni di convalida con i vostri dati di convalida, ottenendo valori di perdita e gradienti per l’ottimizzazione, che viene poi eseguita. Sfortunatamente, questo significa che alcune delle ideosincrasie dei dati sono trapelate nei pesi del modello. Cioè, poiché i dati sono un campione piuttosto che una popolazione completa, sono sempre leggermente diversi dalla popolazione completa che rappresentano. Quando si ottimizza il modello per centinaia di epoche con questi dati, si otterrà sempre un offset rispetto a questa vera popolazione.

Se si continuasse l’allenamento, il modello si adatterebbe sempre più a queste ideosincrasie, rendendolo meno adatto ai dati che non ha mai visto prima – cioè, altri campioni della popolazione. Si dice allora che il modello è overfit: è troppo ben adattato ai dati di allenamento e di validazione.

Fermiamoci un attimo! 👩💻

I blog di MachineCurve insegnano il Machine Learning agli sviluppatori. Iscriviti all’aggiornamento gratuito di MachineCurve sul Machine Learning oggi stesso! Imparerai cose nuove e capirai meglio i concetti che già conosci.
Inviamo email almeno ogni venerdì. Benvenuto!

Iscrivendosi, si acconsente che qualsiasi informazione ricevuta possa includere servizi e offerte speciali via email.

L’overfitting può essere rilevato su grafici come quello sopra ispezionando la perdita di convalida: quando sale ancora, mentre la perdita di addestramento rimane costante o diminuisce, si sa che il modello è in overfitting. Come si può vedere, la rete alimentata da ELU nel grafico qui sopra ha iniziato a sovraperformare molto leggermente.

Sono da evitare sia l’underfitting che l’overfitting, in quanto il vostro modello avrà prestazioni peggiori di quelle che potrebbe avere in teoria. Fortunatamente, alcune tecniche – chiamate regolarizzatori – possono essere utilizzate per ridurre l’impatto dell’overfitting. Il dropout è una di queste – e la tratteremo in questo blog. Cominciamo ad analizzare cos’è Dropout, cosa fa e come funziona.

Cos’è Dropout e come funziona?

Nel loro documento “Dropout: A Simple Way to Prevent Neural Networks from Overfitting”, Srivastava et al. (2014) descrivono la tecnica Dropout, che è una tecnica di regolarizzazione stocastica e dovrebbe ridurre l’overfitting combinando (teoricamente) molte architetture di reti neurali diverse.

Con Dropout, il processo di formazione essenzialmente abbandona i neuroni in una rete neurale. Essi vengono temporaneamente rimossi dalla rete, il che può essere visualizzato come segue:

Nota che anche le connessioni o sinapsi vengono rimosse, e che quindi nessun dato scorre più attraverso questi neuroni.

…ma solo molto brevemente! Questo processo si ripete ogni epoca (o anche ogni minibatch! – Srivastava et al. 2014) e quindi il campionamento di reti diradate avviene molto spesso. Questo dovrebbe portare a tassi di errore di generalizzazione significativamente più bassi (cioè, overfitting), poiché “la presenza di neuroni è resa inaffidabile” (Srivastava et al., 2014).

Questa rimozione di neuroni e sinapsi durante l’allenamento viene eseguita in modo casuale, con un parametro \(p\) che è sintonizzabile (o, dati i test empirici, meglio impostato a 0,5 per gli strati nascosti e vicino a 1,0 per lo strato di ingresso). Questo significa effettivamente che, secondo gli autori, la rete “assottigliata” viene campionata dall’architettura globale, e utilizzata per l’addestramento.

Al momento del test, “non è fattibile fare esplicitamente la media delle predizioni di molti modelli assottigliati in modo esponenziale” (Srivastava et al., 2014). Questo è vero: diventerebbe un peso computazionale quando centinaia di migliaia di epoche/minibatch devono essere mediati, soprattutto quando le reti diventano davvero grandi.

Per fortuna, c’è una soluzione – che è semplice, ma produce lo stesso risultato. Usando una rete neurale, dove le uscite dei pesi sono scalate in base al \(p\) con cui un’unità è stata mantenuta durante l’allenamento. Questo significa che l’output atteso al momento dell’addestramento è lo stesso del vero output al momento del test, risolvendo il problema computazionale e rendendo Dropout utilizzabile nella pratica.

Variabili di Bernoulli

Diamo ora uno sguardo a come funziona matematicamente Dropout. Non preoccupatevi, non vi seppelliremo con la matematica, ma cercheremo invece di assumere un punto di vista molto intuitivo.

Molto semplicisticamente, questo è il modo in cui un neurone riceve il suo input: ad esempio, tre neuroni a monte in uno strato denso a tre neuroni inviano i loro output allo strato successivo, dove viene ricevuto come input. Si noti che per il bene della semplicità omettiamo qui i valori di bias.

Normale neurone (assunto senza bias)

È molto semplice passare da qui a un neurone Dropout, che si presenta come segue:

Neurone Dropout (assunto senza bias)

Matematicamente, questo comporta le cosiddette variabili casuali di Bernoulli:

Nella teoria della probabilità e nella statistica, la distribuzione di Bernoulli, dal nome del matematico svizzero Jacob Bernoulli, è la distribuzione di probabilità discreta di una variabile casuale che assume il valore 1 con probabilità \(p\).

Wikipedia sulla distribuzione di Bernoulli

Per creare Dropout, Srivastava et al. (2014) hanno attaccato ai neuroni della rete (moltiplicandoli per le uscite neurali) delle variabili di Bernoulli, “ciascuna delle quali ha la probabilità \(p\) di essere 1″. Il valore \(p\) qui è selezionato dall’ingegnere di machine learning, di solito basato su qualche set di validazione, o naïvely impostato a 0.5.

Non perdere mai nuovi articoli di Machine Learning ✅

Blogs at MachineCurve teach Machine Learning for Developers. Iscriviti all’aggiornamento gratuito di MachineCurve su Machine Learning oggi stesso! Imparerai cose nuove e capirai meglio i concetti che già conosci.
Inviamo email almeno ogni venerdì. Benvenuto!

Iscrivendosi, si acconsente che qualsiasi informazione ricevuta possa includere servizi e offerte speciali via email.

All’interno della rete, la variabile Bernoulli e il suo valore di 1 o 0 determina se un neurone è ‘abbandonato’ durante l’epoca o l’operazione feedforward minibatch. Questo, in effetti, porta alla ‘rete assottigliata’ di cui parlano Srivastava et al. (2014).

Perché Dropout potrebbe ridurre l’overfitting?

Potreste ora chiedervi: perché le variabili di Bernoulli collegate alle reti neurali regolari, rendendo la rete più sottile, riducono l’overfitting?

Per la risposta a questa domanda, dovremo dare un’occhiata a come vengono addestrate le reti neurali.

Di solito, a questo scopo si usa la backpropagation e la discesa del gradiente o un ottimizzatore simile. Dato un valore di perdita, vengono calcolati i cosiddetti ‘gradienti’ che l’ottimizzatore elabora nei pesi della rete. Usando questi gradienti (rispetto al tasso di errore) per cambiare i pesi, la rete probabilmente si comporta leggermente meglio durante l’iterazione successiva del processo di formazione.

Il calcolo del gradiente viene fatto rispetto all’errore, ma anche rispetto a ciò che tutte le altre unità stanno facendo (Srivastava et al., 2014). Questo significa che alcuni neuroni, attraverso cambiamenti nei loro pesi, possono correggere gli errori di altri neuroni. Questi, sostengono Srivastava et al. (2014), portano a co-adattamenti complessi che potrebbero non generalizzarsi a dati non visti, con conseguente overfitting.

Dropout, quindi, impedisce questi co-adattamenti rendendo – come abbiamo scritto prima – inaffidabile la presenza di altri nascosti. I neuroni semplicemente non possono contare su altre unità per correggere i loro errori, il che riduce il numero di co-adattamenti che non generalizzano ai dati non visti, e quindi presumibilmente riduce anche l’overfitting.

Allenamento delle reti neurali con Dropout

L’allenamento delle reti neurali a cui è stato applicato Dropout è praticamente uguale all’allenamento delle reti neurali senza Dropout. Si può usare la discesa del gradiente stocastico o ottimizzatori simili. L’unica differenza, come riportato da Srivastava et al. (2014), può essere trovata quando si utilizza un approccio mini-batch: piuttosto che per epoca, le reti assottigliate vengono campionate per minibatch.

Inoltre, possono essere utilizzati anche metodi che migliorano SGD classico – come il momentum – e mostrano miglioramenti simili a quelli delle reti neurali regolari (Srivastava et al, 2014).

Quello che gli autori hanno anche trovato utile durante l’addestramento è l’applicazione della regolarizzazione max-norm, che significa vincolare la norma del peso in entrata ad essere limitata da un certo valore massimo \(c\). Questo valore deve essere impostato dal tecnico in anticipo, e determinato utilizzando un set di validazione (Srivastava et al, 2014).

Combinare Dropout con la regolarizzazione max-norm migliora le prestazioni rispetto all’utilizzo del solo Dropout, ma gli autori hanno riportato risultati ancora migliori quando Dropout e la regolarizzazione max-norm sono combinati con altre due cose:

  • Tassi di apprendimento grandi e decadenti.
  • Alto slancio.

Secondo Srivastava et al. (2014), questo può eventualmente essere giustificato dai seguenti argomenti:

  1. Costringere i vettori di peso rende possibile utilizzare grandi tassi di apprendimento senza far esplodere i pesi.
  2. Il rumore di dropout più grandi tassi di apprendimento aiutano quindi gli ottimizzatori “ad esplorare diverse regioni dello spazio dei pesi che altrimenti sarebbero state difficili da raggiungere”.
  3. Riducendo il tasso di apprendimento si rallenta la saltuarietà del processo di esplorazione, alla fine “si stabilizza in un minimo”.
  4. Un alto momentum permette alla rete di superare i minimi locali, aumentando la probabilità di trovare il minimo globale.

Il dropout funziona davvero? Risultati sperimentali

Con qualsiasi miglioramento nell’apprendimento automatico, è bello avere un miglioramento teorico – ma è anche importante testare se funziona davvero. Srivastava et al. (2014) hanno eseguito diversi test per scoprire se Dropout funziona. In primo luogo, hanno utilizzato vari set di dati standard (come il dataset MNIST) per verificare se Dropout migliora le prestazioni del modello in una vasta gamma di problemi di classificazione.

In secondo luogo, hanno controllato come si è comportato con una varietà di altri regolarizzatori (ottenendo l’intuizione che la regolarizzazione max-norm insieme a Dropout funziona meglio – ma diamo un’occhiata a questi risultati più in dettaglio più avanti), e in terzo luogo, Srivastava et al. (2014) hanno studiato quali tassi di abbandono (cioè, quale parametro \(p\)) funziona meglio e come la dimensione dei dati influisce sulle prestazioni di dropout. Diamo un’occhiata!

Campioni dal dataset MNIST

Dropout vs no dropout su dataset standard

Gli autori hanno testato Dropout vs No Dropout su questi dataset standard (Srivastava et al, 2014):

  • Il dataset MNIST, che contiene migliaia di cifre scritte a mano;
  • Il dataset di riferimento TIMIT per il riconoscimento vocale pulito.
  • I dataset CIFAR-10 e CIFAR-100, contenenti piccole immagini naturali in 10 e 100 classi.
  • Il dataset Street View House Numbers (SVHN), con immagini di numeri civici raccolte da Google Street View.
  • Il dataset ImageNet, che contiene molte immagini naturali.
  • Il dataset Reuters RCV1 newswire articles. Questo è un dataset di testo piuttosto che un dataset di immagini.

Campioni dal dataset CIFAR10

Per tutti i dataset, Dropout ha migliorato il potere di generalizzazione del modello. Su MNIST, è stato possibile riportare errori di test drasticamente diversi, con miglioramenti sostanziali per tutte le diverse architetture che sono state testate.

Unisciti a centinaia di altri studenti! 😎

I blog di MachineCurve insegnano il Machine Learning per gli sviluppatori. Iscriviti all’aggiornamento gratuito di MachineCurve su Machine Learning oggi stesso! Imparerai cose nuove e capirai meglio i concetti che già conosci.
Inviamo email almeno ogni venerdì. Benvenuto!

Iscrivendosi, si acconsente che qualsiasi informazione ricevuta possa includere servizi e offerte speciali via email.

Dropout supera anche le normali reti neurali sulle Convnet addestrate su CIFAR-100, CIFAR-100, e i dataset ImageNet.

Per il dataset SVHN, si può riportare un’altra interessante osservazione: quando Dropout viene applicato allo strato convoluzionale, anche le prestazioni aumentano. Secondo gli autori, questo è interessante, perché prima si supponeva che questi strati non fossero sensibili all’overfitting perché non hanno molti parametri (Srivastava et al., 2014). Si sostiene che l’aggiunta di Dropout agli strati Conv fornisce input rumorosi agli strati Dense che li seguono, il che impedisce loro un ulteriore overfitting.

Infine, Dropout funziona sui dataset di benchmark TIMIT speech e sul dataset Reuters RCV1, ma qui il miglioramento era molto più piccolo rispetto ai dataset vision e speech.

Dropout vs nessun dropout con altri regolarizzatori

Ora che gli autori sanno che Dropout funziona bene su una varietà di problemi di apprendimento automatico, hanno indagato ulteriormente: come si comporta rispetto ad altri regolarizzatori?

Sono stati testati diversi metodi di regolarizzazione per prevenire l’overfitting:

  • L2 weight decay;
  • Lasso;
  • KL sparsity;
  • Max-norm regularization.

Srivastava et al. (2014) hanno scoperto che quando combinato con max-norm regularization, Dropout dà errori di generalizzazione ancora più bassi. Infatti, ha fornito l’errore più basso riportato, seguito – a una certa distanza – da Dropout + regolarizzazione L2, e infine gli altri.

Quindi, quando si applica Dropout, potrebbe anche essere una buona idea eseguire la regolarizzazione max-norm allo stesso tempo.

Quando Dropout funziona meglio? Riguardo al tasso di dropout e alla dimensione del dataset

Un’altra domanda a cui si è cercato di rispondere: il tasso di dropout (cioè il parametro \(p\)) e/o la dimensione del dataset hanno un impatto sulle prestazioni di Dropout e sulle reti neurali a cui è collegato?

La domanda deve avere una risposta affermativa.

Qual è il valore migliore per \(p\)?

Primo, il parametro \(p\). Ormai, possiamo ricordare che è sintonizzabile, e deve infatti essere impostato in anticipo dall’ingegnere dell’apprendimento automatico. Il fatto che sia sintonizzabile porta agli stessi errori per cui i tassi di apprendimento fissi non sono una buona idea: semplicemente non si sa quale \(p\) si adatta meglio ai dati.

Quindi, sostengono gli autori, la selezione di un valore per \(p\) deve essere fatta da alcuni test iniziali con un set di validazione.

Lo hanno fatto anche loro – per vedere se si potevano trovare schemi interessanti.

E hanno trovato un tale schema: attraverso più scenari, un valore di \(p \circa 0,5\) per gli strati nascosti sembra portare alle migliori prestazioni quando si applica Dropout (Srivastava et al, 2014). Questo è vero per tutti gli strati tranne quello di ingresso, dove \(p \) deve essere \(\approx 1.0 \). Quest’ultimo è presumibilmente il caso perché lo strato di input prende i dati di ingresso, ed è difficile trovare modelli quando i dati vengono eliminati a caso.

Come si comporta Dropout rispetto alle dimensioni del dataset?

Secondo gli autori, un “buon regolarizzatore rende possibile ottenere un buon errore di generalizzazione da modelli con un gran numero di parametri addestrati su piccoli set di dati”. Cioè, si comporta davvero bene su dati che non ha mai visto prima – anche quando è addestrato con dati piccoli.

Per scoprire se Dropout regolarizza bene attraverso varie dimensioni di dataset, Srivastava et al. (2014) hanno eseguito test con varie dimensioni sul dataset MNIST. Le dimensioni erano le seguenti: “100, 500, 1K, 5K, 10K e 50K scelti a caso dal set di allenamento MNIST” (Srivastava et al., 2014).

Ti aiutiamo con il Machine Learning! 🧠

I blog di MachineCurve insegnano il Machine Learning agli sviluppatori. Iscriviti all’aggiornamento gratuito di MachineCurve sul Machine Learning oggi stesso! Imparerai cose nuove e capirai meglio i concetti che già conosci.
Inviamo email almeno ogni venerdì. Benvenuto!

Iscrivendosi, si acconsente che qualsiasi informazione ricevuta possa includere servizi e offerte speciali via email.

Gli autori hanno scoperto che c’è un compromesso tra quando Dropout è necessario, e quando non è più utile. In primo luogo, per coprire il caso in cui il set di dati è estremamente piccolo: anche Dropout non migliora le prestazioni in quel caso, semplicemente perché la dimensione del set di dati è troppo piccola. Lo stesso vale per set di dati abbastanza grandi: Dropout allora non migliora più il modello, ma anzi, le prestazioni del modello peggiorano.

Quindi, esiste un punto dolce, quando Dropout è necessario e quando è intelligente non usarlo (o aumentare le dimensioni del dataset). Secondo Srivastava et al. (2014), non ci sono euristiche per determinare questa dimensione; piuttosto, deve essere determinata con un set di validazione.

Gaussian Dropout: Variabili gaussiane invece che bernoulliane

Ricordiamo da sopra che Dropout funziona con variabili bernoulliane che prendono 1 con probabilità \(p\) e 0 con il resto, essendo \(1 – p\).

Questa idea può essere generalizzata per moltiplicare le attivazioni con variabili casuali da altre distribuzioni (Srivastava et al., 2014). Nel loro lavoro, Srivastava et al. hanno scoperto che la distribuzione gaussiana e quindi le variabili gaussiane funzionano altrettanto bene – e forse anche meglio.

L’applicazione di variabili gaussiane può essere fatta in modo simile: assottigliare le reti al momento dell’addestramento, e utilizzare attivazioni ponderate al momento del test e della produzione (come con Dropout regolare). Tuttavia, gli autori scelgono di usare Gaussian Dropout in modo diverso – cioè, in modo moltiplicativo. Invece di assottigliare e ponderare, il Gaussian Dropout è ponderato al momento dell’addestramento, quando i valori attivati che non vengono eliminati sono moltiplicati per \(1/p\) invece di \(1\) (con il normale Bernoulli Dropout). Non vengono modificati al momento del test. Questo equivale allo scenario precedente.

Il Dropout gaussiano deve essere configurato da qualche \(\sigma\), che negli esperimenti di Srivastava et al. era impostato a \(\sqrt{(1-p)/p}\), dove \(p\) è la configurazione della variante Bernoulli (cioè, in casi ingenui \(p \circa 0.5\) per gli strati nascosti e \(\circa 1.0\) per lo strato di ingresso).

Sommario

In questo post del blog, abbiamo visto l’overfitting – e come evitarlo, con Dropout. Guardando cos’è, come funziona, e che funziona, abbiamo scoperto che è una tecnica interessante per l’applicazione nei vostri modelli di deep learning.

Spero che abbiate imparato qualcosa oggi – qualcosa di utile per i vostri modelli ML 😀 Se lo avete fatto, o se avete domande, non esitate a lasciare un commento qui sotto ⬇! Quando possibile, risponderò alle tue domande 😊

Grazie per aver letto MachineCurve oggi e buona ingegneria! 😎

Srivastava, N., Hinton, G., Krizhevsky, A., Sutskever, I., & Salakhutdinov, R. (2014, June 15). Dropout: Un modo semplice per prevenire l’overfitting delle reti neurali. Recuperato da http://jmlr.org/papers/v15/srivastava14a.html

Wikipedia. (2003, 20 marzo). Distribuzione di Bernoulli. Retrieved from https://en.wikipedia.org/wiki/Bernoulli_distribution

💡 Padroneggia il tuo ML – controlla anche questi post:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.