Ordinazione di normalizzazione batch e abbandono?


116

La domanda originale riguardava specificamente le implementazioni di TensorFlow. Tuttavia, le risposte riguardano le implementazioni in generale. Questa risposta generale è anche la risposta corretta per TensorFlow.

Quando si utilizza la normalizzazione batch e il dropout in TensorFlow (in particolare utilizzando i contrib.layers) devo essere preoccupato per l'ordine?

Sembra possibile che se utilizzo il dropout seguito immediatamente dalla normalizzazione batch potrebbero esserci problemi. Ad esempio, se lo spostamento nella normalizzazione batch si allena ai numeri di scala maggiori degli output di addestramento, ma poi lo stesso spostamento viene applicato ai numeri di scala più piccoli (a causa della compensazione per avere più output) senza dropout durante il test, allora quello il turno potrebbe essere disattivato. Il livello di normalizzazione batch di TensorFlow compensa automaticamente questo problema? O questo non accade per qualche motivo che mi manca?

Inoltre, ci sono altre insidie ​​a cui prestare attenzione quando si usano questi due insieme? Ad esempio, supponendo che li stia usando nell'ordine corretto rispetto a quanto sopra (supponendo che ci sia un ordine corretto), potrebbero esserci problemi con l'utilizzo sia della normalizzazione batch che dell'esclusione su più livelli successivi? Non vedo immediatamente un problema con questo, ma potrei perdere qualcosa.

Grazie mille!

AGGIORNARE:

Una prova sperimentale sembra suggerire che l'ordinazione non importa. Ho eseguito la stessa rete due volte con solo la norma batch e il dropout inverso. Quando il dropout è prima della norma batch, la perdita di convalida sembra aumentare mentre la perdita di formazione diminuisce. Scenderanno entrambi nell'altro caso. Ma nel mio caso i movimenti sono lenti, quindi le cose possono cambiare dopo più allenamento ed è solo un singolo test. Sarebbe comunque gradita una risposta più definitiva e informata.

Risposte:


143

In Ioffe e Szegedy 2015 , gli autori affermano che "vorremmo garantire che per qualsiasi valore di parametro, la rete produca sempre attivazioni con la distribuzione desiderata". Quindi il Batch Normalization Layer viene effettivamente inserito subito dopo un Conv Layer / Fully Connected Layer, ma prima di alimentare ReLu (o qualsiasi altro tipo di) attivazione. Guarda questo video intorno a 53 minuti per maggiori dettagli.

Per quanto riguarda il dropout, credo che il dropout venga applicato dopo il livello di attivazione. Nella figura 3b del documento di esclusione, il fattore di esclusione / matrice di probabilità r (l) per lo strato nascosto l viene applicato su y (l), dove y (l) è il risultato dopo l'applicazione della funzione di attivazione f.

Quindi, in sintesi, l'ordine di utilizzo della normalizzazione batch e del dropout è:

-> CONV / FC -> BatchNorm -> ReLu (o altra attivazione) -> Dropout -> CONV / FC ->


63
Sembra che anche Christian Szegedy ora ami esibirsi in BatchNorm dopo il ReLU (non prima). Citazione di F. Chollet, l'autore di Keras: "Non sono tornato a controllare cosa suggeriscono nel loro articolo originale, ma posso garantire che il codice recente scritto da Christian si applica relu prima di BN. Occasionalmente è ancora un argomento di dibattito, però. " fonte
pseudomarvin

3
Che dire del pool, che andrebbe tra batchnorm e l'attivazione?
parole per il

5
Inoltre, sembra che la precisione possa essere maggiore con BN dopo l'attivazione: github.com/cvjena/cnn-models/issues/3
wordsforthewise

1
il video viene cancellato in qualche modo!
blitu12345

10
Questo documento mostra che normalmente l'abbandono con BN porta a risultati peggiori a meno che non si faccia un po 'di condizionamento per evitare il rischio di cambiamenti di varianza.
Haramoz

37

Come notato nei commenti, una risorsa straordinaria per leggere l'ordine dei livelli è qui . Ho esaminato i commenti ed è la migliore risorsa sull'argomento che ho trovato su Internet

I miei 2 centesimi:

Il dropout ha lo scopo di bloccare completamente le informazioni da alcuni neuroni per assicurarsi che i neuroni non si adattino insieme. Quindi, la normalizzazione batch deve avvenire dopo il dropout, altrimenti stai passando le informazioni attraverso le statistiche di normalizzazione.

