通过'行列式点过程'让 GAN 生成更多样化的样本

2018-12-29

本文介绍 ICML2019 的一篇论文[2]:”GDPP: Learning Diverse Generations using Determinantal Point Processes”。 读完本文可能要花费一点时间,因为需要理解一些相对陌生的数学概念。如果大家花时间阅读了的话,希望能够有所收获。


生成对抗网络(GAN)在训练中有个很突出的问题就是会陷入模式坍塌(mode collapse): 不论输入什么样的的噪声$z$,生成器 G 总是生成模式相同模式的图片 $G(z)$。 通俗的说,不管输入的 $z$如何,G总是生成看起来很相似的图片,也就是生成的数据不够 diverse。

本文介绍的这篇文章用行列式点过程(Determinantal Point Processes, DPP)来规范 GAN 的 Generator,使生成的数据 更加 diverse,缓解 mode collapse。

行列式点过程

这一部分主要参考这篇综述[1]:Determinantal point processes for machine learning。

行列式点过程 $\mathcal{P}$ 是在ground set $\mathcal{Y}$ 的幂集 $2^\mathcal{Y}$ 上的概率测度(probability measure)。 通过 $\mathcal{P}$ 采样得到的子集可以是空集,也可以是全集 $\mathcal{Y}$。 假设 $Y$ 是由 $\mathcal{P}$ 从 $2^\mathcal{Y}$ 中随机采样得到的一个子集,对于任意的 $A \subset \mathcal{Y}$,有 $$ \begin{equation} p(A \subset Y) = \det(K_A)。 \label{eq:eq-dpp1} \end{equation} $$

公式$\ref{eq:eq-dpp1}$ 中变量的含义分别是:

$K$ 很关键,将在接下来一节详细介绍。

DPP kernel

矩阵 $K$ 被称作 DPP kernel,是一个 $N\times N$ 的实对称方阵。 $K$ 的元素 $K_{ij}$ 可以理解为集合 $\mathcal{Y}$ 中第$i,j$个元素之间的相似度(这个很重要!)。

$K_A$ 是根据 $A$ 中的元素从 $K$ 中按行按列索引得到的方阵,也即 $K_A$ 是 $K$ 的主子式(principle minors)。 $\det(K_A)$ 是矩阵 $K_A$ 的行列式值。

由于 $\forall A, p(A \subset Y) \ge 0$,所以 $K$ 是半正定矩阵(主子式大于等于零的矩阵是半正定矩阵)。 同时由于 $p(A \subset Y) \le 1$,$K$ 的特征值都小于1 (证明详见参考文献[1]的Eq.(27))。 我们甚至可以放松 $p(A \subset Y) \le 1$ 条件,这样 $p(A \subset Y)$ 只需要正比于 $\det(K_A)$ 即可:

$$ \begin{equation} p(A \subset Y) \propto \det(K_A)。 \end{equation} $$

$K_{ii}$ 越大的样本,被采样出来的概率越大

当 $A=\{i\}$ 时,$p(\{i\} \subset Y) = K_{ii}$ 表示元素 $i$ 被采样出来的概率。 实际上 $p(\{i\} \subset Y)$是个边缘概率(marginal probability), 因为$p(\{i\} \subset Y) = \sum_{x \subset 2^{\mathcal{Y}}} p(\{i\} \cup x \subset Y)$。

$K_{ij}$ 越大的的两个样本 $\{i, j\}$ 越相似,被同时采样出来的概率越低

假设 $A=\{i,j\}$,那么 $$ \begin{equation} \begin{split} p(\{i,j\} \subset Y) &= \det(\begin{bmatrix} K_{ii} & K_{ij} \\\ K_{ji} & K_{jj} \end{bmatrix}) \\
&= K_{ii}\cdot K_{jj} - K_{ij} - K_{ji} \\
&= K_{ii}\cdot K_{jj} - 2K_{ij} \\
&= K_{ii}\cdot K_{jj} - 2K_{ji}。 \end{split}\label{eq:eq-dpp2} \end{equation} $$

