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)utA = (2, 0)B = (−2, 0)x0x0′xtRETA ATÉ Bx0 = (1, 1)alvo (−3, −1)peso 0,39erro² 10,56RETA ATÉ Ax0′ = (−0,33; 1)alvo (2,33; −1)peso 0,61erro² 4,34t = 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,77setas: 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)011b: peso do ruídoa: peso do dadoa + b = 1a² + b² = 1UM PAR: xt = a·x1 + b·x00x0 (ruído)x1 (dado)setas: 0,25 × velocidadeflow matching: a = t, b = 1 − tdifusã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
Sorteie ruído e integre a ODE treinada com precisão: .
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 dadosA = (2, 0)B = (−2, 0)passe o mouse numa amostra de ruídoamostra 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.
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 purofor i inrange(n_passos): # Euler: 1 avaliação por passo
x = x + dt * modelo(x, i * dt)
for i inrange(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:
é ruído ou dados? (Esta aula: ruído. O artigo do SD3 e muitos códigos: dados.)
O modelo prevê velocidade, ou ? Todos conversíveis, dados e o interpolante.
é 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).
O flow matching regride uma velocidade; o alvo condicional tem o mesmo gradiente do marginal. A perda tem um piso.
A difusão é flow matching com um interpolante curvo; no caminho linear, o DDIM é o passo de Euler do fluxo.
"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.
O ganho real é o objetivo e a receita dele: logit-normal, deslocamento por resolução.
O reflow endireita ao custo de pares gerados; os modelos de poucos passos lançados são destilados.
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.