从训练目标出发理解现代生成模型:Likelihood 到 Flow Matching

2026年8月23日 · 2528 字 · 6 分钟

以下内容整理自我与 ChatGPT 的对话,本来只是对 flow matching 原理解析,一步一步探究到了现代生成模型的基本设计目标,更进一步扩展到了其他生成模型。一些个人的疑惑得到解答,由此记录一下,方便以后翻阅查看。

一、生成模型到底在优化什么?

1.1 全文推进图

$$ p_\theta(x)\approx p_{\mathrm{data}}(x) $$
$$ \Downarrow $$
$$ \text{如何衡量两个分布接近?} $$
$$ \Downarrow $$
$$ \text{为什么 KL 会引出 Maximum Likelihood?} $$
$$ \Downarrow $$
$$ \text{Likelihood 要求模型能计算什么?} $$
$$ \Downarrow $$
$$ \text{为什么概率必须归一化?} $$
$$ \Downarrow $$
$$ \text{如果直接建模 density 很难,有没有别的量可以学?} $$
$$ \Downarrow $$
$$ \text{Density}\rightarrow\text{Score}\rightarrow\text{Velocity} $$

1.2 生成模型的终极目标:学习数据分布

我们手里通常只有有限训练样本:

$$ x_1,x_2,\dots,x_N $$

但生成模型的基本假设是,这些样本并不是孤立出现的,而是来自某个真实数据分布:

$$ x_i\sim p_{\mathrm{data}}(x) $$

比如图像生成里,训练集中的每张图片都可以看成从“自然图像分布”里采样出来的一个点。语言模型里,一段文本可以看成从“人类文本分布”里采样出来的一个序列。

我们真正想学的不是训练集本身,而是训练集背后的分布。

如果模型只记住训练样本,那么它不能真正泛化。生成模型希望得到一个参数化分布:

$$ p_\theta(x) $$

使得:

$$ p_\theta(x)\approx p_{\mathrm{data}}(x) $$

这句话背后有两个层次:

  1. 采样层面:从 $p_\theta$ 采样出来的 $x$ 看起来像真实数据;
  2. 分布层面:$p_\theta$ 在整个空间中分配概率质量的方式接近 $p_{\mathrm{data}}$。

“生成得像”只是表象,分布接近才是根本。


1.3 如何衡量两个分布是否接近:KL 与 Likelihood

现在问题变成:怎样衡量 $p_\theta$ 和 $p_{\mathrm{data}}$ 是否接近?

一个常用选择是 KL divergence:

$$ D_{\mathrm{KL}}(p_{\mathrm{data}}\|p_\theta) = \mathbb E_{x\sim p_{\mathrm{data}}} \left[ \log \frac{p_{\mathrm{data}}(x)}{p_\theta(x)} \right] $$

把它拆开:

$$ D_{\mathrm{KL}}(p_{\mathrm{data}}\|p_\theta) = \mathbb E_{p_{\mathrm{data}}}[\log p_{\mathrm{data}}(x)] - \mathbb E_{p_{\mathrm{data}}}[\log p_\theta(x)] $$

第一项:

$$ \mathbb E_{p_{\mathrm{data}}}[\log p_{\mathrm{data}}(x)] $$

只由真实数据分布决定,和模型参数 $\theta$ 无关。因此,当我们优化 $\theta$ 时,最小化 KL 等价于最大化第二项:

$$ \min_\theta D_{\mathrm{KL}}(p_{\mathrm{data}}\|p_\theta) \iff \max_\theta \mathbb E_{x\sim p_{\mathrm{data}}} [\log p_\theta(x)] $$

真实的数据分布未知,但我们有样本,于是用训练集平均近似期望:

$$ \mathbb E_{x\sim p_{\mathrm{data}}}[\log p_\theta(x)] \approx \frac1N\sum_{i=1}^N \log p_\theta(x_i) $$

这就得到 Maximum Likelihood Estimation:

$$ \theta^* = \arg\max_\theta \sum_{i=1}^N \log p_\theta(x_i) $$

如果改写成最小化 loss,就是 Negative Log-Likelihood:

$$ \mathcal L_{\mathrm{NLL}} = - \sum_{i=1}^N \log p_\theta(x_i) $$

所以 likelihood 来自一个明确的分布匹配思想:


1.4 Likelihood 到底是什么?

同一个表达式:

$$ p_\theta(x) $$

可以有两种不同的看法。

第一种,固定参数 $\theta$,把它看成 $x$ 的函数:

$$ x\mapsto p_\theta(x) $$

