从训练目标出发理解现代生成模型:Likelihood 到 Flow Matching
2026年8月23日 · 2528 字 · 6 分钟 ai
以下内容整理自我与 ChatGPT 的对话,本来只是对 flow matching 原理解析,一步一步探究到了现代生成模型的基本设计目标,更进一步扩展到了其他生成模型。一些个人的疑惑得到解答,由此记录一下,方便以后翻阅查看。
一、生成模型到底在优化什么?
1.1 全文推进图
1.2 生成模型的终极目标:学习数据分布
我们手里通常只有有限训练样本:
但生成模型的基本假设是,这些样本并不是孤立出现的,而是来自某个真实数据分布:
比如图像生成里,训练集中的每张图片都可以看成从“自然图像分布”里采样出来的一个点。语言模型里,一段文本可以看成从“人类文本分布”里采样出来的一个序列。
我们真正想学的不是训练集本身,而是训练集背后的分布。
如果模型只记住训练样本,那么它不能真正泛化。生成模型希望得到一个参数化分布:
使得:
这句话背后有两个层次:
- 采样层面:从 $p_\theta$ 采样出来的 $x$ 看起来像真实数据;
- 分布层面:$p_\theta$ 在整个空间中分配概率质量的方式接近 $p_{\mathrm{data}}$。
“生成得像”只是表象,分布接近才是根本。
1.3 如何衡量两个分布是否接近:KL 与 Likelihood
现在问题变成:怎样衡量 $p_\theta$ 和 $p_{\mathrm{data}}$ 是否接近?
一个常用选择是 KL divergence:
把它拆开:
第一项:
只由真实数据分布决定,和模型参数 $\theta$ 无关。因此,当我们优化 $\theta$ 时,最小化 KL 等价于最大化第二项:
真实的数据分布未知,但我们有样本,于是用训练集平均近似期望:
这就得到 Maximum Likelihood Estimation:
如果改写成最小化 loss,就是 Negative Log-Likelihood:
所以 likelihood 来自一个明确的分布匹配思想:
1.4 Likelihood 到底是什么?
同一个表达式:
可以有两种不同的看法。
第一种,固定参数 $\theta$,把它看成 $x$ 的函数:
这时它是 probability density,也就是模型给不同数据点分配的密度。
第二种,固定观测数据 $x$,把它看成 $\theta$ 的函数:
这时它就是 likelihood:
也就是说:
| 观察方式 | 固定什么 | 变化什么 | 问的问题 |
|---|---|---|---|
| Probability density | $\theta$ | $x$ | 在这个模型下,哪些数据更可能出现? |
| Likelihood | $x$ | $\theta$ | 哪个参数更能解释这条观测数据? |
举一个极简单的例子。假设我们用 Bernoulli 分布建模一次抛硬币结果:
如果观测到的数据是 $x=1$,那么:
显然 $\theta$ 越大,观测到正面的 likelihood 越高。
如果观测到十次里有八次正面、两次反面:
最大化它会得到 $\theta=0.8$。MLE 的直觉是:选择最能解释已发生数据的参数。
1.4.1 NLL 与 Cross Entropy 的关系
对单个样本,NLL 是:
如果是分类问题,真实标签是 one-hot 分布 $q(y)$,模型预测分布是 $p_\theta(y|x)$,交叉熵是:
因为 one-hot 标签只在真实类别 $y_{\mathrm{true}}$ 上等于 1,所以:
这正是 NLL。
语言模型里的 token prediction 也是一样。对每一个位置 $t$,模型输出:
真实 token 是 $x_t^{\mathrm{true}}$,交叉熵就是:
所以常说的语言模型 CE loss,本质就是 token 级别的 NLL。
1.5 为什么一个概率模型必须归一化?
概率分布必须满足总概率为 1。
离散情况:
连续情况:
这不是形式主义,而是概率的定义。如果一个函数没有归一化,它只能表示相对权重,不能表示真正概率。
例如有两个事件 $A,B$,某个模型给出:
这只能说明 $A$ 的权重是 $B$ 的两倍。要变成概率,必须除以总权重:
只有这样,才有:
1.5.1 为什么 Likelihood 特别依赖归一化?
假设模型只输出一个未归一化分数:
如果不要求归一化,那么我们可以把所有分数整体乘以 1000:
所有数据点之间的相对比例完全没变,但每个训练样本的“likelihood”都变大了:
如果允许这样做,训练目标就会变得没有意义。模型可以靠整体放大分数来无限提高目标,而不是改变分布形状。
因此,likelihood modeling 必须要求 $p_\theta(x)$ 是一个真正的概率密度:
其中:
这个 $Z_\theta$ 就是 normalization constant。它把相对权重变成真正概率。
二、显式概率建模:从归一化困难到可计算 Likelihood
2.1 最直接的概率模型:Energy-Based Model
一种最直接的想法是:让神经网络给每个 $x$ 一个 energy:
energy 越低,表示这个数据越可能。于是可以定义未归一化密度:
但它还不是概率分布。要变成概率密度,必须归一化:
其中:
这就是 partition function。
2.1.1 一维例子:为什么 $Z$ 很关键?
假设:
那么:
看起来像一个 Gaussian,但它还不是完整概率密度。真正的归一化常数是:
所以:
如果不知道 $Z$,就不知道 $p(3)$ 到底是多少。
EBM 的困难在于:在图像、语言等高维空间里,
通常极难计算。
这里出现一个分叉:
接下来会看到两类思路:
- Autoregressive 和 Normalizing Flow:设计一种天然归一化、可计算 likelihood 的模型;
- Score Matching 和 Diffusion:不直接学习 density,而是学习 $\nabla_x\log p(x)$ 这样的局部信息。
2.2 第一条路线:Autoregressive Model
Autoregressive Model 基于概率链式法则:
例如:
这不是近似,而是概率论的恒等式。自回归模型做的事情,是用神经网络去参数化每一个条件分布:
2.2.1 为什么自回归天然归一化?
考虑两个离散变量:
对所有可能的 $(x_1,x_2)$ 求和:
先对 $x_2$ 求和:
得到:
所以:
对于长度为 $T$ 的序列也是一样。只要每一个条件分布 $p(x_t|x_{ 自回归模型不需要计算高维全局积分 $Z_\theta$,而是把全局归一化分解成一连串局部归一化。 自回归模型定义: 取 log: 所以序列的 NLL 是: 而 token 级别的 cross entropy 正是: 因此: 训练时我们计算的是: 也就是说,在第 $t$ 个位置预测真实 token 时,条件本来就应该是真实 prefix。 所以 teacher forcing 不是额外加入的技巧,而是 MLE 对自回归分解的直接要求。 假设一个长度为 3 的序列中,模型给真实 token 的概率分别是: 那么整个序列的 likelihood 是: NLL 是: 逐 token CE 相加: 完全一致。 普通生成器通常写成: 这可以直接采样,因为从 $z$ 到 $x$ 是直接的。但如果给定一个真实样本 $x$,问: 普通生成器往往回答不了。 Normalizing Flow 的设计是:让生成映射可逆。 这样,给定 $x$,我们可以反推出对应的 $z$,再利用 change of variables 计算 $p_X(x)$。 这条路线的目标是: 变量变换公式来自概率质量守恒。 假设: 并且 $m$ 可逆。一个很小的 $z$ 区域会被映射成一个很小的 $x$ 区域。概率质量守恒,所以: Jacobian matrix 是: 它描述局部线性变换。局部体积元的变化满足: 代回概率质量守恒: 所以: 如果 $J$ 把局部小体积放大了 2 倍,那么同样的概率质量被摊到 2 倍的空间里,density 就应该变成原来的一半。 一维例子最直观: 此时: 所以: 这正是“体积扩大,密度降低”。 二维里,Jacobian determinant 是局部面积缩放倍率;高维里,它是局部体积缩放倍率。 所以变量变换公式可以读成一句话: Normalizing Flow 从一个已经归一化的 base distribution 出发: 然后用可逆变换搬运概率质量。 根据变量变换: 所以: 因此: 它不是先随便造一个未归一化的地形,再去算全空间积分。它是从已经合法的分布出发,通过可逆变换严格追踪体积变化,因此合法性自动保持。 这和 Energy-Based Model 的思路形成鲜明对比: 从变量变换公式: 取 log: 其中: 所以给定真实数据 $x_{\mathrm{data}}$,Normalizing Flow 可以直接计算: 于是训练目标就是 exact maximum likelihood: 因此 Normalizing Flow 仍然是一条 density modeling 路线:它的模型设计服务于一个目标,即让 $p_\theta(x)$ 可计算。 离散 Normalizing Flow 可以看成一串可逆变换: 每一步都有一个 Jacobian determinant。把所有步骤累加起来,得到总的 log-density correction。 Continuous Normalizing Flow 把这串离散变换变成连续时间动力系统: 这里 $v_\theta$ 是一个 velocity field。它告诉你在时间 $t$、位置 $x_t$,点应该往哪里移动。 对于一个极小时间 $dt$: 这个小变换的 Jacobian 是: 离散 Flow 中的 $\log|\det J|$,在连续极限下就会变成 divergence 的积分。 先看一个极小时间步: 它的 Jacobian 是: 我们需要的是 log determinant: 当 $dt$ 很小时,有近似: 令: 得到: 而 Jacobian 矩阵的 trace 正是 divergence: 因此一个极小时间步的体积变化是: 由于 density 会和体积反向变化,所以: 得到 CNF 的核心公式: 考虑一维 ODE: 解是: 到 $t=1$: 如果 $a=\log 2$,那就是: 体积长度扩大 2 倍,所以 density 应该乘以 $\frac12$。 用 CNF 公式看: 一维 divergence 就是导数: 所以: 从 0 积分到 1: 因此: 当 $a=\log2$: 这和普通 Jacobian 公式完全一致。 还有另一个视角:概率质量守恒。 设 $p_t(x)$ 是时刻 $t$ 的 density,$v_t(x)$ 是 velocity。单位时间穿过某个位置的 probability flux 是: 如果一个小区域内的概率质量减少,一定是因为概率流从边界流出;如果增加,一定是因为流入。因此有 continuity equation: 展开: 沿着粒子轨迹 $x_t$ 的 material derivative 是: 所以: 两边除以 $p_t(x_t)$: 这和 Jacobian 视角得到的结果一致。 CNF 的神经网络输出的是: 也就是 velocity,不是直接输出 probability density。 但 CNF 仍然定义了一个完整的概率模型。原因是: 也就是: 共同决定了最终: 所以可以训练: CNF 解决了离散 Flow 架构受限的问题,但也带来新的计算成本: 于是出现一个新问题: 这引出 Score Matching。 Score 定义为 log density 对数据 $x$ 的梯度: 它不是 density 本身,而是 density landscape 的局部方向信息。 直觉上: 可以把 $p(x)$ 想象成地形高度。density 是你现在站的海拔,score 是脚下最陡的上坡方向。 Score Matching 的想法是:与其直接学难以归一化的 $p(x)$,不如学习: 也就是概率地形的局部几何。 回到 Energy-Based Model: 取 log: 对 $x$ 求梯度: 但 $Z_\theta$ 是对整个 $x$ 空间积分得到的常数。对于固定参数 $\theta$,它不依赖于当前输入 $x$,所以: 于是: 那个最难算的 partition function 消失了。 score 的优势是: 这不等于“概率分布不需要归一化”。准确说法是: Score 绕过的是训练时的全局归一化常数,而不是取消概率分布本身的归一化要求。 因为 score 是 $\log p(x)$ 的梯度: 如果你知道一个函数的导数,理论上就知道这个函数的形状,只差一个常数。例如一维中: 那么: 类似地,如果知道: 就知道了 $\log p(x)$ 的局部变化结构,只差一个全局常数。 这说明 score 包含了分布形状的大量信息。 但还有另一个问题: 我们也不知道。 经典 Score Matching 可以通过 integration by parts 把目标改写成不需要真实 score 的形式。Diffusion 模型中更常用的是 Denoising Score Matching,它用加噪构造出一个可监督的 score target。 Diffusion 的基本操作是给真实数据加 Gaussian noise: 其中 $x_0\sim p_{\mathrm{data}}$,$x_t$ 是加噪后的样本。 给定 $x_0$ 时,$x_t$ 的条件分布是 Gaussian: Gaussian 的 log density 为: 对 $x_t$ 求梯度: 而: 所以: 这就把 score 和 noise prediction 联系起来了。 如果网络预测 score: 那么在高斯加噪条件下,可以用 $-\epsilon/\sigma_t$ 作为训练信号。 很多 diffusion 模型不直接输出 score,而是输出 noise: 这和 score prediction 只是参数化不同。因为: 所以: 这解释了一个容易混淆的点:DDPM 看起来是在预测噪声,但背后的连续视角是在估计 score。 只知道“往哪里 density 更高”为什么能生成样本? 需要看 diffusion 的 forward process 和 reverse process。 设 forward SDE 为: 它把数据分布逐渐加噪,最终接近简单 Gaussian: 反向时间的 SDE 有一个重要形式: 这里的时间是反向运行的,$d\bar W_t$ 是反向 Brownian motion。 reverse dynamics 里需要的正是 score: 因此,只要我们训练出: 就可以从噪声分布开始,沿着反向 SDE 一步步生成数据: 所以: 这是 diffusion 模型的基本逻辑。 Diffusion 通常从 SDE 出发,但它还对应一个确定性的 ODE,叫 Probability Flow ODE。 对于 forward SDE: 对应的 Probability Flow ODE 是: 令: 则: 这一步说明: 也就是说,diffusion 不只是一个随机反向去噪过程,也可以看成一个确定性的概率流: 而这就和 CNF 的形式汇合了。 CNF 从一开始就写: Diffusion 则先学习 score: 再通过 Probability Flow ODE 得到 velocity: 这里出现一个问题: 这就是 Flow Matching 的入口。 Flow Matching 的问题是: 如果生成过程最终可以表示成一个 ODE,为什么不直接学习这个 ODE 的速度场? 也就是直接学习: 训练一个网络: 使它接近目标 velocity: 典型训练目标是: 这里要区分: Flow Matching 不是直接最大化 likelihood,而是做 velocity regression。 设 $x_0$ 来自简单噪声分布,$x_1$ 来自数据分布。可以定义线性插值路径: 那么这条路径的速度是: 于是可以训练网络在中间点 $x_t$ 和时间 $t$ 上预测这个速度: 真实 Flow Matching 的理论更细:同一个 $x_t$ 可能来自许多不同的 $(x_0,x_1)$,目标速度是条件期望意义下的 velocity。直觉是: 这要回到 continuity equation: 它说明:给定一个 velocity field $v_t$,概率密度 $p_t$ 会按照这个速度场演化。 如果 $v_t$ 是正确的,那么从初始分布 $p_0$ 出发,概率质量就会沿着正确路径运动: 所以 Flow Matching 的逻辑是: 这也是它和 likelihood training 的区别: Flow Matching 的重点不是说: 在数值上等于 NLL。更准确的说法是: 也就是说,最终目标仍然是: 只是到达它的学习对象变成了 velocity。 现在可以把全文统一起来。 同一个随时间变化的分布: 可以从三个角度观察。 它回答: 这里有多少 probability mass? Normalizing Flow、CNF 的经典 likelihood 训练要求能够计算或追踪 density: 它回答: 往哪个方向走,density 增长最快? Score Matching 和 Diffusion 学的是这个局部梯度信息。它绕过 partition function,并且能构造 reverse SDE。 它回答: 这里的 probability mass 应该往哪里运动? Flow Matching 直接学习 velocity field,让概率质量从简单分布流向数据分布。 三者关系可以写成: 总结成表: 主线是:2.3 Autoregressive 的 Loss 为什么就是 Likelihood?
2.3.1 Teacher Forcing 为什么自然出现?
2.3.2 一个数值例子
2.4 第二条路线:Normalizing Flow
2.5 Change of Variables:Flow 如何得到 Density
2.5.1 Jacobian determinant 的体积意义
2.6 为什么 Normalizing Flow 天然归一化?
模型 基本做法 归一化问题 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
三、连续概率流:CNF 如何追踪 Density
3.1 从 Normalizing Flow 到 CNF
3.2 为什么 CNF 中 log-det 会变成 divergence?
3.2.1 数值例子:一维缩放 ODE
3.2.2 从 continuity equation 推导同一个结论
3.3 CNF 为什么还需要 Likelihood?
3.3.1 CNF 的困难
四、从 Density 到 Score:绕开 Partition Function
4.1 第三条路线:Score Matching
4.2 Score 为什么绕过 normalization constant?
4.3 为什么知道 Score 就有用?
4.4 Denoising Score Matching
4.5 为什么 Score 可以用于生成?
五、从 Score 到 Velocity:Probability Flow ODE 与 Flow Matching
5.1 Diffusion 与 CNF 在 Probability Flow ODE 汇合
5.2 第四条路线:Flow Matching
5.2.1 一个简单路径例子
5.3 为什么 Velocity Regression 能得到正确分布?
方法 学习对象 训练目标 生成方式 Normalizing Flow / CNF density 或可计算 density 的变换 $-\log p_\theta(x)$ 反向或正向可逆变换 / ODE Score Matching / Diffusion $s_t(x)=\nabla\log p_t(x)$ score / noise prediction loss reverse SDE 或 probability flow ODE Flow Matching $v_t(x)$ velocity regression 解 ODE $\frac{dx}{dt}=v_\theta(x,t)$ 六、统一视角:Density、Score、Velocity
6.1 最后统一:Density、Score、Velocity
6.1.1 Density
6.1.2 Score
6.1.3 Velocity
视角 数学对象 问的问题 代表方法 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 6.2 最终总结:从训练目标重新理解算法设计
视角 对象 训练/生成思路 Density $p_t(x)$ 直接计算或追踪 likelihood Score $\nabla_x\log p_t(x)$ 学局部梯度,用 reverse SDE / ODE 生成 Velocity $v_t(x)$ 学概率质量如何运动,用 ODE 生成