[读论文] Generative Adversarial Nets

Generative Adversarial Networks
Goodfellow, Ij; Pouget-Abadie, J; Mirza, Mehdi
arXiv:1406.2661v1 [2014]

Intro

这篇文章是最初介绍GAN的文章。GAN描述了一种生成式对抗学习的结构。这种结构是一类解决问题的框架,通过生成器生成数据,再由一个判别器鉴别数据真伪:

In the proposed adversarial nets framework, the generative model is pitted against an adversary: a discriminative model that learns to determine whether a sample is from the model distribution or the data distribution.

这是一类解决问题的框架,并且依托于这个思路,能够定义出多种不同的结构来,本文则是定义了一种特殊的case:生成模型通过输入一段噪声来生成数据。作者将这个special case称为对抗网络。

主要包含生成器(Generator)和判别器(Discriminator)两个部分。 生成器输入一段由\(p_z\)随机采样得到的噪声,输出为生成的样本。 判别器需要能判别输入的样本是由数据分布\(p_{data}\)生成的,还是由生成器\(p_g\)生成的。本文作者直接使用mlp作为生成器和判别器。并使用了dropout等来达到效果。除此之外,作者特意强调了没有使用近似推断和马尔科夫链等技术:

No approximate inference or Markov chains are necessary.

关于Adversarial Nets

网络的目的之一,就是通过数据\(x\)学习到生成器的概率分布\(p_g\)。模型首先定义了一个输入噪声的随机变量\(p_z(z)\),然后将由这个分布采样出来的噪声\(z\)经过映射\(G(z;\theta_g)\)映射到数据空间。也就是说,如果这个由参数\(\theta_g\)控制的\(G\)足够强大、参数选择的足够好,则将噪声映射到的那个数据空间,应该跟训练数据的数据空间相一致。这就说明,通过训练,我们可以用\(G\)将一组随机噪声mapping到一个“真实”的数据。这里“真实”加了引号,是因为这个真实指的不是训练数据中的某个真实样例,而是由生成真实数据的生成模型\(p_g\)所生成的其他数据。可见,这个生成模型其实能够生成“新东西”,也就是“符合数据的概率分布、但与已知训练数据都不相同”的真实内容。

Amazing, 我们的模型能够通过学习数据的内部特征,产生新知识、新内容了!

至此,我们就可以构建出一个生成模型。但仔细一想,现有的手段并不能满足我们“产生新知识”的要求:如果我们只有一个生成模型,那么训练的目标函数是什么?是已有的数据?

如果训练目标是已有的数据,那这个问题就退化成了无监督的回归问题:让生成器\(G\)的输出尽可能与已有的样本相等。但是这种方法并不能训练处新知识,而只是让生成器“记住更多训练数据”。

所以,作者很巧妙地增加了另一个模块:判别器\(D\)。

判别器的作用就是判别刚刚生成的数据是“真实的样本”?还是“由生成器生成出来的样本?”如此一来,这个整体模型就变成了两方博弈的过程:生成器学习如何去伪造尽可能逼真的数据,判别器学习如何鉴别出那些是生成的数据、哪些是真实的数据。

也就是说,这个模型由两个部分共同组成。我们可以定义如下的优化目标函数: $$ \mathop{\min}_{G}\mathop{\max}_{D}V(D,G)=\mathbb{E}_{\boldsymbol{x}\sim p_{\text{data}}}\left[\log D(\boldsymbol{x})\right]+\mathbb{E}_{\boldsymbol{z}\sim p_z(\boldsymbol{z})}\left[\log(1-D(G(\boldsymbol{z})))\right]. $$

这个目标函数的含义,就是找到一个能让这个函数最大化的\(D\)和最小化的\(G\)。因为这个函数越大,则说明“\(D\)”的判别能力越强。而这个函数越小,说明\(G\)的“伪装”能力越强(生成的样本越像真实样本)。

听上去有些矛盾是不是?但实际上,这个最大化且最小化的模型,就像两个对手相互竞争,最终达到收敛。作者在文章中证明:这个训练过程总会收敛,而且收敛时,\(p_g=p_{data}\),而优化函数则会收敛到\(-\log4\)

在模型的训练过程中也有一些潜在的坑。

首先是由于整个数据集比较大,在内层循环中利用整个数据集去优化\(D\)的过程是难以计算的,所以我们用迭代的方式:先训练\(k\)次\(D\),然后训练一次\(G\)。这样能够让\(G\)变化的缓慢一些,防止overfit。