这时它是 probability density,也就是模型给不同数据点分配的密度。

第二种,固定观测数据 $x$,把它看成 $\theta$ 的函数:

$$ \theta\mapsto p_\theta(x) $$

这时它就是 likelihood:

$$ L(\theta;x)=p_\theta(x) $$

也就是说:

观察方式固定什么变化什么问的问题
Probability density$\theta$$x$在这个模型下,哪些数据更可能出现?
Likelihood$x$$\theta$哪个参数更能解释这条观测数据?

举一个极简单的例子。假设我们用 Bernoulli 分布建模一次抛硬币结果:

$$ p_\theta(x=1)=\theta,\qquad p_\theta(x=0)=1-\theta $$

如果观测到的数据是 $x=1$,那么:

$$ L(\theta;x=1)=p_\theta(1)=\theta $$

显然 $\theta$ 越大,观测到正面的 likelihood 越高。

如果观测到十次里有八次正面、两次反面:

$$ \log L(\theta) = 8\log\theta+2\log(1-\theta) $$

最大化它会得到 $\theta=0.8$。MLE 的直觉是:选择最能解释已发生数据的参数。

1.4.1 NLL 与 Cross Entropy 的关系

对单个样本,NLL 是:

$$ \mathcal L_{\mathrm{NLL}}(x) = - \log p_\theta(x) $$

如果是分类问题,真实标签是 one-hot 分布 $q(y)$,模型预测分布是 $p_\theta(y|x)$,交叉熵是:

$$ H(q,p_\theta) = - \sum_y q(y)\log p_\theta(y|x) $$

因为 one-hot 标签只在真实类别 $y_{\mathrm{true}}$ 上等于 1,所以:

$$ H(q,p_\theta) = - \log p_\theta(y_{\mathrm{true}}|x) $$

这正是 NLL。

$$ \text{one-hot 分类任务里的 Cross Entropy} = \text{真实类别的 Negative Log-Likelihood} $$

语言模型里的 token prediction 也是一样。对每一个位置 $t$,模型输出:

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

真实 token 是 $x_t^{\mathrm{true}}$,交叉熵就是:

$$ - \log p_\theta(x_t^{\mathrm{true}}|x_{<t}) $$

所以常说的语言模型 CE loss,本质就是 token 级别的 NLL。


1.5 为什么一个概率模型必须归一化?

概率分布必须满足总概率为 1。

离散情况:

$$ \sum_x p(x)=1 $$

连续情况:

$$ \int p(x)\,dx=1 $$

这不是形式主义,而是概率的定义。如果一个函数没有归一化,它只能表示相对权重,不能表示真正概率。

例如有两个事件 $A,B$,某个模型给出:

$$ w(A)=20,\qquad w(B)=10 $$

这只能说明 $A$ 的权重是 $B$ 的两倍。要变成概率,必须除以总权重:

$$ p(A)=\frac{20}{20+10}=\frac23,\qquad p(B)=\frac{10}{20+10}=\frac13 $$

只有这样,才有:

$$ p(A)+p(B)=1 $$

1.5.1 为什么 Likelihood 特别依赖归一化?

假设模型只输出一个未归一化分数:

$$ \tilde p_\theta(x) $$

如果不要求归一化,那么我们可以把所有分数整体乘以 1000:

$$ \tilde p_\theta'(x)=1000\tilde p_\theta(x) $$

所有数据点之间的相对比例完全没变,但每个训练样本的“likelihood”都变大了:

$$ \log \tilde p_\theta'(x) = \log \tilde p_\theta(x)+\log 1000 $$

如果允许这样做,训练目标就会变得没有意义。模型可以靠整体放大分数来无限提高目标,而不是改变分布形状。

因此,likelihood modeling 必须要求 $p_\theta(x)$ 是一个真正的概率密度:

$$ p_\theta(x) = \frac{\tilde p_\theta(x)}{Z_\theta} $$

其中:

$$ Z_\theta = \int \tilde p_\theta(x)\,dx $$

这个 $Z_\theta$ 就是 normalization constant。它把相对权重变成真正概率。


二、显式概率建模:从归一化困难到可计算 Likelihood

2.1 最直接的概率模型:Energy-Based Model

一种最直接的想法是:让神经网络给每个 $x$ 一个 energy:

$$ E_\theta(x) $$

energy 越低,表示这个数据越可能。于是可以定义未归一化密度:

$$ \tilde p_\theta(x)=e^{-E_\theta(x)} $$

但它还不是概率分布。要变成概率密度,必须归一化:

$$ p_\theta(x) = \frac{e^{-E_\theta(x)}}{Z_\theta} $$

