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
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:
- Treine o modelo de fluxo v_1 com emparelhamentos aleatórios.
- Amostre N pares
(x_1, x_0)integrando v_1 dex_1até o seu destinox_0. - 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.
- 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:
- Treinamento livre de simulação — sem desenrolamento de EDO durante o treinamento, trivial de implementar.
- 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).
- 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]comt=0nos dados,t=1no ruído. O DDPM usat ∈ [0, T]comt=0nos dados,t=Tno 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
- Fácil. Execute
code/main.pye compare o MSE de 1 passo vs 20 passos em relação à distribuição real dos dados. - Médio. Mude da amostragem uniforme de
tpara logit-normal (concentra a amostragem no meio do intervalo de t). A qualidade do modelo melhora? - 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
- Liu, Gong, Liu (2022). Flow Straight and Fast: Learning to Generate and Transfer Data with Rectified Flow — rectified flow.
- Lipman et al. (2023). Flow Matching for Generative Modeling — flow matching.
- Esser et al. (2024). Scaling Rectified Flow Transformers for High-Resolution Image Synthesis — SD3, rectified flow at scale.
- Albergo, Vanden-Eijnden (2023). Stochastic Interpolants — framework geral que cobre FM + difusão.
- Song et al. (2023). Consistency Models — destilação de 1 passo de difusão / fluxo.
- Sauer et al. (2023). Adversarial Diffusion Distillation (SDXL-Turbo) — variante turbo.
- Black Forest Labs (2024). Flux.1 models — flow matching em produção.