生成 (Generation)
生成什么?
从根本上说,任何类型的数据都可以被表示为一个高维向量 (Vector)。生成模型的目标就是创造这些向量。
例如,以下这些看似复杂的数据,都可以被视为特定形式的向量:
图像
一个 $H \times W \times 3$ 的像素矩阵可以被展平为一个长向量。
$z \in \mathbb{R}^{H \times W \times 3}$视频
一个 $T \times H \times W \times 3$ 的张量同样可以被视为一个更高维的向量。
$z \in \mathbb{R}^{T \times H \times W \times 3}$分子结构
N个原子在3D空间中的坐标可以被连接成一个向量。
$z \in \mathbb{R}^{3 \times N}$希望生成的样本有怎样的性质?
我们希望生成的样本 $z$ 看起来像是从真实数据的概率分布 $p_{\text{data}}$ 中采样得到的:
生成即采样!
因此,问题转化为:如何对真实数据分布 $p_{\text{data}}$ 进行建模?我们所拥有的只是从该分布中采样出的一组有限样本:
从噪声到数据分布
直接对复杂的数据分布 $p_{\text{data}}$ 建模非常困难。我们的策略是“积跬步以至千里”。
我们从一个最简单的分布——纯粹的噪声分布(标准正态分布)开始:
为了学习从初始分布 $p_{\text{init}}$ 到目标数据分布 $p_{\text{data}}$ 的变换,我们需要模拟数据点的“流动”。什么样的数学工具能模拟这种“流动”或“演化”呢?
微分方程!
流模型 (Flow Models)
我们先介绍一些基本概念,这些概念非常简单。
1. 轨迹 (Trajectory)
描述一个点在一段时间内的路径。某个时间点,点在哪里?
$X: [0,1] \to \mathbb{R}^d, \quad t \mapsto X_t$2. 向量场 (Vector Field)
也叫速度场,定义了空间中每个点在特定时间的速度。某时某地,点往哪跑?
$u: \mathbb{R}^d \times [0,1] \to \mathbb{R}^d, \quad (x,t) \mapsto u_t(x)$3. 常微分方程 (ODE)
将点的瞬时速度与向量场联系起来。位置的导数是速度。
$\frac{d}{dt}X_t = u_t(X_t)$4. 初始条件 (Initial Condition)
定义了轨迹的起点。
$X_0 = x_0$然而,我们想要的是一个统一的描述,能处理任意初始条件。这就引出了流函数的概念。
5. 流函数 (Flow Function)
流函数 $\psi_t(x_0)$ 是给定不同初始条件 $x_0$ 的轨迹集合。它描述了从任意出发点开始的完整流动。
$\psi: \mathbb{R}^d \times [0,1] \to \mathbb{R}^d, \quad (x_0,t) \mapsto \psi_t(x_0)$流函数需要满足两个条件:
- 满足ODE: $\frac{d}{dt}\psi_t(x_0) = u_t(\psi_t(x_0))$
- 满足初始条件: $\psi_0(x_0) = x_0$
总结:概念关系
上述概念之间的关系非常清晰:向量场决定ODE;给定初始条件,ODE的解是一个轨迹;而流函数是所有这些轨迹的集合。只要有了流函数,我们就能实现从任意噪声到目标数据的生成。
这个“一条龙服务”的起点是向量场,因此学习向量场就是我们的核心目标。
扩散模型 (Diffusion Models)
流模型是确定性的。如果我们想在生成过程中引入随机性,该怎么做呢?答案是使用随机微分方程 (SDE)。
随机微分方程 (SDE)
SDE在ODE的基础上增加了一个随机项:
这里出现了两个新变量:
- $\sigma_t$: 扩散系数,描述随机性的大小。
- $W_t$: 布朗运动(或维纳过程),一种随机过程,其增量服从正态分布:
$W_{t+h} = W_t + \sqrt{h}\epsilon_t, \quad \epsilon_t \sim \mathcal{N}(0, I_d)$
生成过程:模拟微分方程
至此,我们理论上已经说明,只要学会了向量场,就能实现生成。然而,微分方程通常没有解析解,需要通过数值方法模拟。下面是两种最基础的模拟方法:
流模型 (ODE): 欧拉法
$X_{t+h} = X_t + h u_t(X_t)$扩散模型 (SDE): Euler-Maruyama法
$X_{t+h} = X_t + h u_t(X_t) + \sqrt{h}\sigma_t\epsilon_t$其中 $\epsilon_t \sim \mathcal{N}(0, I_d)$
流匹配 (Flow Matching)
我们只剩下最后一个问题:如何学习向量场 $u_t^\theta(x)$?一个自然的想法是使用平方误差损失函数来匹配一个目标向量场 $u_t^{\text{target}}(x)$。
从条件路径到边缘路径
为了构建目标向量场,我们首先定义一个“条件概率路径” $p_t(x|z)$。这条路径描述了如何将初始的噪声分布 $p_{\text{init}}$ 平滑地转变为一个以特定数据点 $z$ 为中心的分布。为了确保这个过程的起点和终点正确,该路径必须满足以下两个关键的边界条件:
起点 (t=0)
在时间起点,分布必须是纯粹的噪声分布。
$p_0(\cdot|z) = p_{\text{init}}$终点 (t=1)
在时间终点,分布必须完全集中在目标数据点 $z$ 上(一个狄拉克函数)。
$p_1(\cdot|z) = \delta_z$有了这条路径,我们就可以定义一个相应的条件向量场 $u_t^{\text{target}}(x|z)$。这个向量场必须满足以下性质:如果一个粒子从初始分布 $X_0 \sim p_{\text{init}}$ 出发,并根据微分方程 $\frac{d}{dt}X_t = u_t^{\text{target}}(X_t|z)$ 进行演化,那么在任意时刻 $t$,该粒子的分布 $X_t$ 都将精确地等于我们预设的条件概率路径 $p_t(\cdot|z)$。
通过对所有真实数据 $z \sim p_{\text{data}}$ 的条件路径进行积分,我们得到了边缘概率路径 $p_t(x)$,它描述了从整个噪声分布 $p_{\text{init}}$ 到整个数据分布 $p_{\text{data}}$ 的演变。
相应的,我们也可以定义一个边缘向量场 $u_t^{\text{target}}(x)$。这个向量场被精确地构造成能驱动粒子产生我们想要的边缘概率路径 $p_t(x)$。
核心挑战
这个边缘向量场 $u_t^{\text{target}}(x)$ 的定义需要对整个数据集进行积分,这在计算上是不可行的。
解决方案:条件流匹配 (CFM)
流匹配的精妙之处在于,它证明了我们可以通过优化一个更容易计算的“条件”损失函数来间接优化那个难以处理的“边缘”损失函数。
我们定义两个损失函数:
- 边缘流匹配损失 (FM Loss): 难以计算。
$\mathcal{L}_{\text{FM}}(\theta) = \mathbb{E}_{t, x \sim p_t(x)} [||u_t^\theta(x) - u_t^{\text{target}}(x)||^2]$ - 条件流匹配损失 (CFM Loss): 容易计算。
$\mathcal{L}_{\text{CFM}}(\theta) = \mathbb{E}_{t, z \sim p_{\text{data}}, x \sim p_t(\cdot|z)} [||u_t^\theta(x) - u_t^{\text{target}}(x|z)||^2]$
关键定理
两个损失函数的梯度是相等的!
这意味着我们可以通过最小化容易计算的CFM损失来达到我们的目标。这解决了计算不可行的问题。
关键定理证明概要
下面简述证明过程,展示 $\mathcal{L}_{\text{FM}}(\theta)$ 和 $\mathcal{L}_{\text{CFM}}(\theta)$ 只相差一个与 $\theta$ 无关的常数。
-
展开 $\mathcal{L}_{\text{FM}}(\theta)$:
将平方项展开,并将不依赖于 $\theta$ 的项分离为常数 $C_1$。
$\mathcal{L}_{\text{FM}}(\theta) = \mathbb{E}[||u_\theta(x)||^2 - 2u_\theta(x)^T u_t^{\text{target}}(x)] + C_1$其中 $C_1 = \mathbb{E}[||u_t^{\text{target}}(x)||^2]$
-
变换交叉项:
通过积分变换,可以将边缘期望转换为条件期望。
$\mathbb{E}[u_\theta(x)^T u_t^{\text{target}}(x)] = \mathbb{E}[u_\theta(x)^T u_t^{\text{target}}(x|z)]$ -
代数重组 (补全平方):
将变换后的交叉项代回,并通过“加一项减一项”的方式来补全平方,最终得到CFM损失函数。
$\mathbb{E}[||u_\theta(x)||^2 - 2u_\theta(x)^T u_t^{\text{target}}(x|z) + ||u_t^{\text{target}}(x|z)||^2] - \mathbb{E}[||u_t^{\text{target}}(x|z)||^2] + C_1$上式的第一部分就是 $\mathcal{L}_{\text{CFM}}(\theta)$,后两部分是与 $\theta$ 无关的常数。
完整流程
训练
1. 采样 $t, z, x$
2. 计算 $\mathcal{L}_{\text{CFM}}(\theta)$
3. 优化得到向量场 $u_t^\theta$
生成
1. 采样初始噪声 $x_0$
2. 用 $u_t^\theta$ 模拟微分方程
3. 模拟到 $t=1$ 得到生成样本
分数匹配 (Score Matching)
分数匹配是与流匹配密切相关的概念,是理解扩散模型的另一条路径。这里的“分数”指的是对数概率的梯度。
- 条件分数: $\nabla \log p_t(x|z)$
- 边缘分数: $\nabla \log p_t(x) = \int \nabla \log p_t(x|z) \frac{p_t(x|z)p_{\text{data}}(z)}{p_t(x)} dz$
与流匹配类似,直接匹配边缘分数是困难的,因此我们定义相应的损失函数:
- 边缘分数匹配损失 (SM Loss): 难以计算。
$\mathcal{L}_{\text{SM}}(\theta) = \mathbb{E}_{t, x \sim p_t(x)} [||s_t^\theta(x) - \nabla\log p_t(x)||^2]$ - 条件分数匹配损失 (CSM Loss): 容易计算。
$\mathcal{L}_{\text{CSM}}(\theta) = \mathbb{E}_{t, z \sim p_{\text{data}}, x \sim p_t(\cdot|z)} [||s_t^\theta(x) - \nabla\log p_t(x|z)||^2]$
关键定理
同样地,这两个损失函数的梯度是相等的:
分数匹配对于扩散模型至关重要,因为SDE的演化同时依赖于向量场和分数。一个重要的定理(Fokker-Planck方程)表明,SDE的概率密度演化如下:
这意味着,要实现扩散模型的生成,我们既需要学习向量场 $u_t$,也需要学习分数 $\nabla \log p_t$。那我们是不是需要分别训练两个模型呢?答案是不一定。
在高斯概率路径这种最常用的情形下,两者可以相互转换,不需要分别训练。
例子:高斯概率路径
高斯概率路径是我们最常用的路径,它极大地简化了问题,并统一了流匹配和分数匹配。
定义
条件概率路径被定义为一个高斯分布:
其中参数需要满足边界条件:$\alpha_0=0, \beta_0=1$ 和 $\alpha_1=1, \beta_1=0$。
采样与损失函数推导
在训练的每一步,我们通过以下方式采样来计算损失函数:
- 采样时间 $t \sim \text{Unif}[0,1]$
- 从数据集中采样一个真实数据点 $z \sim p_{\text{data}}$
- 采样一个标准正态噪声 $\epsilon \sim \mathcal{N}(0, I_d)$
- 根据高斯路径定义,构造出在时间 $t$ 的样本点 $x_t = \alpha_t z + \beta_t \epsilon$
流匹配 (CFM)
对于高斯路径,其对应的条件向量场可以通过求解微分方程得到,其解的形式为:
代入CFM损失函数,并用 $x_t = \alpha_t z + \beta_t \epsilon$ 替换:
当选择线性插值 $\alpha_t = t, \beta_t = 1-t$ 时,$\dot{\alpha}_t=1, \dot{\beta}_t=-1$,损失函数变得异常简单:
这个简单的损失函数正是 Stable Diffusion 3 等模型的原理!
分数匹配 (CSM)
对于高斯路径,条件分数的计算非常直接:
代入CSM损失函数:
用 $x_t = \alpha_t z + \beta_t \epsilon$ 替换,并令 $s_t^\theta(x) = -\frac{\epsilon_t^\theta(x)}{\beta_t}$ (忽略常数),我们得到:
这个式子表明我们本质上是在预测噪声 $\epsilon$,这就是大名鼎鼎的 DDPM 的原理!
高斯路径下的大一统
在高斯路径下,条件向量场和条件分数都是 $x$ 和 $z$ 的线性组合,因此它们可以相互转换。这解释了为什么早期的扩散模型可以仅用分数匹配来表述。然而,流匹配是一个更通用的框架,因为它不局限于高斯路径。
补充说明:新旧术语对比
本教程提供了一套最现代、最统一的框架来理解流匹配和扩散模型。为了帮助理解文献,这里对一些新旧术语进行对比,并解释其演进过程。
1. 离散时间 vs. 连续时间
旧方法 (离散时间)
想象一下,把一张清晰的图片变模糊,就像让它一步一步地走下 1000 级台阶,每一步都增加一点噪声。这个过程是固定的、分立的。
缺点: 训练前必须定好总步数(台阶数不能变)。更重要的是,用来指导模型学习的“损失函数”是一个被称为 ELBO 的近似值(证据下界),它只是我们真正想优化的目标的“下限”,不够精确。
新方法 (连续时间)
后来的研究者发现,可以用微分方程 (SDE/ODE) 来描述这个过程。这就不再是走台阶,而是顺着一个平滑的滑梯向下滑。
优点: 这个过程是连续的。最关键的突破是,之前那个近似的 ELBO 在这个框架下变成了精确的等式!这使得理论在数学上更“干净”。同时,模型训练好后,我们可以自由选择从滑梯的哪个位置开始滑、滑多快(即灵活控制生成过程),实践性更强。
2. 前向过程 vs. 概率路径
旧术语 (前向过程, Forward Process)
这特指早期模型中那条具体的、将数据变成高斯噪声的路线。它是一个具体的随机微分方程 (SDE)。
问题: 这个词会带来误解。首先,我们在训练时并没有真的去模拟(simulate)这个过程,而是直接用公式跳到任意时间点进行采样。其次,这个过程理论上要花无穷时间才能走到终点(纯噪声)。
新术语 (概率路径, Probability Path)
这是一个更通用、更抽象的概念,就像一张地图。它不仅仅描述从数据到噪声这一条路,而是可以描述任何两个概率分布之间的演变路径。
优点: “前向过程”只是这张地图上的一条特定路线(高斯概率路径)。使用“概率路径”这个词,框架变得更通用,可以容纳更多样的模型(如流匹配),也避免了上述的误解。
3. 时间反转 vs. 求解Fokker-Planck方程
旧思路 (时间反转, Time-Reversal)
最开始的理论非常精巧,它通过严格的数学推导,找到了加噪过程SDE的“时间反转”形式。这就像要求你必须严格按照来时的脚印原路返回。
问题: 在生成图像这类任务中,我们只关心最终生成的清晰图像,并不在乎返回的路径是否是那个“唯一的、真实”的逆过程。严格遵循时间反转不仅复杂,有时效果还不好。
新思路 (求解Fokker-Planck方程)
现代方法更加直接。它们利用一个更基本的物理/数学定律——Fokker-Planck方程——来直接构建“去噪”过程。
优点: 这就像打开了GPS直接导航到目的地。它告诉你每个位置最快的方向,而不管你来时是怎么走的。这种方法更直接、更灵活,也构成了各种高效采样方法(ODE采样器)的理论基础。