Phase 08 - Lesson 13

Flow Matching & Rectified Flows

Modelos de difusão levam de 20 a 50 etapas de amostragem porque percorrem um caminho curvo do ruído até os dados. O flow matching (Lipman et al., 2023) e o rectified flow (Liu et al., 2022) treinaram caminhos retos. Caminhos mais retos significam menos etapas, o que significa uma inferência mais rápida. Stable Diffusion 3, Flux.1 e AudioCraft 2 migraram para flow matching em 2024.

Type: Build Languages: Python Prerequisites: Phase 8 · 06 (DDPM), Phase 1 · Calculus Time: ~45 minutos

O Problema

O processo reverso do DDPM é um passeio estocástico de 1000 etapas de N(0, I) de volta para a distribuição dos dados. O DDIM reduziu isso para 20-50 etapas determinísticas. Você quer menos etapas — idealmente uma. O impedimento é que a EDO que resolve o processo reverso é rígida (stiff); o caminho é curvo.

Se você pudesse treinar o modelo de forma que o caminho do ruído aos dados fosse uma linha reta, um único passo de Euler de t=1 a t=0 funcionaria. O flow matching constrói isso diretamente: define uma interpolação em linha reta de x_1 ∼ N(0, I) para x_0 ∼ data, treina um campo vetorial v_θ(x, t) para corresponder à sua derivada temporal e integra na inferência.

O rectified flow (Liu 2022) vai além: endireita os caminhos iterativamente com um procedimento de reflow que produz uma EDO progressivamente mais próxima da linear. Após duas iterações de reflow, um amostrador de 2 passos se iguala à qualidade de um DDPM de 50 passos.

O Conceito

Flow matching: interpolação em linha reta entre ruído e dados

Fluxo de linha reta

Defina:

x_t = t · x_1 + (1 - t) · x_0,   t ∈ [0, 1]

onde x_0 ~ data e x_1 ~ N(0, I). A derivada temporal ao longo desta linha reta é constante:

dx_t / dt = x_1 - x_0

Defina um campo vetorial neural v_θ(x_t, t) e treine-o para corresponder a esta derivada:

L = E_{x_0, x_1, t} || v_θ(x_t, t) - (x_1 - x_0) ||²

Esta é a perda de conditional flow matching (Lipman 2023). O treinamento é livre de simulação: você nunca desenrola a EDO. Apenas amostre (x_0, x_1, t) e faça a regressão.

Amostragem

Na inferência, integre o campo vetorial aprendido para trás no tempo:

x_{t-Δt} = x_t - Δt · v_θ(x_t, t)

Comece em x_1 ~ N(0, I) e dê passos de Euler até t=0.

Rectified flow (Liu 2022)

O fluxo em linha reta funciona, mas os caminhos aprendidos não são realmente retos — eles se curvam porque muitos x_0s podem ser mapeados para o mesmo x_1. O passo de reflow do rectified flow:

  1. Treine o modelo de fluxo v_1 com emparelhamentos aleatórios.
  2. Amostre N pares (x_1, x_0) integrando v_1 de x_1 até o seu destino x_0.
  3. Treine v_2 nesses exemplos emparelhados. Como os pares agora são "alinhados por EDO" (ODE-matched), o interpolante de linha reta entre eles é genuinamente mais plano.
  4. Repita.

Na prática, 2 iterações de reflow aproximam você de um comportamento quase linear, permitindo uma inferência de 2-4 passos. SDXL-Turbo, SD3-Turbo e LCM são todos modelos destilados a partir de flow matching.

Por que isso venceu para imagens em 2024

Três motivos:

  1. Treinamento livre de simulação — sem desenrolamento de EDO durante o treinamento, trivial de implementar.
  2. Melhor geometria de perda — caminhos retos têm sinal-ruído consistente, enquanto a perda de ε do DDPM tem uma SNR ruim nas bordas do cronograma (schedule).
  3. Inferência mais rápida — 4-8 passos com qualidade de SDXL-Turbo; 1 passo com destilação de consistência.

Flow matching vs DDPM — a conexão exata

O flow matching com um caminho condicional gaussiano é difusão com um cronograma (noise schedule) de ruído específico. Escolha o cronograma x_t = α(t) x_0 + σ(t) x_1 e o flow matching recupera a difusão reformulada por Stratonovich com v = α'·x_0 - σ'·x_1. Ambos são algebricamente equivalentes para caminhos gaussianos.

O que o flow matching adicionou: a clareza do alvo (uma velocidade simples), uma perda mais limpa e a liberdade de experimentar com interpolantes não gaussianos.

Construa

code/main.py implementa flow matching unidimensional (1-D) em uma mistura gaussiana de dois modos. O campo vetorial v_θ(x, t) é uma MLP minúscula treinada com o alvo de linha reta. Na inferência, integre 1, 2, 4 e 20 passos de Euler e compare a qualidade das amostras.

Passo 1: perda de treinamento

def train_step(x0, net, rng, lr):
    x1 = rng.gauss(0, 1)
    t = rng.random()
    x_t = t * x1 + (1 - t) * x0
    target = x1 - x0
    pred = net_forward(x_t, t)
    loss = (pred - target) ** 2
    # backprop + update