由公式$\ref{eq:eq-dpp2}$很容易得到:当元素$i,j$相似度很高($K_{i,j}$很大)的时候,$i,j$被同时采样的概率就很小。

一个 DPP 采样的例子

到这里可能大家已经被绕晕了。我们先从一个简单的例子开始。

考虑一个从二维平面随机采点的问题。 这里的 ground set 就是限定的正方形二维空间中所有点的集合 $\mathcal{Y}$。 为了简化问题,我们假设只会采样到坐标是整数的点,这样 $\mathcal{Y}$ 就是有限集合,所有的元素个数假设是 $N$。

我们的目标是采样得到的点更加 diverse 一些,也就是点与点之间尽量要远一些, 最好不要存在多个点聚在一起的情况。 那么最简单的做法就是均匀采样。

Figure from [1].

上面右图就是使用均匀采样得到的结果,可以看到有一些点会簇在一起,并不是很“均匀”; 而左边的就是通过 DPP 采样得到的结果,点之间会比较稀疏。

下面我们介绍如何通过 DPP 来采样得到均匀而稀疏的采样点。 想通过 DPP 采样得到 diverse 的样本,我们只需要构造一个 $K$ 矩阵。 假设在正方形区域内一共有 $N$ 个离散的点 $\mathcal{Y} = \{ x_1, …, x_N\}$, 那么 $K \in \mathbb{R}^{N\times N}$ 就是一个 $N\times N$ 的方阵。

前面讲过 $K_{ij}$ 可以理解为集合 $\mathcal{Y}$ 中第$i,j$个元素之间的相似度并且相似度越高的点越不容易被同时采样出来。 因此我们可以定义 $$ \begin{equation} K_{1,1} = K_{2,2} = … = K_{N, N} = \frac{1}{N} \label{eq:k-0} \end{equation} $$

并且

$$ \begin{equation} K_{i,j} = e^{-||i, j||_2} \label{eq:k-1} \end{equation} $$

由公式$\ref{eq:k-0}$和公式$\ref{eq:k-1}$ 可得:

  1. 任意的点$i$被采样出来的概率都是一样的;
  2. 两个点$i,j$的空间距离越近,越不容易被同时采样出来。

通过 公式$\ref{eq:k-0},\ref{eq:k-1}$ 所定义的 DPP kernel 进行采样,得到的点集会更加均匀。

通过“行列式点过程”让 GAN 生成更多样化的样本

将 GAN 训练的每一次迭代建模成一次 DPP 采样

我们考虑 GAN 生成图片的过程为一个采样过程。 GAN 训练中每次迭代都会产生一个 batch size 的图片 $S_B=G(z_B)$,其中$B$是batch size。 同时也会从真实图片中采样出 一些图片$D_B\sim p_d$。 $p_d$ 是真实图像的分布。

对于一个 GAN 而言,我们希望学到一个从噪声 $z$ 到真实数据 $D_B$ 之间的一个映射: $G(\cdot): z \rightarrow p_d$。 因此我们期望生成的图片 $S_B$ 和 真实图片 $D_B$ 是由同一个 DPP kernel 采样得到的: $$ \begin{equation} p(S_B \subset Y) \propto \det(L_{D_B})。 \end{equation} $$ 其中 $L_{D_B}$ 是 $D_B$ 的 DPP kernel(对应公式$\ref{eq:eq-dpp1}$中的$K_A$)。

假设 $L_{S_B}, L_{D_B}$ 分别是采样出 $S_B$ 和 $D_B$ 的 DPP kernel, 那么我们希望$L_{S_B} = L_{D_B}$。

计算 DPP kernel $L_{S_B}, L_{D_B}$

我们怎么计算 $L_{S_B}, L_{D_B}$ 呢? 前面讲过,$L_{S_B}(i,j)$ 表示这个 batch 中第 $i,j$ 两个元素的相似度,值越大越相似。 这样我们就可以用一个特征提取函数 $\phi(\cdot)$,对任意一个图片$I$(不论是 G 生成的还是真实采样的), 都能够提取一个图像特征 $\phi(I)$。

