跳过正文
  1. 日常记录、技术札记与转载收藏。/

Flow Matching

目录

背景搭建,这个是扩散模型的基本。

Diffusion本质:学一个“从噪声还原数据”的过程
#

Diffusion建模的是:

从纯噪声 $x_T \sim \mathcal{N}(0, I)$ 一步步恢复成真实数据 $x_0$

怎么加噪声
#

把真实数据逐步加噪,直到变成高斯噪声。

逐步加噪(马尔可夫链)
#

每一步:

$q(x_t | x_{t-1}) = \mathcal{N}(x_t; \sqrt{1-\beta_t}x_{t-1}, \beta_t I)$

含义:

  • 保留一部分原始信息

  • 加一点高斯噪声

实际训练不会一步步加,而是直接采样:

$x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon$

其中:

  • $\epsilon \sim \mathcal{N}(0, I)$

  • $\bar{\alpha}_t = \prod (1-\beta_i)$

直觉理解
#

这个公式非常关键,你可以这样理解:

x_t = 原始数据 × 保留比例 + 噪声 × 扰动比例

随着 t 增大:

  • 原始信息 ↓

  • 噪声 ↑

最终:

x_T ≈ 纯噪声

怎么“去噪”(Reverse Process)
#

目标:

从 $x_t$推回 $x_{t-1}$

理论形式

真实分布:

$q(x_{t-1} | x_t)$

但它不可直接求,所以:

👉 用神经网络近似:

$p_\theta(x_{t-1} | x_t)$

实际做法:预测“噪声”
#

DDPM做了一个关键简化:

👉 不预测 $x_0$,而是预测噪声 $\epsilon$

ϵθ(xt,t)

反推 x₀(核心公式)
#

$x_0 = \frac{1}{\sqrt{\bar{\alpha}_t}}(x_t - \sqrt{1-\bar{\alpha}_t} \epsilon)$

逐步去噪(推理)
#

每一步:

$x_t$→ 预测 ε → 推回 $x_{t-1}$

循环:

T → T-1 → … → 0

👉 一般需要:

  • 50步(优化版)

  • 1000步(原始DDPM)

怎么做“监督”(最关键)
#

训练目标(标准DDPM)
#

$\mathcal{L} = \mathbb{E}_{x_0, \epsilon, t} \| \epsilon_\theta(x_t, t) - \epsilon \|^2$

训练流程
#

# 1. 采样真实数据
x0

# 2. 采样时间
t ~ Uniform(1, T)

# 3. 采样噪声
ε ~ N(0, I)

# 4. 构造带噪数据
xt = sqrt(alpha_bar)*x0 + sqrt(1-alpha_bar)*ε

# 5. 模型预测噪声
ε_pred = model(xt, t)

# 6. 做MSE
loss = ||ε_pred - ε||^2

问题
#

路径是“随机的”
#

Forward:

  • 是 stochastic process(随机过程)

Reverse:

  • 也是 stochastic

👉 不稳定


不是直接学“变化方向”
#

Diffusion学的是:

噪声 ε

而不是:

从 $x_t → x_{t-1}$ 的方向

Flow Matching(场流动力学)
#

不再用随机扩散
#

而是直接定义一条路径:

$x_t = (1 - t)x_0 + t x_1$

👉 从噪声 → 数据

$\frac{d x_t}{dt} = x_1 - x_0$

训练目标变成
#

$\mathcal{L} = \mathbb{E} \| v_\theta(x_t, t) - (x_1 - x_0) \|^2$

训练流程
#

# 假设:
# data_action: 真实专家动作 x1
# noise_action: 随机噪声动作 x0
# t: 随机时间
# xt: 路径上的中间状态
# model: 预测速度场 v_theta(xt, t, cond)

for batch in dataloader:
    # 1. 取真实数据(专家动作)
    x1 = batch["action"]                  # shape: [B, D]

    # 2. 取条件信息(图像、文本、状态等)
    cond = batch["condition"]

    # 3. 采样噪声起点
    x0 = randn_like(x1)                   # shape: [B, D]

    # 4. 采样时间 t
    t = Uniform(0, 1).sample([B, 1])      # shape: [B, 1]

    # 5. 构造中间状态 xt
    xt = (1 - t) * x0 + t * x1            # shape: [B, D]

    # 6. 构造监督目标:真实速度
    target_v = x1 - x0                    # shape: [B, D]

    # 7. 模型预测速度
    pred_v = model(xt, t, cond)           # shape: [B, D]

    # 8. 计算损失
    loss = mse_loss(pred_v, target_v)

    # 9. 反向传播
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

采样时间t

意思是:

  • 每个样本随机选一个时刻

  • 训练时不走完整条路径

  • 只监督路径上的一个随机位置

这是 Flow Matching 很高效的地方。

Flow Matching 训练时,先采样一个真实样本 $x_1$ 和一个噪声样本$x_0$,再在它们之间随机插值得到中间状态$x_t$,并用路径的真实速度 $x_1-x_0$作为监督信号,训练模型预测该中间状态下的速度场。

对比总结
#

总览
#

传统 Diffusion
#

先把真实数据逐步加噪成高斯噪声,再训练模型学习“怎么一步步去掉噪声”。

Flow Matching
#

