李宏毅深度学习笔记 7 - 生成式对抗网络综述

从 2014 年 GAN 提出来开始,到现在已经多到两个字母的缩写不够用的情况。我们把这些 GAN 的结构分为两种,一种是网络结构层面的变体,另一种是损失函数层面的变体。前面一种的话,主要是为了让 GAN 去适配于不同领域的不同任务,后面一种就是从 GAN 训练的本质上出发去做优化,解决在 GAN 训练中一些突出的问题。两个分类这里都会挑几种经典的讲,最后会介绍一下 GAN 的评价指标。

网络结构层面的变体

首先这个是原始的 GAN,整个的训练过程在《MO 论文分享:Data-free Learning of Student Networks》中已经做了详细的介绍。举个形象一点的例子的话,比如生成动漫的人脸,生成器和判别器一开始参数是随机的,然后生成器 G1 会生成没有意义的图像,因为判别器是看过真实样本的,所以他很轻易根据图像没有两个圆圈一样的眼睛就可以分辨出,然后生成器根据这个去更新参数,生成了有两个圈的图像。判别器更新后又会找到当前的图像和真实图像新的差异,就一直这样下去直到判别器无法分辨生成器生成的图像。这个是最原始的 GAN,因为他 G 和 D 用的是全连接网络,所以我们把他叫做 FCGAN。

第二篇 DCGAN,其实就是把判别器改成卷积,生成器改成反卷积,然后做了很多很多的实验去找到说用什么激活函数、用什么优化器。但其实他的思想的话,和原来的 GAN 的思想是一模一样的。

前面的两个 GAN,虽然我们可以让生成器生成假图像,但是这个生成器是我们无法控制的。比如生成手写数字,我们不能指定让生成器生成数字几。这个条件 GAN,他就是把数字几这个信息,表示成 one-hot 的向量,然后给他直接 concat 到原来 G 和 D 的输入上,这样我们就可以通过指定 y 来生成指定的数字。

条件 GAN 的话,有两种形式,一种就是我们刚才那样直接把图像 x 和标签 c 进行 concat,这样的话,如果判别器给了一个低分,我们不知道是生成的图像不好还是图像和标签不匹配,所以会有下面这样的形式,绿色的网络就是原来的判断图像真假,然后用一个额外的网络来判断 x 和 c 是不是匹配。直觉上的话下面这个结构会更好,但现在说条件 GAN 的话,更多的还是指上面的结构。

还有一种实现控制输出的方法,就是我们把生成器后面额外加一个 Decoder 变成 autodecoder 的形式,通过黄色的这一块,让他还原出输入生成器的 C。这个网络它可以做到更有意思的事情,他的输入 c 可以不是 one-hot 形式的,逐渐增大 c 的第一维我们会看到数字的倾斜度变了,改变第二维可以看到笔划变粗了,也就是说 c 的每一维我们可以确实的知道他代表了输出的什么特征。这种 autodecoder 和 GAN 结合的形式,根据放的位置,还有很多种变体,这里我们就不展开了。

前面说的 GAN 的结构,他们其实生成的图片都非常小,很多都是直接把输入图片 resize 成 64x64,再大的话生成器就完全不行。所以就出现了 StackGAN 这样的分两步去生成大的图像,这个 StackGAN 的话,他是在网络层面上去叠加。

现在用的最多的,还是像下面的 ProGAN 这样一层一层的去加网络,来让他逐步的生成很大的图像。

生成式对抗网络还可以做到更多非常有意思的事情,例如图像到图像的转换,这就是鼎鼎大名的 CycleGAN。值得注意的是,以生成梵高风格的图像为例,在这个任务中,我们的数据集是不具备和输入真实图像一模一样的梵高风格的图像的。因此,直接的对生成图像和已有的梵高风格的图像做 L1,L2 损失都是不能准确的衡量生成图像的质量的,还有可能导致生成图像和输入图像完全无关的情况。所以就有了 CycleGAN 这样 “环 “状的网络结构,对于生成的假梵高风格的图像,我们再通过另外一个生成器给他转换回去,并衡量这个图象和最初图像的相似度。有了第二个生成器的限制,第一个生成器生成的图像就必须包含有原始图像的信息,这样才能转换回原来的图像。

