CNF
CNF: Continuous Normalizing Flows (连续归一化流)
核心定位
CNF 是生成模型的一个重要分支,属于 Flow-based Models (流模型)。
- 它是 Normalizing Flow (NF) 的连续时间版本(从离散层变成微分方程)。
- 它是 Flow Matching 和 Diffusion (Probability Flow) 的理论原型。
简单来说:Flow Matching 是为了解决 CNF 训练太慢而发明的一种高效训练方法。
1. 从 NF 到 CNF
1.1 Normalizing Flow (NF, 归一化流)
NF 的思想是:找一系列可逆的函数 $f_1, f_2, \dots, f_K$,把简单的噪声分布 $z_0$(如高斯)一步步“揉”成复杂的数据分布 $x$。
$$ x = f_K(f_{K-1}(\dots f_1(z_0))) $$- 难点: 为了计算似然 (Likelihood),每个变换 $f_i$ 必须计算雅可比行列式 (Jacobian Determinant),这限制了 $f_i$ 的设计必须很特殊(如 Coupling Layer)。
1.2 Continuous NF (CNF)
Chen et al. (Neural ODE, 2018) 提出:与其用 discrete 的层堆叠,不如把这一过程看作连续时间的演化。 定义一个依赖时间的向量场 $f(z(t), t)$:
$$ \frac{dz(t)}{dt} = f(z(t), t) $$数据从 $t=0$ 演化到 $t=1$。这就是一个 常微分方程 (ODE)。
- 似然计算: 利用 Instantaneous Change of Variables 公式: $$ \frac{\partial \log p(z(t))}{\partial t} = -\text{Tr}\left( \frac{\partial f}{\partial z} \right) $$ 即概率密度的对数变化率等于向量场散度的负值。
1.3 🔥 核心对比:CNF vs Diffusion (Score Matching)
CNF 和 Diffusion 都在解微分方程,但它们对“正向”和“反向”的处理逻辑完全不同:
| 过程 | Diffusion / SDE (Score Matching) | CNF / Neural ODE |
|---|---|---|
| 正向过程 (加噪/编码) | 固定 (Fixed) 物理定义的扩散过程(加高斯噪声)。$t=0 \to t=T$ 的路径是写死的公式,不需要学习。 | 可学习 (Learned) 网络需要自己学习一条从数据 $x$ 到噪声 $z$ 的路径。通过解 ODE 积分得到。 |
| 训练目标 | Score Matching 去拟合每一步的梯度(Score)。简单来说就是“预测噪声”。 | Maximum Likelihood 通过 ODE 求解器算出生成数据的概率及其梯度,最大化似然。计算极慢。 |
| 反向过程 (去噪/生成) | 去噪 (Denoising) 利用学到的 Score 把图变清晰。 | 生成 (Generation) 利用学到的向量场,把噪声“流”回数据。 |
能够“又快又好”的关键
- Diffusion 赢在 训练快(只要预测噪声,不需要解方程),输在 采样慢(路是弯的)。
- 传统 CNF 赢在 路可以是直的,输在 训练极其慢(每次都要解方程)。
- Flow Matching 结合了二者:它像 Diffusion 一样固定了正向路径(设为直线),又像 CNF 一样学习向量场。
2. CNF 的痛点与 Flow Matching 的救赎
2.1 CNF 的致命弱点
在 Flow Matching 出现之前,训练 CNF 非常痛苦:
- 训练慢: 每次前向传播都要解一次 ODE(数值积分),反向传播还要再解一次 (Adjoint method)。
- 为了训练一个生成模型,你需要在 Training Loop 里疯狂解微分方程。 这导致 Neural ODE / FFJORD 等早期模型只能处理作为简单数据,很难扩展到高分辨率图像。
2.2 Flow Matching 的出现
Flow Matching (Lipman 2023) 的核心贡献在于: 它发现我们其实不需要在训练时解 ODE。
- 我们可以构造一个目标向量场 (Target Vector Field),让它直接指向我们要去的方向(比如由 Optimal Transport 定义的直线路径)。
- 然后让神经网络去回归 (Regression) 这个向量场。
- 结论: 训练变成了简单的回归问题 (MSE Loss),完全避免了训练时的 ODE 求解。(详见 RectifiedFlow)
3. 族谱关系图
graph TD
NF["**Normalizing Flows**<br>(RealNVP, Glow)<br>离散层变换"] --> CNF["**Continuous NF**<br>(Neural ODE, FFJORD)<br>连续ODE变换"]
CNF --> Relation{训练方法进化}
Relation --"数值积分 (慢)"--> OldCNF["**传统 CNF**<br>训练需解 ODE<br>Learned Forward"]
Relation --"向量场回归 (快)"--> FM["**Flow Matching**<br>Simulation-Free Training<br>Fixed Forward"]
FM --> SD3[Stable Diffusion 3]
FM --> FLUX[FLUX.1]4. 总结
- CNF 是什么?: 用 ODE 描述数据生成的模型架构。
- 属于什么范畴?: 理论基础 / 历史前身。
- 现在的地位: 现在我们很少直接说“我在训练一个 CNF”,而是说“我在用 Flow Matching 训练一个基于 ODE 的模型”。Flow Matching 是训练 CNF 的最佳实践。