Flow-based学习笔记
Flow-based 学习笔记
相较于GAN而言,flow-based的生成效果略逊一筹。然而它已经非常接近于GAN的程度,并且令人印象深刻。流模型作为一种独特的生成模型,在其设计中直接面对概率计算的问题。在现阶段较为流行的其他生成模型中,则要么采用了优化上界(如VAE)或采用对抗训练的方式(如GAN)去避开概率计算的问题。从而寻求近似逼近真实分布的方法。但是流模型选择了一条硬路(主要是通过变换Jacobian行列式)来求解,在后文会详细介绍。
1. 生成模型
在讲述Flow-based模型之前,首先介绍一下生成模型要解决什么问题:

基于给定的两组数据 z 和 x,在变量 z 服从已知先验分布 π(z)(通常表现为高斯分布)的情况下,变量 x 则遵循更为复杂的概率分布 p(x),此分布可视为训练数据集所代表的真实情况。为了建立变量间的映射关系, 我们希望设计一个变换函数 f 能够实现从变量空间 Z 到观测空间 X 的一一映射关系 f: Z ↦ X, 其中对于任意取自 π(z) 中的一个采样点 z', 都能在 p(x) 中找到一个对应的样本点 x' 来实现对应关系。
当能够找到这一变换函数时,则意味着我们成功地构建了一个生成模型。注意到,在概率空间P(x)中每个样本点都对应一张具体的图片。若希望机器能够生成新的图像,则需要从π(z)中随机选取一个点,并通过f: z → x将其映射到数据空间中得到新的样本点x(即对应的图像)。由此可见,在这种情况下关键的问题在于如何找到这一变换函数f?让我们先来看一个最简单的例子:

如图所示,在本研究中假设 z 和 x 均为一维随机变量,并且 z 的概率密度函数遵循简单的均匀分布模式:π(z) = 1(当 z 属于区间 [0,1]),而 x 的概率密度函数则遵循 p(x) = 0.5(当 x 属于区间 [1,3])。

那么构建 z 与 x 之间的变换关系只需要构造一个线性函数即可:x=f(z)=2z+1.
下面再考虑非均匀分布的更复杂的情况:

如图所示,其中π(z)和p(x)均为较为复杂的分布,在极小区间内将其视为简单均匀分布,并基于前面所述的方法计算小段上的f_{∆}值。经过对各小段时间内的变换进行累加,并将其各小段的实际对应采样样本纳入计算后便能够获得完整的变换式f。

如图所示,在区间(z', z' + \Delta z)内\pi(z)被认为近似服从均匀分布,在区间(x', x' + \Delta x)内p(x)同样近似服从均匀分布;因此有:
p(x')\Delta x = \pi(z')\Delta z
当\Delta x与\Delta z都非常小时,则可得到:
p(x') = \pi(z')\left|\frac{dz}{dx}\right|
需要注意的是,在这种情况下导数\frac{dz}{dx}可能为负值(如前所述),但由于概率密度函数p(x')与\pi(z')均为非负值,
因此实际关系应表示为:
p(x') = \pi(z')\left|\frac{dz}{dx}\right|

下面进一步地做推广,我们考虑z与x都是二维分布的情形。

