Flow Matching For Generative Modeling
一、基于流的(Flow based)生成模型
生成模型
我们先回顾一下所谓的生成任务,究竟是想要做什么事情。我们认为,世界上所有的图片,是符合某种分布 pdata(x)p_{data}(x)pdata(x) 的。当然,这个分布肯定是个极其复杂的分布。而我们有一堆图片 x1,x2,…,xm{x_1,x_2,\dots,x_m}x1,x2,…,xm ,则可以认为是从这个分布中采样出来的 mmm 个样本。我们通过训练希望得到一个生成器网络 GGG ,该网络能够做到输入一个从正态分布 π(z)\pi(z)π(z) 中采样出来的 zzz ,输出一张看起来像真实世界的图片 x=G(z)∼pG(x)x=G(z)\sim p_G(x)x=G(z)∼pG(x) 。我们希望采样并生成出的数据分布 pG(x)p_G(x)pG(x) 与真实的数据分布 pdata(x)p_{data}(x)pdata(x) 越接近越好。
从概率模型的角度来看,想要做到上面说的这件事情,可以通过最大化对数似然 logpG\log p_GlogpG,来优化生成器 GGG 的参数:
G∗=argmaxG∑i=1mlogpG(xi) G^*=\arg\max_{G}\sum_{i=1}^m\log p_G(x_i) G∗=argGmaxi=1∑mlogpG(xi)
可以证明,最大化这个对数似然,就相当于最小化生成器分布 pG(x)p_G(x)pG(x) 与目标分布 pdata(x)p_{data}(x)pdata(x) 的 KL散度,即让这两个分布尽量接近:
G∗≈argminGKL(pdata∣∣pG) G^*\approx\arg\min_GKL(p_{data}||p_G) G∗≈argGminKL(pdata∣∣pG)
概率密度的变量变换定理
给定一个随机变量 zzz 及其概率密度函数 z∼π(z)z\sim\pi(z)z∼π(z) ,通过一个一对一的映射函数 fff 构造一个新的随机变量 x=f(z)x=f(z)x=f(z)。如果存在逆函数 f−1f^{-1}f−1 满足 z=f−1(x)z=f^{-1}(x)z=f−1(x),那么新变量 xxx 的概率密度函数 p(x)p(x)p(x) 计算如下:
p(x)=π(z)∣dzdx∣=π(f−1(x))∣df−1dx∣=π(f−1(x))∣(f′−1(x)∣ 若z为随机变量p(x)=π(z)∣det(dzdx)∣=π(f−1(x))∣det(Jf−1)∣ 若z为随机向量 p(x)=\pi(z)|\frac{dz}{dx}|=\pi (f^{-1}(x))|\frac{df^{-1}}{dx}|=\pi(f^{-1}(x))|(f'^{-1}(x)| \ \ \ \ 若z为随机变量 \\ p(\mathbf{x})=\pi(\mathbf{z})|\det(\frac{d\mathbf{z}}{d\mathbf{x}})|=\pi(f^{-1}(\mathbf{x}))|\det(\mathbf{J}_{f^{-1}})| \ \ \ \ \ 若\mathbf{z}为随机向量 p(x)=π(z)∣dxdz∣=π(f−1(x))∣dxdf−1∣=π(f−1(x))∣(f′−1(x)∣ 若z为随机变量p(x)=π(z)∣det(dxdz)∣=π(f−1(x))∣det(Jf−1)∣ 若z为随机向量
其中 det(⋅)\det(\cdot)det(⋅) 表示行列式,J\mathbf{J}J 表示雅可比矩阵,是向量函数中因变量各维度关于自变量各维度的偏导数组成的矩阵,可类比为单变量函数的导数。
流模型推导
现在流行的生成模型五花八门,各显神通。VAE 优化变分下界 ELBO、GAN 通过对抗训练来隐式地逼近数据分布。流模型则可以直接优化对数似然。
流模型通过最大化对数似然,来优化生成器 GGG:
G∗=argmaxG∑i=1mlogpG(xi) G^*=\arg\max_{G}\sum_{i=1}^m\log p_G(x_i) G∗=argGmaxi=1∑mlogpG(xi)
而根据变量变换定理,有:
pG(xi)=π(zi)∣det(JG−1)∣, zi=G−1(xi) p_G(x_i)=\pi(z_i)|\det(J_{G^{-1}})|,\ \ \ \ z_i=G^{-1}(x_i) pG(xi)=π(zi)∣det(JG−1)∣, zi=G−1(xi)
则对数似然:
logpG(xi)=logπ(G−1(xi))+log∣det(JG−1)∣ \log p_G(x_i)=\log \pi(G^{-1}(x_i))+\log |\det(J_{G^{-1}})| logpG(xi)=logπ(G−1(xi))+log∣det(JG−1)∣
要训练一个好的生成器 GGG 我们只需要训练一个(或一系列)网络完成从噪声分布 π(z)\pi(z)π(z) 到数据分布 pdata(x)p_\text{data}(x)pdata(x) 的变换就可以了。在采样生成时,求出生成器的逆向网络 G−1G^{-1}G−1,再将随机采样的噪声输入,即可生成新的符合数据分布的样本。只要最大化上面这个式子,就可以了。
现在的问题就是怎么把这个式子算出来,具体来说,这个式子计算的关键在以下两点:
- 如何计算行列式 det(JG)\det(J_G)det(JG)
- 如何求逆矩阵 G−1G^{-1}G−1
我们设计的生成器网络 GGG 需要满足上面这两个条件,这就是流模型生成器数学上的限制。在之前的流模型研究中,研究者们提出了许多设计精巧的网络(如 decoupling layer),可以巧妙地使得网络满足上述两点便利计算的要求。
另外要提一点,流模型的输入输出的尺寸必须是一致的。这是因为如果想要 GGG 可逆,它的输入输出维度一致是一个必要条件(非方阵不可能可逆)。比如要生成 100×100×3100\times 100\times 3100×100×3 的图像,那输入的随机噪声也是 100×100×3100\times 100\times 3100×100×3 的。这与 VAE、GAN 等生成模型很不一样,这些生成模型的输入维度通常远小于输出维度。
堆叠多个网络
在实际中,由于可逆神经网络存在数学上的诸多限制,其单个网络的表达能力有限,我们一般需要堆叠多层网络来得到一个生成器,这也是 “流模型” 这个名称的由来。不过虽然堆叠了很多层,在公式上也没有什么复杂的。无非就是把一堆 GiG_iGi 连乘起来,通过 log\loglog 之后,又变成连加。
比如我们有 KKK 个网络 {
fi}i=1K\{f_i\}_{
{i=1}}^K{
fi}i=1K,对噪声分布 π(z0)\pi(\mathbf{z}_0)π(z0) 进行 KKK 步变换,得到数据 x\mathbf{x}x,即有:
x=zk=fK(fK−1...f1(z0)) \mathbf{x}=\mathbf{z}_k=f_K(f_{K-1}...f_1(\mathbf{z}_0)) x=zk=fK(fK−1...f1(z0))
对于其中第 iii 步有:
zi∼pi(zi)zi=fi(zi−1), zi−1=f−1(zi) \mathbf{z}_i\sim p_i(\mathbf{z}_i)\\ \mathbf{z}_i=f_i(\mathbf{z}_{i-1}),\ \ \mathbf{z}_{i-1}=f^{-1}(\mathbf{z}_i) zi∼pi(zi)zi=fi(zi−1), zi−1=f−1(zi)
根据变量变换定理,相邻两步之间的隐变量分布的关系为:
pi(zi)=pi−1(fi−1(zi))∣detJfi−1∣=pi−1(zi−1)∣detJfi∣−1 \begin{align} p_i(\mathbf{z}_{i})&=p_{i-1}(f_i^{-1}(\mathbf{z}_i))|\det\mathbf{J}_{f_i^{-1}}|\\ &=p_{i-1}(\mathbf{z}_{i-1})|\det\mathbf{J}_{f_i}|^{-1} \end{align} pi(zi)=pi−1(fi−1(zi))∣detJfi−1∣=pi−1(zi−1)∣detJfi∣−1
每一步的对数似然为:
logpi(zi)=logpi−1(zi−1)−log(det(Jfi)) \log p_i(\mathbf{z}_i)=\log p_{i-1}(\mathbf{z}_{i-1})-\log(\det(\mathbf{J}_{f_i})) logp