Addestrare reti neurali profonde può essere impegnativo a causa di gradienti che svaniscono o esplodono e dello spostamento di covariate interne. Questi fattori possono rallentare notevolmente l’addestramento e ostacolare la capacità della rete di apprendere in modo efficace. Per fortuna, possiamo affrontare questi problemi con tecniche di normalizzazione.
Sebbene esistano molte tecniche di normalizzazione, la batch normalization è una delle più popolari ed è diventata un componente standard in molte architetture di deep learning. Contribuisce a una convergenza più rapida, a una maggiore stabilità dell’addestramento e a una migliore capacità di generalizzazione.
In questo tutorial spiegheremo la batch normalization, come funziona dal punto di vista matematico e come implementarla usando TensorFlow e Keras.
Che cos’è la normalizzazione nel machine learning?
La normalizzazione è un passaggio di preprocessing fondamentale nel machine learning che mira a standardizzare i dati in input.
Diverse tecniche di normalizzazione, come il min-max scaling, la normalizzazione z-score e la trasformazione logaritmica, sono comunemente usate per riportare le feature a un intervallo o a una distribuzione coerenti. Queste tecniche aiutano a mitigare l’impatto degli outlier, migliorare la convergenza e garantire un confronto equo tra le feature.
Normalizzare i dati in input è essenziale per un addestramento efficace del modello perché assicura che tutte le feature contribuiscano in modo equilibrato al processo di apprendimento. Senza normalizzazione, feature con scale o varianze maggiori possono dominare l’ottimizzazione, portando a prestazioni subottimali.
La normalizzazione consente al modello di apprendere pattern e relazioni significativi dai dati riportando tutte le feature su una scala simile.
Addestrare reti neurali profonde presenta diverse sfide che possono ostacolare la convergenza e la generalizzazione:
Spostamento di covariate interne: man mano che i dati di input passano attraverso più layer, la distribuzione delle attivazioni può cambiare, rendendo difficile per il modello adattarsi e apprendere in modo efficace.
Gradienti che svaniscono o esplodono: le reti profonde possono soffrire di gradienti troppo piccoli o troppo grandi durante la retropropagazione, impedendo aggiornamenti efficaci dei pesi.
Sensibilità all’inizializzazione: i pesi iniziali della rete possono influenzare significativamente l’addestramento; una cattiva inizializzazione può portare a una convergenza lenta o addirittura al fallimento dell’addestramento.
La batch normalization affronta queste sfide normalizzando le attivazioni all’interno di ogni mini-batch, contribuendo a stabilizzare il processo di training e a migliorare le prestazioni del modello.
Che cos’è la Batch Normalization?
La batch normalization è una tecnica che normalizza le attivazioni di un layer all’interno di un mini-batch durante l’addestramento di reti neurali profonde.
Funziona calcolando la media e la varianza delle attivazioni per ciascuna feature nel mini-batch e poi normalizzando le attivazioni usando queste statistiche.
Le attivazioni normalizzate vengono quindi scalate e traslate con parametri apprendibili, permettendo al modello di adattarsi alla distribuzione di attivazione ottimale.
La Batch Normalization viene tipicamente applicata dopo la trasformazione lineare di un layer (ad esempio, dopo la moltiplicazione di matrici in un layer fully connected o dopo l’operazione di convoluzione in un layer convoluzionale) e prima della funzione di attivazione non lineare (ad esempio, ReLU).
Le componenti chiave della batch normalization sono:
Statistiche del mini-batch: per ogni feature nel mini-batch si calcolano media e varianza delle attivazioni.
Normalizzazione: le attivazioni vengono normalizzate sottraendo la media del mini-batch e dividendo per la deviazione standard del mini-batch.
Scalatura e traslazione: si introducono parametri apprendibili (γ e β) per scalare e traslare le attivazioni normalizzate, consentendo al modello di apprendere la distribuzione di attivazione ottimale.
Perché usare la Batch Normalization?
Una delle sfide nell’addestrare reti neurali profonde è lo spostamento di covariate interne. Succede quando la distribuzione delle attivazioni (output) di un layer cambia durante l’addestramento man mano che si aggiornano i pesi nei layer precedenti. Questo spostamento può rendere l’addestramento difficile e lento.
La batch normalization riduce questo spostamento normalizzando le attivazioni in ogni mini-batch, rendendo gli input ai layer successivi più stabili e coerenti.
Normalizzare le attivazioni consente una convergenza più rapida con learning rate più alti e rende il modello meno sensibile alle scelte di inizializzazione.
Inoltre, introduce un effetto di regolarizzazione che aiuta a prevenire l’overfitting riducendo la dipendenza del modello da pattern di attivazione specifici.
Questa combinazione di vantaggi rende la batch normalization uno strumento potente per addestrare modelli di deep learning più robusti. Per saperne di più sulla costruzione di modelli robusti, dai un’occhiata a questo corso su Machine Learning Monitoring Concepts.
La matematica alla base della Batch Normalization
Ora che abbiamo capito il “perché” della batch normalization, vediamo il “come”.
La batch normalization opera in modo diverso nelle fasi di training e di inference, quindi spieghiamo la matematica dietro ciascuna fase.
Batch normalization durante il training
Iniziamo con la fase di normalizzazione. Per prima cosa calcoliamo media e varianza per ciascuna feature in un mini-batch. Queste sono le formule che possiamo usare per media e varianza.
Usiamo poi media e varianza per normalizzare le attivazioni. Questa è la formula che possiamo usare, dove ε (epsilon minuscola) è una piccola costante aggiunta per stabilità numerica:
Conclusa la fase di normalizzazione, passiamo alla fase di scalatura e traslazione. Usando i parametri apprendibili γ e β, trasliamo le attivazioni normalizzate con questa formula:
Questi parametri permettono al modello di apprendere la distribuzione di attivazione ottimale.
Batch normalization durante l’inference
In inference, sostituiamo le statistiche del batch (media e varianza) con le statistiche cumulative calcolate durante il training. Le statistiche cumulative vengono solitamente aggiornate con una media mobile dotata di un fattore di momentum.
Per calcolare media e varianza cumulative, possiamo usare queste due formule, dove α è il fattore di momentum che controlla la velocità di aggiornamento delle statistiche cumulative:
La media e la varianza cumulative sono memorizzate come parametri del modello e usate per la normalizzazione in inference. Anche i parametri di scalatura e traslazione (γ e β) appresi durante il training vengono usati in inference.
Vediamo ora come implementare la batch normalization con TensorFlow.
Batch Normalization in TensorFlow
Iniziamo importando le librerie necessarie:
import tensorflow as tf
from tensorflow import kerasOfferto da
Successivamente, carichiamo il dataset MNIST, composto da 60.000 immagini di training e 10.000 immagini di test di cifre scritte a mano. Carichiamo il dataset con la funzione keras.datasets.mnist.load_data() e lo suddividiamo in dati di training (x_train, y_train) e di test (x_test, y_test):
# Load the MNIST dataset(x_train, y_train),(x_test, y_test)= keras.datasets.mnist.load_data()Offerto da
Per preprocessare i dati, eseguiamo i seguenti passaggi:
Rimodelliamo le immagini di training e di test per avere forma (num_samples, 28, 28, 1), dove num_samples è il numero di immagini e ciascuna immagine è in scala di grigi 28x28 con un canale.
Normalizziamo i valori dei pixel delle immagini dividendo per 255.0 per scalarli tra 0 e 1.
Convertiamo le etichette di training e di test in formato categorico usando keras.utils.to_categorical(), che trasforma le etichette intere in vettori one-hot.
# Preprocess the data
x_train = x_train.reshape((60000,28,28,1))/255.0# Reshape and normalize training images
x_test = x_test.reshape((10000,28,28,1))/255.0# Reshape and normalize test images
y_train = keras.utils.to_categorical(y_train)# Convert training labels to categorical format
y_test = keras.utils.to_categorical(y_test)# Convert test labels to categorical formatOfferto da
Ora passiamo al passaggio successivo: definire l’architettura del modello. Per farlo, procediamo così:
Definiamo l’architettura con l’API keras.Sequential, che consente di impilare i layer in sequenza.
Il modello è composto da layer convoluzionali (Conv2D) per l’estrazione delle feature, seguiti da layer di batch normalization (BatchNormalization) per normalizzare le attivazioni.
Usiamo il max pooling (MaxPooling2D) per ridurre le mappe di attivazione.
Appiattiamo le mappe di attivazione (Flatten) prima di passarle ai layer densi.
Il layer denso finale ha 10 unità con attivazione softmax, corrispondenti alle 10 classi di cifre.
# Define the model architecture
model = keras.Sequential([
keras.layers.Conv2D(32,(3,3), activation='relu', input_shape=(28,28,1)),
keras.layers.BatchNormalization(),
keras.layers.Conv2D(64,(3,3), activation='relu'),
keras.layers.BatchNormalization(),
keras.layers.MaxPooling2D((2,2)),
keras.layers.Flatten(),
keras.layers.Dense(128, activation='relu'),
keras.layers.BatchNormalization(),
keras.layers.Dense(10, activation='softmax')])Offerto da
Successivamente, compiliamo il modello usando il metodo .compile(), specificando ottimizzatore, funzione di loss e metrica di valutazione. Usiamo:
L’ottimizzatore Adam ('adam') per l’ottimizzazione.
La loss categorical cross-entropy ('categorical_crossentropy') come funzione di perdita, dato che il problema è una classificazione multiclasse.
Accuracy ('accuracy') come metrica per misurare le prestazioni del modello.
# Compile the model
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])Offerto da
Ora addestriamo il modello usando il metodo .fit():
Specifichiamo i dati di training (x_train, y_train), la dimensione del batch, il numero di epoche e i dati di validazione (x_test, y_test).
Il batch_size determina il numero di campioni per aggiornamento del gradiente.
Il parametro epochs specifica quante volte il modello itera su tutto il dataset di training.
I dati di validazione vengono usati per valutare le prestazioni del modello su dati non visti durante l’addestramento.
# Train the model
model.fit(x_train, y_train, batch_size=128, epochs=5, validation_data=(x_test, y_test))Offerto da
Seguendo questi passaggi e inserendo i layer di batch normalization nell’architettura, possiamo addestrare il modello in modo efficiente sul dataset MNIST, beneficiando della normalizzazione delle attivazioni e di una maggiore stabilità dell’addestramento.
Ora che abbiamo visto cos’è la batch normalization e come implementarla, esaminiamone i benefici.
Considerazioni di implementazione
Diamo ora uno sguardo più approfondito all’implementazione della batch normalization nelle architetture di deep learning.
Posizionamento nelle architetture neurali
I layer di batch normalization sono più efficaci se posizionati in modo strategico nella rete. In genere si collocano dopo la trasformazione lineare (ad esempio layer convoluzionali o fully connected) e prima della funzione di attivazione non lineare.
Nelle reti convoluzionali, questo si traduce nel mettere la batch normalization dopo ogni layer di convoluzione e prima della funzione di attivazione.
Allo stesso modo, nelle reti fully connected è comune aggiungere la batch normalization dopo la trasformazione lineare e prima dell’attivazione di ciascun layer nascosto.
Il posizionamento dei layer di Batch Normalization può influenzare le prestazioni e le dinamiche di training del modello. Potrebbe essere necessario sperimentare per trovare la configurazione ottimale per ciascuna specifica architettura.
Impatto della dimensione del batch
La dimensione del batch usata durante il training può influenzare l’efficacia della batch normalization. Batch più grandi forniscono stime più accurate delle statistiche del batch (media e varianza), portando a una normalizzazione migliore e a un training più stabile.
Tuttavia, aumentare la dimensione del batch incrementa anche il consumo di memoria e i requisiti computazionali, il che può essere un vincolo a seconda delle risorse hardware disponibili.
È importante bilanciare dimensione del batch e fattibilità computazionale, assicurandosi al contempo che le statistiche del batch restino affidabili per la normalizzazione.
Effetti di regolarizzazione e implicazioni
La batch normalization introduce intrinsecamente un effetto di regolarizzazione a causa del rumore indotto dalle statistiche del mini-batch. La componente stocastica introdotta dalle statistiche del batch agisce come una forma di regolarizzazione, riducendo l’overfitting e migliorando la generalizzazione.
Tuttavia, questo effetto può interagire con altre tecniche di regolarizzazione, come dropout o regolarizzazione L2.
Quando si usa la batch normalization, è fondamentale considerare l’interazione tra diverse tecniche di regolarizzazione e regolarle di conseguenza per evitare eccessiva regolarizzazione o cali di prestazioni.
Sperimentare e monitorare le prestazioni del modello sui dati di validazione può aiutare a trovare il giusto equilibrio tra tecniche di regolarizzazione quando si utilizza la batch normalization.
Limitazioni e sfide della Batch Normalization
Pur essendo una tecnica utile, la batch normalization presenta alcune limitazioni e sfide di cui dobbiamo essere consapevoli.
Batch normalization in architetture non convoluzionali
La Batch Normalization è stata originariamente progettata per le reti neurali convoluzionali (CNN) ed è risultata particolarmente efficace in questo ambito.
Tuttavia, la sua efficacia in architetture non convoluzionali, come le reti ricorrenti (RNN) o i transformer, può essere limitata.
La natura sequenziale delle RNN e i meccanismi di attenzione nei transformer possono rendere più complessa l’applicazione della batch normalization.
Tecniche alternative di normalizzazione, come la layer normalization o la instance normalization, possono essere più adatte per queste architetture.
Batch piccoli e prestazioni in inference
La batch normalization si basa sulle statistiche del batch calcolate durante il training per normalizzare le attivazioni. Quando il batch è piccolo, tali statistiche possono essere meno affidabili e introdurre rumore o instabilità nel processo di normalizzazione.
Ciò può portare a prestazioni subottimali o difficoltà di training, soprattutto quando la dimensione del batch è ridotta per rispettare vincoli di memoria.
Durante l’inference, la batch normalization usa le statistiche cumulative calcolate in training, che potrebbero non rappresentare accuratamente le statistiche di singoli campioni o di batch piccoli. Questo può generare un disallineamento tra distribuzioni di training e inference, con potenziale impatto sulle prestazioni del modello.
Svantaggi e compromessi della batch normalization
La batch normalization introduce un sovraccarico computazionale aggiuntivo durante il training a causa del calcolo delle statistiche del batch e dell’operazione di normalizzazione. Questo overhead può aumentare i requisiti di memoria e i tempi di addestramento, specialmente per modelli o dataset di grandi dimensioni.
La batch normalization può non essere adatta a determinati tipi di dati o compiti in cui la normalizzazione può distorcere informazioni importanti o rimuovere variazioni significative.
Ad esempio, la batch normalization può avere effetti indesiderati su compiti che coinvolgono dettagli fini o informazioni spaziali precise, come segmentazione o localizzazione.
L’effetto di regolarizzazione della Batch Normalization può talvolta interagire con altre tecniche di regolarizzazione, come il dropout, in modi inattesi, richiedendo un’attenta messa a punto.
Come mitigare le limitazioni della Batch Normalization
Nonostante limitazioni e sfide, la batch normalization rimane una tecnica ampiamente utilizzata ed efficace nel deep learning. Ricercatori e professionisti continuano a esplorare modi per affrontare questi problemi e migliorare la formulazione originale.
Consideriamo alcune strategie per mitigare le limitazioni della batch normalization:
Adaptive batch normalization: questa tecnica adatta le statistiche del batch in base alle caratteristiche specifiche di ciascun campione, aiutando ad alleviare i problemi associati a batch di piccole dimensioni.
Virtual batch normalization: questo metodo calcola le statistiche di normalizzazione usando un batch virtuale che include campioni da più batch, migliorando stabilità e affidabilità della normalizzazione.
Tecniche di normalizzazione ibride: combinare la batch normalization con altri metodi, come layer normalization o instance normalization, può aiutare a superare limitazioni specifiche di alcune architetture o compiti.
Varianti ed estensioni della Batch Normalization
Vediamo ora diverse varianti ed estensioni della batch normalization che possiamo usare anche per mitigare le potenziali criticità legate a questa tecnica.
Layer normalization
La layer normalization opera sulle attivazioni di tutti i canali all’interno di un layer, invece che lungo la dimensione del batch.
Normalizza le attivazioni in base a media e varianza calcolate per ciascun singolo campione nel batch.
La layer normalization è particolarmente utile per reti neurali ricorrenti (RNN) e in scenari in cui la dimensione del batch è piccola o variabile.
Group normalization
La group normalization divide i canali in gruppi e calcola le statistiche di normalizzazione all’interno di ciascun gruppo.
Fa da via di mezzo tra layer normalization e batch normalization normalizzando insieme un sottoinsieme di canali.
La group normalization è efficace in scenari con batch limitati, ad esempio in ambienti con vincoli di memoria o quando si elaborano immagini ad alta risoluzione.
Instance normalization
La instance normalization applica la normalizzazione a ciascun canale di ogni singolo campione nel batch.
È comunemente usata nello style transfer e nei task di generazione di immagini, dove l’obiettivo è normalizzare il contenuto preservando le informazioni di stile.
La instance normalization ha dimostrato di migliorare qualità e stabilità delle immagini generate in tali applicazioni.
Batch renormalization
La batch renormalization estende la batch normalization introducendo termini di correzione aggiuntivi nel processo di normalizzazione.
Mira a ridurre la discrepanza tra statistiche del batch e statistiche della popolazione, specialmente quando il batch è piccolo.
La batch renormalization aiuta a stabilizzare l’addestramento e migliora la capacità di generalizzazione del modello, in particolare in scenari con batch limitati.
Weight normalization
La Weight Normalization è una tecnica che riparametrizza i pesi di una rete neurale per separare magnitudine e direzione dei pesi.
Normalizza i pesi dividendo per la loro norma euclidea e introduce un parametro di scala apprendibile.
La weight normalization può essere usata insieme alla Batch Normalization o come metodo alternativo di normalizzazione.
Ha dimostrato di migliorare il condizionamento del problema di ottimizzazione e di accelerare la convergenza in alcuni casi.
Queste varianti ed estensioni della batch normalization offrono strumenti aggiuntivi per affrontare sfide specifiche e migliorare l’addestramento e le prestazioni dei modelli di deep learning. Ogni variante ha punti di forza e considerazioni proprie; la scelta dipende dai requisiti del compito, dall’architettura del modello e dalle risorse computazionali disponibili.
Conclusione
La batch normalization è diventata una tecnica cruciale nel deep learning, offrendo benefici significativi per l’addestramento di reti neurali profonde.
Normalizzando le attivazioni all’interno dei mini-batch, possiamo mitigare lo spostamento di covariate interne, migliorare la convergenza e aumentare la generalizzazione. Come aspirante o junior data practitioner, tieni a mente questi punti chiave:
Integra layer di Batch Normalization nei tuoi modelli di deep learning per migliorare stabilità e prestazioni dell’addestramento.
Sperimenta il posizionamento dei layer di batch normalization e monitora l’impatto sulle prestazioni del modello.
Resta aggiornato su ricerche e avanzamenti nelle tecniche di normalizzazione per sfruttare i metodi più efficaci nei tuoi progetti.
Se vuoi diventare un machine learning engineer, valuta questo percorso di 12 corsi per diventare Machine Learning Engineer.
Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Scopri le basi dell'intelligenza artificiale, impara a usarla al meglio per il lavoro e immergiti in modelli come ChatGPT per orientarti nel mondo dinamico dell'IA.
Addestrare reti neurali profonde può essere impegnativo a causa di gradienti che svaniscono o esplodono e dello spostamento di covariate interne. Questi fattori possono rallentare notevolmente l’addestramento e ostacolare la capacità della rete di apprendere in modo efficace. Per fortuna, possiamo affrontare questi problemi con tecniche di normalizzazione.
Sebbene esistano molte tecniche di normalizzazione, la batch normalization è una delle più popolari ed è diventata un componente standard in molte architetture di deep learning. Contribuisce a una convergenza più rapida, a una maggiore stabilità dell’addestramento e a una migliore capacità di generalizzazione.
In questo tutorial spiegheremo la batch normalization, come funziona dal punto di vista matematico e come implementarla usando TensorFlow e Keras.
Se vuoi apprendere le basi delle reti neurali con Keras, dai un’occhiata a questo corso: Introduction to Deep Learning in Python.
Che cos’è la normalizzazione nel machine learning?
La normalizzazione è un passaggio di preprocessing fondamentale nel machine learning che mira a standardizzare i dati in input.
Diverse tecniche di normalizzazione, come il min-max scaling, la normalizzazione z-score e la trasformazione logaritmica, sono comunemente usate per riportare le feature a un intervallo o a una distribuzione coerenti. Queste tecniche aiutano a mitigare l’impatto degli outlier, migliorare la convergenza e garantire un confronto equo tra le feature.
Normalizzare i dati in input è essenziale per un addestramento efficace del modello perché assicura che tutte le feature contribuiscano in modo equilibrato al processo di apprendimento. Senza normalizzazione, feature con scale o varianze maggiori possono dominare l’ottimizzazione, portando a prestazioni subottimali.
La normalizzazione consente al modello di apprendere pattern e relazioni significativi dai dati riportando tutte le feature su una scala simile.
Se vuoi saperne di più sulla normalizzazione in generale, consulta questo tutorial: What is Normalization in Machine Learning.
Le sfide dell’addestramento nel deep learning
Addestrare reti neurali profonde presenta diverse sfide che possono ostacolare la convergenza e la generalizzazione:
La batch normalization affronta queste sfide normalizzando le attivazioni all’interno di ogni mini-batch, contribuendo a stabilizzare il processo di training e a migliorare le prestazioni del modello.
Che cos’è la Batch Normalization?
La batch normalization è una tecnica che normalizza le attivazioni di un layer all’interno di un mini-batch durante l’addestramento di reti neurali profonde.
Funziona calcolando la media e la varianza delle attivazioni per ciascuna feature nel mini-batch e poi normalizzando le attivazioni usando queste statistiche.
Le attivazioni normalizzate vengono quindi scalate e traslate con parametri apprendibili, permettendo al modello di adattarsi alla distribuzione di attivazione ottimale.
Fonte: Yintai Ma e Diego Klabjan.
La Batch Normalization viene tipicamente applicata dopo la trasformazione lineare di un layer (ad esempio, dopo la moltiplicazione di matrici in un layer fully connected o dopo l’operazione di convoluzione in un layer convoluzionale) e prima della funzione di attivazione non lineare (ad esempio, ReLU).
Le componenti chiave della batch normalization sono:
Perché usare la Batch Normalization?
Una delle sfide nell’addestrare reti neurali profonde è lo spostamento di covariate interne. Succede quando la distribuzione delle attivazioni (output) di un layer cambia durante l’addestramento man mano che si aggiornano i pesi nei layer precedenti. Questo spostamento può rendere l’addestramento difficile e lento.
La batch normalization riduce questo spostamento normalizzando le attivazioni in ogni mini-batch, rendendo gli input ai layer successivi più stabili e coerenti.
Normalizzare le attivazioni consente una convergenza più rapida con learning rate più alti e rende il modello meno sensibile alle scelte di inizializzazione.
Inoltre, introduce un effetto di regolarizzazione che aiuta a prevenire l’overfitting riducendo la dipendenza del modello da pattern di attivazione specifici.
Questa combinazione di vantaggi rende la batch normalization uno strumento potente per addestrare modelli di deep learning più robusti. Per saperne di più sulla costruzione di modelli robusti, dai un’occhiata a questo corso su Machine Learning Monitoring Concepts.
La matematica alla base della Batch Normalization
Ora che abbiamo capito il “perché” della batch normalization, vediamo il “come”.
La batch normalization opera in modo diverso nelle fasi di training e di inference, quindi spieghiamo la matematica dietro ciascuna fase.
Batch normalization durante il training
Iniziamo con la fase di normalizzazione. Per prima cosa calcoliamo media e varianza per ciascuna feature in un mini-batch. Queste sono le formule che possiamo usare per media e varianza.
Usiamo poi media e varianza per normalizzare le attivazioni. Questa è la formula che possiamo usare, dove ε (epsilon minuscola) è una piccola costante aggiunta per stabilità numerica:
Conclusa la fase di normalizzazione, passiamo alla fase di scalatura e traslazione. Usando i parametri apprendibili γ e β, trasliamo le attivazioni normalizzate con questa formula:
Questi parametri permettono al modello di apprendere la distribuzione di attivazione ottimale.
Batch normalization durante l’inference
In inference, sostituiamo le statistiche del batch (media e varianza) con le statistiche cumulative calcolate durante il training. Le statistiche cumulative vengono solitamente aggiornate con una media mobile dotata di un fattore di momentum.
Per calcolare media e varianza cumulative, possiamo usare queste due formule, dove α è il fattore di momentum che controlla la velocità di aggiornamento delle statistiche cumulative:
La media e la varianza cumulative sono memorizzate come parametri del modello e usate per la normalizzazione in inference. Anche i parametri di scalatura e traslazione (γ e β) appresi durante il training vengono usati in inference.
Vediamo ora come implementare la batch normalization con TensorFlow.
Batch Normalization in TensorFlow
Iniziamo importando le librerie necessarie:
Successivamente, carichiamo il dataset MNIST, composto da 60.000 immagini di training e 10.000 immagini di test di cifre scritte a mano. Carichiamo il dataset con la funzione
keras.datasets.mnist.load_data()e lo suddividiamo in dati di training(x_train, y_train)e di test(x_test, y_test):Per preprocessare i dati, eseguiamo i seguenti passaggi:
(num_samples, 28, 28, 1), dovenum_samplesè il numero di immagini e ciascuna immagine è in scala di grigi 28x28 con un canale.keras.utils.to_categorical(), che trasforma le etichette intere in vettori one-hot.Ora passiamo al passaggio successivo: definire l’architettura del modello. Per farlo, procediamo così:
keras.Sequential, che consente di impilare i layer in sequenza.Conv2D) per l’estrazione delle feature, seguiti da layer di batch normalization (BatchNormalization) per normalizzare le attivazioni.MaxPooling2D) per ridurre le mappe di attivazione.Flatten) prima di passarle ai layer densi.Successivamente, compiliamo il modello usando il metodo
.compile(), specificando ottimizzatore, funzione di loss e metrica di valutazione. Usiamo:'adam') per l’ottimizzazione.'categorical_crossentropy') come funzione di perdita, dato che il problema è una classificazione multiclasse.'accuracy') come metrica per misurare le prestazioni del modello.Ora addestriamo il modello usando il metodo
.fit():(x_train, y_train), la dimensione del batch, il numero di epoche e i dati di validazione(x_test, y_test).batch_sizedetermina il numero di campioni per aggiornamento del gradiente.epochsspecifica quante volte il modello itera su tutto il dataset di training.Seguendo questi passaggi e inserendo i layer di batch normalization nell’architettura, possiamo addestrare il modello in modo efficiente sul dataset MNIST, beneficiando della normalizzazione delle attivazioni e di una maggiore stabilità dell’addestramento.
Ora che abbiamo visto cos’è la batch normalization e come implementarla, esaminiamone i benefici.
Considerazioni di implementazione
Diamo ora uno sguardo più approfondito all’implementazione della batch normalization nelle architetture di deep learning.
Posizionamento nelle architetture neurali
I layer di batch normalization sono più efficaci se posizionati in modo strategico nella rete. In genere si collocano dopo la trasformazione lineare (ad esempio layer convoluzionali o fully connected) e prima della funzione di attivazione non lineare.
Nelle reti convoluzionali, questo si traduce nel mettere la batch normalization dopo ogni layer di convoluzione e prima della funzione di attivazione.
Allo stesso modo, nelle reti fully connected è comune aggiungere la batch normalization dopo la trasformazione lineare e prima dell’attivazione di ciascun layer nascosto.
Il posizionamento dei layer di Batch Normalization può influenzare le prestazioni e le dinamiche di training del modello. Potrebbe essere necessario sperimentare per trovare la configurazione ottimale per ciascuna specifica architettura.
Impatto della dimensione del batch
La dimensione del batch usata durante il training può influenzare l’efficacia della batch normalization. Batch più grandi forniscono stime più accurate delle statistiche del batch (media e varianza), portando a una normalizzazione migliore e a un training più stabile.
Tuttavia, aumentare la dimensione del batch incrementa anche il consumo di memoria e i requisiti computazionali, il che può essere un vincolo a seconda delle risorse hardware disponibili.
È importante bilanciare dimensione del batch e fattibilità computazionale, assicurandosi al contempo che le statistiche del batch restino affidabili per la normalizzazione.
Effetti di regolarizzazione e implicazioni
La batch normalization introduce intrinsecamente un effetto di regolarizzazione a causa del rumore indotto dalle statistiche del mini-batch. La componente stocastica introdotta dalle statistiche del batch agisce come una forma di regolarizzazione, riducendo l’overfitting e migliorando la generalizzazione.
Tuttavia, questo effetto può interagire con altre tecniche di regolarizzazione, come dropout o regolarizzazione L2.
Quando si usa la batch normalization, è fondamentale considerare l’interazione tra diverse tecniche di regolarizzazione e regolarle di conseguenza per evitare eccessiva regolarizzazione o cali di prestazioni.
Sperimentare e monitorare le prestazioni del modello sui dati di validazione può aiutare a trovare il giusto equilibrio tra tecniche di regolarizzazione quando si utilizza la batch normalization.
Limitazioni e sfide della Batch Normalization
Pur essendo una tecnica utile, la batch normalization presenta alcune limitazioni e sfide di cui dobbiamo essere consapevoli.
Batch normalization in architetture non convoluzionali
La Batch Normalization è stata originariamente progettata per le reti neurali convoluzionali (CNN) ed è risultata particolarmente efficace in questo ambito.
Tuttavia, la sua efficacia in architetture non convoluzionali, come le reti ricorrenti (RNN) o i transformer, può essere limitata.
La natura sequenziale delle RNN e i meccanismi di attenzione nei transformer possono rendere più complessa l’applicazione della batch normalization.
Tecniche alternative di normalizzazione, come la layer normalization o la instance normalization, possono essere più adatte per queste architetture.
Batch piccoli e prestazioni in inference
La batch normalization si basa sulle statistiche del batch calcolate durante il training per normalizzare le attivazioni. Quando il batch è piccolo, tali statistiche possono essere meno affidabili e introdurre rumore o instabilità nel processo di normalizzazione.
Ciò può portare a prestazioni subottimali o difficoltà di training, soprattutto quando la dimensione del batch è ridotta per rispettare vincoli di memoria.
Durante l’inference, la batch normalization usa le statistiche cumulative calcolate in training, che potrebbero non rappresentare accuratamente le statistiche di singoli campioni o di batch piccoli. Questo può generare un disallineamento tra distribuzioni di training e inference, con potenziale impatto sulle prestazioni del modello.
Svantaggi e compromessi della batch normalization
La batch normalization introduce un sovraccarico computazionale aggiuntivo durante il training a causa del calcolo delle statistiche del batch e dell’operazione di normalizzazione. Questo overhead può aumentare i requisiti di memoria e i tempi di addestramento, specialmente per modelli o dataset di grandi dimensioni.
La batch normalization può non essere adatta a determinati tipi di dati o compiti in cui la normalizzazione può distorcere informazioni importanti o rimuovere variazioni significative.
Ad esempio, la batch normalization può avere effetti indesiderati su compiti che coinvolgono dettagli fini o informazioni spaziali precise, come segmentazione o localizzazione.
L’effetto di regolarizzazione della Batch Normalization può talvolta interagire con altre tecniche di regolarizzazione, come il dropout, in modi inattesi, richiedendo un’attenta messa a punto.
Come mitigare le limitazioni della Batch Normalization
Nonostante limitazioni e sfide, la batch normalization rimane una tecnica ampiamente utilizzata ed efficace nel deep learning. Ricercatori e professionisti continuano a esplorare modi per affrontare questi problemi e migliorare la formulazione originale.
Consideriamo alcune strategie per mitigare le limitazioni della batch normalization:
Varianti ed estensioni della Batch Normalization
Vediamo ora diverse varianti ed estensioni della batch normalization che possiamo usare anche per mitigare le potenziali criticità legate a questa tecnica.
Layer normalization
La layer normalization opera sulle attivazioni di tutti i canali all’interno di un layer, invece che lungo la dimensione del batch.
Normalizza le attivazioni in base a media e varianza calcolate per ciascun singolo campione nel batch.
La layer normalization è particolarmente utile per reti neurali ricorrenti (RNN) e in scenari in cui la dimensione del batch è piccola o variabile.
Group normalization
La group normalization divide i canali in gruppi e calcola le statistiche di normalizzazione all’interno di ciascun gruppo.
Fa da via di mezzo tra layer normalization e batch normalization normalizzando insieme un sottoinsieme di canali.
La group normalization è efficace in scenari con batch limitati, ad esempio in ambienti con vincoli di memoria o quando si elaborano immagini ad alta risoluzione.
Instance normalization
La instance normalization applica la normalizzazione a ciascun canale di ogni singolo campione nel batch.
È comunemente usata nello style transfer e nei task di generazione di immagini, dove l’obiettivo è normalizzare il contenuto preservando le informazioni di stile.
La instance normalization ha dimostrato di migliorare qualità e stabilità delle immagini generate in tali applicazioni.
Batch renormalization
La batch renormalization estende la batch normalization introducendo termini di correzione aggiuntivi nel processo di normalizzazione.
Mira a ridurre la discrepanza tra statistiche del batch e statistiche della popolazione, specialmente quando il batch è piccolo.
La batch renormalization aiuta a stabilizzare l’addestramento e migliora la capacità di generalizzazione del modello, in particolare in scenari con batch limitati.
Weight normalization
La Weight Normalization è una tecnica che riparametrizza i pesi di una rete neurale per separare magnitudine e direzione dei pesi.
Normalizza i pesi dividendo per la loro norma euclidea e introduce un parametro di scala apprendibile.
La weight normalization può essere usata insieme alla Batch Normalization o come metodo alternativo di normalizzazione.
Ha dimostrato di migliorare il condizionamento del problema di ottimizzazione e di accelerare la convergenza in alcuni casi.
Queste varianti ed estensioni della batch normalization offrono strumenti aggiuntivi per affrontare sfide specifiche e migliorare l’addestramento e le prestazioni dei modelli di deep learning. Ogni variante ha punti di forza e considerazioni proprie; la scelta dipende dai requisiti del compito, dall’architettura del modello e dalle risorse computazionali disponibili.
Conclusione
La batch normalization è diventata una tecnica cruciale nel deep learning, offrendo benefici significativi per l’addestramento di reti neurali profonde.
Normalizzando le attivazioni all’interno dei mini-batch, possiamo mitigare lo spostamento di covariate interne, migliorare la convergenza e aumentare la generalizzazione. Come aspirante o junior data practitioner, tieni a mente questi punti chiave:
Se vuoi diventare un machine learning engineer, valuta questo percorso di 12 corsi per diventare Machine Learning Engineer.