Se ci pensi, nei tipici problemi di ML, questo è il motivo per cui non calcoliamo la media e la deviazione standard su interi dati per poi dividerli in set di addestramento, test e convalida. Dividiamo e quindi calcoliamo le statistiche sul set di treni e le usiamo per normalizzare e centrare i set di dati di convalida e test

quindi suggerisco lo schema 1 (questo prende in considerazione il commento di pseudomarvin sulla risposta accettata)

-> CONV / FC -> ReLu (o altra attivazione) -> Dropout -> BatchNorm -> CONV / FC

al contrario dello Schema 2

-> CONV / FC -> BatchNorm -> ReLu (o altra attivazione) -> Dropout -> CONV / FC -> nella risposta accettata

Si noti che ciò significa che la rete nello Schema 2 dovrebbe mostrare un over-fitting rispetto alla rete nello Schema 1 ma OP ha eseguito alcuni test come menzionato in questione e supportano lo Schema 2


Discussione redditizia pertinente sul posizionamento BatchNorm: reddit.com/r/MachineLearning/comments/67gonq/…
saetch_g

3
Ma questo non rovinerebbe le tue statistiche BN dal momento che le calcolerai dopo che è stato applicato il dropout, cosa che non avverrà al momento del test?
ZakJ

@ZakJ Immagino di no. Poiché calcoliamo BN per unità (per ogni caratteristica interna) e inoltre viene ridimensionato per compensare il dropout.
zelo

@ZakJ è corretto. Vedi la risposta di Mohammed Adel e questo documento qui: arxiv.org/pdf/1801.05134.pdf . In effetti, i livelli di normalizzazione batch imparano a contrastare lo spostamento di covariata nei dati che non esistono più quando Dropout viene disattivato in fase di test.
skeller88

@ skeller88 Non ho letto il giornale. In cima alla mia testa penso che se hai BN prima del dropout, questo essenzialmente rovina l'intento del livello BN poiché la funzione di BN è fornire dati standardizzati al livello successivo.
MiloMinderbinder

12

Di solito, rilascia semplicemente Dropout(quando hai BN):

  • "BN elimina la necessità di Dropoutin alcuni casi perché BN fornisce vantaggi di regolarizzazione simili a Dropout intuitivamente"
  • "Architetture come ResNet, DenseNet, ecc. Non utilizzate Dropout

Per maggiori dettagli, fare riferimento a questo documento [ Comprendere la disarmonia tra abbandono e normalizzazione in batch mediante variazione della varianza ] come già menzionato da @Haramoz nei commenti.


per quanto riguarda gli MLP è utile combinarli.
DINA TAKLIT

1
@DINATAKLIT Quando davvero non hai abbastanza dati di allenamento, a mio parere, SI.
xtluo

@xtulo intendi questo lavoro una volta che il loro è un piccolo datest? come se avessi letto che la normalizzazione batch funziona meglio con set di dati di grandi dimensioni! Sono un po 'confuso :!
DINA TAKLIT

1
@DINATAKLIT Nel tuo commento precedente what about MLPs is it useful to combine them, intendevi questo Is it useful to combine Dropout and BN when using MLPs? La mia sensazione al riguardo è che dipende principalmente dalle dimensioni del tuo modello e dalla quantità di dati di allenamento che hai.
xtluo

@xtulo si intendo che è utile combinare Droupout e BN, si sono d'accordo con la tua ultima risposta.
DINA TAKLIT

6

Ho trovato un documento che spiega la disarmonia tra Dropout e Batch Norm (BN). L'idea chiave è ciò che chiamano "variazione della varianza" . Ciò è dovuto al fatto che il dropout ha un comportamento diverso tra le fasi di addestramento e di test, che sposta le statistiche di input che BN apprende. L'idea principale può essere trovata in questa figura che è presa da questo documento . inserisci qui la descrizione dell'immagine

Una piccola demo per questo effetto può essere trovata in questo taccuino .


3
Come risponde questo alla domanda?
nbubis

1
Il documento fornisce 2 potenziali strategie: - Applica abbandono (solo) dopo tutti i livelli BN - Cambia abbandono in una forma più stabile alla varianza
user3641187

