Redes Neurais Artificiais e Deep Learning · Insper

Flow Matching

Trace uma reta, aprenda a média

A dedução da difusão e um atalho

Difusão: uma EDE (equação diferencial estocástica), um limite variacional, um cronograma de ruído com
nome, uma cadeia de 1000 passos, três parametrizações (, , ). O método é simples; a dedução não é.

O flow matching chega ao mesmo lugar em três linhas:

  1. Sorteie uma amostra de ruído e uma de dados .
  2. Trace a reta entre elas: .
  3. Treine uma rede para prever a direção do deslocamento, , num ponto aleatório dela.

Isto é uma família de modelos diferente da difusão?

Nesta aula é o ruído e o dado: é ruído, é dado. É o contrário da aula de Stable Diffusion, em que era a imagem.

O laço de treino inteiro

x1 = lote_de_dados();  x0 = torch.randn_like(x1)
t  = torch.rand(len(x1), 1)                   # um t por exemplo, em [0, 1)
xt = (1 - t) * x0 + t * x1                    # um ponto na reta
perda = ((modelo(xt, t) - (x1 - x0)) ** 2).mean()

Sem cronograma, sem limite, sem cadeia. Amostrar: sorteie ruído e integre

CFM: conditional flow matching, porque o alvo é o de um par sorteado. vθ: a rede, com pesos θ.

O problema: qual reta?

Muitas retas passam perto do mesmo ponto no mesmo instante , indo para lados diferentes. O que
uma rede pode devolver ali?

  • Só a média delas, sobre os pares cuja reta passa por em : o campo marginal

  • Não dá para calculá-lo em dados reais — ele faz a média sobre todo ponto de dados que poderia ter produzido .
  • Teorema (Lipman et al., 2023): regredir o alvo condicional tem o mesmo gradiente que regredir . Treine no que dá para escrever; convirja para o que você queria.
  • O mesmo truque do DDPM ao regredir em vez do score () — enunciado uma vez, em geral.

Um ponto, duas retas, uma resposta

Duas retas de treino passam pelo mesmo ponto x t em t = 0,25: uma do ruído x0 = (1, 1) até B = (−2, 0), outra de x0′ = (−0,33; 1) até A = (2, 0). Os alvos delas são (−3, −1) e (2,33; −1). Pesados pela probabilidade de cada amostra de ruído, 0,39 e 0,61, eles têm média igual à velocidade marginal (0,25; −1,00); a dispersão em torno dela, 6,77, é o piso da perda neste ponto. ruído 𝒩(0, I) ut​ A = (2, 0)B = (−2, 0) x0​ x0​′ xt​ RETA ATÉ B x0​ = (1, 1) alvo (−3, −1) peso 0,39 erro² 10,56 RETA ATÉ A x0​′ = (−0,33; 1) alvo (2,33; −1) peso 0,61 erro² 4,34 t = 0,25xt​ = (0,25; 0,75) ut​(xt​) = 0,61·(2,33; −1) + 0,39·(−3, −1) = (0,25; −1) piso = 0,61 · 4,34 + 0,39 · 10,56 = 6,77 setas: 0,5 × velocidade

Simulador · pares de treino e o fluxo aprendido

t = 0.00

Duas consequências que surpreendem

Treinada por tempo suficiente, a perda de flow matching vai a zero?

  • Não. A dispersão dos alvos em torno da média deles, , é um piso. Laboratório, 8 gaussianas num círculo: piso 3,73 (exato; prever zero dá 6,04), rede treinada 3,76. Convergiu, não falhou.
  • Os caminhos aprendidos nunca se encontram: uma ODE tem uma velocidade por ponto e instante.
  • Então o fluxo repareia ruído e dados: cada partícula termina nos dados, não no seu par de treino.
  • E em , : saber é saber o ruído e nada sobre , então . Tudo vai para a média dos dados.

Simulador · um passo de treino e Euler, linha a linha

x0 · ruído
x1 · dados
t

● dados A, B · ● x0 · ● xt · → alvo · → v · — Euler (setas: 0,25 × velocidade)

A difusão é um caso particular

