Dimensione del lotto di compromesso rispetto al numero di iterazioni per la formazione di una rete neurale


222

Quando si allena una rete neurale, che differenza fa impostare:

  • dimensione del lotto in e numero di iterazioni in bab
  • rispetto alle dimensioni del batch in numero di iterazioni in dcd

dove ?ab=cd

In altre parole, supponendo che addestriamo la rete neurale con la stessa quantità di esempi di addestramento, come impostare la dimensione ottimale del lotto e il numero di iterazioni? (dove dimensione del lotto * numero di iterazioni = numero di esempi di allenamento mostrati alla rete neurale, con lo stesso esempio di allenamento potenzialmente mostrato più volte)

Sono consapevole che maggiore è la dimensione del batch, maggiore è lo spazio di memoria necessario e spesso rende i calcoli più veloci. Ma in termini di prestazioni della rete formata, che differenza fa?


1
Dai un'occhiata a questo blog che descrive come scegliere la giusta dimensione del lotto confrontando gli effetti delle diverse dimensioni del lotto sull'accuratezza del set di dati Cifar-10.
Teja Sreenivas,

Risposte:


208

Da Nitish Shirish Keskar, Dheevatsa Mudigere, Jorge Nocedal, Mikhail Smelyanskiy, Ping Tak Peter Tang. Sulla formazione in lotti di grandi dimensioni per l'apprendimento profondo: gap di generalizzazione e Sharp Minima. https://arxiv.org/abs/1609.04836 :

Il metodo di discesa gradiente stocastico e le sue varianti sono algoritmi di scelta per molte attività di Deep Learning. Questi metodi operano in un regime di piccoli lotti in cui una frazione dei dati di allenamento, in genere 32-512 punti dati, viene campionata per calcolare un'approssimazione al gradiente. È stato osservato in pratica che quando si utilizza un lotto più grande si verifica un significativo degrado della qualità del modello, misurato dalla sua capacità di generalizzazione.Ci sono stati alcuni tentativi di indagare sulla causa di questo calo di generalizzazione nel regime dei grandi lotti, tuttavia la risposta precisa a questo fenomeno è finora sconosciuta. In questo documento, presentiamo ampie prove numeriche a supporto della tesi secondo cui i metodi di grandi lotti tendono a convergere in netti minimizzatori delle funzioni di addestramento e test - e che minimi netti portano a una generalizzazione più scarsa. Al contrario, i metodi di piccoli lotti convergono costantemente in minimizzatori piatti e i nostri esperimenti supportano una visione diffusa secondo cui ciò è dovuto al rumore intrinseco nella stima del gradiente. Discutiamo anche diverse strategie empiriche che aiutano i metodi di grandi lotti per eliminare il divario di generalizzazione e concludere con una serie di idee di ricerca future e domande aperte.

[...]

2f(x)2f(x)

[...]

inserisci qui la descrizione dell'immagine

Inoltre, alcune buone intuizioni di Ian Goodfellow rispondono al perché non utilizzare l'intero set di allenamento per calcolare il gradiente? su Quora:

La dimensione del tasso di apprendimento è limitata principalmente da fattori come la curva dei costi. Puoi pensare alla discesa del gradiente come a un'approssimazione lineare della funzione di costo, quindi a spostarti in discesa lungo quel costo approssimativo. Se la funzione di costo è altamente non lineare (altamente curvata), l'approssimazione non sarà molto buona per molto lontano, quindi sono sicuri solo piccoli passi. Puoi leggere di più al riguardo nel capitolo 4 del libro di apprendimento approfondito, sul calcolo numerico: http://www.deeplearningbook.org/contents/numerical.html

Quando inserisci m esempi in un minibatch, devi eseguire il calcolo O (m) e utilizzare la memoria O (m), ma riduci la quantità di incertezza nel gradiente di un fattore di solo O (sqrt (m)). In altre parole, ci sono rendimenti marginali decrescenti nel mettere più esempi nel minibatch. Puoi leggere ulteriori informazioni al riguardo nel Capitolo 8 del libro di testo di deep learning, sugli algoritmi di ottimizzazione per il deep learning: http://www.deeplearningbook.org/contents/optimization.html

