Normalizing Flows
I flussi di normalizzazione trasformano rumore semplice in dati complessi tramite livelli invertibili, consentendo a un unico modello di generare campioni e calcolare verosimiglianze esatte. Scopri come funzionano.
Un normalizing flow è un modello di IA generativa che trasforma una distribuzione di base semplice, di solito una gaussiana standard, in una distribuzione di dati complessa attraverso una sequenza di funzioni invertibili e differenziabili. Poiché ogni livello può essere eseguito al contrario e il suo effetto sul volume viene calcolato esattamente, un flow svolge due compiti che la maggior parte dei modelli generativi non può svolgere contemporaneamente: genera nuovi campioni propagando il rumore in avanti attraverso i livelli e calcola la verosimiglianza esatta di un punto dati osservato propagandolo all’indietro verso la distribuzione di base. Esteban Tabak e i suoi colleghi hanno formulato i flow per la stima della densità nel 2010 e nel 2013; Danilo Rezende e Shakir Mohamed di DeepMind hanno introdotto il termine nel deep learning con Variational Inference with Normalizing Flows a ICML 2015. «Normalizing» si riferisce alla trasformazione della distribuzione dei dati in una distribuzione normale, o gaussiana, e non ha a che fare con la normalizzazione batch.
La formula del cambio di variabili#
Se una funzione invertibile f mappa un punto dati x in un punto latente z = f(x), la log-verosimiglianza dei dati è log p(x) = log p_z(f(x)) + log |det J|, dove J è la matrice jacobiana di f e il determinante misura quanto f espande o comprime il volume intorno a x. Per una funzione generica di D variabili, il calcolo di questo determinante richiede un numero di operazioni dell’ordine di D³, troppo lento per immagini con centinaia di migliaia di dimensioni. I livelli dei flow vengono quindi progettati con jacobiane triangolari, il cui determinante è semplicemente il prodotto degli elementi diagonali. La composizione di molti livelli combina le loro trasformazioni e somma i loro log-determinanti; l’addestramento massimizza direttamente la log-verosimiglianza dei dati di addestramento.
Il livello di accoppiamento affine di RealNVP è il design classico. Metà dell’input passa invariata e alimenta una piccola rete neurale che determina la scala e lo spostamento per l’altra metà, come in questo livello PyTorch:
import torch
from torch import nn
torch.manual_seed(0)
# Affine coupling layer (RealNVP): x1 passes through unchanged and sets the scale and shift for x2
net = nn.Sequential(nn.Linear(2, 32), nn.Tanh(), nn.Linear(32, 4))
def coupling(x):
"""Map data x to z and return log|det J|, which is just the sum of the log-scales."""
x1, x2 = x.chunk(2, dim=-1)
log_s, t = net(x1).chunk(2, dim=-1)
return torch.cat([x1, x2 * log_s.exp() + t], dim=-1), log_s.sum(dim=-1)
x = torch.randn(4)
z, log_det = coupling(x)
jacobian = torch.autograd.functional.jacobian(lambda v: coupling(v)[0], x)
print(f"log|det J|: {log_det:.4f} from the formula, {torch.logdet(jacobian):.4f} from the full 4x4 Jacobian")
# Inverse: z1 equals x1, so the same scale and shift can be recomputed and undone
z1, z2 = z.chunk(2)
log_s, t = net(z1).chunk(2)
x_rec = torch.cat([z1, (z2 - t) * (-log_s).exp()])
print(f"Largest reconstruction error: {(x_rec - x).abs().max():.1e}")La formula semplificata e la jacobiana completa restituiscono entrambe un log-determinante di 0.1489, e l’inversa recupera l’input con uno scarto massimo di 1.2e-07, dovuto all’arrotondamento float32. Non è necessario invertire la rete all’interno del livello, quindi la rete può avere una complessità arbitraria.
Architetture dei flow#
- Flow di accoppiamento: NICE (2014) e RealNVP (2016) di Laurent Dinh e colleghi alternano la metà da trasformare; Glow (2018) di OpenAI ha aggiunto convoluzioni 1 x 1 invertibili apprese e generato volti realistici di 256 x 256 pixel. Sia il campionamento sia la valutazione della densità sono rapidi.
- Flow autoregressivi: Trasformano ogni dimensione condizionandola a quelle precedenti. I masked autoregressive flow valutano le densità in un solo passaggio, ma campionano una dimensione alla volta; gli inverse autoregressive flow fanno il contrario. TarFlow (2024) di Apple sovrappone blocchi transformer autoregressivi su patch di immagini ed è stato il primo flow autonomo i cui campioni hanno rivaleggiato con i modelli di diffusione per qualità.
- Flow continui: Definiscono la trasformazione come soluzione di un’equazione differenziale ordinaria, eliminando i vincoli di progettazione dei livelli; FFJORD (2018) tiene traccia della variazione della log-densità con uno stimatore stocastico della traccia.
Applicazioni#
- Rilevamento delle anomalie: DifferNet (2021), CFLOW-AD e FastFlow adattano i flow alle caratteristiche di una rete neurale convoluzionale preaddestrata su immagini di prodotti privi di difetti e segnalano come difettose le immagini con bassa verosimiglianza. Nel 2021 FastFlow ha riportato un’AUC del 99.4% per il rilevamento delle anomalie nel benchmark di ispezione industriale MVTec AD.
- Sintesi vocale: WaveGlow (2018) di NVIDIA generava audio vocale da spettrogrammi mel in un unico passaggio parallelo.
- Campionamento scientifico: I generatori di Boltzmann (2019) di Frank Noé e colleghi campionano stati di equilibrio di molecole e proteine, usando la verosimiglianza esatta per ripesare i campioni in modo che corrispondano alla distribuzione fisica reale.
Questi rilevatori modellano le caratteristiche anziché i pixel per un motivo dimostrato da Eric Nalisnick e colleghi nel 2019: un modello Glow addestrato su foto CIFAR-10 assegna una verosimiglianza maggiore a immagini di numeri civici SVHN che non ha mai visto, un problema poi ricondotto al fatto che i flow modellano le correlazioni locali tra pixel più del contenuto dell’immagine. Per il rilevamento dei difetti, l’input del flow può essere costituito da embedding ottenuti da qualsiasi backbone preaddestrato: il metodo embed di Ultralytics YOLO26 restituisce un vettore di caratteristiche con pooling medio per ogni immagine, per impostazione predefinita dal livello appena prima della testa di rilevamento.
Normalizing flow a confronto con termini correlati#
- Flow matching e rectified flow: Addestrano un flow continuo regredendo il suo campo di velocità, senza log-determinante durante l’addestramento, e oggi alimentano grandi generatori di immagini.
- Autoencoder variazionali e modelli di diffusione: Vengono addestrati su un limite inferiore della verosimiglianza.
- GAN: Imparano a ingannare un discriminatore e non forniscono alcuna verosimiglianza.
- Reti di flusso generativo (GFlowNets): Condividono la parola «flow», ma costruiscono oggetti discreti passo dopo passo con una probabilità proporzionale a una ricompensa.