不再真正做“逐步加噪”,而是直接在“噪声样本”和“真实数据”之间连一条路径,训练模型学习这条路径上的运动方向。

第一部分:加噪方式对比
#

Diffusion
#

Diffusion 的 forward process 是:

$q(x_t|x_{t-1})=\mathcal{N}(\sqrt{1-\beta_t}x_{t-1}, \beta_t I)$

意思是:

  • 上一步的样本是 $x_{t-1}$

  • 这一时刻 $x_t$ 在保留一部分原信息的同时

  • 再加上一点高斯噪声

如果把很多步合起来,训练时常写成闭式:

$x_t=\sqrt{\bar{\alpha}_t}x_0+\sqrt{1-\bar{\alpha}_t}\epsilon,\quad \epsilon\sim\mathcal{N}(0,I)$

这里:

  • $x_0$ 是真实数据

  • $\epsilon$ 是随机噪声

  • $x_t$ 是“被污染后的数据”

直观理解
#

Diffusion 是真的在做:

真实数据 -> 加一点噪声 -> 再加一点噪声 -> 再加一点噪声 -> 最后变成纯噪声

所以它的“加噪”是一个逐步扩散过程

Flow Matching
#

Flow Matching 常见写法是:

$x_t=(1-t)x_0+t x_1$$\quad t\in[0,1]$

这里:

  • $x_0$噪声样本

  • $x_1$:真实数据

  • $x_t$:两者之间的插值点

它不是:

真实数据一步步被污染

而是:

先拿一个噪声起点 x0

再拿一个真实终点 x1

然后在两者之间随便取一个中间点 xt

所以 Flow Matching 没有真正意义上的“逐步加噪”。

它更准确地说是:构造噪声到数据的中间状态

加噪方式本质区别
#

Diffusion
#

  • 从真实数据出发

  • 逐步加入随机高斯噪声

  • $x_t$ 是一个随机变量

  • 本质上定义的是一个条件分布

Flow Matching
#

  • 直接采样一个噪声起点和一个真实终点

  • 通过插值得到中间状态

  • xtx_txt 是一条路径上的确定点

  • 本质上定义的是一条轨迹

第二部分:建模对象对比
#

Diffusion 建模的是什么
#

Diffusion 表面上是在预测噪声:

$\epsilon_\theta(x_t,t)$

但本质上,它建模的是:

数据分布的逆扩散过程

也就是:

如何从带噪样本 xt 恢复到更干净的样本 xt-1

所以它是分布建模

更严格地说,它对应的是一个随机过程,通常写成 SDE(随机微分方程)。

Flow Matching 建模的是什么
#

Flow Matching 直接学习一个向量场:

$v_\theta(x_t,t)$

它希望模型输出:

在当前时刻 t、当前状态 $x_t$ 下,应该朝哪个方向移动

所以它建模的不是“噪声分布”,而是:

噪声到数据的连续运动规律

这本质上是轨迹建模 / 动力学建模

更严格地说,它对应一个 ODE(常微分方程):

$\frac{dx}{dt}=v_\theta(x,t)$

一句话
#

Flow Matching 学的是:

“当前这个点,下一步该往哪里走”

Diffusion
#

  • 建模对象:逆扩散分布

  • 数学本质:SDE

  • 学的是:噪声 / score / 等价参数化

Flow Matching
#

  • 建模对象:连续轨迹上的速度场

  • 数学本质:ODE

  • 学的是:速度 / 方向

第三部分:去噪方式对比
#

Diffusion 怎么去噪
#

Diffusion 推理时从纯噪声开始:

$x_T\sim \mathcal{N}(0,I)$

然后一步一步往回推:

xT -> xT-1 -> xT-2 -> … -> x0

每一步都要:

  1. 输入当前 $x_t$

  2. 模型预测噪声$\epsilon_\theta(x_t,t)$

  3. 用解析公式计算更干净的 $x_{t-1}$

典型形式可以理解为:

$x_{t-1}=\text{denoise}(x_t,\epsilon_\theta(x_t,t))$

特点
#

  • 多步迭代

  • 每一步都在“去掉一点噪声”

  • 生成过程比较慢

  • 常常需要很多步


Flow Matching 怎么“去噪”
#

Flow Matching 推理时也是从噪声开始,但它不是“去噪预测”,而是“沿着速度场前进”。

假设初始是:

$x(0)∼N(0,I)$

然后按时间积分:

$\frac{dx}{dt}=v_\theta(x,t)$

离散化后,比如 Euler:

$x_{t+\Delta t}=x_t+\Delta t \cdot v_\theta(x_t,t)$

或者如果时间方向反着定义,也可能写成减号,取决于起点终点约定。

直观理解
#

它不是:

当前有多少噪声,我减掉多少

而是:

当前在路径的这个位置,我该沿哪个方向走

特点
#

  • 也是多步

  • 但每一步是“积分运动”

  • 不是“预测噪声并去掉”

  • 更像连续控制

去噪方式本质区别
#

Diffusion
#

  • 方式:逐步去噪

  • 每一步:预测噪声,再还原

  • 本质:逆扩散采样

Flow Matching
#

  • 方式:沿向量场积分

  • 每一步:预测速度,再更新位置

  • 本质:解 ODE

第四部分:训练监督方式对比
#

Image
Image

相关文章