Método Caminho
DDPM / difusão curvo: (b, a) num quarto de círculo
Flow matching reto, por par
Fluxo retificado reto, pares refeitos pelo modelo

Um framework, uma perda, um código. Com ruído gaussiano as duas visões são intercambiáveis: no caminho linear, o DDIM é o passo de Euler do fluxo (). O que muda: a ponderação ao longo de e o formato dos caminhos.

Aqui cresce de 0 (ruído) a 1 (dado): o cronograma da aula de Stable Diffusion lido de trás para frente. Linear: , , o alvo do laço. Difusão: , um círculo.

Um par, dois interpolantes

t =
O mesmo par de ruído e dado sob dois interpolantes. À esquerda, os pesos (b, a): o flow matching anda na reta a + b = 1, a difusão no quarto de círculo a² + b² = 1. À direita, o par no plano: o flow matching vai de x0 a x1 em linha reta com velocidade constante x1 − x0; a difusão segue uma curva e a velocidade dela, a′x1 + b′x0, muda no caminho. Os botões escolhem t. OS PESOS: (b, a) 011 b: peso do ruído a: peso do dado a + b = 1 a² + b² = 1 UM PAR: xt​ = a·x1​ + b·x0​ 0 x0​ (ruído) x1​ (dado) setas: 0,25 × velocidade flow matching: a = t, b = 1 − t difusão: a = sen(πt/2), b = cos(πt/2)

"Caminhos retos, menos passos"?

A reta entre uma amostra de ruído e um ponto de dados é reta. O caminho que o modelo aprende é reto?

  • O caminho condicional é reto por construção.
  • O caminho marginal não é: ele faz a média de pares que se cruzam.
  • Num anel de 8 gaussianas (o simulador a seguir, campos exatos), os caminhos do interpolante linear são 111% mais longos que a reta entre as pontas; os da difusão, 58%. As redes treinadas do laboratório (outro anel) medem 88% e 44%.
  • Nenhum vence em todo número de passos; depois de ~32 passos os dois somem. O argumento é sobre o regime de poucos passos.

Simulador · interpolante linear vs. de difusão, campos exatos

Em imagens: resultados divergentes; a ponderação importa

Medição Caminho linear Caminho de difusão
Lipman et al. 2023: avaliações do solver (CIFAR-10, ImageNet 32/64) 122–142 183–193
SD3, 61 formulações, posição média (menor é melhor), uniforme 5,67 /linear: 2,88
SD3, fluxo retificado com logit-normal 1,54, 1º; melhor com 5 passos
Este laboratório, MNIST, uniforme, FD com 2 / 4 / 8 passos 751 / 226 / 133 510 / 180 / 94,0

No melhor caso, de 22 a 37% menos avaliações (CIFAR-10: 1 − 142/183 ≈ 22%; ImageNet 32: 1 − 122/193 ≈ 37%), não 2–10× — e só com a ponderação certa de .
Não é do interpolante que vem a grande economia de passos.

ε/linear: predição de ε com o cronograma β linear do DDPM. FD: a receita do FID (distância de Fréchet entre atributos de imagens geradas e reais), com um classificador de dígitos no lugar da Inception; menor é melhor e dígitos reais dão 4,6.

A vantagem real é o objetivo

  • Uma regressão sem ponderação; nenhum cronograma a ajustar; nenhuma escolha -vs- para errar em ruído alto.
  • O Movie Gen (Meta, 2024) treinou os dois: flow matching mais robusto ao cronograma de ruído e melhor que as perdas de difusão testadas.
  • Isso, mais que o número de passos, é o motivo de SD3, FLUX e os modelos de vídeo o terem adotado.
  • Ir de cinquenta passos para quatro ou um exige outra coisa: reflow ou destilação.

Reflow: endireitar de propósito

  1. Sorteie ruído e integre a ODE treinada com precisão: .
  2. Retreine nos pares que o próprio modelo produziu, nas retas entre eles.

O reflow muda o que o modelo gera?

  • Não: mesma distribuição de , novo acoplamento.
  • Os caminhos do fluxo não se encontram, então as retas entre seus pontos finais raramente se cruzam — e uma reta é integrada exatamente por um passo de Euler.