CycleGAN 实现了一种风格到另一种风格的转换,那如果有多种风格呢?例如喜怒哀乐四个表情的转换是不是需要设置 4*3=12 个 CycleGAN 来进行转换呢?这样对计算资源的消耗将是具大的。因此就有了 StarGAN,其实 StarGAN 并不神秘,他和前面介绍的 cGAN 十分相似,只不过是用一个向量代表了当前的图片属于哪一种风格,并作为控制条件一起输入到生成器当中。

损失函数层面的变体

然后是损失函数层面的。下图左侧的公式就是在证明说,原来的 GAN 结构是在优化真实分布和生成分布的 JS 距离,就是右侧上面这个式子。这个式子有一个问题,就是当真实分布和均匀分布没有重合的时候,他是一个定值,所里这里两个红色的生成分布曲线,虽然左边的离真实的分布更近,但他们得到的损失是完全一样的。而真实分布他是高维空间中的一个低维流形,所以很有可能生成的分布和真实分布就是没有重合的。

此外 GAN 还有两个问题,一个是模式奔溃,就是我们看图上这样会有很多重复的人脸,可能越训到后面,生成器生成的分布就会越来越小,这张图片就会开始蔓延。

还有一种是 ModeDropping,它是指生成器在某个阶段只会生成真实分布的一个子分布,比如这里只会生成白肤色的人脸这样。

这个问题数学上解释的话就是说我们 GAN 的优化目标 JS 距离更像是下图右侧这个 Reverse KL 散度,按照这个去优化,他最后就会是红色的分布这样只匹配真实分布的一部分。

而 WGAN,就是把原来的 JS 距离给他改成了一个推土机距离,推土机距离就是说,我们把这个分布看成一个个沙堆,从上面这个分布变成下面这个分布,需要移动多少的土。这种移土的方法不止一种,WGAN 就是穷举这些方法找到一个最小的。然后他做了很多数学上的证明,反正到最后就是把 D 的损失改成了这个样子。这里对 D 是有要求的,他必须是一种比较平滑的函数。但有了这个限制的话我们的网络不是很好的去优化,初始的 GAN 就是梯度超过某个阈值 c 的时候给他强制为 c,但是这个方法的话,他是有很多假设在的,之后的 WGAN-GP 就是从另外的角度去实现这个限制。

然后这个 LSGAN,他是说,传统的 GAN 他的输出层是 sigmoid,如果我的真实分布是绿色的点,生成分布是蓝色的点,我们希望损失函数可以带领我们移动过去,但是 sigmoid 的话,我们在这个位置是得不到有效梯度的,所以他只是把原来的二分类改成了回归,让输出值取靠近 1,就是这种简单的改动但是他真的可以 work。

评价指标

最后就是 GAN 的两个评价指标,第一个是 inception score,他的话就是把生成的图片丢入在 imagenet 上与训练好的 inceotion v3 网络,然后去看他的输出。如果输出在某一个类的概率特别高,这里的 H(y|x)就会小,这个用来表示生成图像的质量,如果生成的图像在每一个类别都是均衡的,这里的 H(y)就会大,这个用来表示多样性。这样总的 inception score 就会越大。

但其实 inception score 是不准确的,比如 G 可能每个类别生成的都是一张一模一样的图像,这样他的 H (y),也是很大的。主要还是因为这个得分没有考虑到真实的样本分布。所以这里 FID 把生成的图片和真实图片一起丢入 inception v3 网络,然后取他的全连接层,再用这个公式去计算两者的距离。这个 FID 的话,还是有很多问题。现在的话,还是一直用的 inception score 和 FID 去衡量生成的质量,然后一些文章还会额外的贴上自己生成的图片让我们人眼去判断这个好坏的程度。

丨fengche丨 wechat
来找我聊天吧~
-------------本文结束感谢您的阅读-------------