@nbubis Penso che risponda indirettamente. Sembra suggerire di non usarli affatto insieme ("spiega la disarmonia tra Dropout e Batch Norm (BN)").
NelsonGon


2

L'ordine corretto è: Conv> Normalization> Activation> Dropout> Pooling


2

Conv - Attivazione - DropOut - BatchNorm - Pool -> Test_loss: 0,04261355847120285

Conv - Attivazione - DropOut - Pool - BatchNorm -> Test_loss: 0.050065308809280396

Conv - Attivazione - BatchNorm - Pool - DropOut -> Test_loss: 0.04911309853196144

Conv - Attivazione - BatchNorm - DropOut - Pool -> Test_loss: 0.06809622049331665

Conv - BatchNorm - Attivazione - DropOut - Pool -> Test_loss: 0.038886815309524536

Conv - BatchNorm - Attivazione - Pool - DropOut -> Test_loss: 0.04126095026731491

Conv - BatchNorm - DropOut - Attivazione - Pool -> Test_loss: 0.05142546817660332

Conv - DropOut - Attivazione - BatchNorm - Pool -> Test_loss: 0.04827788099646568

Conv - DropOut - Attivazione - Pool - BatchNorm -> Test_loss: 0,04722036048769951

Conv - DropOut - BatchNorm - Attivazione - Pool -> Test_loss: 0,03238215297460556


Addestrato sul dataset MNIST (20 epoche) con 2 moduli convoluzionali (vedi sotto), seguito ogni volta con

model.add(Flatten())
model.add(layers.Dense(512, activation="elu"))
model.add(layers.Dense(10, activation="softmax"))

I livelli convoluzionali hanno una dimensione del kernel di (3,3), riempimento predefinito, l'attivazione è elu. Il Pooling è un MaxPooling del bordo piscina (2,2). La perdita è categorical_crossentropye l'ottimizzatore è adam.

La corrispondente probabilità di abbandono è 0.2o 0.3, rispettivamente. La quantità di mappe delle caratteristiche è rispettivamente 32o 64.

Modifica: quando ho abbandonato il Dropout, come consigliato in alcune risposte, convergeva più velocemente ma aveva una capacità di generalizzazione peggiore rispetto a quando uso BatchNorm e Dropout.


A causa della natura stocastica degli NN non è sufficiente giocare con un solo allenamento. Quando farai circa 100 allenamenti e prenderesti la media, i risultati saranno più accurati.
GensaGames

0

ConV / FC - BN - Sigmoid / tanh - dropout. Se la funzione di attivazione è Relu o in altro modo, l'ordine di normalizzazione e abbandono dipende dall'attività


0

Ho letto i documenti consigliati nella risposta e nei commenti da https://stackoverflow.com/a/40295999/8625228

Dal punto di vista di Ioffe e Szegedy (2015), utilizzano solo BN nella struttura della rete. Li et al. (2018) forniscono analisi statistiche e sperimentali che indicano uno spostamento della varianza quando i professionisti usano Dropout prima di BN. Così, Li et al. (2018) consiglia di applicare Dropout dopo tutti i livelli BN.

Dal punto di vista di Ioffe e Szegedy (2015), BN si trova all'interno / prima della funzione di attivazione. Tuttavia, Chen et al. (2019) utilizzano uno strato IC che combina dropout e BN e Chen et al. (2019) consiglia di utilizzare BN dopo ReLU.

Per quanto riguarda la sicurezza, utilizzo Dropout o BN solo nella rete.

Chen, Guangyong, Pengfei Chen, Yujun Shi, Chang-Yu Hsieh, Benben Liao e Shengyu Zhang. 2019. "Ripensare l'uso della normalizzazione e del dropout in batch nella formazione delle reti neurali profonde." CoRR ass. / 1905,05928. http://arxiv.org/abs/1905.05928 .

Ioffe, Sergey e Christian Szegedy. 2015. "Normalizzazione in batch: accelerare la formazione in rete profonda riducendo lo spostamento delle covariate interne". CoRR abs / 1502.03167. http://arxiv.org/abs/1502.03167 .

Li, Xiang, Shuo Chen, Xiaolin Hu e Jian Yang. 2018. "Capire la disarmonia tra abbandono e normalizzazione dei lotti mediante variazione della varianza". CoRR abs / 1801.05134. http://arxiv.org/abs/1801.05134 .

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.