Papers

04 · Rectified Flow 与 Flow Matching 入门

这一页从概率传输的直觉写到数学形式,再对照 score-based 去噪和 diffusion_engine 的实现。

1. 从"去噪"到"概率传输"

传统 DDPM 从去噪出发:前向扩散过程写作 x_t = α_t·x_0 + σ_t·ε,模型训练为预测噪声 ε,反向过程再用概率流 ODE 或 Langevin SDE 求解。

Rectified flow 换个角度看:这是两个概率分布之间的传输问题。

给定数据分布 p_data(如所有自然图像的分布)和噪声分布 p_noise(如 N(0,I)),rectified flow 要找到一条从前者到后者的"最直"的流动路径。沿这条路径,概率质量可以从一个分布被"推送"到另一个分布。

2. 直线流动

Rectified flow 的起点是一个简单的事实:如果你知道某张图 x_0 和某个噪声 x_1 是"配对"的,那它们之间的直线就是最好的路径:

x_t = (1−t)·x₀ + t·x₁ , t ∈ [0,1]

在 t=0 时,x_t 是数据;在 t=1 时,x_t 是噪声。(注意:本文档中 t=0 为数据,t=1 为噪声,与 SD3 论文和 diffusion_engine 的实现一致。)

沿这条直线的速度场(vector field)就是常数:

v(x_t, t) = dx_t/dt = x₁ − x₀

训练目标:学习一个神经网络 v_θ(x_t, t),使它在 (x_t, t) 处的输出接近条件期望:

v_θ(x_t, t) ≈ 𝔼[x₁ − x₀ | X_t = x_t]

训练目标所需数据:这个目标不需要知道任意时刻的 score function 或噪声水平,只需要"数据-噪声"配对;配对可以通过对 p_data 和 p_noise 独立采样获得。

3. Rectified Flow 的训练(概览,不在本项目中实现)

虽然 diffusion_engine 不实现训练,但理解训练有助于理解推理:

# 每次训练迭代 x₀ ~ p_data # 一张真实图片 x₁ ~ N(0, I) # 一个随机噪声 t ~ Uniform[0,1] # 随机时间点 x_t = (1−t)·x₀ + t·x₁ # 线性插值 loss = ‖v_θ(x_t, t) − (x₁ − x₀)‖² # 回归目标向量场

与 DDPM 的差异:DDPM 的 loss 是 ‖ε_θ(x_t, t) − ε‖²,其中 x_t 的分布取决于 α_t/σ_t schedule。Rectified flow 的 x_t 是线性插值,t 服从均匀分布,训练目标更直接。

4. Rectified Flow 的推理

推理时,从噪声 x_1 ~ N(0,I) 出发,沿 ODE 反向积分:

# 推理算法(Euler 法) x_t = 随机噪声 # t=1 for t in [1 → 0] (离散步进): v = v_θ(x_t, t) # 模型预测向量场 x_t = x_t + (t_next − t) * v # Euler 步 # x_0 即为生成结果

由于 ODE 是可逆的、确定的:

5. 与 Score-Based 去噪的系统对比

维度 Score-Based / DDPM Rectified Flow
模型预测目标 噪声 ε_θ 或 score ∇ log p_t 向量场 v_θ = x₁ − x₀
时间空间 sigma(需 log-linear 间隔) t∈[0,1](线性间隔)
前向路径 x_t = α_t·x₀ + σ_t·ε x_t = (1−t)·x₀ + t·x₁
训练 t 采样 取决于 noise schedule Uniform[0,1]
推理更新公式 x = (x − σ_t·ε_θ) / α_t 或等效 x = x + (t_next − t)·v
推理随机性 SDE 模式有噪声注入,ODE 模式确定 确定性 ODE(无噪声)
代表模型 Stable Diffusion 1.x/2.x SD3, FLUX, Sana

6. Rectified Flow 为什么"更直"

"Rectified"(矫正)的含义:

  1. 第一条流(1-Rectified Flow):用随机配对 (x_0, x_1) 训练第一个流。存在瓶颈,不同 x_0 可能匹配到同一个 x_1 导致路径交叉。
  2. 第二条流(2-Rectified Flow):用第一条流生成的 (x_0, x_1) 作为训练对,重新训练。这些路径几乎不交叉(得到"矫正"),所以 ODE 积分更直、更稳定、可以用更少的步数。

实践中,SD3/FLUX/Sana 使用 1-rectified flow(一次训练),路径通常比 DDPM 更直。2-rectified flow 理论上还能继续矫正路径,但在大规模图像生成中的收益是否超过额外训练成本仍是一个开放问题。

7. CFG 在 Vector Field 层面

与 DDPM 一致,CFG 也在 模型输出层面(不是 latent 层面)做:

v_cfg = v_uncond + s × (v_cond − v_uncond)

其中 s 是 CFG scale(通常 1.0-7.5)。s=0 退化为 unconditional,s→∞ 过度放大条件信号(失真)。

这在 rectified flow 框架下仍然有效:v_θ 虽然不再是"噪声预测",但它仍然是"从当前状态到目标的方向"。加强 v_cond 的贡献就是加强文本引导的方向。

结论:Rectified flow 将扩散生成重新定义为两个概率分布之间的最优传输问题。它用简单的线性插值路径替代 DDPM 复杂的 α_t/σ_t schedule,使得训练更稳定、推理公式极简(dx = v·dt)。CFG 仍然在向量场层面做,这与 score-based 模型一致。现代主力模型(SD3、FLUX、Sana)全部基于 rectified flow 范式。

8. 在 diffusion_engine 中的实现映射

和我的 diffusion_engine 的关系:本页描述的理论直接映射到 diffusion_engine 的以下模块:
概念diffusion_engine 文件
向量场 v_θ(x,t)core/rectified_flow.py - rectified_flow_step()
Euler ODE 积分循环core/rectified_flow.py - rectified_flow_sample()
t∈[0,1] 时间调度core/scheduler.py - RectifiedFlowScheduler
Sigma 空间调度core/scheduler.py - EulerScheduler
Timestep 嵌入core/timestep_embedding.py - sinusoidal_embedding()
Toy 演示experiments/toy_rectified_flow/

diffusion_engine 的时间参数:diffusion_engine 直接使用 rectified flow 的 t∈[0,1] 作为默认时间空间,不进行 σ 转换。上游 DiT 模型只需输出 v_θ(向量场),scheduler 直接用于 Euler 积分。这与 SD3 论文中描述的 inferencer 对齐。

9. Rectified Flow 在视频生成模型中的应用

SD3、FLUX、Sana 等文生图模型采用 Rectified Flow;不少视频模型也使用 rectified flow / flow matching:

模型 框架 推理步数 Video Latent Shape 示例 资源档位
Wan2.1-1.3B Flow Matching 50 步 (1, 16, 21, 60, 104) @ 81f×480p 极限可行 (~8.2 GB)
CogVideoX-2B DDPM / Flow Matching 50 步 (1, 4, 13, 90, 60) @ 49f×720×480 可行 (~8-9 GB)
LTX-Video 2B Flow Matching (distilled) 4~8 步 (1, 4, 15, 22, 15) @ 121f×720×480 可行 (~6 GB)
HunyuanVideo 1.5 Flow Matching 10~20 步 (distilled) (1, 16, 33, 90, 160) @ 129f×720×1280 偏紧 (需量化+offload)

视频与图像的 Flow Matching 差异

10. 延伸阅读