如上文所示,在同一幅图中展示了变量z和变量x均为二维概率分布的情况。左子图中的浅蓝色阴影区则代表了原始空间中的一个微小矩形区域,在该区域内变量z^{'}沿两个坐标轴方向分别移动了微小步长Δz₁和Δz₂所形成的矩形区域。经过线性变换函数f: z→x的作用,在右子图中对应于一个平行四边形的绿色阴影区。其中二维概率密度函数π(z)和p(x)都服从于简单的均匀分布(其具体高度值并未在本图表中标注),这些阴影区的高度均垂直纸面向外延伸。
因为蓝色区域与绿色区域具有相同的体积,则有:
p(x^{'})\begin{vmatrix}det\begin{bmatrix}\Delta x_{11} & \Delta x_{21}\\ \Delta x_{12} & \Delta x_{22}\end{bmatrix}\end{vmatrix}=\pi(z^{'})\Delta z_{1}\Delta z_{2}
其中det\begin{bmatrix}\Delta x_{11} & \Delta x_{21}\\ \Delta x_{12} & \Delta x_{22}\end{bmatrix}代表行列式的计算结果, 这个结果等于图中浅绿色区域所代表的面积(行列式的定义)。接下来我们将\bigtriangleup z_1\bigtriangleup z_2移至左边,则有:
p(x^{'})\begin{vmatrix}\frac{1}{\Delta z_{1}\Delta z_{2}}det\begin{bmatrix}\Delta x_{11} & \Delta x_{21}\\ \Delta x_{12} & \Delta x_{22}\end{bmatrix}\end{vmatrix}=\pi(z^{'})
即:
p(x^{'})\begin{vmatrix}det\begin{bmatrix}\frac{\Delta x_{11}}{\Delta z_ {1}} & \frac{\Delta x_{21}}{\Delta z_ {1}}\\ \frac{\Delta x_{ 34}}{\delta z_ { 56}} & \frac{\delta x_ {78}}{\delta z_ {90}}\end{bmatrix}\end{vmatrix}=π(z')
当Δz₁和Δz₂非常小时:
p(x^{'}) \left| \det \begin{bmatrix}
\frac{\partial x'{1}}{\partial z'{1}} & \frac{\partial x'{2}}{\partial z'{1}} \
\frac{\partial x'{3}}{\partial z'{2}} & \frac{\partial x'{4}}{\partial z'{2}}
\end{bmatrix} \right| = π(z^{'})
即:
p(x^{'}) | det(J_f) | = π(z^{'})
其中J_f代表函数f所对应的雅可比行列式。基于雅可比行列式的逆矩阵计算,则得出:
p(x^{'}) = π(z^{'}) | det(J_{f^{-1}}) |
其中f^{-1}表示将变量从x转换到z空间中的反函数关系。
在此处, 我们得出了一个关键性结论: 当变量Z和变量X分别遵循两种不同的分布, 并且变量Z可以通过函数F转换为变量X时, 针对任意一组对应的采样点Z' 和X', 它们之间的关系可表示如下:
基于上述结论,在将其带回生成模型所应对的问题中去后,则形成了Flow-based Model(流模型)的基本构建思路

如图所示,在完成从z - \pi(z)到x = G(z)-pG(x)之间转化的任务后,请考虑求解生成器G的表达式:
G^{*}= \arg\max_{G}\sum^{m}_{i=1}\log p_{G}(x^{i})
基于之前的推导过程可知:
p_{G}(x^{'})中的样本点与\pi(z)中的样本点之间存在对应关系:
p_{G}(x^{'}) = \pi(z^{'}) \cdot |det(J_{G})|^{-1}
其中z^{i}被定义为G^{-1}(x^{i})的结果。
因此,在G^{*}的目标式能够通过上述关系式得以求解时,则意味着我们成功地完成了生成模型的构建。Flow-based Model 就是基于这一思路展开理论推导并构建模型体系。接下来的部分将详细阐述Flow-based Model的具体求解流程。
2. 求解Flow-based Model
将上一章中的式子:
p_{G}(x^{'})=\pi(z^{'})(|det(J_{G})|)^{-1},z^{i}=G^{-1}(x^{i})
取log,得到:
log p_{G}(x^{'})=log\pi(z^{'})+log(|det(J_{G})|)^{-1}
现在,如果想直接求解这个式子有两方面的困难。第一个困难是,det(J_{G^{-1}})是不好计算的——由于G^{-1}的 Jacobian 矩阵一般维度不低(譬如 256*256 矩阵),其行列式的计算量是异常巨大的,所以在实际计算中,我们必须对G^{-1}的 Jacobian 行列式做一定优化,使其能够在计算上变得简洁高效。第二个困难是,表达式中出现了G^{-1},这意味着我们要知道G^{-1}长什么样子,而我们的目标是求 G,所以这需要巧妙地设计G的结构使得G^{-1}也是好计算的。
为了构建 G 的结构, 我们将从最基础的架构出发进行系统设计。考虑到为了使 G^{-1} 能够计算得出, 矩阵 G 必须满足其输入与输出维度一致, 并且其行列式不等于零。接着, 由于这一目标函数仅依赖于逆变换网络 G^{-1}, 在实际训练过程中, 我们会专注于优化逆变换网络 G^{-1} 对应的部分, 并最终通过求逆得到正向生成模型 G, 在测试阶段则直接采用正向模型来进行图像生成。

如上图所示,在训练过程中我们通过真实分布P_{data}(x)采集到样本数据x^{i}随后对该逆生成器G^{-1}进行系统化训练以确保其输出结果满足预设先验分布要求;在测试阶段则从潜在空间z中提取一个样本点z^{j}经过G映射生成的新样本x^{j}=G(z^{j})即为我们所获得的新生成图像。
接下来详细探讨G的内部架构设置,在确保G^{-1}能够顺利计算的同时使得G的Jacobian行列式易于求解。Flow-based Model采用了称为Coupling Layer的一种关键组件结构。

如图所示,在分解过程中,z与x各自分为前d+1到D维. 在转化过程中, z被划分为前d维直接复制到x中, 而经过F和H两个函数分别转换为\beta_{d+1,\dots,D}和y... 其中,x中的后$d+1到D维通过仿射计算得到. 我们进一步说明了...

上图详细呈现了函数 G 的雅可比行列式的计算框架。首先注意到变量 x_{{1…d}} 与变量 z_{{1…d}} 之间存在直接的一一对应关系,在雅可比矩阵中表现为左上角区域为单位矩阵 I。接着指出变量 x_{{1…d}} 与变量 z_{{1…d}} 之间不存在任何间接关系。因此雅可比矩阵中左下角对应的子块对行列式的贡献可以忽略不计。最后重点考察雅可比矩阵中的右下角子块。
最后此 G 的 Jacobian 行列式的计算公式即表示为:
det(J_{G})=\frac{\partial{x_{d+1}}}{\partial{z_{d+1}}}\frac{\partial{x_{d+2}}}{\partial{z_{d+2}}}\cdots \frac{\partial{x_{D}}}{\partial{z_{D}}}=\beta_{d+1}\beta_{d+2}\cdots\beta_D
这确实是一个易于计算且简洁明了的表达式。接下来值得探讨的是,在上述措施对 G 施加了显著约束后导致其变换能力受限的情况下,则可以通过叠加多个这样的结构来增强模型的能力。

如图所示, 将多个耦合层依次叠加, 从而形成一个更为完整的生成器. 然而, 这会带来一个新的问题: 最终生成的数据在前面d维特征上与原始输入具有高度相似性. 这会导致存在一块固定区域呈现明显的特征模式(实际上这部分源于原始输入中的高斯噪声). 通过将复制模块与其后的仿射模块进行顺序调换的方式可有效缓解这一挑战.

如图所示,在特定耦合层中实施复制操作与仿射模块的位置交换后发现:各个数据单元依次经过复制、仿射、复制、仿射的循环变换路径。这样设计的目的在于避免生成图像中出现来自初始输入直接复制的现象。值得注意的是,在图像生成过程中此类复制-仿射交互模式具有多种具体实现方式:例如,在编码器架构中可采用多层叠加的方式;又如在解码器分支中可引入分支级联机制等具体策略:下面将分别举例加以说明

上图展示了两种不同的数据划分方法用于执行 copy 和 affine 的交替变换操作。左侧图形描述了基于像素空间的划分策略:将所有满足横纵坐标之和为偶数的像素归为一类(记为A类),而剩下的则归入另一类(B类)。随后对这两类图像单元分别交替执行 copy 和 affine 变换(即A-B-A-B循环)。右侧图形则采用了基于通道空间的划分方法:对于一个多通道图像(如三通道),在每次耦合变换过程中按照顺序选择一个通道执行 copy 操作(其余两个通道则执行 affine 变换),通过三次轮换交替完成整个生成过程。

更深入地探讨这一问题时会发现,在生成模型中实现更好的学习效果需要通过何种方式实现copy和affine变换这一关键环节的学习过程。为此我们引入了权重矩阵W这一工具它能够指导copy和affine变换的具体执行步骤从而形成一种高效的学习机制这种方法被称为1×1卷积并且已经被应用于著名的GLOW架构中。值得注意的是这种设计的核心在于让计算机能够在仿射操作之前自动识别并处理图像的不同区域而不必人工指定操作顺序这与直接交换copy和affine操作的执行顺序所产生的效果其实是等价的。

这种对调的原理非常简单,如上图所示举例,假设我们需要将(3,1,2)向量替换成(1,2,3) 向量,只需要将 w 矩阵定义为图中所示矩阵即可。下面我们看一下,将 w 引入 flow 模型之 后,对于原始的 Jacobian 行列式的计算是否会有影响。 对于每一个 3 _3 维划分上的仿射操作来说,由 x = f(z) = W_{z}我们可以得到 f 的 Jacobian 行列式的计算结果为:
J_{f}=\begin{bmatrix}\delta x_{1}/\delta z_{1} & \delta x_{1}/\delta z_{2} & \delta x_{1}/\delta z_{3}\\ \delta x_{2}/\delta z_{1} & \delta x_{2}/\delta z_{2} & \delta x_{2}/\delta z_{3}\\ \delta x_{3}/\delta z_{1} & \delta x_{3}/\delta z_{2} & \delta x_{3}/\delta z_{3}\end{bmatrix}= \begin{bmatrix}w_{11}& w_{12} & w_{13}\\ w_{21} & w_{22} & w_{23}\\ w_{31} & w_{32} & w_{33}\end{bmatrix}=W
代入到整个含有 d 个 3_3 维的仿射变换矩阵当中,得到最终的 Jacobian 行列式的计算 结果就为:(det(W))^{d\times d},如下图所示:

因此,在采用了 1×1 卷积之后的 G 矩阵行列式的计算仍然极为简便;由此可见该方法值得采用,并且这也是 GLOW 论文中最具创新性和突破性的关键发现之一。
总结
在完成了Flow-based Model的理论讲解与架构分析后