Reflow, passo a passo

Seis amostras de ruído e dois pontos de dados, A e B. Passo 1: o treino liga cada amostra de ruído a um ponto de dados sorteado por uma reta e as retas se cruzam. Passo 2: o fluxo aprendido curva os caminhos para que nunca se encontrem; quatro das seis chegam ao outro ponto de dados. Passo 3: um passo de Euler nesse fluxo leva todas as amostras à média dos dados, (0, 0). Passo 4: o reflow pareia cada amostra com o fim do próprio caminho, por uma reta. Passo 5: depois do reflow, um passo de Euler cai nos dados. ruído 𝒩(0, I) média dos dados A = (2, 0)B = (−2, 0) passe o mouse numa amostra de ruído amostra de ruído zponto de dados

Reflow, medido no laboratório

Antes Depois de um reflow
2-D: perda 3,76 0,0010
2-D: curvatura dos caminhos 88% 0,1%
2-D: Wasserstein fatiada, 1 passo de Euler 1,35 0,061
MNIST: FD com 1 / 2 / 4 passos de Euler 2255 / 751 / 226 201 / 146 / 124

O custo: um conjunto grande de pares gerados com a ODE completa, um segundo treino e os erros do
primeiro modelo gravados nos pares. Uma rodada em imagens deixa uma diferença (FID de 1 passo no
CIFAR-10: 12,2 → 3,1 só depois de refazer a receita, Lee et al. 2024).

Curvatura: comprimento do caminho / distância entre as pontas − 1. SW (Wasserstein fatiada) até dados novos: dados contra dados ≈ 0,05. A perda desce abaixo do piso de 3,73 porque o piso vem dos cruzamentos e os novos pares quase não se cruzam.

"Fluxo retificado" diz menos do que parece

SD3 e FLUX são modelos de "fluxo retificado". Eles fizeram reflow?

  • Nenhum dos dois artigos descreve uma etapa de reflow. No SD3, o nome se refere ao interpolante reto de Liu et al. (dado em ) — o caminho do flow matching.
  • Os modelos de poucos passos que foram lançados foram destilados:
    • FLUX.1 [schnell]: destilação adversarial de difusão latente, 1–4 passos.
    • SD3.5 Large Turbo: destilação adversarial de difusão, 4 passos.

Menos passos: aprender saltos, não velocidades

Método O que a rede aprende Resultado
Consistência (2023), sCM (2025) qualquer ponto → o fim da trajetória FID de 2 passos 1,88, ImageNet 512
Modelos de atalho (2025) velocidade e tamanho do passo : um salto de = dois de um modelo, 1–128 passos
MeanFlow (2025) velocidade média num intervalo FID de 1 passo 3,43 → 1,72, ImageNet 256
Destilação adversarial aluno de poucos passos + um discriminador o que foi lançado: FLUX.1 [schnell], SD3.5 Turbo

Todos são jeitos de aprender o mapa de fluxo : onde está em quem estava em
no instante . A velocidade é o salto de comprimento zero.

Escolhas de treino que mudaram

  • Onde em treinar. Um uniforme desperdiça esforço nas pontas fáceis. SD3, HunyuanVideo: logit-normal (, ), concentrada no meio. π0, GR00T: uma Beta que favorece a ponta ruidosa.
  • Deslocar com a resolução. Com mais tokens, um mesmo nível de ruído esconde menos: imagens grandes e vídeos deslocam para o ruído (SD3, LTX-Video) — o painel de SNR da aula de Stable Diffusion.
  • O que a rede devolve. Velocidade por padrão; dado limpo ou ruído são conversíveis. Li & He (2025): prever o dado limpo deixa um Transformer simples gerar no espaço de pixels.

Onde é usado hoje (1/2)

Domínio Modelos (primeiro lançamento)
Imagem SD3 (mar. 2024), FLUX.1 (ago. 2024), FLUX.1 Kontext (maio 2025), Qwen-Image (ago. 2025), Z-Image e FLUX.2 (nov. 2025)
Vídeo Movie Gen (out. 2024), HunyuanVideo (dez. 2024), LTX-Video, Wan 2.1 (fev. 2025), Open-Sora 2.0
Fala, áudio, música Voicebox (2023), Matcha-TTS, CosyVoice, F5-TTS (2024), Movie Gen Audio, ACE-Step (2025)

