在本文中,我们将深入探讨第三种生成模型:基于流的生成模型(Flow-based generative models)。与GAN和VAE不同,这种模型显式地学习输入数据的概率密度函数。
截至目前,我已介绍了两种生成模型,GAN和VAE。它们都不能显式地计算出真实数据的概率密度函数 $p(\boldsymbol{x}),\boldsymbol{x} \in \mathcal{D}$,因为这真的很难!以含有隐变量的生成模型为例,$p(\boldsymbol{x})=\int p(\boldsymbol{x} | \boldsymbol{z}) p(\boldsymbol{z}) d \boldsymbol{z}$ 几乎不可能被算出,因为遍历所有隐变量 $\boldsymbol{z}$ 的值是不可能的。
在normalizing flow的帮助下,基于流的生成模型解决了这个困难的问题。对于 $p(\boldsymbol{x})$ 的良好估计使得许多下游任务能被高效完成:数据生成(data generation)、密度估计(density estimation)、推理隐变量(infer latent variables)等。
生成模型的种类(Type of Generative Models)
以下是GAN、VAE和flow-based models的主要区别:GAN:生成式对抗网络(GAN)使用一种十分聪明的方式将数据生成这个无监督问题转化为一个有监督问题。判别模型学习如何将真实数据从生成模型生成的假样例中区分出来,两个模型以一种minmax游戏的方式进行训练。
VAE:变分自动编码器(VAE)通过最大化证据下界(ELBO)来隐式地最优化数据的对数似然。
Flow-based generative models:基于流的生成模型由一系列可逆变换(invertible transformations)组成。不像其他两种模型,基于流的模型显式地学习数据分布 $p(\boldsymbol{x})$,因此其损失函数就是简单的负对数似然函数。
线性代数基础(Linear Algebra Basics Recap)
在更加深入地了解基于流的生成模型之前,我们应该理解两个关键概念:雅可比矩阵行列式和变量变换定理。
雅可比矩阵和行列式(Jacobian Matrix and Determinant)
给定一个将 $n$ 维输入向量 $\boldsymbol{x}$ 映射到 $m$ 维的函数 $\boldsymbol{f} : \mathbb{R}^{n} \mapsto \mathbb{R}^{m}$,该函数的所有一阶偏导数组成的 $m \times n$ 矩阵称为雅可比矩阵 $\boldsymbol{J}$:
$$
\boldsymbol{J}=\left[\begin{array}{ccc}{\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{array}\right]
$$
行列式是由方阵的所有元素计算得到的一个实数。行列式的绝对值可以视为方阵列向量(或行向量)所张成的平行多面体的体积。
$n\times n$ 矩阵 $M$ 的行列式为:
$$
\operatorname{det} M=\operatorname{det}\left[\begin{array}{cccc}{a_{11}} & {a_{12}} & {\dots} & {a_{1 n}} \\ {a_{21}} & {a_{22}} & {\dots} & {a_{2 n}} \\ {\vdots} & {\vdots} & {} & {\vdots} \\ {a_{n 1}} & {a_{n 2}} & {\dots} & {a_{n n}}\end{array}\right]=\sum_{j_{1} j_{2} \dots j_{n}}(-1)^{\tau\left(j_{12} \dots j_{n}\right)} a_{1 j_{1}} a_{2 j_{2}} \dots a_{n j_{n}}
$$
方阵 $M$ 的行列式决定了其是否可逆:如果 $\operatorname{det}(M)=0$ 则 $M$ 不可逆,反之则可逆。
矩阵乘积的行列式等于矩阵行列式的乘积:
$$
\operatorname{det}(A B)=\operatorname{det}(A) \operatorname{det}(B)
$$
变量变换定理(Change of Variable Theorem)
让我们在概率密度估计问题的背景下复习一下变量变换定理,首先以单变量的情况为例。
给定一个随机变量 $z$,并已知其概率密度函数 $z \sim \pi(z)$。我们使用1-1映射 $x=f(z)$ 构造一个新的随机变量 $x$,映射函数 $f$ 是可逆的,故 $z=f^{-1}(x)$ 。现在的问题是:如何推断出新的变量 $x$ 的概率密度函数 $p(x)$?
$$
\int p(x) d x=\int \pi(z) d z=1
$$
$$
p(x)=\pi(z)\left|\frac{d z}{d x}\right|=\pi\left(f^{-1}(x)\right)\left|\frac{d f^{-1}}{d x}\right|=\pi\left(f^{-1}(x)\right)\left|\left(f^{-1}\right)^{\prime}(x)\right|
$$
根据定义,积分 $\int \pi(z) d z$ 是无数个宽度为无穷小 $\Delta z$ 的长方形的面积之和。这种长方形在 $z$ 处的高度为概率密度函数 $\pi(z)$ 的值。当我们替换变量时,由 $z=f^{-1}(x)$ 有 $\frac{\Delta z}{\Delta x}=\left(f^{-1}(x)\right)^{\prime}$,即 $\Delta z=\left(f^{-1}(x)\right)^{\prime} \Delta x$。
多变量的版本具有相似的形式:
$$
\boldsymbol{z} \sim \pi(\boldsymbol{z}), \boldsymbol{x}=f(\boldsymbol{z}), \boldsymbol{z}=f^{-1}(\boldsymbol{x})
$$
$$
p(\boldsymbol{x})=\pi(\boldsymbol{z})\left|\operatorname{det} \frac{d \boldsymbol{z}}{d \boldsymbol{x}}\right|=\pi\left(f^{-1}(\boldsymbol{x})\right)\left|\operatorname{det} \frac{d f^{-1}}{d \boldsymbol{x}}\right|
$$
其中 $\operatorname{det} \frac{\partial f}{\partial \boldsymbol{z}}$ 是函数 $f$ 的雅可比行列式。
什么是标准化流?(What is Normalizing Flows?)
密度估计在许多机器学习问题中都有应用,但它十分困难。例如,由于我们在深度学习模型中需要进行反向传播,因此后验概率分布 $p(\boldsymbol{z} | \boldsymbol{x}))$ 应该足够简单,以便进行求导。这也是高斯分布在隐变量生成模型中被广泛应用的原因,即使大多数现实世界的分布要远比高斯分布复杂。
标准化流(Normalizing Flow)模型的提出就是为了获得更好、更强大的近似概率分布的能力。标准化流通过一系列可逆变换函数将一个简单的分布转化为一个复杂的分布。在一串变换中,我们根据变量变换定理重复地进行变量替换,并最终得到目标变量的概率分布。
如上图所示:
$$
\boldsymbol{Z}_{i-1} \sim p_{i-1}\left(\boldsymbol{Z}_{i-1}\right)
$$
$$
\boldsymbol{z}_{i}=f_{i}\left(\boldsymbol{z}_{i-1}\right), \text { thus } \boldsymbol{z}_{i-1}=f_{i}^{-1}\left(\boldsymbol{z}_{i}\right)
$$
$$
p_{i}\left(\boldsymbol{z}_{i}\right)=p_{i-1}\left(f_{i}^{-1}\left(\boldsymbol{z}_{i}\right)\right)\left|\operatorname{det} \frac{d f_{i}^{-1}}{d \boldsymbol{z}_{i}}\right|
$$
接下来,让我们把该公式转化为 $\boldsymbol{z}_i$ 的函数,以便根据初始分布进行推理。
$$
\begin{aligned}
p_{i}\left(\boldsymbol{z}_{i}\right)&=p_{i-1}\left(f_{i}^{-1}\left(\boldsymbol{z}_{i}\right)\right)\left|\operatorname{det} \frac{d f_{i}^{-1}}{d \boldsymbol{z}_{i}}\right|\\
&=p_{i-1}\left(\boldsymbol{z}_{i-1}\right)\left|\operatorname{det}\left(\frac{d f_{i}}{d \boldsymbol{z}_{i-1}}\right)^{-1}\right|\\
&=p_{i-1}\left(\boldsymbol{z}_{i-1}\right)\left|\operatorname{det} \frac{d f_{i}}{d \boldsymbol{z}_{i-1}}\right|^{-1}
\end{aligned}
$$
上面的过程用到了以下数学定理。反函数定理
如果 $y=f(x),x=f^{-1}(y)$,则有:
$$
\frac{d f^{-1}(y)}{d y}=\frac{d x}{d y}=\left(\frac{d y}{d x}\right)^{-1}=\left(\frac{d f(x)}{d x}\right)^{-1}
$$可逆函数的雅可比行列式
可逆矩阵的逆的行列式等于该矩阵行列式的逆:
$$
\operatorname{det}\left(M^{-1}\right)=(\operatorname{det}(M))^{-1}
$$
这是因为
$$
\operatorname{det}(M) \operatorname{det}\left(M^{-1}\right)=\operatorname{det}\left(M \cdot M^{-1}\right)=\operatorname{det}(I)=1
$$
给定一系列这样的概率密度函数,并且已知每对相邻变量的关系,我们可以将公式一步一步进行扩展,直至追溯到初始分布 $\boldsymbol{z}_{0}$。
$$
\boldsymbol{x}=\boldsymbol{z}_{K}=f_{K} \circ f_{K-1} \circ \cdots \circ f_{1}\left(\boldsymbol{z}_{0}\right)
$$
$$
\begin{aligned}
\log p(\boldsymbol{x})=\log \pi_{K}\left(\boldsymbol{z}_{K}\right)&=\log \pi_{K-1}\left(\boldsymbol{z}_{K-1}\right)-\log \left|\operatorname{det} \frac{d f_{K}}{d \boldsymbol{z}_{K-1}}\right|\\
&=\log \pi_{K-2}\left(\boldsymbol{z}_{K-2}\right)-\log \left|\operatorname{det} \frac{d f_{K-1}}{d \boldsymbol{z}_{K-2}}\right|-\log \left|\operatorname{det} \frac{d f_{K}}{d \boldsymbol{z}_{K-1}}\right|\\
&=\ldots\\
&=\log \pi_{0}\left(\boldsymbol{z}_{0}\right)-\sum_{i=1}^{K} \log \left|\operatorname{det} \frac{d f_{i}}{d \boldsymbol{z}_{i-1}}\right|
\end{aligned}
$$
随机变量 $\boldsymbol{z}_{i}=f_{i}\left(\boldsymbol{z}_{i-1}\right)$ 穿过的路径被称为流(flow),而连续分布 $\pi_{i}$ 组成的链被称为标准化流(normalizing flow)。出于计算的需求,变换函数 $f_i$ 应满足两个性质:容易求逆;
雅可比行列式容易计算。
标准化流模型(Models with Normalizing Flows)
当我们的工具箱内有了标准化流之后,输入数据的对数似然 $p(\boldsymbol{x})$ 就很容易处理了。基于流的生成模型的训练目标就是数据集 $\mathcal{D}$ 上的简单的负对数似然函数:
$$
\mathcal{L}(\mathcal{D})=-\frac{1}{|\mathcal{D}|} \sum_{\boldsymbol{x} \in \mathcal{D}} \log p(\boldsymbol{x})
$$
RealNVP
RealNVP(Real-valued Non-Volume Preserving)模型通过堆叠一系列可逆双射变换函数实现了标准化流。在每个被称为“仿射连接层”的双射 $f: \boldsymbol{x} \mapsto \boldsymbol{y}$ 中,输入向量(假设有 $D$ 维)的维度被分为两个部分:前 $d$ 个维度保持不变;
$d+1$ 到 $D$ 维进行一个仿射变换(放缩和平移,scale-and-shift),并且放缩和平移的参数都是前 $d$ 个维度的函数。
$$
\begin{aligned} \boldsymbol{y}_{1 : d} &=\boldsymbol{x}_{1 : d} \\ \boldsymbol{y}_{d+1 : D} &=\boldsymbol{x}_{d+1 : D} \odot \exp \left(s\left(\boldsymbol{x}_{1 : d}\right)\right)+t\left(\boldsymbol{x}_{1 : d}\right) \end{aligned}
$$
其中 $s( .)$ 和 $t( .)$ 分别是放缩和平移函数,都进行映射 $\mathbb{R}^{d} \mapsto \mathbb{R}^{D-d}$。$\odot$ 运算表示对应元素相乘。
现在让我们来检查一下这种变换是否满足上文提到的两种性质。
条件1:容易求逆
显然该变换函数的逆很容易求出:
$$
\left\{\begin{array}{l}{\boldsymbol{y}_{1 : d}=\boldsymbol{x}_{1 : d}} \\ {\boldsymbol{y}_{d+1 : D}=\boldsymbol{x}_{d+1 : D} \odot \exp \left(s\left(\boldsymbol{x}_{1 : d}\right)\right)+t\left(\boldsymbol{x}_{1 : d}\right)}\end{array} \Leftrightarrow\left\{\begin{array}{l}{\boldsymbol{x}_{1 : d}=\boldsymbol{y}_{1 : d}} \\ {\boldsymbol{x}_{d+1 : D}=\left(\boldsymbol{y}_{d+1 : D}-t\left(\boldsymbol{y}_{1 : d}\right)\right) \odot \exp \left(-s\left(\boldsymbol{y}_{1 : d}\right)\right)}\end{array}\right.\right.
$$
条件2:雅可比行列式容易计算
该变换函数的雅可比行列式很容易求出,因为它的雅可比矩阵是一个下三角矩阵:
$$
\boldsymbol{J}=\left[\begin{array}{cc}{\mathbb{I}_{d}} & {\boldsymbol{0}_{d \times(D-d)}} \\ {\frac{\partial \boldsymbol{y}_{d+1 : D}}{\partial \boldsymbol{x}_{1 : d}}} & {\operatorname{diag}\left(\exp \left(s\left(\boldsymbol{x}_{1 : d}\right)\right)\right)}\end{array}\right]
$$
因此其雅可比行列式就是对角线元素的乘积:
$$
\operatorname{det}(\boldsymbol{J})=\prod_{j=1}^{D-d} \exp \left(s\left(\boldsymbol{x}_{1 : d}\right)\right)_{j}=\exp \left(\sum_{j=1}^{D-d} s\left(\boldsymbol{x}_{1 : d}\right)_{j}\right)
$$
看起来仿射连接层对于建立标准化流来说十分完美。除此之外,由于计算 $f^{-1}$ 不需要计算 $s$ 或 $t$ 的逆,并且计算雅可比行列式不需要计算 $s$ 或 $t$ 的雅可比行列式,因此这两个函数可以是任意复杂的,都可以用神经网络来表示。
在一个仿射连接层中,一些维度(信道)保持不变。为了保证所有输入都有机会被改变,模型在每一层中反转顺序。使用这种模式,在一个层中保持不变的单元在下一层中必被改变。批量归一化(batch normalization)操作被发现有助于模型的训练。
除此之外,RealNVP能以多尺度的结构进行工作,从而对大规模的输入构造高效的模型。多尺度架构对仿射层使用几种采样(sampling)操作,包括空间棋盘样式遮挡(spatial checkerboard pattern masking)、挤压操作(squeezing operation)、信道维度的遮挡(channel-wise masking)等。
NICE
NICE(Non-linear Independent Component Estimation)模型是REALNVP的前作。NICE中的变换操作时不含有放缩操作的仿射连接层,被称为“加和连接层”(additive coupling layer)。
$$
\left\{\begin{array}{l}{\boldsymbol{y}_{1 : d}=\boldsymbol{x}_{1 : d}} \\ {\boldsymbol{y}_{d+1 : D}=\boldsymbol{x}_{d+1 : D}+m\left(\boldsymbol{x}_{1 : d}\right)}\end{array} \Leftrightarrow\left\{\begin{array}{l}{\boldsymbol{x}_{1 : d}=\boldsymbol{y}_{1 : d}} \\ {\boldsymbol{x}_{d+1 : D}=\boldsymbol{y}_{d+1 : D}-m\left(\boldsymbol{y}_{1 : d}\right)}\end{array}\right.\right.
$$
Glow
Glow模型拓展了之前的可能生成模型NICE和RealNVP,并将信道上的反向排列操作替换为可逆的1×1卷积。
Glow中每一步流操作包含3个子步骤。
步骤1:Activation normalization(简写为actnorm)
该步骤使用一个放缩参数和一个偏移参数对每一个信道进行仿射变换,这与batch normalization类似,但在大小为1的mini-batch上工作。这两个参数是可以训练的,但由于具有初始化的值,因此数据的第一个minibatch在经过actnorm后均值为0,标准差为1。
步骤2:可逆 $1×1$ 卷积
在RealNVP流中,新到的顺序被反转,因此所有的数据维度都有机会被改变。而输入信道数和输出信道数相同的 $1×1$ 卷积可以进行任意顺序的信道排列操作。
也就是说,我们对 $h \times w \times c$ 维的输入张量 $\boldsymbol{h}$ 使用 $c\times c$ 权重矩阵 $\boldsymbol{w}$ 进行可逆的 $1\times1$ 卷积操作,输出为一个 $h \times w \times c$ 维的张量,表示为 $f=\operatorname{conv} 2 \mathrm{d}(\boldsymbol{h} ; \boldsymbol{W})$。为了应用变量变换定理,我们需要计算雅可比行列式 $|\operatorname{det} \partial f / \partial \boldsymbol{h}|$。
$1\times 1$ 卷积地输入和输出都可以被视为一个大小为 $h\times w$ 维的矩阵。输入张量 $\boldsymbol{h}$ 中的每个entry $\boldsymbol{x}_{i j}(i=1, \ldots, h, j=1, \ldots, w)$ 是一个 $c$ 信道的向量,每个entry分别与权重矩阵 $\boldsymbol{W}$ 相乘来获得输出矩阵中的对应entry。每个entry的导数为 $\partial \boldsymbol{x}_{i j} \boldsymbol{W} / \partial \boldsymbol{x}_{i j}=\boldsymbol{W}$,共有 $h\times w$个这样的entry,因此有:
$$
\log \left|\operatorname{det} \frac{\partial \operatorname{conv} 2 \mathrm{d}(\boldsymbol{h} ; \boldsymbol{W})}{\partial \boldsymbol{h}}\right|=\log \left(|\operatorname{det} \boldsymbol{W}|^{h \cdot w} |\right)=h \cdot w \cdot \log |\operatorname{det} \boldsymbol{W}|
$$
逆向的 $1\times 1$ 卷积依赖于逆矩阵 $\boldsymbol{W}^{-1}$。由于权重矩阵 $\boldsymbol{W}$ 相对来说规模较小,因此计算其行列式和逆矩阵的计算量仍在可控范围内。
步骤3:仿射连接层
这一部分的设计与RealNVP相同。