Corso
Hai visto il termine "flow matching" accanto a ogni nuovo modello di immagini e video e non hai idea di cosa significhi?
Molte spiegazioni passano subito alle equazioni differenziali o lo presentano come "diffusione, ma meglio". Nessuna delle due ti dice cosa impara il modello. Sia Stable Diffusion 3 che Flux usano il flow matching e generano immagini in un paio di passaggi, dove la diffusione classica ne richiede decine.
L'idea generale è questa: invece di imparare esempi individuali, il modello impara un campo di velocità che dice a qualsiasi campione in quale direzione e a quale velocità muoversi. Una volta capito questo, il processo di training, la matematica e il rapporto con la diffusione diventano tutti più chiari.
In questo articolo ti guiderò nell'intuizione dietro il flow matching, come si allena, un po' di matematica (senza appesantire) e come si confronta con i modelli di diffusione.
Se sei alle prime armi con l'IA per i dati visivi, leggi la nostra Top 10 dei modelli Vision Language nel 2026 per scoprire gli attuali modelli all'avanguardia per il ragionamento visivo, l'analisi delle immagini e la computer vision.
Che cos'è il Flow Matching?
Il flow matching è un obiettivo di training, non un'architettura di modello.
Questa distinzione è importante perché puoi abbinarlo a un transformer o a quasi qualsiasi altra rete: ciò che rende flow matching è cosa la rete viene addestrata a predire, non com'è fatta la rete.
E ciò che viene addestrata a predire è un campo vettoriale dipendente dal tempo. In parole semplici, è una funzione che ti dice in quale direzione e a quale velocità un campione dovrebbe muoversi in ogni punto lungo il suo percorso dalla distribuzione sorgente a quella target. Quando lo alleni per addestrare dei continuous normalizing flows in questo modo, ottieni un modello che trasforma una distribuzione semplice in una complessa, passo dopo passo.
Mi piace spezzare l'intuizione in quattro idee:
- Parti dal semplice: inizia con una distribuzione da cui è facile campionare, come il rumore gaussiano
- Definisci i percorsi: collega ogni campione di rumore a un punto dati target lungo un percorso regolare
- Impara il movimento: allena una rete a predire come un campione dovrebbe muoversi lungo quel percorso, in ogni istante
- Segui il flusso: una volta addestrata, parti dal rumore e segui il campo vettoriale appreso per produrre nuovi campioni
Se sei più visivo, immagina una nuvola di particelle sparse senza alcun ordine. Il flow matching insegna a ogni particella esattamente in quale direzione muoversi e a quale velocità, così l'intera nuvola si assesta nel tempo in uno schema strutturato (la forma della tua distribuzione target).
Quando lo applichi a un dataset di immagini, "schema strutturato" significa una foto coerente invece di rumore casuale.
Come funziona il Flow Matching
Training e generazione sono due fasi distinte, e la confusione spesso nasce quando si pensa che siano la stessa cosa.
Durante il training:
- Campiona un punto dati: scegli un punto dal tuo set di addestramento - il target verso cui i campioni si muovono
- Campiona il rumore: scegli un punto da una distribuzione sorgente semplice, di solito rumore gaussiano
- Scegli un istante: scegli un
tcasuale tra 0 e 1 - Costruisci un punto intermedio: combina il punto dati e il campione di rumore in funzione di
t, basandoti su un percorso di probabilità che li collega - Ottieni la velocità target: determina la direzione e la velocità che quel punto intermedio dovrebbe avere al tempo
t, in base al percorso scelto - Allena la rete: insegnale a predire quella velocità, dato il punto intermedio e il tempo
La generazione non ha bisogno del punto dati.
Parti dal rumore e integra in avanti nel tempo il campo vettoriale appreso, un piccolo passo alla volta, finché non ottieni un campione dalla distribuzione dei dati.
E questa è l'idea: durante il training predici la velocità, e durante la generazione la segui.
Capire campi vettoriali e percorsi di probabilità
Ci sono due idee che fanno gran parte del lavoro dietro l'obiettivo di flow matching: i campi vettoriali e i percorsi di probabilità. Una volta capite, la funzione di perdita nella prossima sezione sarà naturale.
Campi vettoriali
Un campo vettoriale è ciò che la rete predice. In qualunque punto dello spazio e in qualunque istante, ti dà una direzione e una velocità: il modo in cui un campione in quel punto dovrebbe muoversi per avvicinarsi alla distribuzione dei dati.
Per esempio, immagina di stare in un fiume. Ovunque tu sia, la corrente ti spinge in un certo modo, e l'intensità e la direzione dipendono dalla tua posizione esatta e dal momento nel tempo. Un campo vettoriale fa lo stesso per i tuoi campioni: assegna una direzione e una velocità a ogni punto dello spazio, in ogni istante.
Percorsi di probabilità
Un percorso di probabilità è la sequenza di distribuzioni che un campione attraversa andando dal rumore ai dati. A t = 0 campioni dalla distribuzione sorgente, di solito rumore gaussiano. A t = 1 campioni dalla distribuzione dei dati target. Tutto ciò che sta in mezzo sono distribuzioni intermedie, e il percorso di probabilità descrive come una si trasforma nella successiva.
Il campo vettoriale e il percorso di probabilità sono direttamente collegati perché il campo vettoriale muove i campioni lungo il percorso di probabilità, da una distribuzione intermedia alla successiva, finché non raggiungono la distribuzione dei dati.