其中:

$$ Z_\theta = \int e^{-E_\theta(x)}\,dx $$

这就是 partition function。

2.1.1 一维例子:为什么 $Z$ 很关键?

假设:

$$ E(x)=\frac{(x-1)^2}{8} $$

那么:

$$ e^{-E(x)} = \exp\left(-\frac{(x-1)^2}{8}\right) $$

看起来像一个 Gaussian,但它还不是完整概率密度。真正的归一化常数是:

$$ Z=\int_{-\infty}^{\infty} \exp\left(-\frac{(x-1)^2}{8}\right)\,dx = 2\sqrt{2\pi} $$

所以:

$$ p(x) = \frac{1}{2\sqrt{2\pi}} \exp\left(-\frac{(x-1)^2}{8}\right) $$

如果不知道 $Z$,就不知道 $p(3)$ 到底是多少。

EBM 的困难在于:在图像、语言等高维空间里,

$$ Z_\theta = \int e^{-E_\theta(x)}\,dx $$

通常极难计算。

这里出现一个分叉:

$$ \text{如何既表达复杂分布,又避免难算的全局 normalization?} $$

接下来会看到两类思路:

  • Autoregressive 和 Normalizing Flow:设计一种天然归一化、可计算 likelihood 的模型;
  • Score Matching 和 Diffusion:不直接学习 density,而是学习 $\nabla_x\log p(x)$ 这样的局部信息。

2.2 第一条路线:Autoregressive Model

Autoregressive Model 基于概率链式法则:

$$ p(x_1,\dots,x_T) = \prod_{t=1}^T p(x_t|x_{<t}) $$

例如:

$$ p(x_1,x_2,x_3) = p(x_1)p(x_2|x_1)p(x_3|x_1,x_2) $$

这不是近似,而是概率论的恒等式。自回归模型做的事情,是用神经网络去参数化每一个条件分布:

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

2.2.1 为什么自回归天然归一化?

考虑两个离散变量:

$$ p(x_1,x_2)=p(x_1)p(x_2|x_1) $$

对所有可能的 $(x_1,x_2)$ 求和:

$$ \sum_{x_1,x_2}p(x_1)p(x_2|x_1) $$

先对 $x_2$ 求和:

$$ = \sum_{x_1} p(x_1) \underbrace{ \sum_{x_2}p(x_2|x_1) }_{=1} $$

得到:

$$ = \sum_{x_1}p(x_1)=1 $$

所以:

$$ \text{局部 conditional normalization} \Rightarrow \text{全局 joint normalization} $$