Inoltre, se ci pensi, anche usare l'intero set di allenamento non ti dà davvero il vero gradiente. Il gradiente reale sarebbe il gradiente atteso con l'attesa presa su tutti i possibili esempi, ponderata dalla distribuzione generatrice di dati. L'utilizzo dell'intero set di formazione consiste semplicemente nell'utilizzare una dimensione di minibatch molto grande, in cui la dimensione del minibatch è limitata dall'importo speso per la raccolta dei dati, piuttosto che dall'importo speso per il calcolo.

Correlati: discesa gradiente batch rispetto a discesa gradiente stocastica


Dal momento che batch_size divide solo il set di dati di training in batch, avrebbe senso riorganizzare il set di dati (non temporale) per avere una varianza uniforme in tutti i batch? Ciò potrebbe ridurre la necessità di ottimizzare le dimensioni del batch, il che è utile solo per trovare una convergenza più rapida. in tal caso, come si farebbe? Stavo pensando che potrebbe non fornire un minimo più piatto. Gradirei una guida dettagliata.
user12348

@ user12348 Come riorganizzerà il set di dati? Come è possibile stimare che una data dimensione dei dati produrrà un vettore di caratteristiche specifiche dopo l'allenamento?
Cloud Cho

46

Suppongo che tu stia parlando di ridurre la dimensione del batch in un algoritmo di discesa gradiente stocastico mini batch e di confrontarlo con dimensioni di batch più grandi che richiedono meno iterazioni.

Andrew Ng. fornisce una buona discussione di questo e di alcuni elementi visivi nella sua classe di corsi online su ML e reti neurali. Quindi il resto di questo post è principalmente un rigurgito dei suoi insegnamenti da quella classe.

Prendiamo i due estremi, su un lato ogni passo di discesa del gradiente utilizza l'intero set di dati. Stai calcolando i gradienti per ogni campione. In questo caso sai esattamente il meglio direttamente verso un minimo locale. Non perdi tempo andando nella direzione sbagliata. Quindi, in termini di numeri gradini di discesa gradiente, ci arriverai nel minor numero possibile.

Ovviamente calcolare il gradiente sull'intero set di dati è costoso. Quindi ora andiamo all'altro estremo. Una dimensione del lotto di solo 1 campione. In questo caso il gradiente di quel campione potrebbe portare completamente nella direzione sbagliata. Ma ehi, il costo del calcolo di un gradiente era piuttosto banale. Man mano che si procede per un solo campione, si "gira" un po 'in giro, ma in media ci si dirige verso un minimo locale altrettanto ragionevole come nella discesa a gradiente di lotto completo.

Questo potrebbe essere un momento per sottolineare che ho visto alcune pubblicazioni che suggeriscono che forse questo rimbalzare attorno a quella discesa stocastica a 1 campione potrebbe aiutarti a rimbalzare da un minimo locale che la modalità batch completa non eviterebbe, ma è discutibile. Alcune altre buone risposte qui affrontano questa domanda più direttamente di me.

In termini di potenza computazionale, mentre il processo GD stocastico a campione singolo richiede molte più iterazioni, si finisce per arrivarci a un costo inferiore rispetto alla modalità batch completa, "in genere". Questo è come dice Andrew Ng.

Ora troviamo la via di mezzo di cui hai chiesto. Potremmo renderci conto che le moderne librerie BLAS rendono il calcolo della matematica vettoriale abbastanza efficiente, quindi calcolare 10 o 100 campioni contemporaneamente, presumendo di aver vettorizzato correttamente il codice, sarà a malapena più lavoro rispetto al calcolo di 1 campione (si ottiene efficienza della memoria e trucchi computazionali integrati nelle librerie matematiche più efficienti). E la media su un lotto di 10, 100, 1000 campioni produrrà un gradiente che è un'approssimazione più ragionevole del gradiente vero e completo in modalità batch. Quindi i nostri passaggi sono ora più precisi, il che significa che ne abbiamo bisogno di meno per convergere, e ad un costo che è solo marginalmente superiore a GD a campione singolo.