Schema di un percorso di probabilità
L'obiettivo del Flow Matching
L'obiettivo di flow matching unisce campi vettoriali e percorsi di probabilità in un'unica loss di regressione.
Ogni step di training confronta due velocità. La prima è la velocità target: la direzione e la velocità con cui un campione dovrebbe muoversi in quel punto lungo il percorso di probabilità scelto. La seconda è la velocità predetta dal modello: la stima della rete per la stessa direzione e velocità, basata sul campione e sul tempo correnti. Il training fa sì che le due coincidano il più possibile.
Ecco la funzione di perdita:

Funzione di perdita del flow matching
Ecco cosa significa ogni termine:
-
v_θ(x_t, t): la velocità predetta dal modello nel puntox_te al tempot -
u_t(x_t): la velocità target nello stesso punto e istante, in base al percorso di probabilità scelto -
𝔼[...]: una media su molti valori casuali ditex_t -
‖ · ‖^2: la differenza al quadrato tra le due velocità - semplice errore quadratico medio
La derivazione completa qui non è essenziale. Conta che la rete predice un singolo vettore in un singolo punto e istante, e lo confronti con un target noto. Tutto qui!
Conditional Flow Matching
Il percorso di probabilità marginale che collega l'intera distribuzione di rumore all'intera distribuzione dei dati non è qualcosa che puoi scrivere direttamente.
Calcolare la velocità target in un punto dato significa tenere conto di ogni campione di dati che potrebbe averlo prodotto: un integrale sull'intero dataset, non qualcosa che si calcola a ogni step di training.
Il conditional flow matching risolve questo problema condizionando su singoli campioni invece che sull'intero percorso. Invece di calcolare il campo vettoriale per l'intero percorso marginale, scegli un singolo punto dati e un singolo punto di rumore, poi costruisci un percorso di probabilità solo per quella coppia. Quando rendi semplice quel percorso condizionale, ad esempio una linea retta tra i due punti, la velocità target ha un'espressione in forma chiusa che puoi calcolare direttamente.
Addestrare la rete su queste velocità condizionali semplici, per coppia, e mediarle su abbastanza coppie, ti porta allo stesso campo vettoriale che otterresti dall'obiettivo marginale intrattabile. Non calcoli mai direttamente il percorso marginale: lo approssimi indirettamente, un percorso condizionale facile alla volta.
Questa versione condizionale è quella che quasi tutti addestrano realmente. La formulazione marginale fa tornare la matematica, ma quella condizionale è ciò che funziona in pratica.
Flow Matching vs Modelli di Diffusione
Diffusione e flow matching vengono continuamente confrontati per una buona ragione: la maggior parte dei "modelli di diffusione" che già conosci ora usa un obiettivo di flow matching. Non significa che il flow matching abbia sostituito la diffusione. Significa che la diffusione si è rivelata un caso specifico all'interno di un quadro più ampio, e il flow matching ne è la versione generale.
Parto da ciò che ogni rete predice. Un modello di diffusione predice il rumore. Dato un campione rumoroso e uno step temporale, predice il rumore che è stato mescolato e poi lo rimuove, uno step alla volta. Il flow matching invece predice una velocità. Dato un campione e uno step temporale, predice in quale direzione e a quale velocità quel campione dovrebbe muoversi verso la distribuzione dei dati.
Il percorso di probabilità è dove i due differiscono di più.
I modelli di diffusione fissano in partenza un processo di noising specifico, di solito aggiungono rumore gaussiano con una schedule fissa, e tutto il resto discende da quella singola scelta. Nel flow matching, scegli qualsiasi percorso che collega rumore e dati, e l'obiettivo funziona allo stesso modo qualunque sia la tua scelta. Un percorso gaussiano in stile diffusione è un'opzione. Una linea retta tra rumore e dati è un'altra, e risulta molto importante per la velocità di campionamento.
Queste due previsioni non sono così diverse come sembrano.
La previsione del rumore di un modello di diffusione e la previsione della velocità di un modello di flow matching sono due viste dello stesso oggetto sottostante, collegate tramite lo score della distribuzione in ogni istante. Dove differiscono è nel modo di generare. Il campionamento nella diffusione è stocastico per impostazione predefinita, il che significa che a ogni step di denoising si aggiunge un po' di casualità (anche se esistono varianti deterministiche come DDIM). Il flow matching funziona al contrario: la sua formulazione naturale è un'ODE deterministica, quindi lo stesso rumore iniziale produce sempre lo stesso output, e esistono anche versioni stocastiche da questo lato.
In entrambi i casi campionare significa risolvere un'equazione differenziale passo dopo passo, muovendosi dal rumore verso i dati.
I modelli di diffusione tendono ad aver bisogno di decine di step, a meno di usare sampler veloci o distillazione. Il flow matching, soprattutto quando è addestrato su percorsi rettilinei, tende ad aver bisogno di molti meno step senza nulla di tutto ciò: un percorso rettilineo ha velocità costante, molto più facile da seguire con precisione per un risolutore rispetto a uno curvo.
È proprio la scelta del percorso a dare un vantaggio al flow matching.
I modelli di diffusione sono limitati al processo di noising da cui sono derivati. Il flow matching tratta il percorso come una scelta di design, e scelte diverse comportano compromessi diversi.
|
Modelli di diffusione |
Flow matching |
|
|
Cosa predice la rete |
Rumore aggiunto a ogni step |
Velocità verso la distribuzione dei dati |
|
Percorso di probabilità |
Fissato da un processo di noising specifico |
Scelto liberamente; le linee rette sono comuni |
|
Oggetto sottostante |
Score della distribuzione rumorosa |
Campo vettoriale dipendente dal tempo, collegato allo score |
|
Generazione |
Stocastica per default ma esistono varianti deterministiche |
Deterministica per default ma esistono varianti stocastiche |
|
Step di campionamento |
Spesso decine senza trucchi extra |
Spesso molti meno, soprattutto con percorsi più rettilinei |
|
Scelta del percorso |
Fissata dal processo forward |
Una scelta di design aperta — la diffusione è un'istanza |
Confronto tra flow matching e modelli di diffusione
Flow Matching vs. metodi generativi correlati
La diffusione non è l'unico metodo paragonato al flow matching. Ce ne sono altri tre che dovresti conoscere
Flow matching vs continuous normalizing flows
I continuous normalizing flows sono arrivati per primi, e il flow matching è nato direttamente dai problemi nel loro training.
Un continuous normalizing flow è il tipo di modello che il flow matching produce: una rete che definisce una trasformazione continua tra distribuzioni tramite un'ODE. Addestrarne uno nel modo originale significava risolvere quella ODE in avanti e calcolare una likelihood esatta a ogni passaggio, cioè tenere traccia di come la trasformazione cambia la densità di probabilità lungo il percorso. Questo calcolo è costoso, e peggiora all'aumentare della rete.
Il flow matching evita tutto ciò. Esegue una regressione direttamente su una velocità target nota invece di risolvere l'ODE e calcolare le likelihood durante il training. Non serve alcuna simulazione. Ottieni comunque un continuous normalizing flow, semplicemente senza pagare il costo di training di prima.
Flow matching vs score matching
Lo score matching allena una rete a predire lo score - il gradiente della log-densità di probabilità - a ogni livello di rumore. È l'obiettivo dietro i modelli di diffusione che già conosci.
Il flow matching allena invece una rete a predire una velocità. I due oggetti sono collegati matematicamente, il che significa che, sotto certe scelte di percorso, puoi convertirne uno nell'altro. Ma rappresentano cose diverse. Lo score descrive la forma della distribuzione di probabilità in un istante fissato. La velocità descrive come un campione dovrebbe muoversi al variare del tempo.
Lo score matching parla di geometria. Il flow matching parla di movimento.
Flow matching vs rectified flow
Il rectified flow è una scelta specifica all'interno del flow matching.
Il flow matching ti lascia scegliere qualsiasi percorso di probabilità che colleghi rumore e dati. Il rectified flow ne sceglie uno: linee rette, e fa un passo ulteriore con una procedura iterativa chiamata "reflow" che raddrizza i percorsi già appresi da un modello addestrato, così un modello di seconda tornata richiede ancora meno step di integrazione in fase di generazione.
Ecco perché i due termini compaiono fianco a fianco negli stessi paper. Sia Stable Diffusion 3 che Flux usano il flow matching con una scelta di percorso vicina al rectified flow. Ma trattare flow matching e rectified flow come intercambiabili fa perdere il punto. Il flow matching è il framework. Il rectified flow è uno dei percorsi che puoi scegliere al suo interno.
Il Flow Matching nell'IA generativa moderna
Il flow matching oggi alimenta alcuni dei più grandi sistemi generativi in produzione.
- Generazione di immagini è dove il flow matching è apparso per primo su larga scala. Stable Diffusion 3 è passato dalla vecchia formulazione in stile DDPM al flow matching, e Flux, di Black Forest Labs, si basa su un approccio simile al rectified flow. Entrambi ottengono campionamento più veloce e di qualità superiore grazie all'idea del percorso rettilineo spiegata sopra.
- Generazione video è dove ha senso la libertà di scegliere il proprio percorso, perché il video è costoso da campionare anche per un singolo frame, figuriamoci per decine di frame a ogni step di denoising. Movie Gen Video di Meta, un modello da 30 miliardi di parametri, sostituisce la solita U-Net di diffusione con un Transformer addestrato con un obiettivo di flow matching. Un paio di grandi generatori video rilasciati da allora usano lo stesso approccio nello spazio latente di un encoder video pre-addestrato, per lo stesso motivo: meno step di campionamento significano risparmi reali a quella scala.
- Generazione audio e voce beneficia anch'essa del flow matching. Voicebox di Meta lo ha usato per la generazione vocale multilingue già nel 2023, e il componente audio di Movie Gen genera colonne sonore ed effetti sonori allo stesso modo, sincronizzati con il video. Sistemi TTS open come F5-TTS si basano direttamente sul flow matching con un diffusion transformer, producendo parlato naturale senza un modello di durata separato o un allineatore di fonemi.
- Generazione multimodale compare meno come tecnica separata e più come il risultato di usare lo stesso obiettivo ovunque. Movie Gen stesso è inquadrato come un insieme di foundation model per i media - video, audio, personalizzazione ed editing, tutti addestrati con lo stesso obiettivo di flow matching.
Tutto questo perché una loss di regressione è semplice da implementare e scalare. E poiché il percorso è una scelta di design, i team che costruiscono sistemi da miliardi di parametri possono sceglierne uno che richiede meno step di campionamento, e questo conta quando ogni step costa calcolo a quella scala.
Un semplice esempio di Flow Matching
Finora tutto era concettuale. Ora ti mostro la stessa idea su un dataset 2D reale, abbastanza piccolo da vedere ogni passaggio.
La distribuzione del rumore è una Gaussiana 2D standard, centrata all'origine. La distribuzione target sono tre cluster gaussiani disposti a triangolo: abbastanza semplice perché una piccola rete impari rapidamente, ma abbastanza strutturata da permetterti di capire se ha imparato bene.

