Flow Matching For Generative Modeling

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) 越接近越好。

从概率模型的角度来看,想要做到上面说的这件事情,可以通过最大化对数似然 log⁡pG\log p_GlogpG,来优化生成器 GGG 的参数:
G∗=arg⁡max⁡G∑i=1mlog⁡pG(xi) G^*=\arg\max_{G}\sum_{i=1}^m\log p_G(x_i) G=argGmaxi=1mlogpG(xi)
可以证明,最大化这个对数似然,就相当于最小化生成器分布 pG(x)p_G(x)pG(x) 与目标分布 pdata(x)p_{data}(x)pdata(x) 的 KL散度,即让这两个分布尽量接近:
G∗≈arg⁡min⁡GKL(pdata∣∣pG) G^*\approx\arg\min_GKL(p_{data}||p_G) GargGminKL(pdata∣∣pG)

概率密度的变量变换定理

给定一个随机变量 zzz 及其概率密度函数 z∼π(z)z\sim\pi(z)zπ(z) ,通过一个一对一的映射函数 fff 构造一个新的随机变量 x=f(z)x=f(z)x=f(z)。如果存在逆函数 f−1f^{-1}f1 满足 z=f−1(x)z=f^{-1}(x)z=f1(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=π(f1(x))dxdf1=π(f1(x))(f1(x)    z为随机变量p(x)=π(z)det(dxdz)=π(f1(x))det(Jf1)     z为随机向量
其中 det⁡(⋅)\det(\cdot)det() 表示行列式,J\mathbf{J}J 表示雅可比矩阵,是向量函数中因变量各维度关于自变量各维度的偏导数组成的矩阵,可类比为单变量函数的导数。

流模型推导

现在流行的生成模型五花八门,各显神通。VAE 优化变分下界 ELBO、GAN 通过对抗训练来隐式地逼近数据分布。流模型则可以直接优化对数似然。

在这里插入图片描述

流模型通过最大化对数似然,来优化生成器 GGG
G∗=arg⁡max⁡G∑i=1mlog⁡pG(xi) G^*=\arg\max_{G}\sum_{i=1}^m\log p_G(x_i) G=argGmaxi=1mlogpG(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(JG1),    zi=G1(xi)
则对数似然:
log⁡pG(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π(G1(xi))+logdet(JG1)
要训练一个好的生成器 GGG 我们只需要训练一个(或一系列)网络完成从噪声分布 π(z)\pi(z)π(z) 到数据分布 pdata(x)p_\text{data}(x)pdata(x) 的变换就可以了。在采样生成时,求出生成器的逆向网络 G−1G^{-1}G1,再将随机采样的噪声输入,即可生成新的符合数据分布的样本。只要最大化上面这个式子,就可以了。

现在的问题就是怎么把这个式子算出来,具体来说,这个式子计算的关键在以下两点:

  • 如何计算行列式 det⁡(JG)\det(J_G)det(JG)
  • 如何求逆矩阵 G−1G^{-1}G1

我们设计的生成器网络 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(fK1...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) zipi(zi)zi=fi(zi1),  zi1=f1(zi)
根据变量变换定理,相邻两步之间的隐变量分布的关系为:
pi(zi)=pi−1(fi−1(zi))∣det⁡Jfi−1∣=pi−1(zi−1)∣det⁡Jfi∣−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)=pi1(fi1(zi))detJfi1=pi1(zi1)detJfi1
每一步的对数似然为:
log⁡pi(zi)=log⁡pi−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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值