L'ottimizzazione delle dimensioni esatte del mini-batch da utilizzare è generalmente lasciata a tentativi ed errori. Esegui alcuni test su un campione del set di dati con numeri che vanno da decine a qualche migliaio e vedi quali convergono più velocemente, quindi procedi con quello. Le dimensioni dei lotti in questi intervalli sembrano abbastanza comuni in tutta la letteratura. E se i tuoi dati sono veramente IID, allora il teorema del limite centrale sulla variazione dei processi casuali suggerirebbe anche che quegli intervalli sono una ragionevole approssimazione dell'intero gradiente.

Decidere esattamente quando interrompere l'iterazione viene in genere eseguito monitorando l'errore di generalizzazione rispetto a un set di convalida non addestrato e scegliendo il punto in cui l'errore di convalida si trova nel punto più basso. L'allenamento per troppe iterazioni alla fine porterà a un eccesso di adattamento, a quel punto il tuo errore sul set di convalida inizierà a salire. Quando vedi questo accadere, esegui il backup e fermati nel punto ottimale.


22

TL; DR: una dimensione di mini-batch troppo grande di solito porta a una precisione inferiore !

Per chi è interessato, ecco una spiegazione.

Esistono due nozioni di velocità:

  • Velocità computazionale
  • Velocità di convergenza di un algoritmo

La velocità computazionale è semplicemente la velocità di eseguire calcoli numerici nell'hardware. Come hai detto, di solito è più alto con una dimensione mini-batch più grande. Questo perché le librerie di algebra lineare usano la vettorializzazione per operazioni vettoriali e matriciali per accelerarle, a scapito dell'utilizzo di più memoria. I guadagni possono essere significativi fino a un certo punto. Dalla mia esperienza, c'è un punto dopo il quale ci sono solo guadagni marginali di velocità, se presenti. Il punto dipende dal set di dati, dall'hardware e da una libreria utilizzata per i calcoli numerici (sotto il cofano).

Ma non dimentichiamo che esiste anche l'altra nozione di velocità, che ci dice quanto velocemente converge il nostro algoritmo.

Innanzitutto, cosa significa far convergere il nostro algoritmo? Bene, sta a noi definire e decidere quando siamo soddisfatti di una precisione, o di un errore, che otteniamo, calcolati sul set di validazione. Possiamo definirlo in anticipo e attendere che l'algoritmo giunga a quel punto, oppure possiamo monitorare il processo di addestramento e decidere di interromperlo quando l'errore di validazione inizia a salire in modo significativo (il modello inizia a sovrautilizzare il set di dati). Non dovremmo davvero fermarlo subito, il primo momento in cui l'errore inizia a sorgere, se lavoriamo con mini batch, perché utilizziamo la discesa gradiente stocastica, SGD. In caso di discesa gradiente (batch completo), dopo ogni epoca, l'algoritmo si sistemerà al minimo, sia esso locale o globale. SGD non si accontenta mai al minimo. Continua a oscillare attorno ad esso. Potrebbe andare avanti indefinitamente,

Ora, dopo tutta quella teoria, c'è una "cattura" a cui dobbiamo prestare attenzione. Quando si utilizza una dimensione batch inferiore, il calcolo dell'errore ha più rumore rispetto a quando si utilizza una dimensione batch più grande. Si direbbe, beh, che male, no? Il fatto è che quel rumore può aiutare l'algoritmo a saltare fuori da un minimo locale negativo e avere maggiori possibilità di trovare un minimo locale migliore o, si spera, il minimo globale.

Pertanto, se riusciamo a trovare una soluzione migliore più rapidamente utilizzando una dimensione batch inferiore anziché una più grande, solo con l'aiuto del rumore "indesiderato", possiamo sintonizzarci tra il tempo totale impiegato dal nostro algoritmo per trovare una soluzione soddisfacente soluzione e una maggiore precisione.

Quello che voglio dire è che, per una certa precisione (o errore), una dimensione del lotto inferiore può portare a un tempo di addestramento totale più breve, non più lungo, come molti credono.