然后图片之间的相似度就可以用特征内积来计算: $$ L_{D_B} = \phi(D_B)^T\phi(D_B) $$

$$ L_{S_B} = \phi(S_B)^T\phi(S_B) $$

为了不引入额外的参数,文章直接用判别器 D 作为 $\phi(\cdot)$。 取判别器倒数第二个全连接层的输出作为样本特征。

图中 $S_B$ 是生成器 G 生成的图片,$D_B$ 是从真实数据中采样出的图片。 特征提取函数 $\phi(\cdot)$ 就是判别器。取判别器倒数第二个全连接层的输出作为输入图像的特征。 $S_B$ 和 $D_B$ 的特征分别是 $\phi(S_B), \phi(D_B)$。$L_{S_B}, L_{D_B}$ 分别是 $S_B$ 和 $D_B$ 的 kernel。 原图来自参考文献 [2]

计算 DPP 损失

在一次迭代中,我们得到 $S_B, D_B$ 并计算出各自的 DPP kernel $L_{S_B},L_{D_B}$。 前面我们假设 $L_{S_B} = L_{D_B}$。 因此损失函数很自然的就想到用 $$ \mathcal{L}^{DPP} = L_{S_B} - L_{D_B}。 $$ 文献[3]指出这是一个非限制性的优化问题。 让$L_{S_B}, L_{D_B}$ 的特征值与特征向量互相匹配是另外一种解决方案。

最终 DPP 损失定义为: $$ \begin{equation} \begin{split} \mathcal{L}^{DPP} &= \mathcal{L}_M + \mathcal{L}_s \\ &= \sum_i ||\lambda_{real}^i - \lambda_{fake}^i|| \\ &- \sum_i \hat{\lambda}_{real}^i \cos(v_{real}, v_{fake}) \end{split}\label{eq:loss-dpp} \end{equation} $$ 公式$\ref{eq:loss-dpp}$ 中 $\lambda_{fake}^i, \lambda_{real}^i$ 分别是 $L_{S_B},L_{D_B}$ 的第 $i$ 个特征值, $v_{fake}^i, v_{real}^i$ 是特征向量。

原生 GAN 的损失函数为: $$ \begin{equation} \mathcal{L}^{GAN} = \mathbb{E}_{z\sim p_z} \Big[ \log\Big(1-D\big(G(z)\big)\Big)\Big] \label{eq:loss-gan} \end{equation} $$

将 DPP 损失(公式$\ref{eq:loss-dpp}$)加入到 GAN 损失函数中,得到: $$ \begin{equation} \mathcal{L}^{DPP-GAN} = \mathcal{L}^{GAN} + \mathcal{L}^{DPP} \label{eq:loss-dpp-gan} \end{equation} $$

使用公式 $\ref{eq:loss-dpp-gan}$ 中的损失函数训练 GAN,在训练数据少的情况下可以显著提升生成图片的多样性。 在训练数据充足的情况下可以提升生成图片的质量。

并且,文章所提出的方法并不单单依赖于 GAN 的结构,也适用于 VAE。实验结果表明 DPP loss 同样可以提升 VAE 所生成图片的质量。


参考文献

  1. Determinantal point processes for machine learning, Alex Kulesza, Ben Taskar
  2. GDPP: Learning Diverse Generations using Determinantal Point Processes, Mohamed Elfeki, Camille Couprie, Morgane Riviere, Mohamed Elhoseiny
  3. Kernel learning by unconstrained optimization. Fuxin Li, Yunshan Fu, Yu-Hong Dai, Cristian Sminchisescu, Jue Wang

感谢阅读🤗 本文内容谢绝任何形式的转载,如果您想和朋友分享本文内容,请分享本文链接 kaizhao.net/blog/gdpp。 如果您发现文中的错误,或者有任何疑问,欢迎在下方留言交流 (留言功能基于 disqus,在中国大陆的读者可能需要一些技术手段才能连接🥲)。