对于长度为 $T$ 的序列也是一样。只要每一个条件分布 $p(x_t|x_{

自回归模型不需要计算高维全局积分 $Z_\theta$,而是把全局归一化分解成一连串局部归一化。


2.3 Autoregressive 的 Loss 为什么就是 Likelihood?

自回归模型定义:

$$ p_\theta(x_1,\dots,x_T) = \prod_{t=1}^T p_\theta(x_t|x_{<t}) $$

取 log:

$$ \log p_\theta(x_1,\dots,x_T) = \sum_{t=1}^T \log p_\theta(x_t|x_{<t}) $$

所以序列的 NLL 是:

$$ - \log p_\theta(x_1,\dots,x_T) = - \sum_{t=1}^T \log p_\theta(x_t|x_{<t}) $$

而 token 级别的 cross entropy 正是:

$$ \mathcal L_t = - \log p_\theta(x_t^{\mathrm{true}}|x_{<t}) $$

因此:

$$ \text{Autoregressive token CE} = \text{sequence NLL 的逐项分解} $$

2.3.1 Teacher Forcing 为什么自然出现?

训练时我们计算的是:

$$ p_\theta(x_t^{\mathrm{data}}|x_{<t}^{\mathrm{data}}) $$

也就是说,在第 $t$ 个位置预测真实 token 时,条件本来就应该是真实 prefix。

所以 teacher forcing 不是额外加入的技巧,而是 MLE 对自回归分解的直接要求。

2.3.2 一个数值例子

假设一个长度为 3 的序列中,模型给真实 token 的概率分别是:

$$ 0.8,\quad 0.5,\quad 0.25 $$

那么整个序列的 likelihood 是:

$$ 0.8\times0.5\times0.25=0.1 $$

NLL 是:

$$ -\log 0.1\approx 2.3026 $$

逐 token CE 相加:

$$ -\log0.8-\log0.5-\log0.25 = 2.3026 $$

完全一致。


2.4 第二条路线:Normalizing Flow

普通生成器通常写成:

$$ z\sim p_Z(z),\qquad x=G_\theta(z) $$

这可以直接采样,因为从 $z$ 到 $x$ 是直接的。但如果给定一个真实样本 $x$,问:

$$ p_\theta(x)=? $$

普通生成器往往回答不了。

Normalizing Flow 的设计是:让生成映射可逆。

$$ x=m_\theta(z),\qquad z=m_\theta^{-1}(x) $$

这样,给定 $x$,我们可以反推出对应的 $z$,再利用 change of variables 计算 $p_X(x)$。

这条路线的目标是:


2.5 Change of Variables:Flow 如何得到 Density

变量变换公式来自概率质量守恒。

假设:

$$ x=m(z) $$

并且 $m$ 可逆。一个很小的 $z$ 区域会被映射成一个很小的 $x$ 区域。概率质量守恒,所以:

$$ p_X(x)\,d^nx = p_Z(z)\,d^nz $$

Jacobian matrix 是:

$$ J = \frac{\partial x}{\partial z} $$

它描述局部线性变换。局部体积元的变化满足:

$$ d^nx = \left| \det \frac{\partial x}{\partial z} \right| d^nz $$

代回概率质量守恒:

$$ p_X(x) \left| \det \frac{\partial x}{\partial z} \right| d^nz = p_Z(z)d^nz $$

所以:

$$ p_X(x) = p_Z(z) \left| \det \frac{\partial x}{\partial z} \right|^{-1} $$

2.5.1 Jacobian determinant 的体积意义

如果 $J$ 把局部小体积放大了 2 倍,那么同样的概率质量被摊到 2 倍的空间里,density 就应该变成原来的一半。

一维例子最直观:

$$ x=2z+1 $$

此时:

$$ \frac{dx}{dz}=2 $$

所以:

$$ p_X(x) = \frac12 p_Z\left(\frac{x-1}{2}\right) $$

这正是“体积扩大,密度降低”。

二维里,Jacobian determinant 是局部面积缩放倍率;高维里,它是局部体积缩放倍率。

$$ |\det J| = \text{局部体积缩放倍率} $$

所以变量变换公式可以读成一句话:

$$ \text{新 density} = \frac{\text{旧 density}}{\text{局部体积放大倍数}} $$

2.6 为什么 Normalizing Flow 天然归一化?

Normalizing Flow 从一个已经归一化的 base distribution 出发:

$$ \int p_Z(z)\,dz=1 $$

然后用可逆变换搬运概率质量。

根据变量变换:

$$ p_X(x)\,dx=p_Z(z)\,dz $$

所以:

$$ \int p_X(x)\,dx = \int p_Z(z)\,dz = 1 $$

因此:

它不是先随便造一个未归一化的地形,再去算全空间积分。它是从已经合法的分布出发,通过可逆变换严格追踪体积变化,因此合法性自动保持。

这和 Energy-Based Model 的思路形成鲜明对比:

模型基本做法归一化问题
EBM先定义 $\tilde p_\theta(x)=e^{-E_\theta(x)}$需要算 $Z_\theta=\int e^{-E_\theta(x)}dx$
Normalizing Flow从已归一化 $p_Z$ 出发,用可逆变换搬运通过 Jacobian 自动保持归一化

2.7 Normalizing Flow 的 Likelihood

从变量变换公式:

$$ p_X(x) = p_Z(z) \left| \det \frac{\partial x}{\partial z} \right|^{-1} $$

取 log:

$$ \log p_X(x) = \log p_Z(z) - \log \left| \det \frac{\partial x}{\partial z} \right| $$

其中:

$$ z=m_\theta^{-1}(x) $$

所以给定真实数据 $x_{\mathrm{data}}$,Normalizing Flow 可以直接计算:

$$ \log p_\theta(x_{\mathrm{data}}) $$

于是训练目标就是 exact maximum likelihood:

$$ \mathcal L_{\mathrm{NF}} = - \log p_\theta(x_{\mathrm{data}}) $$

因此 Normalizing Flow 仍然是一条 density modeling 路线:它的模型设计服务于一个目标,即让 $p_\theta(x)$ 可计算。


三、连续概率流:CNF 如何追踪 Density

3.1 从 Normalizing Flow 到 CNF

离散 Normalizing Flow 可以看成一串可逆变换:

$$ z \rightarrow h_1 \rightarrow h_2 \rightarrow \cdots \rightarrow x $$

每一步都有一个 Jacobian determinant。把所有步骤累加起来,得到总的 log-density correction。

Continuous Normalizing Flow 把这串离散变换变成连续时间动力系统:

$$ \frac{dx_t}{dt} = v_\theta(x_t,t) $$

这里 $v_\theta$ 是一个 velocity field。它告诉你在时间 $t$、位置 $x_t$,点应该往哪里移动。

对于一个极小时间 $dt$:

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

这个小变换的 Jacobian 是:

$$ J = \frac{\partial x_{t+dt}}{\partial x_t} = I+ \frac{\partial v_\theta}{\partial x}dt $$

离散 Flow 中的 $\log|\det J|$,在连续极限下就会变成 divergence 的积分。


3.2 为什么 CNF 中 log-det 会变成 divergence?

先看一个极小时间步:

$$ x_{t+dt} = x_t+v(x_t,t)dt $$

它的 Jacobian 是:

$$ J = I+ \frac{\partial v}{\partial x}dt $$

我们需要的是 log determinant:

$$ \log\det J = \log\det\left(I+\frac{\partial v}{\partial x}dt\right) $$

当 $dt$ 很小时,有近似:

$$ \log\det(I+A\,dt) \approx \operatorname{Tr}(A)\,dt $$

令:

$$ A=\frac{\partial v}{\partial x} $$

得到:

$$ \log\det J \approx \operatorname{Tr}\left(\frac{\partial v}{\partial x}\right)dt $$

而 Jacobian 矩阵的 trace 正是 divergence:

$$ \operatorname{Tr} \left(\frac{\partial v}{\partial x}\right) = \sum_i \frac{\partial v_i}{\partial x_i} = \nabla\cdot v $$

因此一个极小时间步的体积变化是:

$$ \log\det J \approx (\nabla\cdot v)dt $$

由于 density 会和体积反向变化,所以:

$$ d\log p_t(x_t) = - (\nabla\cdot v_t(x_t))dt $$

得到 CNF 的核心公式:

$$ \frac{d}{dt}\log p_t(x_t) = - \nabla\cdot v_t(x_t) $$

3.2.1 数值例子:一维缩放 ODE

考虑一维 ODE:

$$ \frac{dx}{dt}=ax $$

解是:

$$ x_t=e^{at}x_0 $$

到 $t=1$:

$$ x_1=e^a x_0 $$

如果 $a=\log 2$,那就是:

$$ x_1=2x_0 $$

体积长度扩大 2 倍,所以 density 应该乘以 $\frac12$。

用 CNF 公式看:

$$ v(x)=ax $$

一维 divergence 就是导数:

$$ \nabla\cdot v = \frac{dv}{dx} = a $$

所以:

$$ \frac{d}{dt}\log p_t(x_t) = -a $$

从 0 积分到 1:

$$ \log p_1-\log p_0 = -a $$

因此:

$$ p_1=p_0e^{-a} $$

当 $a=\log2$:

$$ p_1=\frac12p_0 $$

这和普通 Jacobian 公式完全一致。

3.2.2 从 continuity equation 推导同一个结论

还有另一个视角:概率质量守恒。

设 $p_t(x)$ 是时刻 $t$ 的 density,$v_t(x)$ 是 velocity。单位时间穿过某个位置的 probability flux 是:

$$ j_t(x)=p_t(x)v_t(x) $$

如果一个小区域内的概率质量减少,一定是因为概率流从边界流出;如果增加,一定是因为流入。因此有 continuity equation:

$$ \frac{\partial p_t}{\partial t} + \nabla\cdot(p_t v_t) = 0 $$

展开:

$$ \frac{\partial p_t}{\partial t} + v_t\cdot\nabla p_t + p_t\nabla\cdot v_t = 0 $$

沿着粒子轨迹 $x_t$ 的 material derivative 是:

$$ \frac{d}{dt}p_t(x_t) = \frac{\partial p_t}{\partial t} + v_t\cdot\nabla p_t $$

所以:

$$ \frac{d}{dt}p_t(x_t) = - p_t(x_t)\nabla\cdot v_t(x_t) $$

两边除以 $p_t(x_t)$:

$$ \frac{d}{dt}\log p_t(x_t) = - \nabla\cdot v_t(x_t) $$

这和 Jacobian 视角得到的结果一致。

$$ \text{Jacobian 体积变化} \equiv \text{continuity equation 概率流守恒} $$

3.3 CNF 为什么还需要 Likelihood?

CNF 的神经网络输出的是:

$$ v_\theta(x,t) $$

也就是 velocity,不是直接输出 probability density。

但 CNF 仍然定义了一个完整的概率模型。原因是:

  1. 初始分布 $p_0(z)$ 已知,比如标准 Gaussian;
  2. ODE 把 $z$ 搬运到 $x$;
  3. divergence 公式告诉我们沿途 density 如何变化。

也就是:

$$ p_0 + v_\theta + \frac{d}{dt}\log p_t(x_t) = - \nabla\cdot v_\theta(x_t,t) $$

共同决定了最终:

$$ p_\theta(x) $$

所以可以训练:

$$ \mathcal L_{\mathrm{CNF}} = - \log p_\theta(x_{\mathrm{data}}) $$

3.3.1 CNF 的困难

CNF 解决了离散 Flow 架构受限的问题,但也带来新的计算成本:

  • 需要数值求解 ODE;
  • 需要计算或估计 divergence;
  • 训练时要对整个 ODE solve 过程反向传播;
  • 如果用 exact likelihood,成本可能很高。

于是出现一个新问题:

这引出 Score Matching。


四、从 Density 到 Score:绕开 Partition Function

4.1 第三条路线:Score Matching

Score 定义为 log density 对数据 $x$ 的梯度:

$$ s(x) = \nabla_x\log p(x) $$

它不是 density 本身,而是 density landscape 的局部方向信息。

直觉上:

  • $p(x)$ 告诉你:这里有多少 probability mass;
  • $\log p(x)$ 是概率密度的对数地形;
  • $\nabla_x\log p(x)$ 告诉你:往哪个方向走,log density 增长最快。

可以把 $p(x)$ 想象成地形高度。density 是你现在站的海拔,score 是脚下最陡的上坡方向。

Score Matching 的想法是:与其直接学难以归一化的 $p(x)$,不如学习:

$$ \nabla_x\log p(x) $$

也就是概率地形的局部几何。


4.2 Score 为什么绕过 normalization constant?

回到 Energy-Based Model:

$$ p_\theta(x) = \frac{e^{-E_\theta(x)}}{Z_\theta} $$

取 log:

$$ \log p_\theta(x) = -E_\theta(x)-\log Z_\theta $$

对 $x$ 求梯度:

$$ \nabla_x\log p_\theta(x) = - \nabla_xE_\theta(x) - \nabla_x\log Z_\theta $$

但 $Z_\theta$ 是对整个 $x$ 空间积分得到的常数。对于固定参数 $\theta$,它不依赖于当前输入 $x$,所以:

$$ \nabla_x\log Z_\theta=0 $$

于是:

$$ \nabla_x\log p_\theta(x) = - \nabla_xE_\theta(x) $$

那个最难算的 partition function 消失了。

score 的优势是:

这不等于“概率分布不需要归一化”。准确说法是:

Score 绕过的是训练时的全局归一化常数,而不是取消概率分布本身的归一化要求。


4.3 为什么知道 Score 就有用?

因为 score 是 $\log p(x)$ 的梯度:

$$ s(x)=\nabla_x\log p(x) $$

如果你知道一个函数的导数,理论上就知道这个函数的形状,只差一个常数。例如一维中:

$$ f'(x)=2x $$

那么:

$$ f(x)=x^2+C $$

类似地,如果知道:

$$ \nabla_x\log p(x) $$

就知道了 $\log p(x)$ 的局部变化结构,只差一个全局常数。

这说明 score 包含了分布形状的大量信息。

但还有另一个问题:

$$ \nabla_x\log p_{\mathrm{data}}(x) $$

我们也不知道。

经典 Score Matching 可以通过 integration by parts 把目标改写成不需要真实 score 的形式。Diffusion 模型中更常用的是 Denoising Score Matching,它用加噪构造出一个可监督的 score target。


4.4 Denoising Score Matching

Diffusion 的基本操作是给真实数据加 Gaussian noise:

$$ x_t = \alpha_t x_0 + \sigma_t\epsilon, \qquad \epsilon\sim\mathcal N(0,I) $$

其中 $x_0\sim p_{\mathrm{data}}$,$x_t$ 是加噪后的样本。

给定 $x_0$ 时,$x_t$ 的条件分布是 Gaussian:

$$ p(x_t|x_0) = \mathcal N(\alpha_t x_0,\sigma_t^2I) $$

Gaussian 的 log density 为:

$$ \log p(x_t|x_0) = C - \frac{1}{2\sigma_t^2} \|x_t-\alpha_t x_0\|^2 $$

对 $x_t$ 求梯度:

$$ \nabla_{x_t}\log p(x_t|x_0) = - \frac{x_t-\alpha_t x_0}{\sigma_t^2} $$

而:

$$ x_t-\alpha_t x_0 = \sigma_t\epsilon $$

所以:

$$ \nabla_{x_t}\log p(x_t|x_0) = - \frac{\epsilon}{\sigma_t} $$

这就把 score 和 noise prediction 联系起来了。

如果网络预测 score:

$$ s_\theta(x_t,t) \approx \nabla_{x_t}\log p_t(x_t) $$

那么在高斯加噪条件下,可以用 $-\epsilon/\sigma_t$ 作为训练信号。

很多 diffusion 模型不直接输出 score,而是输出 noise:

$$ \epsilon_\theta(x_t,t) \approx \epsilon $$

这和 score prediction 只是参数化不同。因为:

$$ s_\theta(x_t,t) \approx - \frac{\epsilon_\theta(x_t,t)}{\sigma_t} $$

所以:

$$ \text{noise prediction} \leftrightarrow \text{score prediction} $$

这解释了一个容易混淆的点:DDPM 看起来是在预测噪声,但背后的连续视角是在估计 score。


4.5 为什么 Score 可以用于生成?

只知道“往哪里 density 更高”为什么能生成样本?

需要看 diffusion 的 forward process 和 reverse process。

设 forward SDE 为:

$$ dx = f(x,t)dt + g(t)dW_t $$

它把数据分布逐渐加噪,最终接近简单 Gaussian:

$$ p_0\approx p_{\mathrm{data}}, \qquad p_T\approx \mathcal N(0,I) $$

反向时间的 SDE 有一个重要形式:

$$ dx = \left[ f(x,t) - g(t)^2 \nabla_x\log p_t(x) \right]dt + g(t)d\bar W_t $$

这里的时间是反向运行的,$d\bar W_t$ 是反向 Brownian motion。

reverse dynamics 里需要的正是 score:

$$ \nabla_x\log p_t(x) $$

因此,只要我们训练出:

$$ s_\theta(x,t)\approx\nabla_x\log p_t(x) $$

就可以从噪声分布开始,沿着反向 SDE 一步步生成数据:

$$ p_T\rightarrow p_{T-\Delta t}\rightarrow\cdots\rightarrow p_0 $$

所以:

$$ \text{学到 score} \Rightarrow \text{知道 reverse dynamics} \Rightarrow \text{可以从 noise 生成 data} $$

这是 diffusion 模型的基本逻辑。


五、从 Score 到 Velocity:Probability Flow ODE 与 Flow Matching

5.1 Diffusion 与 CNF 在 Probability Flow ODE 汇合

Diffusion 通常从 SDE 出发,但它还对应一个确定性的 ODE,叫 Probability Flow ODE。

对于 forward SDE:

$$ dx=f(x,t)dt+g(t)dW_t $$

对应的 Probability Flow ODE 是:

$$ \frac{dx}{dt} = f(x,t) - \frac12 g(t)^2 \nabla_x\log p_t(x) $$

令:

$$ s_t(x)=\nabla_x\log p_t(x) $$

则:

$$ v_t(x) = f(x,t) - \frac12 g(t)^2s_t(x) $$

这一步说明:

也就是说,diffusion 不只是一个随机反向去噪过程,也可以看成一个确定性的概率流:

$$ \frac{dx}{dt}=v_t(x) $$

而这就和 CNF 的形式汇合了。

CNF 从一开始就写:

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

Diffusion 则先学习 score:

$$ s_\theta(x,t) $$

再通过 Probability Flow ODE 得到 velocity:

$$ v_t(x) = f(x,t)-\frac12g(t)^2s_t(x) $$

这里出现一个问题:

这就是 Flow Matching 的入口。


5.2 第四条路线:Flow Matching

Flow Matching 的问题是:

如果生成过程最终可以表示成一个 ODE,为什么不直接学习这个 ODE 的速度场?

也就是直接学习:

$$ \frac{dx_t}{dt}=v_t(x_t) $$

训练一个网络:

$$ v_\theta(x,t) $$

使它接近目标 velocity:

$$ u_t(x) $$

典型训练目标是:

$$ \mathcal L_{\mathrm{FM}} = \mathbb E \left[ \|v_\theta(x_t,t)-u_t(x_t)\|^2 \right] $$

这里要区分:

$$ \mathcal L_{\mathrm{FM}} \neq - \log p_\theta(x) $$

Flow Matching 不是直接最大化 likelihood,而是做 velocity regression。

5.2.1 一个简单路径例子

设 $x_0$ 来自简单噪声分布,$x_1$ 来自数据分布。可以定义线性插值路径:

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

那么这条路径的速度是:

$$ \frac{dx_t}{dt} = x_1-x_0 $$

于是可以训练网络在中间点 $x_t$ 和时间 $t$ 上预测这个速度:

$$ v_\theta(x_t,t) \approx x_1-x_0 $$

真实 Flow Matching 的理论更细:同一个 $x_t$ 可能来自许多不同的 $(x_0,x_1)$,目标速度是条件期望意义下的 velocity。直觉是:


5.3 为什么 Velocity Regression 能得到正确分布?

这要回到 continuity equation:

$$ \frac{\partial p_t}{\partial t} + \nabla\cdot(p_t v_t) = 0 $$

它说明:给定一个 velocity field $v_t$,概率密度 $p_t$ 会按照这个速度场演化。

如果 $v_t$ 是正确的,那么从初始分布 $p_0$ 出发,概率质量就会沿着正确路径运动:

$$ p_0\rightarrow p_t\rightarrow p_1 $$

所以 Flow Matching 的逻辑是:

这也是它和 likelihood training 的区别:

方法学习对象训练目标生成方式
Normalizing Flow / CNFdensity 或可计算 density 的变换$-\log p_\theta(x)$反向或正向可逆变换 / ODE
Score Matching / Diffusion$s_t(x)=\nabla\log p_t(x)$score / noise prediction lossreverse SDE 或 probability flow ODE
Flow Matching$v_t(x)$velocity regression解 ODE $\frac{dx}{dt}=v_\theta(x,t)$

Flow Matching 的重点不是说:

$$ \mathcal L_{\mathrm{FM}} $$

在数值上等于 NLL。更准确的说法是:

也就是说,最终目标仍然是:

$$ p_1\approx p_{\mathrm{data}} $$

只是到达它的学习对象变成了 velocity。


六、统一视角:Density、Score、Velocity

6.1 最后统一:Density、Score、Velocity

现在可以把全文统一起来。

同一个随时间变化的分布:

$$ p_t(x) $$

可以从三个角度观察。

6.1.1 Density

$$ p_t(x) $$

它回答:

这里有多少 probability mass?

Normalizing Flow、CNF 的经典 likelihood 训练要求能够计算或追踪 density:

$$ x\mapsto \log p_\theta(x) $$

6.1.2 Score

$$ s_t(x)=\nabla_x\log p_t(x) $$

它回答:

往哪个方向走,density 增长最快?

Score Matching 和 Diffusion 学的是这个局部梯度信息。它绕过 partition function,并且能构造 reverse SDE。

6.1.3 Velocity

$$ v_t(x) $$

它回答:

这里的 probability mass 应该往哪里运动?

Flow Matching 直接学习 velocity field,让概率质量从简单分布流向数据分布。

三者关系可以写成:

$$ p_t \xrightarrow{\nabla\log} s_t $$
$$ s_t \xrightarrow{\text{Probability Flow ODE}} v_t $$
$$ v_t \xrightarrow{\text{Continuity Equation}} p_t $$

总结成表:

视角数学对象问的问题代表方法
Density$p_t(x)$这里有多少概率质量?Autoregressive、Normalizing Flow、CNF
Score$\nabla_x\log p_t(x)$哪个方向概率密度更高?Score Matching、Diffusion
Velocity$v_t(x)$概率质量应该怎么移动?Flow Matching、Probability Flow ODE

主线是:

$$ \text{Density} \rightarrow \text{Score} \rightarrow \text{Velocity} $$

6.2 最终总结:从训练目标重新理解算法设计

$$ p_\theta\approx p_{\mathrm{data}} $$
$$ \Downarrow $$
$$ \text{KL} \Rightarrow \text{Likelihood / NLL} $$
$$ \Downarrow $$
$$ \text{Likelihood 需要 normalized density} $$
$$ \Downarrow $$
$$ \text{Autoregressive / Normalizing Flow / CNF} $$
$$ \Downarrow $$
$$ \text{直接 density modeling 有 normalization 或计算成本} $$
$$ \Downarrow $$
$$ \text{Score Matching / Diffusion} $$
$$ \Downarrow $$
$$ \text{Score} \rightarrow \text{Reverse SDE} \rightarrow \text{Probability Flow ODE} $$
$$ \Downarrow $$
$$ \text{Velocity} \rightarrow \text{Flow Matching} $$
视角对象训练/生成思路
Density$p_t(x)$直接计算或追踪 likelihood
Score$\nabla_x\log p_t(x)$学局部梯度,用 reverse SDE / ODE 生成
Velocity$v_t(x)$学概率质量如何运动,用 ODE 生成
Comments