Semplice esempio di flow matching
Il primo pannello è il punto di partenza di ogni campione: rumore sparso senza struttura. Il secondo pannello è il campo vettoriale stesso, valutato su una griglia a metà training. Nota come le frecce puntino già verso uno dei tre cluster, ben prima che un campione ci arrivi. Il terzo pannello mostra cosa succede quando parti da rumore fresco e segui quel campo fino a t = 1: emergono tre cluster, che corrispondono quasi perfettamente al quarto pannello.
Nulla di tutto questo ha richiesto qualcosa che le sezioni precedenti non avessero già coperto: una distribuzione sorgente, una distribuzione target, un campo vettoriale appreso e un risolutore ODE che li collega. Passiamo al codice.
Flow Matching in Python
Ecco una piccola implementazione PyTorch dello stesso esempio, usando la stessa sorgente di rumore e il target a tre cluster.
Inizia con le due distribuzioni e come campionarle:
import torch
import torch.nn as nn
torch.manual_seed(0)
# Three Gaussian clusters as the target ("data") distribution
centers = torch.tensor([[0.0, 3.0], [-2.6, -1.6], [2.6, -1.6]])
def sample_target(n):
idx = torch.randint(0, 3, (n,))
return centers[idx] + 0.4 * torch.randn(n, 2)
def sample_source(n):
return torch.randn(n, 2)
La rete prende un punto e uno step temporale e predice una velocità:
class VelocityNet(nn.Module):
def __init__(self, hidden=64):
super().__init__()
self.net = nn.Sequential(
nn.Linear(3, hidden), nn.ReLU(),
nn.Linear(hidden, hidden), nn.ReLU(),
nn.Linear(hidden, 2),
)
def forward(self, x, t):
return self.net(torch.cat([x, t], dim=1))
Il training, a ogni step, campiona un batch di punti sorgente, punti target e istanti temporali, poi interpola tra i primi due e fa regressione sulla velocità risultante:
model = VelocityNet()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
for step in range(3000):
# source (noise) points
x0 = sample_source(256)
# target (data) points
x1 = sample_target(256)
# random time steps
t = torch.rand(256, 1)
# interpolate along a straight-line path
xt = (1 - t) * x0 + t * x1
# target velocity for that path
target_v = x1 - x0
pred_v = model(xt, t)
loss = ((pred_v - target_v) ** 2).mean()
optimizer.zero_grad()
loss.backward()
optimizer.step()
La generazione risolve l'ODE appresa con la semplice integrazione di Eulero. Ti serve solo un ciclo che fa piccoli passi da t = 0 a t = 1:
@torch.no_grad()
def generate(model, n_samples, n_steps=100):
x = sample_source(n_samples)
dt = 1.0 / n_steps
for i in range(n_steps):
t = torch.full((n_samples, 1), i * dt)
x = x + model(x, t) * dt
return x
samples = generate(model, n_samples=600)
`

Visualizzazione dei campioni generati
Ed ecco l'intera pipeline! Campiona, interpola, regredisci, integra. Nulla cambia se usi una rete più grande, un percorso diverso o un dataset di dimensione superiore: cambia solo la scala.
Vantaggi e limitazioni del Flow Matching
Niente di tutto questo rende il flow matching un upgrade universale rispetto alla diffusione. È un compromesso, come qualsiasi altra scelta di design.
Ecco quando è una buona opzione e quando non lo è.
Vantaggi
- Obiettivo di regressione diretto: niente stima dello score, niente bound di likelihood, niente loss avversaria da bilanciare: solo un confronto tra una velocità predetta e un target noto
- Scelta del percorso di probabilità: non sei limitato a un solo processo di noising; un percorso rettilineo, uno in stile diffusione o uno personalizzato rientrano tutti nello stesso obiettivo
- Affinità naturale con i modelli in tempo continuo: il flow matching addestra continuous normalizing flows senza il costoso calcolo di likelihood che prima era necessario
- Meno step di campionamento: percorsi più rettilinei consentono a un risolutore ODE di usare meno step per restare accurato, che in pratica si traduce in generazione più veloce
- Funziona su più tipi di dati: lo stesso obiettivo allena modelli di immagini, video, audio e multimodali: la matematica non cambia con la modalità
Limitazioni
- L'integrazione ODE può essere costosa: ogni step di campionamento richiede comunque un forward pass nella rete, e questo pesa alla scala di video o audio
- La qualità dipende dal percorso e dalla rete: un percorso di probabilità scelto male o una rete sottoaddestrata producono comunque campioni scadenti, inclusi i percorsi rettilinei
- La matematica richiede una curva di apprendimento: percorsi di probabilità, campi vettoriali e formulazioni in tempo continuo richiedono più background rispetto a una semplice immagine di denoising
- I modelli grandi costano comunque quanto i modelli grandi: il flow matching riduce il costo per step di un sistema come Movie Gen o Flux, ma addestrare ed eseguire reti da miliardi di parametri resta impegnativo in ogni caso
Conclusione
Il flow matching insegna a un modello come i campioni dovrebbero muoversi da una distribuzione semplice verso la distribuzione dei dati. Tutto il resto descritto in questo articolo esiste per rendere addestrabile questa singola idea.
Due idee fanno la maggior parte del lavoro. Un percorso di probabilità collega il rumore ai dati attraverso una sequenza di distribuzioni intermedie. Un campo vettoriale descrive come un campione dovrebbe muoversi in qualsiasi punto lungo quel percorso, in qualunque istante. La rete impara quel campo vettoriale, cioè la sua velocità, e generare significa semplicemente seguire il flusso risultante dal rumore ai dati.
Nulla di questo è separato da ciò che c'era prima. Il flow matching è il modo in cui i sistemi moderni addestrano i continuous normalizing flows senza il vecchio calcolo della likelihood, e i modelli di diffusione risultano essere un caso specifico di esso.
Se i modelli di diffusione, i normalizing flow o più in generale l'IA generativa ti interessano, ecco dove andare dopo:
Domande frequenti sul Flow Matching
Che cos'è il flow matching?
Il flow matching è un metodo di training per modelli generativi, non un'architettura. Invece di imparare a generare esempi specifici, la rete impara un campo vettoriale: una funzione che dice a qualsiasi campione in quale direzione e a quale velocità muoversi in un dato punto e istante. Se parti dal rumore e segui quel campo fino a t = 1, ottieni un campione dalla distribuzione dei dati.
In cosa il flow matching è diverso dai modelli di diffusione?
Un modello di diffusione predice il rumore in un campione e lo rimuove passo dopo passo, seguendo un processo di noising fisso. Il flow matching invece predice una velocità e ti consente di scegliere il percorso di probabilità che collega rumore e dati — ad esempio una linea retta, invece di una schedule gaussiana fissa. La diffusione risulta essere una specifica scelta di percorso all'interno del più ampio framework del flow matching, non un metodo separato in competizione.
Il flow matching è un'architettura di modello?
No, è un obiettivo di training. Puoi abbinarlo a un transformer o a quasi qualsiasi altra rete: ciò che rende flow matching è cosa la rete è addestrata a predire, non com'è fatta. Ecco perché vedrai lo stesso obiettivo dietro modelli di immagini, video e audio costruiti su architetture molto diverse.
Cos'è il conditional flow matching e perché è importante?
Lavorare direttamente con il percorso di probabilità completo che collega ogni punto di rumore a ogni punto dati non è pratico, perché la vera velocità target dovrebbe tener conto dell'intero dataset in una volta sola. Il conditional flow matching risolve il problema condizionando su singole coppie rumore-dato, ognuna con un percorso semplice e una velocità calcolabile. Se medi l'addestramento della rete su un numero sufficiente di queste coppie, finisci per approssimare lo stesso campo vettoriale cercato dall'obiettivo completo, senza mai calcolarlo direttamente.
Quali modelli reali usano il flow matching?
Stable Diffusion 3 e Flux usano entrambi il flow matching per la generazione di immagini. Movie Gen di Meta lo applica a video e audio, e modelli di sintesi vocale come Voicebox e F5-TTS usano lo stesso obiettivo per il text-to-speech. Il motivo dell'adozione a quella scala sta in una loss di regressione semplice da addestrare, unita a una scelta di percorso che spesso richiede meno step di campionamento.
