[读论文] Deep Generative Image Models using a Laplacian Pyramid of Adversarial Networks

Deep Generative Image Models using a Laplacian Pyramid of Adversarial Networks
Emily Denton, Soumith Chintala, Arthur Szlam, Rob Fergus
arXiv:1506.05751 [2015]

Intro

之前的文章曾经介绍过生成式对抗网络(Generative Adversarial Networks, GANs)这个模型。然而在应用中我们会发现,用GAN生成的图片其实并不是很逼真。尤其是在高分辨率的情况下,图片看起来明显不自然。

所以在研究了用GAN生成图片的框架之后,很多研究者就开始研究如何让GAN生成的图片看起来更加地自然。一个比较有效果的工作就是Emily Denton et al.的这篇文章。

这篇文章使用级联的方式将很多个由卷积模型组成的生成式网络组合在一起。如同人类作画一样,逐步添加细节,一步一步让内容更加真实,实现了一个“逐步求精”(coarse-to-fine)的过程。这个组合框架被称为Laplacian pyramid,所以这个这篇论文的题目就叫做Deep Generative Image Models using a Laplacin Pyramid of Adversarial Networks。下面简称这个模型为LAPGAN。

Approach

回顾一下GAN:由生成器和判别器组成;生成器输入一串噪声,输出尽可能逼真的图片;判别器输入一张图片,尽可能正确地判断这张图片是由生成器产生的,还是一张真正的图片。这个模型的训练目标是这个:

$$ \mathop{\min}_{G}\mathop{\max}_{D}V(D,G)=\mathbb{E}_{\boldsymbol{h}\sim p_{\text{Data}}(\mathbf{h})}\left[\log D(\boldsymbol{h})\right]+\mathbb{E}_{\boldsymbol{z}\sim p_{\text{Noise}}(\mathbf{z})}\left[\log(1-D(G(\boldsymbol{z})))\right]. $$

而LAPGAN并不是用这个最基本的GAN模型,而是用之前一篇博客中提到的那篇文章中的CGAN(Conditional GAN)。在CGAN中,增加了一个叫做Condition的向量,作为对“控制信息”的编码。这个控制信息可能是图像、标签的one-hot表示、文本等任何内容。这时候,训练目标就变成了这个:

$$ \mathop{\min}_{G}\mathop{\max}_{D}V(D,G)=\\ \mathbb{E}_{\boldsymbol{h},\boldsymbol{l}\sim p_{\text{Data}}(\mathbf{h},\mathbf{l})}\left[\log D(\boldsymbol{h},\boldsymbol{l})\right]+\mathbb{E}_{\boldsymbol{z}\sim p_{\text{Noise}}(\boldsymbol{z}),l\sim p_{l}(\mathbf{l})}\left[\log(1-D(G(\boldsymbol{z},\boldsymbol{l}),\boldsymbol{l}))\right]. $$

这里面这个\(l\)就是控制变量,例如在MNIST数据集上生成手写数字,这个\(l\)就可以是一个表示类别的10维的one-hot向量。

LAP(Laplacian Pyramid)的主要思想就是考虑计算“将小图像上采样得到的图像”与“图像本身”的残差。下面是一些形式化的定义。

首先我们定义两个函数。\(d(.)\)为降采样:例如有一张\(j\times j\)大小的图像\(I\),则\(d(I)\)的尺寸就是\(j/2\times j/2\)。另一个函数是\(u(.)\)为上采样,\(u(I)\)的尺寸是\(2j\times 2j\)。

然后,可以定义一个Gaussian Pyramid \(\mathcal{G}(I)=\left[I_0,I_1,\dots,I_K\right]\)。其中\(I_0=I\),\(I_k\)就是将降采样连续用了\(k\)次。例如\(I_1=d(I)\)、\(I_2=d(d(I))\)以此类推。

Laplacian Pyramid则是由一组系数\(h_k\)组成。表达式是:

$$ h_k=\mathcal{L}_k(I)=\mathcal{G}_k(I)-u(\mathcal{G}_{k+1}(I))=I_k-u(I_{k+1})
$$

有了这一组参数,想要重构图像,就可以这样:\(I_k=u(I_{k+1})+h_k\)。重构图片的时候从这个公式的第\(K\)项开始,逐步向前进行,最终图像\(I=I_0\)。

LAPGAN就是利用了这个思想。通过模型,训练出一个能产生这个系数的生成器,使用“对小图像上采样再叠加这个系数”的方式,从而使低分辨率图像逐步变清晰。

也就是说,整个框架“画”出来的图像,是通过一组GAN,利用这样的方式画出来:

$$ \tilde{I}_k=u(\tilde{I}_{k+1})+\tilde{h}_k=u(\tilde{I}_{k+1})+G_k(z_k,u(\tilde{I}_{k+1})) $$

从公式中可以发现,\(\tilde{h}_k\)实际上是由\(G_k\)通过\(z_k\)和\(u(\tilde{I}_{k+1})\)产生的。其中\(z_k\)就是GAN中的输入噪声,\(u({\tilde{I}_{k+1}})\)就是CGAN中的控制条件。

下面这张图一看就能帮助理解:

开始训练时,我们先用最后一级的生成模型\(G_K\)输入噪声\(z_k\)产生一个\(\tilde{I}_3\)。为了统一模型的架构,此时我们可以设置让\(\tilde{I}_{K=1}=0\),也就是说这个GAN中并没有控制变量的输入。之后就可以按照上面的公式一层一层将这个模型串起来,最终得到一个更高分辨率的图像。

现在问题来了,我们应该如何训练这个生成器G呢?训练生成器,就需要对抗学习的方法。我们可以将这个模型转换成为这个架构(只在训练时使用的架构):

在这个架构下,我们用来训练的顺序跟生成图片的顺序刚好相反,即从原图开始,逐渐向金字塔顶端进行训练。以上图中的第一张图片为例,原图\(I_0=I\),首先对原图进行降采样得到\(I_1\),然后再对\(I_1\)上采样得到\(l_0\)。这时候,我们将原图\(I_0\)与降采样后上采样得到的模糊图\(l_0\)做差,计算出来的残差就是\(h_0\)。在训练中,我们认为这个\(h_0\)就是GAN中可以被判别器标记为真实(Real)的样本。另一方面,我们的CGAN模型,通过输入一段噪声\(z_0\)和降采样后上采样的模糊图片\(l_0\),就能生成一个\(\tilde{h}_0\)。而判别器的功能,就是来判断输入的内容究竟是真实的?还是生成的?在这样的架构之下,系统就能够学习到“将低质量图像变成高质量图像的画笔”。在按照前面一张图片所介绍的过程,就可以生成高质量的图片了!

实验部分就不展开介绍了,跟其他的大同小异,就来看看结果吧:

从这个结果中我们能够理解到Laplacian Pyramid的核心思想。如果我们将一张图降采样再上采样,得到的图片势必会变模糊,如果我们能得到模糊图片和原始图片的插值,也就意味着我们可以将一张分辨率不高的图片,通过叠加这个残差来提升其分辨率。

这种方法并不是学习“如何将分辨率低的图片变成分辨率高的图片”,而是学习能够让分辨率低的图片变成分辨率高的图片的“画法”。这个思想感觉在很对场景都会有应用。即学习到从A到B的映射或许很难,但我们可以捕捉到A和B之间差值的规律,通过对A增加这个差值而得到B,这可能会把问题的规模变得更简单。

这篇文章的另一个启示就是,不要拘泥于GAN中判别器用来判断“真假”的这个固有思维。其实,判别器就是一个二类分类器,它可以用作区分图片是真实的还是生成的,也可以区分输入是“我们所定义的”合理的、还是不合理的。

Friskit

继续阅读此作者的更多文章