Imagem e vídeo: um latente de VAE por um DiT (próxima aula). FLUX.2: Transformer de 32B e um modelo de
visão e linguagem de 24B como encoder de texto.

Onde é usado hoje (2/2)

Domínio Modelos O que flui
Políticas de robôs π0 (out. 2024), π0.5, GR00T N1, SmolVLA um bloco de ações futuras
Proteínas FrameFlow, FoldFlow, Proteina frames ou coordenadas da cadeia principal
Dentro de LLMs multimodais JanusFlow (2024), BAGEL (2025) uma cabeça de imagem ao lado da perda de próximo token

Não são flow matching: AlphaFold 3 (difusão), CogVideoX e Stable Audio Open (predição ).
Sora, Veo 3: "difusão", objetivo não revelado. Com a equivalência, o rótulo importa menos que o
interpolante, o alvo e a ponderação.

Por que os robôs o usam

Um robô pode pegar uma caneca pela esquerda ou pela direita. O que devolve uma cabeça de regressão que
prevê a ação diretamente?

  • A média das duas: uma pegada no meio, que não corresponde a nenhuma.
  • Um fluxo representa uma distribuição com vários modos e sorteia um deles.
  • π0: um especialista de ações gera blocos de 50 ações com 10 passos de Euler, rápido o bastante para controle a até 50 Hz. GR00T N1: blocos de 16, 4 passos.
  • A mesma perda de um modelo de imagem; um (a distribuição dos dados, aqui das ações) diferente.

Amostrar é uma escolha à parte

x, dt = torch.randn(forma), 1 / n_passos       # t = 0: ruído puro
for i in range(n_passos):                      # Euler: 1 avaliação por passo
    x = x + dt * modelo(x, i * dt)

for i in range(n_passos):                      # Heun: 2 avaliações por passo
    v1 = modelo(x, i * dt)
    v2 = modelo(x + dt * v1, (i + 1) * dt)
    x = x + dt * (v1 + v2) / 2

Conte avaliações do modelo, não passos. MNIST, laboratório, FD (menor é melhor):

avaliações do modelo Euler Heun
4 226 (4 passos) 550 (2 passos × 2)
16 99,3 (16 passos) 89,7 (8 passos × 2)

Um passo no MNIST

No MNIST os caminhos aprendidos são só 2,2% mais longos que as retas. Um passo de Euler é
bom?

  • Não: FD 2255 com 1 passo, contra 99,3 com 16 — toda amostra é a mesma mancha cinza, a 2,0 do dígito médio (dígitos reais ficam a 14,0 dele).
  • Em o campo é : um passo cai no dígito médio.
  • "Quase reto em comprimento" não é reto o bastante: a curva acontece cedo e é tudo.

Lendo um código de flow matching

Três convenções mudam entre artigos. Confira antes de depurar qualquer outra coisa:

  1. é ruído ou dados? (Esta aula: ruído. O artigo do SD3 e muitos códigos: dados.)
  2. O modelo prevê velocidade, ou ? Todos conversíveis, dados e o interpolante.
  3. é um número em ou um índice inteiro de timestep?

Referência: o Flow Matching Guide and Code da Meta (2024), com o pacote PyTorch flow_matching.

Laboratório · Flow matching do zero

Notebook do Colab, ~2 h. Seções 1–5 em CPU (2-D, campo exato conhecido); 6–8 numa GPU T4 (MNIST).

  1. o campo exato e o piso da perda
  2. treinar uma rede de velocidade
  3. passos, solvers, curvatura
  4. o interpolante de difusão, mesmo código
  1. reflow em 2-D
  2. MNIST: a mesma perda em imagens
  3. um passo, Heun e o interpolante no MNIST
  4. reflow no MNIST; logit-normal: a tabela é sua

abrir no Colab →

