我们产生出来的生成器它好或者是不好。要 评估一个生成器的好坏,最直觉的做法也许是找人来看生成器产生出来的图片到底像不像真 实的图片。所以其实很长一段时间,尤其是人们刚开始研究生成式技术的时候,很长一段时间 没有好的评估方法。那时候要评估生成器的好坏,都是人眼看,直接在论文最后放几张图片,然后说这个生成器产生出来的图片是不是比较好。所以我们可以发现比较早年GAN的论文, 它没有数字结果,整篇论文里面没有准确度等等的数字结果,它只有一些图片,然后说这个生 成器产生出来的图片是不是比较好,接着就结束了。这样显然是不行的,并且有很多的问题, 比如说不客观、不稳定等等诸多的问题。所以有没有比较客观而且自动的方法来度量一个生 成器的好坏呢?
针对特定的一些任务,是有办法设计一些特定方法的。比如说我们要产生一些动画人物 的头像,那我们可以设计一个专门用于动画人物面部的识别系统,然后看看我们的生成器产 生出来的图片里面,有没有可以被识别的动画人物的人脸。如果有的话,那就代表说这个生成 器产生出来的图片是比较好的。但是这个方法只能针对特定的任务,如果我们要产生的东西 不是动画人物的头像,而是别的东西,那这个方法就不行了。那如果是更一般的案例,比如它 不一定是产生动画人物的,它专门产生猫、专门产生狗、专门产生斑马等等,那我们怎么知道 它做得好不好呢?
其实有一个方法,是训练一个图像的分类系统,然后把GAN产生出来的图片输入到这 个图像的分类系统里面,看它产生什么样的结果,如图1所示。这个图像分类系统的输入 是一张图片,输出是一个概率分布,这个概率分布代表说这张图片是猫的概率、狗的概率、斑 马的概率等等。如果这个概率分布越集中,就代表现在产生的图片可能越好。如果生成出来的 图片是一个四不像,图像识别系统就会非常地困惑,它产生出来的这个概率分布就会是非常 平均地分布。
图1 评估GAN生成图像的质量
这个是靠图像识别系统来判断产生出来的图片好坏,这是一个可能的做法,但是光用这 个做法是不够的。光用这个做法会被一个叫做模式崩塌(modecollapse)的问题骗过去。模 式崩塌是指在训练GAN的过程中遇到的一个状况,假设如图2蓝色的星星是真正的数据 的分布,红色的星星是GAN的模型的分布。我们会发现生成式的模型它输出来的图片来来 去去就是那几张,可能单一张拿出来你觉得好像还做得不错,但让它多产生几张就露出马脚, 产生出来就只有那几张图片而已,这就是模式崩塌的问题。
图2 模式崩塌问题
发生模式崩塌的原因,从直觉上理解可以想成这个地方就是判别器的一个盲点,当生成 器学会产生这种图片以后,它就永远都可以骗过判别器,判别器没办法看出来图片是假的。那 对于如何避免模式坍塌,其实到今天其实还没有一个非常好的解答,不过有方法是模型在生 成器训练的时候,一直将训练的节点存下来,在模式坍塌之前把训练停下来,就只训练到模式 崩塌前,然后就把之前的模型拿出来用。不过模型崩塌这种问题,我们至少是知道有这个问 题,是可以看得出的,生成器总是产生这张脸的时候,你不会说你的生成器是个好的生成器。 但是有一些问题是你不知道的并且更难侦测到的,即你不知道生成器产生出来的图片是不是 真的有多样性.
这个问题叫做模式丢失,指GAN能很好地生成训练集中的数据,但难以生成非训练集的数据,“缺乏想象力”。你的产生出来的数据,只有真实数据的一部分,单纯看产生出来的数据, 你可能会觉得还不错,而且分布的这个多样性也够,但你不知道真实数据的多样性的分布其 实是更大的。事实上今天这些非常好的GAN,BGAN、ProgressGAN等等可以产生非常真实 人脸这些GAN,多多少少还是有模式丢失的问题。如果你看多了GAN产生出来的人脸,你 会发现虽然非常真实但好像来来去去就是那么几张脸而已,并且有一个非常独特的特征是你 看多了以后就觉得,这个脸好像是被生成出来的。今天也许模式丢失都还没有获得本质上的 解决。
虽然存在以上模式坍塌、模式丢失等等的问题,但是我们需要去度量生成器产生出来的 图片到底多样性够不够。有一个做法是借助我们之前介绍过的图像分类,把一系列图片都丢 到图像分类器里,看它被判断成哪一个类别,如图3所示。每张图片都会给我们一个分布, 我们将所有的分布平均起来,接下来看看平均的分布长什么样子。如果平均的分布非常集中, 就代表现在多样性不够,如果平均的分布非常平坦,就代表现在多样性够了。具体来讲,如 果什么图片输入到图像分类系统中的输出都是第二种类别,那代表说每一张图片也许都很像, 也就代表输出的多样性是不够的,那如果另外一个案例不同张图片丢进去,它的输出分布都 不一样,那就代表说多样性是够的。并且平均完以后发现结果是非常平坦的,那这个时候代表 多样性是足够的。
图3 GAN 生成结果多样性问题
当我们用这个图像分类器来做评估的时候,对于结果的多样性和质量好像是有点互斥的。 因为我们刚才在讲质量的时候说,分布越集中代表质量越高,多样性的分布越平均。但是如 果分布越平均,那质量就会越低,因为分布越平均,代表图片都不太像,所以质量就会越低。 这里要强调一下质量和多样性的评估范围不一样,质量是只看一张图片,一张图片丢到分类 器的时候,分布有没有非常地集中。而多样性看的是一堆图片分布的平均,一堆图片中图像分 类器输出的越平均,那就代表现在的多样性越大。
过去有一个非常常被使用的分数,叫做Inception 分数。其顾名思义就是用Inception 网 络来做评估,用Inception 网络度量质量和多样性。如果质量高并且多样性又大,那Inception 分数就会比较大。目前研究人员通常会采取另外一个评估方式,叫FréchetInceptiondistance (FID)。具体来讲,先把生成器产生出来的人脸图片,丢到InceptionNet 里面,让 Inception 网络输出它的类别。这里我们需要的不是最终的类别,而是进入Softmax之前的隐藏层的输出向量,这个向量的维度是上千维的,代表这个图片,如图4所示。图中所有红色点代表 把真正的图片丢到Inception 网络以后,拿出来的向量。这个向量其实非常高维度,甚至是上 千维的,我们就把它降维后画在二维的平面上。蓝色点是GAN的生成器产生出来的图片,它 丢到Inception 网络以后进入 Softmax 之前的向量。接下来,我们假设真实的图片和生成的 图片都服从高斯分布,然后去计算这两个分布之间的Fréchet的距离。两个分布间的距离越小 越好,距离越小越代表这两组图片越接近,也就是产生出来的品质越高。这里还有几个细节问 题,首先,假设为高斯分布没问题吗?另外一个问题是如果要准确的得到网络的分布,那需要 产生大量的采样样本才能做到,这需要一点运算量,也是做FID不可避免的问题。
图4 FID 的计算过程
FID 算是目前比较常用的一种度量方式,那有一篇文章叫做“AreGANs Created Equal? A Large-Scale Study”,这个 Google 完成的论文里面尝试了不同的 GAN。每一个 GAN 的训 练的分类,训练的损失都有点不太一样,并且每一种GAN,它都用不同的随机种子,去跑过很 多次以后,取结果的平均值等等。从文章的结果来看所有的GAN都差不多,那所以与GAN 有关的研究都是白忙一场吗?事实上也未必是如此,这篇文章做实验的时候不同的GAN用的 网络架构都是同一个,只是疯狂调参而已,调随机种子和学习率而已。网络架构还是同一个, 所以是不是有某些网络架构,某些种类的GAN会不会在不同的网络架构上表现得比较稳定。 这些都有待研究 .
此外,还有一个状况。假设GAN产生出来的图片,跟真实的图片长得一模一样,那此时 FID 会是零,因为两个分布是一模一样的。如果你不知道真实数据长什么样子,光看这个生 成器的输出可能会觉得太棒了,那FID算出来一定是非常小的,但是如果它产生出来的图片 都跟数据库里面的训练数据的一模一样的话,那干脆直接从训练数据集里面采样一些图像出 来不是更好,也就不需要训练生成器了。我们训练生成器其实是希望它产生新的图片,也就是 训练集里面没有的人脸。
对于这种问题,就不是普通的度量标准可以侦测的。那怎么解决呢?其实有一些方法,例 如可以用一个分类器,这个分类器是用来判断这张图片是不是真实的,是不是来自于你的训 练集的。这个分类器的输入是一张图片,输出是一个概率,这个概率代表说这张图片是不是来 自于你的训练集。如果这个概率是1,那就代表说这张图片是来自于你的训练集,如果这个概 率是0,那就代表说这张图片不是来自于你的训练集。但是另外一个问题,假设生成器学到的 是把所有训练数据里面的图片都左右反转呢,那它也是什么事都没有做。但是你的分类器会 觉得说,这张图片是来自于你的训练集,因为它是来自于你的训练集的图片,只不过是左右反转而已。进行分类时或者进行相似度的比较时,又比不出来。所以GAN的评估是非常地困难 的,还甚至如何评估一个生成器做得好不好都是一个可以研究的题目。