CNF

CNF: Continuous Normalizing Flows (连续归一化流)

核心定位

CNF 是生成模型的一个重要分支,属于 Flow-based Models (流模型)

  • 它是 Normalizing Flow (NF) 的连续时间版本(从离散层变成微分方程)。
  • 它是 Flow MatchingDiffusion (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 的最佳实践