Batch_size in Keras ha effetti sulla qualità dei risultati?


38

Sto per formare una grande rete LSTM con 2-3 milioni di articoli e sto lottando con errori di memoria (utilizzo AWS EC2 g2x2large).

Ho scoperto che una soluzione è ridurre il batch_size. Tuttavia, non sono sicuro se questo parametro sia correlato solo a problemi di efficienza della memoria o se influirà sui miei risultati. È un dato di fatto, ho anche notato che batch_sizeusato negli esempi è di solito come un potere di due, che non capisco neanche.

Non mi importa se la mia rete impiega più tempo ad allenarsi, ma vorrei sapere se ridurre batch_sizela qualità diminuirà la qualità delle mie previsioni.

Grazie.


Questa domanda non è specifica per keras. Penso che il consesus generale sia che campioni di dimensioni più piccole convergano più lentamente ma sono meno inclini a rimanere bloccati nei minimi locali
Alex

Ho visto casi in cui una dimensione del lotto troppo grande può impedire la convergenza anche con lo stesso numero di epoche di addestramento.
Curtis White,

Risposte:


43

Dopo un anno e mezzo, torno alla mia risposta perché la mia precedente risposta era sbagliata.

Le dimensioni del lotto incidono in modo significativo sull'apprendimento. Quello che succede quando metti un batch attraverso la tua rete è che fai la media dei gradienti. Il concetto è che se la dimensione del batch è abbastanza grande, ciò fornirà una stima abbastanza stabile di quale sarebbe il gradiente dell'intero set di dati. Prendendo campioni dal set di dati, si stima il gradiente riducendo in modo significativo i costi di calcolo. Più vai basso, meno accurata sarà la tua stima, tuttavia in alcuni casi questi gradienti rumorosi possono effettivamente aiutare a sfuggire ai minimi locali. Quando è troppo basso, i pesi della rete possono semplicemente saltare se i dati sono rumorosi e potrebbero non essere in grado di apprendere o convergono molto lentamente, con un impatto negativo sul tempo di calcolo totale.

Un altro vantaggio del batching è per il calcolo della GPU, le GPU sono molto brave a parallelizzare i calcoli che avvengono nelle reti neurali se parte del calcolo è la stessa (ad esempio, la moltiplicazione della matrice ripetuta sulla stessa matrice di peso della rete). Ciò significa che una dimensione del lotto di 16 richiederà meno del doppio della quantità di una dimensione del lotto di 8.

Nel caso in cui siano necessari lotti di dimensioni maggiori ma non si adattino alla GPU, è possibile alimentare un piccolo lotto, salvare le stime del gradiente e alimentare uno o più lotti, quindi eseguire un aggiornamento del peso. In questo modo si ottiene un gradiente più stabile perché è stata aumentata la dimensione del batch virtuale.

RISPOSTA SBAGLIATA, VECCHIA: [[[No, il batch_size influenza solo la velocità del tuo apprendimento, non la qualità dell'apprendimento. Anche i batch_sizes non devono essere potenze di 2, anche se capisco che alcuni pacchetti consentono solo potenze di 2. Dovresti cercare di ottenere il tuo batch_size il più alto possibile che si adatta alla memoria della tua GPU per ottenere la massima velocità possibile .]]]]


Non posso permettermi 32 ma posso permettermi 16. Tuttavia, ho notato che è troppo lento. Pensi che dovrei provare alcuni valori tra 16-32 o attenermi a 16?
hipoglucido,

Vorrei provare e cronometrare alcuni valori. Ogni epoca dovrebbe essere nello stesso periodo in modo che non ci vorrà troppo tempo. Prova prima 17 per vedere se è più veloce o più lento perché sono interessato a questo, dato che questa potenza di 2 dipende dalla GPU e / o dal backend di Keras. Ma penso che riempirlo fino all'orlo sia probabilmente il migliore
Jan van der Vegt,

9
Sei sicuro che la dimensione del lotto non influisca sulla qualità dell'apprendimento? Ricordo di aver letto alcuni blog / articoli (?) In cui dicevano che lotti più piccoli producono gradienti più rumorosi rispetto a lotti più grandi, ma il rumore può essere utile per uscire dai minimi locali. Non sono sicuro se / come questo si applica agli LSTM.
stmax,

Non del tutto convinto, non ho avuto abbastanza esperienza me stesso, ma è quello che ho letto. Riesco a vedere i gradienti meno stabili, quindi potrei essere fuori.
Jan van der Vegt,

2
Un anno e mezzo dopo e ora molto più ben informato e sono d'accordo. Cambierò la mia risposta
Jan van der Vegt,

11

Penso che la risposta accettata sia probabilmente sbagliata. Esistono varianti negli algoritmi di discesa del gradiente .

  1. Discesa del gradiente alla vaniglia : qui il gradiente viene calcolato su tutti i punti di dati in una singola inquadratura e viene presa la media. Quindi abbiamo una versione più fluida del gradiente che richiede più tempo per l'apprendimento.

  2. Discesa del gradiente stocastico : qui punto di un dato alla volta quindi il gradiente è aggressivo (gradienti rumorosi) quindi ci saranno molte oscillazioni (usiamo i parametri Momentum - ad esempio Nesterov per controllare questo). Quindi c'è la possibilità che le tue oscillazioni possano far sì che l'algoritmo non raggiunga un minimo locale (divergere).

  3. Discesa gradiente mini-batch : che prende i vantaggi di entrambi i precedenti in media gradienti di un piccolo batch. Quindi non troppo aggressivo come SGD e consente l'apprendimento online che Vanilla GD non ha mai permesso.

Più piccolo è il Mini-Batch, migliori sarebbero le prestazioni del tuo modello (non sempre) e ovviamente ha a che fare con l'apprendimento delle tue epoche troppo veloce. Se ti stai allenando su un set di dati di grandi dimensioni, vuoi una convergenza più veloce con buone prestazioni, quindi scegliamo Batch-GD.

SGD aveva fissato i parametri di apprendimento, quindi iniziamo altri ottimizzatori adattivi come Adam, AdaDelta, RMS Prop ecc. Che cambiano il parametro di apprendimento in base alla storia dei gradienti.


3) di solito si chiama minibatch
Alex

@Alex: aggiunta la modifica.
Jil Jung Juk,

1
Sono d'accordo che non esiste alcuna regola per quanto riguarda il parametro dimensione batch. Ma questa affermazione - "Più piccolo è il Mini-Batch, migliori sarebbero le prestazioni del tuo modello" - è in contrasto con la regola generale. Generalmente si desidera massimizzare la dimensione del lotto
MonsieurBeilto

4

Stranamente, ho scoperto che i lotti più grandi con keras richiedono più epoche per convergere.

Ad esempio, l'output di questo script basato sul test di integrazione di keras è

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

Relazionato

L'uso di dimensioni di lotto troppo grandi può avere un effetto negativo sull'accuratezza della rete durante l'allenamento poiché riduce la stocastica della discesa del gradiente.

Modifica: la maggior parte delle volte, batch_sizesi desidera aumentare per accelerare il calcolo, ma ci sono altri modi più semplici per farlo, come usare tipi di dati di un footprint più piccolo tramite l' dtypeargomento, sia in keras che in tensorflow , ad esempio float32invece difloat64


Con lotti più grandi (e quindi meno per epoca) avrai meno aggiornamenti gradiente per epoca. "epoca" è solo il gergo ML per "un passaggio attraverso i dati durante l'allenamento". Se stai cercando di accelerare l'allenamento, misura il tempo a muro e ignora le epoche.
Andrew Wagner,
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.