还有一个坑就是,由于上面这个优化的目标函数不能对\(G\)的更新提供足够的梯度。并且在训练初期,\(G\)显然是一个非常差的模型,这个时候\(D\)有很高的可能性会鉴别出来\(G\)生成的“伪”数据。因为这些数据与真实数据相比确实是非常的不同。而在这种情况下,\(\log(1-D(G(\boldsymbol{z})))\)饱和了。所以此时,我们不再最小化\(\log(1-D(G(\boldsymbol{z}))\)而是去训练\(G\)去最大化\(\log(D(G(\boldsymbol{z})))\)。这种训练方法会导致"The same fixed point of the dynamics of \(G\) and \(D\)",但是能够在训练的早期提供比较大的梯度。

没看懂是吧?所以让我们直观一些解释一下。

我们本来需要优化的函数是同时最大最小化这个:

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

因为上面公式的第二项(有生成器的那部分)的形式会导致其很容易处于饱和状态(即梯度几乎是0的状态)。这时候对我们的训练时非常不利的!所以我们将这个训练过程拆成两步。第一步是按照上面的损失函数训练判别器。然后再换一个目标函数来训练生成器: $$ \mathop{\max}_{D}\mathbb{E}_{\boldsymbol{x}\sim p_{\text{data}}}\left[\log D(\boldsymbol{x})\right]+\mathbb{E}_{\boldsymbol{z}\sim p_z(\boldsymbol{z})}\left[\log(1-D(G(\boldsymbol{z})))\right]\\ \mathop{\max}_{G}\mathbb{E}_{\boldsymbol{z}\sim p_{\text{z}}}\left[\log D(G(\boldsymbol{z}))\right] $$

这两个部分交替进行训练,也就是本片论文中提到的“训练\(k\)次\(D\)、训练一次\(G\)”

Experiments

在文章的实验部分,作者使用了几个不同的数据集进行训练,给出了下面这张图:

Experience

每一副图片都是由一个数据集生成。图片左边五列是生成的内容,最后一列是与第四列生成出内容最像的一个。从结果上能看出来:生成的模型与真实模型相似、但不完全一致。说明我们的目标达到了。

Advantages and disadvantages and future works

作为一篇用来首次提出模型的文章,这个模型还很简单,所以文章的精华部分在于讨论这个模型的优缺点以及后续的可能的工作,相当于给后来人留下许多可以填的坑。

首先,文章自己承认,用这种方法其实并不能学习到一个明确的\(p_g(\boldsymbol{x})\)的表示,由于里面用了神经网络,所以最后只相当于学习到了一个黑盒子:以噪声为输入,以生成的结果为输出。除此之外,判别器的训练过程应该与生成器的训练过程保持同步。特别在判别器没有更新的情况下,绝对不能更新太多次生成器,否则可能会发生“Helvetica Scenario”现象,也就是不论\(\boldsymbol{z}\)是啥,都会得到同样的生成结果\(\boldsymbol{x}\)。

而这个模型的好处在于不需要马尔科夫链,只需要用反向传导的算法获取梯度即可,并且在学习过程中也不需要推断过程。

论文中列了个表格来讨论GAN与其他模型的优劣:

Markdown画大表格太麻烦了我就直接截图了:

然而其实很多方法我也没有看懂。。。

上述优点主要是“可计算”。对抗模型在统计特性上也有一些优势,比如说生成器并不是直接通过数据样本进行更新,而是通过判别器的梯度进行更新。这意味着算法并不是直接将输入数据拷贝到生成器的参数中(而是学习到了样本数据的一些特征)。另一个对抗网络的好处是它能够表现的非常“锐”,甚至是对退化分布也是如此。而基于马尔科夫链的方法需要这个分布有一些模糊才能够使得其能够融合多个模式。(这段话仍然没太看懂,直译。)

紧接着,作者提出了几点在未来可能会有价值的扩展:

  1. 通过在\(G\)和\(D\)上增加一个输入\(\boldsymbol{c}\),从而能够得到一个“条件生成模型”\(p(\boldsymbol{x}|\boldsymbol{c})\)。
  2. 通过训练一个辅助的网络来用\(\boldsymbol{x}\)预测\(\boldsymbol{z}\),从而能学习到近似推断。
  3. 能近似地建模所有条件概率\(p(\boldsymbol{x}_S|\boldsymbol{x}_{\require{cancel}\cancel{S}})\)。其中的\(S\)是通过训练一组条件概率模型得到的共享参数的下标(indices)的子集。
  4. 半监督学习:当只有有限的标注数据时,判别器或者推断网络中得到的特征能够提高分类性能。
  5. 提升效率:可以通过一些能更好地协调\(G\)与\(D\)的方法或者更好的对\(z\)进行采样的方法来提升效率。

最后作者说了一句意味深长的话:

This paper has demonstrated the viability of the adversarial modeling framework, suggesting that these research directions could prove useful.

也就是说,作者提出了一个adversarial modeling framework,在这个framework上还是有不少可以继续研究的东西的。

大家努力填坑吧!

Friskit

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