本文原文以 CC BY-NC-SA 4.0 许可协议发布于 笔记|Normalizing Flow 理论与实现(一):基础理论,转载请注明出处。
Normalizing flow(标准化流)是一类对概率分布进行建模的工具,它能完成简单的概率分布(例如高斯分布)和任意复杂分布之间的相互转换,经常被用于 data generation、density estimation、inpainting 等任务中,例如 Stability AI 提出的 Stable Diffusion 3 中用到的 rectified flow 就是 normalizing flow 的变体之一。
为了便于理解,在正式开始介绍之前先简要说明一下 normalizing flow 的做法。如上图所示,为了将一个高斯分布 z 0 z_0 z0 转换为一个复杂的分布 z K z_K zK,normalizing flow 会对初始的分布 z 0 z_0 z0 进行多次可逆的变换,将其逐渐转换为 z K z_K zK。由于每一次变换都是可逆的,从 z K z_K zK 出发也能得到高斯分布 z 0 z_0 z0。这样,我们就实现了复杂分布与高斯分布之间的互相转换,从而能从简单的高斯分布建立任意复杂分布。
对 diffusion models 比较熟悉的读者可能已经发现了,这个过程和 diffusion 的做法非常相似。在 diffusion model 中,对于一个从高斯分布中采样出的样本,模型也是通过一系列去噪过程,从而获得目标样本;同样也可以通过其逆过程从一个确定的样本通过加噪得到高斯噪声。这两者的确有一些相似之处,可以放到一起来了解。
概率密度映射的推导
因为 normalizing flow 构建复杂分布主要依靠概率分布的可逆映射,因此需要首先推导在映射的过程中,概率密度会发生怎样的变化。为了导出最终的结论,一个需要了解的概念是 Jacobian 矩阵,对于一个将 n n n 维向量变化为一个 m m m 维向量的变换 f : R n → R m \mathbf{f}:\mathbb{R}^n\rightarrow\mathbb{R}^m f:Rn→Rm,其全部一阶偏导数构成的矩阵即为 Jacobian 矩阵 J \mathbf{J} J:
J = ( ∂ f 1 ∂ x 1 ⋯ ∂ f 1 ∂ x n ⋮ ⋱ ⋮ ∂ f m ∂ x 1 ⋯ ∂ f m ∂ x n ) . \mathbf{J}=\begin{pmatrix} \frac{\partial f_1}{\partial x_1} & \cdots & \frac{\partial f_1}{\partial x_n} \\\\ \vdots & \ddots & \vdots \\\\ \frac{\partial f_m}{\partial x_1} & \cdots & \frac{\partial f_m}{\partial x_n} \end{pmatrix}. J=
∂x1∂f1⋮∂x1∂fm⋯⋱⋯∂xn∂f1⋮∂xn∂fm