Batch Normalization
La normalizzazione dei batch standardizza ogni canale su un mini-batch, quindi lo riscalibra con parametri appresi. Tratta la matematica, il comportamento in inferenza e i limiti.
La normalizzazione dei batch, o BatchNorm, è uno strato di una rete neurale che normalizza ogni canale del proprio input usando la media e la varianza del mini-batch corrente, quindi riscalando il risultato con due parametri appresi. Sergey Ioffe e Christian Szegedy la introdussero nel 2015, e ciò permise al loro classificatore di immagini Inception di raggiungere la stessa accuratezza con un numero di passaggi di addestramento 14 volte inferiore. BatchNorm consente tassi di apprendimento più elevati, rende l’addestramento meno sensibile all’inizializzazione dei pesi ed è diventata un componente standard delle reti neurali convoluzionali (CNNs), come ResNet.
Come funziona la normalizzazione dei batch#
Per uno strato convoluzionale, BatchNorm calcola una media μ e una varianza σ² per ogni canale, aggregando i dati di tutte le immagini del batch e di tutte le posizioni spaziali. Ogni attivazione x attraversa quindi due passaggi:
- Normalizzazione: x̂ = (x − μ) / √(σ² + ε), dove un valore ε piccolo, pari a 1e-5 per impostazione predefinita in PyTorch, evita la divisione per zero.
- Scala e traslazione: y = γ·x̂ + β, dove γ e β sono parametri appresi per ogni canale. Consentono alla rete di ripristinare la media e la dispersione più adatte allo strato successivo, anche annullando del tutto la normalizzazione.
BatchNorm si trova di solito tra una convoluzione e la relativa funzione di attivazione. Poiché β aggiunge già uno spostamento per canale, il bias della convoluzione precedente è ridondante e normalmente viene disabilitato.
Addestramento e inferenza#
Durante l’addestramento, ogni passaggio in avanti aggiorna anche una media mobile e una varianza mobile, calcolate come medie mobili esponenziali delle statistiche del batch. BatchNorm2d di PyTorch le sposta per impostazione predefinita del 10% verso i valori di ogni nuovo batch (momentum=0.1). In inferenza, invece, lo strato normalizza usando queste medie mobili, così la predizione di un’immagine non dipende più dalle altre immagini presenti nello stesso batch. model.train() e model.eval() alternano i due comportamenti:
import torch
torch.manual_seed(0)
bn = torch.nn.BatchNorm2d(num_features=3)
# A batch of 8 three-channel feature maps with mean 5 and standard deviation 2
x = 5 + 2 * torch.randn(8, 3, 16, 16)
# Training mode normalizes with this batch's per-channel mean and variance
out = bn(x)
print(f"train mode: output mean {out.mean():.3f}, std {out.std():.3f}")
# The same call nudges the running averages 10% of the way toward the batch statistics
print(f"running mean {bn.running_mean[0]:.3f}, running var {bn.running_var[0]:.3f}")
# Eval mode normalizes with the running averages instead of the batch statistics
bn.eval()
out = bn(x)
print(f"eval mode: output mean {out.mean():.3f}, std {out.std():.3f}")In modalità di addestramento, l’output ha media 0.000 e deviazione standard 1.000, anche se l’input ha media 5. Dopo un batch, la media mobile è passata solo da 0 a 0.496 e la varianza mobile da 1 a 1.294, quindi la modalità eval produce output con media 3.920. Le medie mobili richiedono alcune decine di batch per convergere; un modello valutato nella modalità sbagliata, o prima che le sue statistiche si siano stabilizzate, ottiene un punteggio molto inferiore alla sua vera accuratezza.
In inferenza, BatchNorm è una trasformazione lineare fissa per canale e può quindi essere incorporata nella convoluzione precedente: i pesi della convoluzione vengono moltiplicati per γ/√(σ² + ε) e il bias diventa β − γμ/√(σ² + ε). Il blocco convoluzionale standard in YOLO26 è composto da una convoluzione senza bias seguita da BatchNorm e da un’attivazione SiLU; Ultralytics fonde ciascuno di questi strati BatchNorm nella convoluzione prima della predizione e dell’esportazione, rimuovendo così lo strato e mantenendo invariati gli output.
Perché la normalizzazione batch è utile#
L’articolo originale attribuiva i vantaggi di BatchNorm alla riduzione dello shift covariato interno, cioè al cambiamento nella distribuzione degli input di ogni strato durante l’aggiornamento degli strati precedenti. In seguito, esperimenti che hanno introdotto shift casuali delle distribuzioni dopo gli strati BatchNorm hanno rilevato effetti minimi sull’addestramento e hanno ricondotto il vantaggio a una superficie di perdita più regolare, con gradienti più prevedibili, che consente all’ottimizzatore di compiere passi più ampi e stabili. Mantenere le pre-attivazioni vicine a una media nulla e a una varianza unitaria evita inoltre che le attivazioni saturanti entrino nelle loro regioni piatte, contrastando i gradienti evanescenti.
Poiché ogni esempio viene normalizzato usando le statistiche di un batch estratto casualmente, BatchNorm aggiunge anche rumore che agisce da lieve regolarizzatore; l’articolo originale ha riportato che, in alcuni casi, questo poteva eliminare la necessità del dropout.
Limiti#
- Batch piccoli: le statistiche del batch diventano rumorose quando ogni dispositivo contiene poche immagini. Con 2 immagini per GPU, la Group Normalization, che calcola le statistiche su gruppi di canali all’interno di ogni immagine, ha ottenuto un errore su ImageNet inferiore del 10.6% rispetto a BatchNorm su ResNet-50.
- Addestramento multi-GPU: ogni GPU normalizza usando la propria porzione del batch, a meno che gli strati non vengano convertiti in SyncBatchNorm, che aggrega le statistiche tra i dispositivi al costo di una comunicazione aggiuntiva.
- Modelli sequenziali: le sequenze di lunghezza variabile e le statistiche dipendenti dal batch si adattano male, quindi i transformer usano invece la normalizzazione degli strati.
Normalizzazione batch e termini correlati#
- Normalizzazione dei dati: riscala gli input grezzi una volta durante il pre-processing, per esempio dividendo i valori dei pixel per 255. BatchNorm normalizza le attivazioni intermedie a ogni strato e a ogni passaggio di addestramento.
- Normalizzazione degli strati: normalizza ogni esempio rispetto alle proprie feature, quindi si comporta allo stesso modo durante l’addestramento e l’inferenza e non dipende dalla dimensione del batch. RMSNorm, una variante più semplice che non sottrae la media, è comune nei modelli linguistici di grandi dimensioni.
- Normalizzazione a gruppi: suddivide i canali di ogni immagine in gruppi e li normalizza all’interno di ciascun gruppo, una soluzione adatta ai modelli di rilevamento e segmentazione addestrati con batch piccoli.
- Normalizzazione per istanza: normalizza separatamente ogni canale di ogni immagine, eliminando il contrasto specifico dell’immagine. Sostituire BatchNorm con la normalizzazione per istanza, sia durante l’addestramento sia durante il test, ha migliorato notevolmente la qualità del trasferimento dello stile neurale rapido.