Passo 2: inferência de múltiplos passos

def sample(net, num_steps):
    x = rng.gauss(0, 1)
    for i in range(num_steps):
        t = 1.0 - i / num_steps
        dt = 1.0 / num_steps
        x -= dt * net_forward(x, t)
    return x

Passo 3: comparar contagem de passos

Espere que o amostrador de 4 passos já se iguale à qualidade do de 20 passos — algo muito importante para a latência.

Armadilhas

  • Parametrização do tempo. O flow matching usa t ∈ [0, 1] com t=0 nos dados, t=1 no ruído. O DDPM usa t ∈ [0, T] com t=0 nos dados, t=T no ruído. Mesma direção, escala diferente. Os artigos científicos erram isso constantemente.
  • Escolha do cronograma (schedule). A linha reta do rectified flow é "o" cronograma de flow matching, mas você pode usar amostragem t cosseno ou logit-normal (o SD3 faz isso) para uma melhor cobertura de escala.
  • Custo do reflow. Gerar o conjunto de dados emparelhado para o reflow exige uma passada completa de inferência por amostra. Só faça o reflow quando você realmente precisar de inferência em 1-2 passos.
  • O classifier-free guidance (CFG) ainda se aplica. Basta trocar ε por v na combinação linear: v_cfg = (1+w) v_cond - w v_uncond.

Use-o

Caso de uso Stack de 2026
Texto para imagem, melhor qualidade Flow matching: SD3, Flux.1-dev
Texto para imagem, 1-4 passos Flow matching destilado: Flux.1-schnell, SD3-Turbo, SDXL-Turbo
Inferência em tempo real Destilação de consistência a partir de uma base com flow matching (LCM, PCM)
Geração de áudio Flow matching: Stable Audio 2.5, AudioCraft 2
Geração de vídeo Flow matching misturado com difusão (Sora, Veo, Stable Video)
Ciência / física (trajetórias de partículas, moléculas) Flow matching + campo vetorial equivariante

Sempre que um artigo diz "mais rápido que difusão" em 2025-2026, trata-se quase sempre de flow matching + destilação.

Envie

Salve outputs/skill-fm-tuner.md. A Skill recebe uma especificação de modelo no estilo difusão e a converte em uma configuração de treinamento de flow matching: escolha do cronograma, distribuição de amostragem temporal (uniforme / logit-normal), otimizador, plano de reflow, contagem de passos de destino e protocolo de avaliação.

Exercícios

  1. Fácil. Execute code/main.py e compare o MSE de 1 passo vs 20 passos em relação à distribuição real dos dados.
  2. Médio. Mude da amostragem uniforme de t para logit-normal (concentra a amostragem no meio do intervalo de t). A qualidade do modelo melhora?
  3. Difícil. Implemente uma iteração de reflow: gere pares (x_0, x_1) integrando o primeiro modelo, treine um segundo modelo nesses pares e compare a qualidade das amostras de 1 passo.

Termos-Chave

Termo O que as pessoas dizem O que realmente significa
Flow matching "Difusão em linha reta" Treinar v_θ(x, t) para corresponder a x_1 - x_0 ao longo de um interpolante.
Rectified flow "Reflow" Procedimento iterativo que endireita os fluxos aprendidos.
Velocity field "v_θ" Saída do modelo — a direção para mover x_t.
Straight-line interpolant "O caminho" x_t = (1-t)·x_0 + t·x_1; derivada alvo trivial.
Euler sampler "Solucionador de EDO de 1ª ordem" Integrador mais simples; funciona bem quando os caminhos são retos.
Logit-normal t "Amostragem SD3" Concentrar a amostragem de t em direção aos valores médios onde os gradientes são mais fortes.
Consistency distillation "Amostrador de 1 passo" Treinar um estudante para mapear qualquer x_t diretamente para x_0.
CFG with velocity "v-CFG" v_cfg = (1+w) v_cond - w v_uncond; mesmo truque, nova variável.

Nota de produção: Flux.1-schnell é flow matching em sua forma mais rápida

A vitória de produção do flow matching é o Flux.1-schnell — um DiT com flow matching destilado para 1-4 passos de inferência, mantendo a qualidade de nível do Flux-dev. O notebook de Niels "Run Flux on an 8GB machine" é a receita de implantação de referência: codificação T5 + CLIP, decodificação MMDiT quantizada (em 4 passos para o schnell vs 50 para o dev), decodificação VAE. A contabilidade de custos:

Variante Passos Latência em 1024² na L4 FLOPs Totais (relativo)
Flux.1-dev (cru) 50 ~15 s 1.0×
Flux.1-schnell 4 ~1.2 s 0.08× (12× mais rápido)
SDXL-base 30 ~4 s 0.25×
SDXL-Lightning 2-step 2 ~0.3 s 0.03×

A regra de produção: base com flow matching + destilação = o padrão de 2026 para texto para imagem rápido. Todos os principais fornecedores enviam essa combinação: SD3-Turbo (SD3 + fluxo + destilação), Flux-schnell (Flux-dev + endireitamento de rectified-flow), CogView-4-Flash. Bases de difusão pura existem apenas para checkpoints legados.

Leituras Adicionais

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).