Pontos principais

  1. O flow matching regride uma velocidade; o alvo condicional tem o mesmo gradiente do marginal. A perda tem um piso.
  2. A difusão é flow matching com um interpolante curvo; no caminho linear, o DDIM é o passo de Euler do fluxo.
  3. "Reto" é o caminho condicional. O aprendido se curva e nunca se encontra; em imagens o caminho linear economiza no máximo cerca de um terço dos passos.
  4. O ganho real é o objetivo e a receita dele: logit-normal, deslocamento por resolução.
  5. O reflow endireita ao custo de pares gerados; os modelos de poucos passos lançados são destilados.
  6. Imagem, vídeo, fala, ações de robôs: a mesma linha de código, um diferente.

Roteiro: (1) a perda em três linhas; (2) o campo marginal e o teorema; (3) a difusão como caso particular; (4) o que "caminhos retos" significa, medido; (5) reflow e geração em poucos passos; (6) escolhas de treino; (7) onde é usado em 2026. Fecha com o laboratório no Colab.

Resposta mais adiante: não. A difusão é a mesma coisa com um interpolante curvo.

Avance pelas cinco etapas. Dados A = (2, 0), B = (-2, 0), os mesmos do simulador do passo de treino. Duas retas passam por x_t = (0,25; 0,75) em t = 0,25: de (1, 1) até B e de (-0,33; 1) até A. Pesos 0,61 para A e 0,39 para B (o ruído da reta até A está mais perto da origem). A média, (0,25; -1), é o que a rede devolve; o piso neste ponto é 6,77; qualquer v paga |v - u|^2 + 6,77. Passe o mouse numa reta para isolá-la.

Comece em "pares de treino" e anime: as retas se cruzam, 1569 cruzamentos, 15 encontros. Troque para "o fluxo aprendido": os caminhos se curvam, 0 encontros, distância média 0,51 contra 1,23. O fluxo repareia ruído e dados.

Caso inicial, "o laço de treino": dados A = (2, 0), B = (-2, 0); o par 1 liga o ruído (1, 1) a B. Avance linha a linha; o gráfico mostra x_t (laranja), o alvo (amarelo) e v (roxo). Linha 6: v do par 1 é (0,25; -1,00) contra o alvo (-3; -1): só ele dá 10,56, perda 3,52 com a rede já ideal. O par 3 também cruza (em t = 0,75) e não custa nada. Linha 9 com 4 passos: o ruído do par 1 termina em A, não em B (repareamento). Troque para 1 passo: (1, 1) + (-1, -1) = (0, 0), a média. Casos: t = 0 dá perda 4 = média de |x1|^2; t = 0,95 dá 0; v = 0 dá 6,17.

Cronograma cosseno: abar = sen^2(pi t / 2), então a = sen(pi t / 2), b = cos(pi t / 2). Clique em t = 0; 0,25; ...; 1. À esquerda, os pesos: o flow matching na reta a + b = 1, a difusão no quarto de círculo, em passos iguais de ângulo. À direita, um par. O ponto linear anda na velocidade constante x1 - x0; o da difusão sai da reta e a velocidade a' x1 + b' x0 gira, de a' x1 em t = 0 (somando dado) a b' x0 em t = 1 (tirando ruído). Em t = 0,5: a^2 + b^2 = 0,5 na reta e 1 na difusão (preserva a variância).

Campos marginais exatos, nada treinado. Mostre o linear com 1, 2 e 8 passos, depois o vp. Com 2 passos o erro do vp é menor (0,23 contra 0,43); com 8, o do linear (0,05 contra 0,08). Depois marque o reflow ideal: o limite, não o que um reflow treinado obtém.

Os mesmos dois pontos de dados. (1) Pares de treino, parceiros sorteados, retas que se cruzam. (2) O fluxo exato: os caminhos se curvam e nunca se encontram; 4 das 6 trocam de par, distância média 2,25 -> 1,32. (3) Um passo de Euler no fluxo: v = -z em t = 0, todas caem em (0, 0), a média. (4) O reflow pareia cada z com o próprio ponto de chegada. (5) Um passo depois do reflow cai nos dados. Passe o mouse numa amostra de ruído para segui-la pelas cinco etapas.