Normalizing Flow

本文最后更新于 2026年7月18日 下午

北京大学信息科学技术学院 生成模型基础(2025秋)的课程笔记

第五讲:Flow

一期非常久违的更新(填坑),今天让我们走进flow matching的世界
先回顾一样下我们之前学过的三种生成模型:

  • VAE:浅层、非序列、重建
  • AR:深层、序列、MLE
  • GAN:深层、非序列、近似距离

而今天我们的主角Flow则是:深层、非序列、MLE

初步分析

首先我们有图像$x$,噪音$z$,生成模型$g(z)$
我们从标准正态分布$N(0,I)$中sample出$z$,然后把$z$喂给$g(z;\theta)$,最终得到$x$,其中$\theta$为参数
那么,应该如何估计$p(x;\theta)$呢?

一种简单的方式是,假设$g$反函数存在,则有:

接下来我们看一个更一般的情况:变量变换定理
$Z$为一个随机变量,概率密度函数为$p_{Z}(z)$
$X=g(Z)$,且$x$的概率密度函数为$p_{X}(x)$
假设$g$反函数存在,且为了方便设$g$单增
再假设$g,g^{-1}$都可微,于是有:
$P(X<x)=P(g(Z)<x)=P(z<g^{-1}(x))=\int_{-\infty}^{g^{-1}(x)}p_{Z}(z) dz$
两边同时求导,便有:
$p_{X}(x)=(g^{-1}(x))’p_{Z}(z)$

又$g(g^{-1}(x))=x$
两边求导有$g’(z)(g^{-1}(x))’=1$
代入,亦可得出:
$p_{X}(x)g’(z)=p_{Z}(z)$

多维情况

设$Z,X$均为$d$维随机向量,其余条件不变
$g:R^d \rightarrow R^d $反函数存在,且$g,g^{-1}$可微(这一条件我们称作微分同胚)
我们设Jacobi行列式$D_g(z)=\dfrac{\partial(g_1,…,g_d)}{\partial(z_1,…,z_d)}$
那么类似地,我们可以推出
$p_{X}(x)=|detD_{g^{-1}}(x)|p_{Z}(z)$

如上图,反函数$g^{-1}$的作用恰好就是把复杂的分布$p_{X}(x)$ normalizing 为简单的分布$p_Z(z)$,从相反的方向 flow 过去,因此这种模型被称为normalizing flow

根据之前的推导,我们也可以类似得出

总之就是从标准正态分布sample出$z$之后,$z$就可以和$x$互相flow来flow去

实际应用

在实际应用中,我们可以通过参数化$f$或者$g$来解决问题,根据不同场景具体分析

density estimation

给定样本$x$,将其输入模型,输出$p(x)$的估计值
具体应用比如:假设有一组生成图像,需要选出质量最佳的那一张

此时根据$P_X(x)=p_Z(f(x))|det D_f(x)|$,参数化$f$即可
因为我们不知道$Z$概率分布,如果参数化$g$还得求反函数,十分麻烦

sampling

给定噪声$z$,将其输入模型,输出复杂分布$p_X(x)$的样本
具体应用场景显然就是生成模型

此时对$g$参数化就更方便,因为$x=g(z)$和$x=f^{-1}(z)$相比的话,显然前者更简单,不需要求反函数

挑战

讲了这么多flow的应用,但是在真实的神经网络中,存在许多非线性变换,卷积操作,这些行为都不一定保证能有反函数,更不用说要求出反函数了,如何是好?
科学家们想到的办法是:
寻找某个function class,这个class中的函数易于计算,反函数存在,并且能算出Jacobi行列式

直接找到一个属于该class的函数,一步到位把$x$变成$z$显然是极为困难的
我们就分多步进行,只需保证每一步的函数都属于这个class即可
定义$x_n=g_1 ·g_2·…·g_n(z)$,代表经过$n$次函数的结果
于是$p_{X}(x)=|detD_{g^{-1}}(x)|p_{Z}(z)$
$=p_{Z}(z)|detD_{g_1^{-1}}(x_1)|…|detD_{g_n^{-1}}(x_n)|$

一些特殊flow

接下来我们会在normalizing flow的基础上,介绍几种特殊的flow,都是对一般情况的改进

element flow

即在normalizing flow基础上加以限制,每一个维度都不和其他维度相关联,这样Jacobi矩阵为对角阵,行列式非常好算
$g(z)=(h(z_1),…,h(z_d))$
其中若每个$h$都可逆,则$g$也可逆
$h$可以是任意合理的激活函数,比如RELU

linear flow

顾名思义就是最简单的线性层:$g(z)=Az+b$,$A$为$d$维方阵
如果$A$可逆,那么$g$反函数存在,$g^{-1}(x)=A^{-1}(x-b)$
$D_g(z)=A,D_{g^{-1}}(x)=A^{-1}$
$|detD_g(z)|=|A|,|detD_{g^{-1}}(x)|=|A^{-1}|$
这种方法主要问题在于计算量太大,计算矩阵行列式要$O(d^3)$

改进:
如果$A$为对角元非零的上(下)三角阵,那么它可逆,并且行列式易于计算
行列式$O(d)$,算逆矩阵$O(d^2)$

如果$A$为正交矩阵,显然$A$可逆,且$A^{-1}=A^{T}$
于是$|detD_g(z)|=|detD_{g^{-1}}(x)|=1$,这样就十分方便
如何在训练中确保$A$正交呢?我们一般采用Householder transform
(这个方法在数值分析课上会重点讲述,这里不加赘述,放一张图就好)

如果从结构角度看,MLP也可以看成是linear flow与element flow的叠加
(读者可以思考一下为什么这么说)

residual flow 1

$g(z)=h+h(z)$
我们设$z$的前$d_1$维为$z_1$,后$d-d_1$维为$z_2$
$h1:R^{d-d_1} \rightarrow R^{d_1}$
$h2:R^{d_1} \rightarrow R^{d-d_1}$
$x_1=z_1+h_1(z_2)$
$x_2=z_2+h_2(x_1)$
$x=(x_1,x_2)=g(z)$

反向求解则有:
$z_2=x_2-h_2(x_1)$
$z_1=x_1-h_1(x_2-h_2(x_1))$

residual flow 2

2相比1的升级版在于:
如果满足Lipschitz条件,即$Lip(h)<1$,即可证明$g(z)$反函数存在
然而这种方法效率极低,虽然理论上$g(z)$反函数存在,但是实际解很难求出,只能逼近求近似解

continuous flow

这里就牵扯到常微分方程数值解的知识了,笔者在学完数值分析回来之后,对此理解又加深了一层
定义常微分方程:$\dfrac{dx}{dt}=f(x,t)$
初值$x(t_0)=z$
需要找到目标函数$x^{\ast}(t)$满足上述条件

大多数情况下难以获得解析解,因此需要采用数值方法,对于任意$t_1$估算$x(t_1)$
当然在此之前需要确保ODE的解唯一存在,回顾一下高数下的Picard 定理

传统的ODE会将式子改写为$\dfrac{dx}{dt}=f(x,t,\theta),x(0)=z$
将时间维度取消就得到了time independent ODE $\dfrac{dx}{dt}=f(x,\theta),x(0)=z$
我们已知噪音$z$和参数$\theta$后,解这个ODE,得出$x(1)$就是我们需要的图片输出,并且容易证明ODE也是可逆的(见下图),所以ODE某种意义上也是normalizing flow


Normalizing Flow
https://yjyxfcy.github.io/2026/07/18/gen5/
作者
Yjy
发布于
2026年7月18日
更新于
2026年7月18日
许可协议