Batch Size
La dimensione del batch è il numero di esempi di addestramento che un modello elabora per ogni aggiornamento dei pesi. Determina l'uso della memoria GPU, la velocità di addestramento e il rumore dei gradienti.
La dimensione del batch è il numero di esempi di addestramento che un modello elabora insieme prima di aggiornare i pesi del modello. Invece di inviare l’intero dataset di addestramento alla rete neurale in una sola volta, l’addestramento lo suddivide in batch. Per ogni batch, il modello produce predizioni, la funzione di perdita le valuta, la retropropagazione calcola i gradienti e l’ottimizzatore compie un passo. La dimensione del batch è un iperparametro che determina contemporaneamente tre aspetti: quanta memoria GPU serve per l’addestramento, quanto dura ogni epoca e quanto è rumorosa ogni stima del gradiente.
Effetti della dimensione del batch sull’addestramento#
Ogni batch fornisce all’algoritmo di ottimizzazione una stima del gradiente sull’intero dataset, e la stima diventa più precisa man mano che cresce il batch. Il frammento PyTorch qui sotto misura direttamente tale precisione calcolando la media dei gradienti per campione su numerosi batch casuali di diverse dimensioni:
import torch
torch.manual_seed(0)
# Per-sample gradients of a squared-error loss for 10,000 samples
x = torch.randn(10_000)
y = 2 * x + torch.randn(10_000)
w = torch.tensor(0.0)
per_sample_grads = 2 * (w * x - y) * x
# Estimate the gradient from 1,000 random batches at each batch size
for batch_size in (8, 64, 512):
idx = torch.randint(0, len(x), (1000, batch_size))
batch_grads = per_sample_grads[idx].mean(dim=1)
print(f"batch {batch_size:3d}: gradient std {batch_grads.std():.3f}")La dispersione della stima del gradiente scende da 2.248 con una dimensione del batch pari a 8, a 0.771 con 64 e a 0.267 con 512. Ogni aumento di 8 volte della dimensione del batch riduce il rumore di circa 2.9 volte, un valore vicino alla radice quadrata di 8, come accade quando si calcola la media di campioni indipendenti.
Questo rumore determina il compromesso tra batch piccoli e grandi:
- Batch piccoli (per esempio, da 8 a 32): aggiornamenti rumorosi e molti passaggi per epoca. Il rumore agisce da lieve regolarizzatore e spesso aiuta la discesa del gradiente stocastica (SGD) a generalizzare; i batch piccoli si adattano inoltre a hardware modesto, ma ogni epoca dura di più perché la GPU rimane parzialmente inattiva.
- Batch grandi (per esempio, da 256 in su): gradienti più regolari, meno passaggi per epoca e utilizzo elevato dell’hardware. Come hanno rilevato Keskar et al., i batch molto grandi tendono a convergere verso minimi acuti che generalizzano peggio; inoltre, poiché comportano meno passaggi per epoca, richiedono un tasso di apprendimento proporzionalmente maggiore e un periodo di warmup. Applicando questa regola di scalatura lineare, Goyal et al. hanno addestrato ResNet-50 su ImageNet con una dimensione del batch di 8,192 usando 256 GPU in un’ora, raggiungendo un’accuratezza pari a quella dell’addestramento con batch piccoli.
Limiti di memoria e accumulo dei gradienti#
La memoria GPU deve contenere i pesi del modello, lo stato dell’ottimizzatore e le attivazioni intermedie necessarie alla retropropagazione; inoltre, la memoria occupata dalle attivazioni cresce linearmente con la dimensione del batch e la risoluzione delle immagini. Se un batch non entra in memoria, l’addestramento si interrompe con un errore di memoria esaurita (OOM). L’addestramento a precisione mista riduce all’incirca della metà la memoria occupata dalle attivazioni, mentre l’accumulo dei gradienti consente di raggiungere un batch effettivo più grande sommando i gradienti di diversi batch piccoli prima di ogni aggiornamento dei pesi.
L’addestramento Ultralytics YOLO include questa funzionalità: accumula i gradienti finché non ha elaborato circa 64 immagini, la nbs dimensione nominale del batch, quindi, dopo il warmup, l’impostazione predefinita batch=16 esegue un aggiornamento dei pesi ogni quattro batch. Impostando batch=-1 si avvia AutoBatch, che seleziona il batch più grande compatibile con circa il 60% della memoria CUDA libera e ripiega su una dimensione del batch pari a 16 su dispositivi CPU e Apple MPS.
from ultralytics import YOLO
# Carica un modello YOLO26n preaddestrato
model = YOLO("yolo26n.pt")
# batch=-1 consente ad AutoBatch di scegliere la dimensione del batch in base alla memoria GPU disponibile
# Usa un numero intero (batch=16) per una dimensione fissa oppure un numero decimale (batch=0.70) per una frazione della memoria
results = model.train(data="coco8.yaml", epochs=5, batch=-1)Prima che inizi l’addestramento, AutoBatch esegue il modello YOLO26 con dimensioni del batch da 1 a 16 (fino a 64 sulle GPU con almeno 16 GB), adatta una retta ai valori di memoria misurati e la risolve per determinare la dimensione del batch che raggiunge la frazione obiettivo.
Dimensione del batch e termini correlati#
- Epoca e iterazione: un’epoca è un passaggio sull’intero dataset, mentre un’iterazione è un aggiornamento dei pesi. Il numero di iterazioni per epoca è pari alla dimensione del dataset divisa per la dimensione del batch, arrotondando per eccesso; quindi, 1,000 immagini con una dimensione del batch di 100 richiedono 10 iterazioni.
- Mini-batch: nella maggior parte dei testi sul deep learning è sinonimo di batch. In senso stretto, la discesa del gradiente batch usa l’intero dataset per ogni aggiornamento, la discesa del gradiente stocastica usa un singolo esempio e la discesa del gradiente mini-batch si colloca tra le due: è il metodo usato per addestrare quasi tutte le reti moderne.
- Normalizzazione batch: uno strato che normalizza le attivazioni usando la media e la varianza del batch corrente; le sue statistiche diventano quindi inaffidabili con batch molto piccoli. La Group Normalization evita questa dipendenza e ha registrato un errore inferiore del 10.6% rispetto alla normalizzazione batch su ResNet-50 e ImageNet con una dimensione del batch pari a 2.
- Dimensione del batch in inferenza: al momento della distribuzione, il batching scambia la latenza di inferenza con la velocità di elaborazione. Raggruppare i fotogrammi di più telecamere aumenta il numero di immagini elaborate al secondo, mentre ogni fotogramma attende che il batch sia completo.










