Perché la dimensione del mini batch è migliore di un singolo "batch" con tutti i dati di addestramento?


40

Ho letto spesso che, nel caso dei modelli di Deep Learning, la pratica abituale è quella di applicare mini lotti (generalmente uno piccolo, 32/64) in diverse epoche di allenamento. Non riesco davvero a capire il motivo dietro questo.

A meno che non mi sbagli, la dimensione del batch è il numero di istanze di training visualizzate dal modello durante un'iterazione di training; e l'epoca è una svolta quando tutte le istanze di addestramento sono state viste dal modello. In tal caso, non riesco a vedere il vantaggio di iterare su un sottoinsieme quasi insignificante delle istanze di addestramento più volte in contrasto con l'applicazione di un "batch massimo" esponendo al modello tutte le istanze di addestramento disponibili in ogni turno (supponendo, ovviamente, abbastanza la memoria). Qual è il vantaggio di questo approccio?


1
Dai un'occhiata a questa risposta.
Icyblade



Risposte:


46

Il vantaggio principale dell'uso del minibatch rispetto all'insieme di dati completo risale all'idea fondamentale della discesa gradiente stocastica 1 .

Nella discesa del gradiente batch, si calcola il gradiente sull'intero set di dati, calcolando la media su potenzialmente una grande quantità di informazioni. Ci vuole molta memoria per farlo. Ma il vero handicap è la traiettoria del gradiente batch che ti porta in una brutta posizione (punto di sella).

In SGD puro, d'altra parte, aggiorni i tuoi parametri aggiungendo (segno meno) il gradiente calcolato su una singola istanza del set di dati. Poiché si basa su un punto dati casuale, è molto rumoroso e potrebbe andare in una direzione lontana dal gradiente batch. Tuttavia, il rumore è esattamente quello che vuoi nell'ottimizzazione non convessa, perché ti aiuta a fuggire dai punti della sella o dai minimi locali (Teorema 6 in [2]). Lo svantaggio è che è terribilmente inefficiente e per trovare una buona soluzione è necessario ricorrere più volte all'intero set di dati.

La metodologia minibatch è un compromesso che inietta abbastanza rumore per ogni aggiornamento del gradiente, ottenendo al contempo una convergenza relativamente rapida.

1 Bottou, L. (2010). Apprendimento automatico su larga scala con discesa gradiente stocastica. In Atti del COMPSTAT'2010 (pagg. 177-186). Physica-Verlag HD.

[2] Ge, R., Huang, F., Jin, C., & Yuan, Y. (2015, giugno). Sfuggire ai punti di sella-Gradiente stocastico online per la decomposizione del tensore. In COLT (pagg. 797-842).

MODIFICARE :

Ho appena visto questo commento sul facebook di Yann LeCun, che offre una nuova prospettiva su questa domanda (scusate non so come collegarmi a fb.)

L'allenamento con minibatch di grandi dimensioni fa male alla salute. Ancora più importante, fa male al tuo errore di test. Gli amici non consentono agli amici di utilizzare minibatch di dimensioni superiori a 32. Ammettiamolo: le uniche persone sono passate a dimensioni di minibatch più grandi di una dal 2012 perché le GPU sono inefficienti per lotti di dimensioni inferiori a 32. Questo è un motivo terribile. Significa solo che il nostro hardware fa schifo.

Ha citato questo articolo che è stato appena pubblicato su arXiv pochi giorni fa (aprile 2018), che vale la pena leggere,

Dominic Masters, Carlo Luschi, Rivisitazione di piccoli lotti di addestramento per reti neurali profonde , arXiv: 1804.07612v1

Dall'astratto,

Mentre l'uso di grandi mini-lotti aumenta il parallelismo computazionale disponibile, è stato dimostrato che l'addestramento in piccoli lotti offre prestazioni di generalizzazione migliorate ...

Le migliori prestazioni sono state costantemente ottenute per dimensioni di mini lotti tra m = 2 e m = 32, il che contrasta con i recenti lavori a favore dell'uso di dimensioni di mini lotti a migliaia.


2
Perché la discesa con gradiente mini-batch dovrebbe essere più probabile per evitare minimi locali negativi rispetto alla discesa con gradiente batch? Hai qualcosa a sostegno di tale richiesta?
Martin Thoma,

@MartinThoma Vedi Teorema 6 in [2], un recente articolo su JMLR.
oracoloT11

2
ϕ(w,X)

2
@MartinThoma Dato che esiste un minimo globale per il set di dati che ci viene fornito, il percorso esatto per quel minimo globale dipende da cose diverse per ciascun metodo GD. Per il batch, l'unico aspetto stocastico sono i pesi durante l'inizializzazione. Il percorso del gradiente sarà lo stesso se si allena nuovamente NN con gli stessi pesi e set di dati iniziali. Per mini-batch e SGD, il percorso presenterà alcuni aspetti stocastici tra ogni passaggio dal campionamento stocastico dei punti dati per l'addestramento ad ogni passaggio. Ciò consente a mini-batch e SGD di sfuggire all'optima locale se sono in arrivo.
Wesley,