Oppure, se decidiamo di mantenere lo stesso tempo di addestramento di prima, potremmo ottenere un'accuratezza leggermente superiore con una dimensione del lotto inferiore e molto probabilmente lo faremo, soprattutto se abbiamo scelto il nostro tasso di apprendimento in modo appropriato.

Se hai tempo, dai un'occhiata a questo documento: Valutazione sistematica dei progressi della CNN su ImageNet In particolare, dai un'occhiata a "3.7. Dimensione del lotto e tasso di apprendimento", e Figura 8. Vedrai che grandi dimensioni di mini-lotti portano ad una precisione peggiore , anche se ottimizza il tasso di apprendimento su un'euristica.

In generale, la dimensione batch di 32 è un buon punto di partenza e dovresti provare anche con 64, 128 e 256. Altri valori (inferiori o superiori) potrebbero andare bene per alcuni set di dati, ma l'intervallo indicato è generalmente il migliore da inizia a sperimentare. Tuttavia, sotto i 32 anni, potrebbe rallentare troppo a causa della velocità computazionale significativamente più bassa, a causa del non sfruttare pienamente la vettorializzazione. Se viene visualizzato un errore "memoria insufficiente", provare comunque a ridurre la dimensione del mini batch.

Quindi, non si tratta semplicemente di utilizzare la dimensione del mini batch più grande possibile che si adatta alla memoria.

Per concludere e rispondere alla tua domanda, una dimensione di mini-batch più piccola (non troppo piccola) di solito porta non solo a un numero inferiore di iterazioni di un algoritmo di allenamento, rispetto a una dimensione di batch di grandi dimensioni, ma anche a una maggiore precisione complessiva, ovvero una rete neurale che si comporta meglio, nella stessa quantità di tempo di allenamento o meno.

Non dimenticare che il rumore più elevato può aiutarlo a saltare fuori da un minimo locale negativo, piuttosto che lasciarlo bloccato.


14

Sto aggiungendo un'altra risposta a questa domanda per fare riferimento a un nuovo documento della conferenza ICLR (2018) di Google che affronta quasi direttamente questa domanda.

Titolo: non decadere il tasso di apprendimento, aumentare le dimensioni del lotto

https://arxiv.org/abs/1711.00489

L'estratto del documento sopra è copiato qui:

È pratica comune decadere il tasso di apprendimento. Qui mostriamo che di solito è possibile ottenere la stessa curva di apprendimento su entrambi i set di allenamento e test aumentando invece la dimensione del lotto durante l'allenamento. Questa procedura ha esito positivo per la discesa gradiente stocastica (SGD), SGD con quantità di moto, momento di Nesterov e Adam. Raggiunge accuratezze di test equivalenti dopo lo stesso numero di epoche di allenamento, ma con un minor numero di aggiornamenti dei parametri, portando a un maggiore parallelismo e tempi di allenamento più brevi. Possiamo ridurre ulteriormente il numero di aggiornamenti dei parametri aumentando il tasso di apprendimento ϵ e ridimensionando la dimensione del batch B∝ϵ. Infine, si può aumentare il coefficiente di momento m e la scala B∝1 / (1 − m), sebbene ciò tenda a ridurre leggermente la precisione del test. In modo cruciale, le nostre tecniche ci consentono di riutilizzare i programmi di allenamento esistenti per l'addestramento in lotti di grandi dimensioni senza messa a punto di iper-parametri. Formiamo ResNet-50 su ImageNet con una precisione di validazione del 76,1% in meno di 30 minuti.


1
Un fabbisogno di memoria maggiore sembra un cattivo compromesso per evitare semplicemente di ridurre un valore. Anche l'IMHO che ha un impatto sulla memoria in crescita durante l'allenamento rende un algoritmo meno, non più, scalabile.
P-Gn,

3

Mostro qui un'esperienza empirica . Ho fatto un esperimento con la dimensione del lotto 4 e la dimensione del lotto 4096. La dimensione 4096 sta facendo 1024x meno backpropagations. Quindi la mia intuizione è che lotti più grandi eseguono meno e più grossolane fasi di ricerca per la soluzione ottimale, e quindi per costruzione sarà meno probabile convergere sulla soluzione ottimale.

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.