深入理解 Flow Matching:生成建模的统一理论框架
1. 为什么要理解 Flow Matching?
1.1 扩散模型的”理论黑箱”问题
在阅读 Diffusion Transformer 文章 与 MMDiT 文章 时,你可能已经注意到一个细节:两篇文章都提到了 Rectified Flow,但它们都没有从最底层解释——
为什么”把噪声和样本用直线连接”的轨迹,就能训练出一个生成模型?
答案藏在 Flow Matching(流匹配)理论里——这是 Yaron Lipman 等人在 2022 年提出的万有理论框架,它把 DDPM、Score Matching、Rectified Flow、Nerfies、Dynablock 等看似不同的生成方法统一在一个优雅的数学框架下。
1.2 一句话概括
Flow Matching 的核心思想:用一条精心设计的 连续路径(Flow) 把噪声分布连接到数据分布,然后训练一个神经网络去学”这条路径的速度场”——学成之后,沿 ODE 反向走,就能从噪声生成样本。
1.3 直观理解
想象一条河流系统:
起点 (噪声 x_1) ───────→ ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←─── ←───终点 (数据 x_0)
每条路径代表一个样本从噪声到数据的"旅程"Flow Matching = 学出整条河流的速度场 → 知道了速度场,就可以从任意点出发 → 逆流而上就能从噪声到达数据1.4 Flow Matching 的历史脉络
2015-2019: Neural ODE (Chen et al., 2018) — "连续化神经网络" │ 把离散残差网络 → 微分方程 │2019-2021: Score Matching → Noise Conditional Score Network (NCSN) │ 学 ∇log p(x) — 朗之万采样 │2020: DDPM (Ho et al.) — 加噪 → 去噪, 但理论不统一 │2022: Flow Matching (Lipman et al., Jun 2022) │ ★ 统一了: DDPM / NCSN / 任意路径 │2022: Conditional Flow Matching (CFM) — 条件版本 │2023: Rectified Flow (Liu et al.) — 最优传输路径 │ ★ 被 SD3 / FLUX / MMDiT 采用 │2024+: Flow Matching 成为扩散模型训练的理论基础2. 概率论基础:从噪声到数据的路径
2.1 目标是什么?
我们有一堆真实数据点 ,它们服从某个未知分布 。
我们想学一个可逆变换 ,使得:
- (噪声)
- (生成数据)
可逆性:如果知道如何从 走到 ,那么我就能从 反推回 ——这就是”生成”的本质。
2.2 连续时间路径
Flow Matching 把从 (数据)到 (噪声)的过程参数化为时间连续的路径 :
对于任意时刻 ,路径 给出该时刻的”中间状态”。
# 路径的直观例子import numpy as np
t = np.linspace(0, 1, 100) # 100 个时间点
# 1) DDPM 路径 (概率守恒路径)x_t_ddpm = alpha_bar[t]**0.5 * x0 + (1 - alpha_bar[t])**0.5 * noise
# 2) Rectified Flow 路径 (直线)x_t_rf = (1 - t) * x0 + t * noise
# 3) 子空间线性路径x_t_linear = (1 - t) * x0 + t * noise2.3 三种经典路径对比
| 路径类型 | 公式 | 形状 | 代表模型 |
|---|---|---|---|
| DDPM (VP-SDE) | 弧线(高斯混合) | DDPM, SD 1/2/xl | |
| Rectified Flow | 直线 | SD3, FLUX, MMDiT | |
| Sub-VP (次扩散) | 弧线(更快衰减) | 改进型 SD |
x_t │ DDPM: 弧线 │ ╭─╮ │ ╱ ╲ │ ╱ RF ╲ ← 直线,最短路径 │ ╱ ╲ ╲ │╱ ────╲ └────────────── t 0 12.4 边际分布
对于固定的 ,所有样本的均值和方差决定边际分布 :
好的路径设计让 随 平滑变化——不能有任何 出现奇点。
3. 常微分方程 (ODE) 与概率流
3.1 核心:从路径到向量场
Flow Matching 的关键洞察是:每条路径 都是某个向量场 的积分曲线:
反过来,给定向量场 ,我就可以解 ODE 得到整条路径。
把生成建模问题重新表述为:
- 找一个向量场 使得 ODE 把噪声分布 推到数据分布
- 学这个
- 采样时,从 开始,反向积分 ODE( 从 1 降到 0)
3.2 向量场的定义
对于条件路径 (以数据点 为起点),定义条件向量场:
整体的边际向量场是条件向量场的加权平均:
def conditional_velocity(x0, noise, t): """Rectified Flow 的条件向量场 = ε - x0(速度场)。""" return noise - x0
def marginal_velocity(x, dataset): """边际向量场 = 所有条件向量场的期望。""" v = 0.0 for x0 in dataset: noise = sample_noise() t = sample_time_uniform() x_t = (1 - t) * x0 + t * noise # RF 路径 v += conditional_velocity(x0, noise, t) return v / len(dataset)3.3 概率流方程(连续性方程)
一个深刻的事实:边际向量场 必须满足连续性方程——保证概率质量守恒:
这意味着:
- 的散度 控制概率密度如何变化
- 如果 无散(),则 不随 变化
为什么这很重要:因为 Flow Matching 证明,可以完全绕过 直接学习 ,而 学好后, 自动满足连续性方程。
3.4 ODE 求解(采样)
给定学好的向量场 ,生成样本只需要反向求解 ODE:
@torch.no_grad()def ode_sample(model, num_steps=50, device="cuda"): """ x_{t-1} = x_t - (1/num_steps) * v_θ(x_t, t) t 从 1 → 0 (反向) """ x = torch.randn(batch_size, dim, device=device)
t_grid = torch.linspace(1.0, 0.0, num_steps + 1, device=device)
for i in range(num_steps): t = t_grid[i] t_batch = t.expand(x.shape[0])
v = model(x, t_batch) # 学好的向量场 dt = t_grid[i] - t_grid[i + 1]
# Euler 积分 x = x - dt * v
return x # 近似从 p_1 逆流到 p_0这里的 是反向时间(): 是纯噪声, 是数据。
4. Flow Matching 定理
4.1 条件流匹配目标 (Conditional Flow Matching, CFM)
这是 Flow Matching 理论的核心。设 是以 为起点的条件分布, 是对应的条件向量场。
定理(Lipman et al., 2022):
训练目标 等价于 边际流匹配目标 ,且梯度相同。
其中 。
换句话说:你只需要让模型去拟合”以真实起点 为条件的向量场”,自动保证边际目标也是最优的。
4.2 证明的直觉
边际目标: ∫ || v_θ(x) - 𝔼[v_t(x|x_0)] ||² p_t(x) dx ↑ 这是 x 的函数,难以优化
CFM 目标: 𝔼 || v_θ(x_t) - v_t(x_t|x_0) ||² ↑ 给定了 x_0,就知道 v_t(x_t|x_0) = dx_t/dt 因为 x_t = f(x_0, t) 是已知的!
通过边际分解: p_t(x) = ∫ p(x_t|x_0) p_data(x_0)可以证明两个目标在最优解处等价 (差一个常数)关键洞察:条件路径 是已知的(因为我们设计它),所以 是可以解析计算的!
def cfm_loss(model, x0, noise, t): """ 条件流匹配损失 = MSE(预测速度, 真实速度)
Rectified Flow: v_t = ε - x0 DDPM VP-SDE: v_t = -σ² ∇_x log p_t(x|...) """ # 1) 构造条件路径 xt = (1 - t) * x0 + t * noise # RF 直线
# 2) 解析计算条件向量场 (速度) true_v = noise - x0 # RF: d/dt[(1-t)x0 + tε] = ε - x0
# 3) 模型预测 pred_v = model(xt, t)
# 4) MSE return ((pred_v - true_v) ** 2).mean()4.3 为什么这个定理如此重要?
| 传统方法 | 问题 | CFM 的优势 |
|---|---|---|
| Score Matching | 需要计算 Hessian 或 log-likelihood | 不需要 |
| 变分推断 | 需要 ELBO、KL散度 | 不需要 |
| 原始 DDPM | 目标函数复杂 | 只需 MSE(预测, 真实速度) |
CFM 目标 = 简单的 MSE + 解析已知的目标向量场——这让它成为最简单的扩散类训练目标。
4.4 对 DDPM 的重新解释
用 Flow Matching 框架,DDPM 的训练目标可以重新推导:
DDPM 的路径:
对 求导:
整理后得到速度场形式:
这揭示了 DDPM 与 Score Matching 的内在联系——两者学的其实是同一个东西!
def ddpm_velocity_from_eps(xt, alpha_bar, noise): """DDPM 速度场 = α' x0 + σ' ε 但用噪声预测网络 ε_θ 来表示。 """ sqrt_alpha = np.sqrt(alpha_bar) sqrt_1_alpha = np.sqrt(1 - alpha_bar) alpha_prime = (d/dt) sqrt_alpha_bar # 与 DDPM 超参有关 sigma_prime = (d/dt) sqrt(1 - alpha_bar)
# 重新组织 x0_pred = (xt - sqrt_1_alpha * noise) / sqrt_alpha v = alpha_prime * x0_pred + sigma_prime * noise return v5. 最优传输与 Rectified Flow
5.1 什么是”最优传输路径”?
在所有可能的路径中,最优传输(Optimal Transport, OT)路径有一个极其重要的性质:
沿最优传输路径训练的模型,其 ODE 采样 更直、更短——这意味着可以用更少的步数生成高质量样本。
定义:最优传输路径是最小化总体路径弯曲能量的那条:
结论:对于高斯分布之间的传输,这个最小能量路径就是直线!
5.2 Rectified Flow 的最优传输证明
# Rectified Flow 是 Gaussian-to-Gaussian 的最优传输路径def rf_optimal_transport_path(x0, epsilon): """ x_t = (1 - t) * x0 + t * epsilon
d/dt x_t = epsilon - x0 = - (x0 - epsilon)
能量: ||dx_t/dt||² = ||x0 - epsilon||² 这与 t 无关,是常数! → 所以 Rectified Flow 是平坦路径(零曲率) → 走这条路径做 ODE 采样时,误差最小 """ return epsilon - x0直观理解:DDPM 的路径是”弧线”,每一步都在”减速”(因为高斯方差在变化)。Rectified Flow 的路径是”直线”,模型只需学”匀速前进”——但从 到 的匀速运动,就是恒定的速度场,最容易学习。
5.3 最速下降流 (Gradient Flow)
另一种重要路径是梯度流——沿数据分布的对数密度梯度方向:
这是 Stein Variational Gradient Descent 的连续时间版本。
def gradient_flow_loss(model, x0, noise, t): """ 梯度流: 学 log p_data 的梯度
但 log p_data 未知! 所以在实际中,梯度流通常用 JKO 离散化或 MCMC 近似。 """ pass5.4 路径设计空间
Flow Matching 路径设计空间:
所有路径 = {x_t = φ(x_0, ε, t) | φ 是任意光滑插值函数}
约束: - x_0 = data - x_1 = noise - p_t 随 t 平滑变化
最优路径? - 能量最小 → 直线 (Rectified Flow) - 熵最小 → DDPM VP-SDE - 混合 → sub-VP, VE-SDE, ...6. 扩展:随机微分方程 (SDE) 视角
6.1 为什么需要 SDE?
ODE 路径是确定性的——给定起点,路径完全确定。但在 DDPM 中,加噪过程是随机的:
这引入了随机性。Flow Matching 可以同时处理 ODE(确定性)和 SDE(随机性) 两种情况。
6.2 VP-SDE(Variance Preserving)和 VE-SDE
VP-SDE(方差保持)——DDPM 的连续化:
VE-SDE(方差爆炸)——高噪声方差的情况:
6.3 ODE vs SDE 采样
# ODE 采样 (Flow Matching 标准)@torch.no_grad()def ode_sample(model, xt, num_steps=50): """确定性反向 ODE 积分。""" dt = 1.0 / num_steps for i in reversed(range(num_steps)): t = torch.full((xt.shape[0],), i / num_steps, device=xt.device) v = model(xt, t) xt = xt - dt * v # 反向积分 return xt
# SDE 采样 (DDPM Langevin 类型)@torch.no_grad()def sde_sample(model, xt, num_steps=50, beta_fn=None): """随机微分方程采样(DDPM 风格)。""" dt = 1.0 / num_steps for i in reversed(range(num_steps)): t = torch.full((xt.shape[0],), i / num_steps, device=xt.device)
# 预测噪声 eps = model(xt, t)
# 漂移项 + 扩散项 drift = -beta_fn(t) / 2 * xt diffusion = torch.sqrt(beta_fn(t)) * torch.randn_like(xt)
xt = xt - drift * dt + diffusion * np.sqrt(dt)
return xt6.4 从 SDE 到 ODE 的技巧
概率流对应:任何 SDE 都有一个对应的 ODE(去掉随机项后的期望轨迹)——这就是 Flow Matching 所用的。
反过来:可以先训练 SDE 版本(更稳定的训练),然后用对应的 ODE 采样(更快,更确定性)。
7. 训练与采样完整流程
7.1 完整训练代码
import torchimport torch.nn as nnfrom torch.utils.data import DataLoader
def flow_matching_train_step(model, batch, sigma_min=1e-3, sigma_max=50.0): """ 通用 Flow Matching 训练步。 支持任意路径 (通过 path_fn 指定)。 """ x0 = batch # (B, D) 真实数据
# 1. 采样时间步 t ∈ [0, 1] t = torch.rand(x0.shape[0], device=x0.device)
# 2. 采样噪声 eps = torch.randn_like(x0)
# 3. 构造路径 (可替换为任意 φ) # 默认: Rectified Flow (直线) xt = (1 - t.view(-1, 1)) * x0 + t.view(-1, 1) * eps
# 4. 解析速度场 (由 φ 的定义决定) # RF: v = ε - x0 true_v = eps - x0
# 5. 模型预测 pred_v = model(xt, t)
# 6. MSE 损失 loss = ((pred_v - true_v) ** 2).mean() return loss
def train_flow_matching(model, dataloader, epochs=100, lr=1e-4): optimizer = torch.optim.AdamW(model.parameters(), lr=lr)
for epoch in range(epochs): for batch in dataloader: batch = batch.to(device) loss = flow_matching_train_step(model, batch) optimizer.zero_grad() loss.backward() optimizer.step()
print(f"Epoch {epoch}, Loss: {loss.item():.4f}")
# 使用不同路径的示例class FlowMatchingPath: """可配置的 Flow Matching 路径。"""
@staticmethod def rectified_flow(x0, eps, t): """直线: x_t = (1-t)x_0 + t ε""" return (1 - t) * x0 + t * eps, eps - x0
@staticmethod def ve_sde(x0, eps, t, sigma_min=0.01, sigma_max=50.0): """方差爆炸 SDE 的路径。""" sigma_t = sigma_min * (sigma_max / sigma_min) ** t xt = x0 + sigma_t * eps # 速度场: dσ/dt * ε dsigma = sigma_min * (sigma_max / sigma_min) ** t * torch.log( sigma_max / sigma_min ) true_v = dsigma.view(-1, 1) * eps return xt, true_v
@staticmethod def goeginger(x0, eps, t): """GoGGinger 路径: 更稳定的插值。""" lambda_t = torch.sinh(3 * t) / torch.sinh(3) xt = (1 + lambda_t) / 2 * x0 + (1 - lambda_t) / 2 * eps true_v = 3 / 2 * (torch.cosh(3 * t) / torch.sinh(3)) * (x0 - eps) return xt, true_v7.2 推理加速技术
7.2.1 高阶 ODE 求解器
Euler 积分简单但慢。可以用更高阶的求解器:
def heun_sampler(model, num_steps=20): """ Heun 二阶方法,比 Euler 精度高。 适合 RF 的直线 ODE——因为局部截断误差 O(dt²)。 """ x = torch.randn(batch_size, dim, device=device) dt = 1.0 / num_steps
for i in reversed(range(num_steps)): t = i / num_steps t_batch = torch.full((x.shape[0],), t, device=device)
# Euler 预测 v1 = model(x, t_batch) x_mid = x - dt * v1
# Heun 校正 (用中点斜率) t_mid = (i - 0.5) / num_steps t_mid_batch = torch.full((x.shape[0],), t_mid, device=device) v2 = model(x_mid, t_mid_batch)
# 加权组合 x = x - dt * ((v1 + v2) / 2)
return x7.2.2 自适应步长
from scipy.integrate import solve_ivp
def adaptive_sampler(model, rtol=1e-5, atol=1e-6): """用 scipy 的自适应 ODE 求解器。"""
def ode_fn(t, x_flat): x = torch.tensor(x_flat.reshape(1, -1), device=device) t_batch = torch.full((1,), 1.0 - t, device=device) # 反向时间 v = model(x, t_batch) return -v.cpu().numpy().flatten() # dt/dt = -1 (反向积分)
# 从噪声开始 x0 = torch.randn(1, dim).cpu().numpy().flatten()
sol = solve_ivp( ode_fn, t_span=(0, 1), y0=x0, method="RK45", rtol=rtol, atol=atol, ) return torch.tensor(sol.y[:, -1].reshape(1, -1), device=device)7.3 一致性模型蒸馏
Flow Matching 的直线 ODE 让一致性蒸馏变得极为简单:
一致性模型 (Consistency Model) 的核心观察: 在直线路径上,同一条直线上的所有点应该映射到同一个终点()。
def consistency_distillation_step(model, student, x0, num_steps=6): """ 从教师模型蒸馏到少步学生模型。 适用于 RF 直线路径。 """ eps = torch.randn_like(x0) t = torch.rand(x0.shape[0])
# 噪声图 xt = (1 - t) * x0 + t * eps
# 教师输出 (teacher 是多步模型) with torch.no_grad(): v_teacher = model(xt, t) x0_teacher = xt - t.view(-1, 1) * v_teacher
# 学生输出 (student 是少步模型,直接预测 x0) x0_student = student(xt, t)
# 蒸馏损失: 学生应该预测和教师一样的 x0 loss = ((x0_student - x0_teacher) ** 2).mean() return loss8. Flow Matching 与 Score Matching 的关系
8.1 核心区别
| 维度 | Flow Matching | Score Matching |
|---|---|---|
| 学什么 | 向量场 | 对数密度梯度 |
| 关系 | ||
| 采样 | ODE 反向积分 | 朗之万动力学 / ODE |
| 训练目标 | MSE(简单) | 需要 Hutchinson 估计(复杂) |
| 方差 | 稳定 | 取决于噪声调度 |
8.2 数学上的精确关系
在 Rectified Flow 中,,上式化简为:
即 ,与 成正比。
9. Flow Matching 的应用版图
9.1 图像生成
Flow Matching 在图像生成中的位置:
Rectified Flow → SD3 / FLUX / MMDiT (核心训练目标) - 论文: "Scaling Rectified Flow Transformers" - 4 步采样 (FLUX Schnell) - 比 DDPM 快 10 倍以上9.2 音频生成
# AudioLDM 2 / MusicLDM 使用 Flow Matching# 声音 = 频谱图 (STFT) → 2D Flow Matching# 音乐 = 多通道频谱图 + 时序依赖9.3 3D 生成
Point-E (Nichol et al., 2022): - 3D 点云 → Flow Matching - 从随机点云 → 目标形状
DreamBooth3D: - 个性化 3D 资产生成9.4 科学计算
分子生成: - GPS: "Generative Flow Networks" (GFlowNets) - 用 Flow Matching 做贝叶斯推断
强化学习: - Q-Flow, Decision Flow Matching10. Flow Matching 训练的理论细节
10.1 损失函数的推导
从 CFM 目标出发:
其中 是设计的路径。
def cfm_loss_detailed(model, x0, eps, t): """ 完整推导的 CFM 损失,包含权重选项。 """ # 可选: 重要性采样时间步 (与 σ² 相关) lambda_t = 1.0 # 或 lambda(t)
# 路径 xt = (1 - t) * x0 + t * eps
# 速度 true_v = eps - x0
# 预测 pred_v = model(xt, t)
# 加权 MSE return (lambda_t * (pred_v - true_v) ** 2).mean()10.2 训练分布的等价性
一个深刻结论:边际流匹配目标的梯度等于条件流匹配目标的期望:
这意味着可以直接用批量平均来近似期望——这就是标准的小批量 SGD。
10.3 时间采样策略
| 时间采样 | 公式 | 适合场景 |
|---|---|---|
| 均匀 | 通用(Rectified Flow 默认) | |
| 重要性加权 | DDPM 风格路径 | |
| 噪声调度 | 与 相关 | 高分辨率生成 |
11. 完整实现:从零到 SD3
11.1 完整的 Flow Matching 模型
import mathimport torchimport torch.nn as nnimport torch.nn.functional as F
class FlowMatchingUNet(nn.Module): """简化的 Flow Matching UNet (与 DDPM 相同架构, 不同目标)。"""
def __init__(self, dim=64, channels=3): super().__init__() self.time_embed = nn.Sequential( nn.Linear(64, dim * 4), nn.SiLU(), nn.Linear(dim * 4, dim * 4), ) # ... 标准 UNet 组件 self.final = nn.Conv2d(dim, channels, 3, padding=1)
def forward(self, xt, t, cond=None): """ xt: (B, C, H, W) — 任意时间步的中间状态 t: (B,) — 时间步 ∈ [0, 1] """ # 1) 时间嵌入 t_emb = self._timestep_embedding(t * 1000, 64) t_emb = self.time_embed(t_emb)
# 2) 噪声图 h = self.init_conv(xt)
# 3) 下采样 + 中间层 + 上采样 (标准 UNet) # ... (省略中间层)
# 4) 输出速度场 v_θ(x_t, t) return self.final(h)
class FlowMatchingTransformer(nn.Module): """基于 DiT 的 Flow Matching Transformer。"""
def __init__(self, hidden_size=1024, depth=12): super().__init__() self.time_embed = TimestepEmbedder(hidden_size) self.blocks = nn.ModuleList([TransformerBlock(hidden_size) for _ in range(depth)])
def forward(self, xt, t, cond=None): """ 返回速度场 v_θ(xt, t) = ε - x0 与 DiT/MMDiT 完全兼容! """ t_emb = self.time_embed(t) h = self.patch_embed(xt)
for block in self.blocks: h = block(h, t_emb)
return self.unpatchify(self.final_layer(h))11.2 与 MMDiT 的对应
# MMDiT (SD3/FLUX) 中的 Flow Matching# 1) backbone: DiT → MMDiT (双流)# 2) 路径: DDPM → Rectified Flow (直线)# 3) 目标: 噪声 ε → 速度 v = ε - x0
# MMDiT 的 forward 就是:def mmdit_forward(xt, t, txt_tokens): v_pred = mmdit(xt, t, txt_tokens) # 预测速度场 return v_pred
def mmdit_training_loss(xt, x0, eps, t, txt_tokens): true_v = eps - x0 # 速度场 (解析) pred_v = mmdit_forward(xt, t, txt_tokens) return F.mse_loss(pred_v, true_v) # Flow Matching 目标一图总结:
Flow Matching (理论框架)│├── 路径选择 ──→ Rectified Flow (直线, OT 最优)│├── 网络架构 ──→ DiT / MMDiT│└── 训练目标 ──→ MSE(预测速度, 真实速度)SD3 / FLUX = Rectified Flow + MMDiT + CFG + 蒸馏
12. 局限与开放问题
12.1 当前局限
| 问题 | 描述 |
|---|---|
| 直线陷阱 | RF 直线路径在高维空间未必是全局最优传输 |
| 分布外泛化 | 学到的向量场在训练分布外可能不可靠 |
| ** ODE 数值误差** | 少步采样时 ODE 积分误差累积 |
| 条件生成复杂度 | CFG 仍需双倍计算(cond + uncond) |
12.2 开放研究方向
理论: ├── 最优传输路径的全局最优性证明 ├── 高维最优传输的计算高效近似 └── Flow Matching 与 W-GAN 的理论联系
实践: ├── 任意到任意的分布传输 (任意起点 → 任意终点) ├── 多模态 Flow Matching (同时建模多个分布) ├── Flow Matching + RLHF (对齐) └── 时空 Flow (视频、3D)13. 总结
13.1 核心要点
| 维度 | 关键要点 |
|---|---|
| 核心思想 | 学向量场 ,通过 ODE 把噪声推向数据 |
| 核心定理 | 条件流匹配 (CFM) = 边际流匹配 (FM),无需 KL 散度 |
| 最优传输 | Rectified Flow 是 OT 最优路径 → 最短 ODE 轨迹 |
| 目标函数 | (简单 MSE) |
| ODE vs SDE | ODE 快速采样,SDE 稳定训练 |
| 与 DDPM | 与 成正比,Rectified Flow 让关系最简 |
| 与 MMDiT | MMDiT + RF = SD3 / FLUX 的训练基础 |
13.2 一句话总结
Flow Matching 用”向量场 + ODE”的语言,把扩散模型、统一在最简洁的 MSE 目标下——而 Rectified Flow 的直线路径,则是这条理论框架下最优传输路径的工程实现,也是 SD3/FLUX/MMDiT 高质量、快推理的数学保证。
13.3 推荐学习资源
论文: - Flow Matching (Lipman et al., 2022): "Flow Matching for Causal Inference" - Conditional Flow Matching (Tong et al., 2023) - Rectified Flow (Liu et al., 2022): "Flow Straight and Fast" - RF-LR (2024): "Scaling Rectified Flow for Image Understanding" (SD3 论文) - Consistency Models (Song et al., 2023)
代码: - facebookresearch/flow_matching (官方实现) - stabilityai/sd3-ref (Rectified Flow + MMDiT) - black-forest-labs/FLUX (FLUX.1)
扩展: - GFlowNets: 离散的 Flow Matching - Diffusion Schrödinger Bridge: 最优传输的另一种视角一句话总结:Flow Matching 把”扩散模型”从工程技巧升华为优雅理论——它的核心定理证明”简单 MSE = 最优生成”,而 Rectified Flow 的直线路径让这一理论在 SD3/FLUX 中落地成工程现实。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!