8

La memoria è non è davvero il motivo per fare questo, perché si può solo accumulare i tuoi sfumature, come si scorrere l'insieme di dati, e applicarli alla fine, ma ancora in SGD si applicarle ad ogni passo.

Le ragioni per cui SGD è utilizzato così ampiamente sono:

1) efficienza. In genere, specialmente all'inizio dell'allenamento, i gradienti di parametro per diversi sottoinsiemi dei dati tenderanno a puntare nella stessa direzione. Quindi i gradienti valutati su 1/100 dei dati indicheranno approssimativamente la stessa direzione generale dell'intero set di dati, ma richiedono solo 1/100 del calcolo. Poiché la convergenza su una rete profonda altamente non lineare richiede in genere migliaia o milioni di iterazioni, non importa quanto siano buoni i gradienti, ha senso fare molti aggiornamenti basati su stime economiche del gradiente piuttosto che pochi aggiornamenti basati su buoni.

2) Ottimizzazione: gli aggiornamenti rumorosi potrebbero consentire di rimbalzare da una cattiva optima locale (anche se non ho una fonte che dimostri che questo è importante nella pratica).

3) Generalizzazione. Sembra (vedi Zhang et al: Theory of Deep Learning III: Generalization Properties of SGD ) che SGD effettivamente aiuta la generalizzazione trovando minimi "piatti" sul set di addestramento, che hanno maggiori probabilità di essere anche minimi sul set di test. Intuitivamente, possiamo pensare a SGD come una sorta di insaccamento : calcolando i nostri parametri sulla base di molti minibatch di dati, rafforziamo le regole che si generalizzano su tutti i minibatch e cancelliamo le regole che non lo fanno, rendendoci quindi meno inclini a sovralimentare set di allenamento.


3

A meno che non mi sbagli, la dimensione del batch è il numero di istanze di training visualizzate dal modello durante un'iterazione di training

Corretto (anche se lo definirei "passaggio di aggiornamento del peso")

e l'epoca è una svolta quando tutte le istanze di addestramento sono state viste dal modello

Corretta

In tal caso, non riesco a vedere il vantaggio di iterare su un sottoinsieme quasi insignificante delle istanze di addestramento più volte in contrasto con l'applicazione di un "batch massimo" esponendo al modello tutte le istanze di addestramento disponibili in ogni turno (supponendo, ovviamente, abbastanza la memoria). Qual è il vantaggio di questo approccio?

Bene, praticamente quello. Di solito non hai abbastanza memoria. Diciamo che stiamo parlando della classificazione delle immagini. ImageNet è un set di dati estremamente popolare. Per un bel po ', VGG-16D è stato uno dei modelli più popolari. Ha bisogno di calcolare 15 245 800 float (nelle mappe delle caratteristiche) per un'immagine 224x224. Ciò significa circa 61 MB per immagine. Questo è solo un limite inferiore approssimativo di quanta memoria è necessaria durante l'allenamento per ogni immagine. ImageNet contiene diverse migliaia di immagini (penso circa 1,2 milioni?). Mentre potresti avere tanta memoria principale, certamente non hai tanta memoria GPU. Ho visto la GPU accelerare le cose a circa 21x. Quindi sicuramente vuoi usare la GPU.

Inoltre: il tempo per un mini-batch è molto più basso. Quindi la domanda è: preferiresti fare n passaggi di aggiornamento con mini-batch all'ora su una GPU o m passaggi di aggiornamento con batch senza GPU, dove n >> m.


Non è davvero una questione di memoria limitata. È sempre possibile calcolare il gradiente sul set di dati in un numero di batch con parametri del modello fissi (funzionalmente equivalenti al calcolo del gradiente in un singolo batch gigante). Praticamente si tratta più delle proprietà di generalizzazione causate dalla stocastica / rumorosità di SGD / MBGD e del fatto che sono necessarie meno epoche attraverso il set di dati per raggiungere la convergenza. L'aggiornamento dei parametri del modello in un'unica epoca porta a parametri intermedi migliori che rendono più istruttivi ulteriori calcoli del gradiente all'interno dell'epoca.
Madison,

1

A parte le altre risposte, penso che valga la pena sottolineare che ci sono due quantità distinte ma spesso accoppiate:

  1. Il numero di input utilizzati per calcolare il gradiente dei parametri in ogni passaggio.

Come altri hanno sottolineato, il gradiente rispetto a un minibatch è un'approssimazione del gradiente reale. Più grande è il minibatch, migliore è l'approssimazione.

  1. Il numero di input raccolti in un array e calcolati "contemporaneamente"

Il compromesso qui riguarda esclusivamente le prestazioni (memoria / cicli).

Queste quantità sono in genere le stesse, ovvero le dimensioni del minibatch, ma in linea di principio possono essere disaccoppiate.

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.