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.