GAN

网络结构

GAN由两部分网络组成:生成网络与判别网络

通俗的来讲,生成网络可以理解为一个画赝品的人,而判别网络可以理解为一个判别真假的人。两者不断对抗,通过训练,从而达到使生成网络画赝品越来越高超,甚至以假乱真。

下面我们来了解Generator与Discriminator。

Generator

Generator也即为一个网络,那么我们希望这个网络达到什么目标呢?

首先,假如有一些人脸图片,那么我们希望这个网络可以生产出非常逼真的人脸图片,即这些人脸是原先并不存在的。

如图所示,我们希望向Generator中input一个从正态分布sample出来的vector。然后会输出一个Distribution,即$P_G$。而$P_{data}$为真实的Distribution。我们的目标是:让$P_G$与$P_{data}$越接近越好。

假如现在输入一个一维向量,那么经过Generator可能会input出绿色的一维向量,而真实的一维向量是蓝色的。所以我们的目标函数即为$G^*$,即最小化$Div(P_G,P_{data})$。这个Divergence越小,就代表$P_G$与$P_{data}$越相似。这个Divergence可以表示为两个向量的距离。

所以Generator的Loss function即为:$Div(P_G,P_{data})$,但由于实际的Divergence式子非常复杂。于是便有这样的问题,如何计算这个Loss function。

而GAN则可以解决这个问题。我们不需要知道$P_G$和$P_{data}$的formulation是什么样子。只要可以从它们间sample出来东西,便可以计算出Divergence。

而计算Divergence便需要Discriminator了。

Discriminator

首先,data中含有真实data与机器生成的data,Discriminator就相当于将从所有data中分辨出哪些是真实的data与假data。其中判别出真data后,给其较大的分数,判别出假data后给其较小的分数。

而我们想让目标函数$V$越大越好,即让$D(y)$越大越好。而目标函数$V$是与cross entropy是有联系的。即$V=-cross \ entropy$,那么现在这个优化问题便可以当成一个分类问题来做。而$V$其实是与$Divergence$有关。

如果$P_G$与$P_{data}$非常相近,那么它们之间的$Divergence$会比较小。那么这便会给$Discriminator$带来困难,其没有办法很好的分辨$P_{G}$与$P_{data}$。那么目标函数$V$的值便不会很大。

于是我们可以将Divergence替换为$max_{D}\ V(D,G)$,于是最初的优化问题便成为min max问题。于是上图训练的算法。尽管如此,GAN的train还是很困难的。

GAN训练技巧

Wasserstein distance

现在有$P$与$Q$两个distribution,可以想象$P$为一堆土,$Q$为土堆放的地方。有一台推土机,将$P$移动到$Q$的距离即为Wasserstein distace。假设P、Q都集中到一点,则Wasserstein distace=d。

但如果P、Q是比较复杂的distribution

例如P变成Q这样可以有多种move的方法。于是将Wasserstein distance定义为:穷举所有moving plan,看哪种方法所用的距离虽少,则即为Wasserstein distance。

求解下图优化问题,即得Wasserstein distance。

Generator 评估

当我们train一个GAN时,我们怎么判断Generator的output的好坏呢?如果我们的输出是一张人靓图片,我们可能会用肉眼进行直接观察,判断其是否逼真。但这样其实是无法准确的进行量度其质量的。

我们可以将图片输入到一个图像分类系统,它的输出为一个概率分布。如果。如果这个概率分布越集中,就代表现在生成的图片可能会比较好。

尽管我们不知道这个image是什么东西,可能是狗、猫、人。但如果分类系统输出的分布非常集中,则证明分类系统非常肯定它看见了狗或猫,所以Generator可能产生了比较逼真的图片。

但这样仍有问题,因为GAN可能会发生Mode Collapse(模式崩溃)。

Mode Collapse

由上图可以发现Generator生成的图片会频繁出现一种动漫人物的脸。这是为什么呢?

由于Discriminator有盲点。即对于刚才频繁出现的动漫人物,它没有办法进行辨识出它为假图片,于是Generator便会频繁生成这类图片。于是便会发生Mode Collapase现象。但Mode Collapse问题现在仍没有好的解决方案。

Mode Dropping

我们在train的时候,也经常会发生一种类似Mode Collapase的现象——Mode Dropping。简单的描述就是其结果的多样性有问题,没有办法达到真实数据的多样性。

在第t个iteration时,我们还没发现有什么问题。但在第t+1个iteration时,我们会发现,它的肤色基本是相同的,其多样性是有问题的。这便是出现了Mode Dropping。

那么如何解决Mode Dropping呢?

我们的方法就是把生成的图片都输入进image classify里面,看它被判断成哪一个class。每一张图片都会输出一个distribution。我们将所有distribution取一个平均。如果平均的distribution非常集中,那么多样性便不够。

而这个评估似乎与评估图片质量的方法是相反的。评估图片质量(quality),要求其产生的分布越集中越好;而评估生成的图片多样性(diversity),要求其产生的分布越平均越好。

但其实它们的评估的范围是不同的。quality是要求输入一张图片产生的distribution越集中越好,而diversity要求输入所有的图片,最后平均的distribution越平均越好。故两者是并不冲突的。

Evaluation Method

使用FID方法。我们不取最后softmax计算得到的类别,而是取在它前面的hidden layer的输出,即incepton network的输出。

我们将这两组高维向量拿出来,假设它们都是Gaussian distribution,然后计算它们的Frechet distance。由于是distance,所以越小越好,即代表两个分布越接近。

但仍有一些问题,即两个分布可能并不是高斯分布,但我们仍将其假设为高斯分布,会比较奇怪。而如果要准确的得到network的分布,可能需要sample很多次。

Condition Generator

如果我们想要输入一个描述性的文字,然后得到相应的图片,应该怎么做呢?这便是condition generator的作用。

在原来distribution Z的基础上,我们加入condition X。假如X即为text,我们希望可以输出与text想对应的image。

那么我们要如何训练呢?

传统的discriminator只需要输入图片,这显然是对condition gan训练是没有作用的。

因此必须要加入condition X也作为discriminator的输入。只有图像与文字匹配了才会给高分。如果图像与文字不匹配,则给低分。所以在训练discriminator时,我们需要有标注的图片。

尽管有positive sample 与negative sample 往往是不够的,我们还需要把生成的图片故意打乱配上错误的文字,以此来告诉discriminator遇到这样的情况也要给低分。