背景搭建,这个是扩散模型的基本。
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
每一步都要:
输入当前 $x_t$
模型预测噪声$\epsilon_\theta(x_t,t)$
用解析公式计算更干净的 $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