在对抗生成网络中,判别器和生成器的目标函数通常都是用来衡量它们各自做的怎么样的。例如,生成器的目标函数用来衡量生成的图片能骗过分类器的性能。
但是这并不能很好的衡量生成图片的质量多样性
通常,我们使用IS(inception score)和FID(Fréchet Inception Distance)这两个指标来评价不同的GAN模型。

IS(inception score)

IS用来衡量GAN网络的两个指标:

1. 生成图片的质量 和
2. 多样性

熵(entropy)可以用来描述随机性:如果一个随机变量是高度可预测的,那么它就有较低的熵;相反,如果它是高度不可预测,那么它就用较高的熵。
如下图,我们有两个概率分布, p 2 p_2 p2 p 1 p_1 p1 有更高的熵值,因为 p 2 p_2 p2 是一个均匀分布,我们很难预测 x x x 的值。
在这里插入图片描述

在GAN中,我们希望条件概率 P ( y ∣ x ) P(y|x) P(yx) 可以被高度预测( x x x 表示给定的图片, y y y 表示这个图片包含的主要物体,看到后面你会更加清楚这个概率是什么意思),也就是希望它的熵值较低。例如,给定一个图片,我们很容易的知道其中包含什么物体。

因此,我们使用inception network(可以理解这是一个固定的分类网络)来对生成的图像进行分类。(这里都是针对ImageNet数据集而言)然后预测 P ( y ∣ x ) P(y|x) P(yx), 这里的 y y y 就是标签。用这个概率来反应图片的质量。

简单来说,假如inception network能够以较高的概率预测图片中包含的物体,也就是有很高的把握对其进行正确分类,这就说明图片质量较高。相反,比如我们人眼并无法看出这张图片是什么,就说明这个图片质量不高。当然这里的人是我改的。

综上,我们知道概率 P ( y ∣ x ) P(y|x) P(yx) 代表了图片的质量,概率越大,质量则越高。接下来说说如何评价多样性。

我们用下面的公式计算边缘概率:

∫ z p ( y ∣ x = G ( z ) ) d z \int_z{p(y|x=G(z))}dz zp(yx=G(z))dz

G ( z ) G(z) G(z) 就是生成器用噪声 z z z 得到的输出图像。
如果生成的图像多样化很好,那么预测的标签 y y y 的分布则会有较高的熵,因为数量多了,我们就更难准确预测 y y y
下图就表现了这样的概念:
在这里插入图片描述
结合以上两个指标来说,我们的目标应该就是这样的:
1)图片质量:针对每一张生成的图片,已知的分类器应该很确信的知道它属于哪一类。而这可以用条件概率 p ( y ∣ x ) p(y|x) p(yx)来表示,它越大越好。 p ( y ∣ x ) p(y|x) p(yx)熵应该是越小越好
2)图片的多样性:我们这时候考虑的是标签的分布情况,我们希望标签分布均与,而不希望模型生成的都是某一类图片。这时候我们考虑的不是条件概率了,而是边缘概率,也就是 p ( y ) p(y) p(y),展开来写应该是 p ( y 1 ) , p ( y 2 ) , . . . , p ( y n ) p(y_1), p(y_2), ...,p(y_n) p(y1),p(y2),...,p(yn)这里的 n n n就是原训练数据的类数。我们希望 p ( y 1 ) = p ( y 2 ) = . . . = p ( y n ) = 1 / n p(y_1)= p(y_2) =...= p(y_n) = 1/n p(y1)=p(y2)=...=p(yn)=1/n从熵的角度来说,我们希望 p ( y ) p(y) p(y) 的熵越大越好

注意到上面 y y y不只是一个数,而是很多的数,准确来说是一个分布,或者说是一个随机变量。

为了综合两个指标,我们使用KL-divergence 并用下面的公式计算得到IS的值:
I S ( G ) = e E x ∈ p D K L ( p ( y ∣ x ) ∣ ∣ p ( y ) ) IS(G)=e^{E_{x\in{p}}D_{KL}(p(y|x)||p(y))} IS(G)=eExpDKL(p(yx)p(y))
其中 D K L D_{KL} DKL 就是KL-divergence的计算公式。

IS缺点:当只产生一种物体的图像时,我们仍会认为这是均匀分布,而导致评价不正确。当模型坍塌时,结果就可能产生同样的图片。

写到这里或许有朋友有点看不下去了。怎么就从一个熵较小、一个熵较大变成了一个KL散度公式。下面试着解释一下两个熵怎么变成了一个KL散度公式。不感兴趣的朋友可以跳过以下的部分

让我们先从数学角度来看,为了简便,我们用 E E E表示熵。
出发点:
1)条件熵越小越好,也就是 E ( p ( y ∣ x ) ) = − ∑ i = 1 m p ( y i ∣ x i ) ∗ l o g ( p ( y i ∣ x i ) ) E(p(y|x))=-\sum_{i=1}^{m}p(y_i|x_i)*log(p(y_i|x_i)) E(p(yx))=i=1mp(yixi)log(p(yixi))越小越好。这里的 m m m表示生成的图片量。
2) 熵越大越好,也就是 E ( p ( y ) ) = − ∑ i = 1 m p ( y i ) ∗ l o g ( p ( y i ) ) E(p(y))=-\sum_{i=1}^{m}p(y_i)*log(p(y_i)) E(p(y))=i=1mp(yi)log(p(yi))越大越好。

我们要做的就是求以上的这两个熵与KL散度之间的关系了
按照KL公式,我们可以做下面的计算:
K L ( p ( y ∣ x ) ∗ p ( y ) ) = ∑ i = 1 m p ( y i ∣ x i ) ∗ l o g ( p ( y i ∣ x i ) p ( y i ) ) KL(p(y|x)*p(y))=\sum_{i=1}^{m}p(y_i|x_i)*log(\frac{p(y_i|x_i)}{p(y_i)}) KL(p(yx)p(y))=i=1mp(yixi)log(p(yi)p(yixi))
= ∑ i = 1 m p ( y i ∣ x i ) ∗ l o g ( y i ∣ x i ) − ∑ i = 1 m p ( y i ∣ x i ) ∗ l o g ( p ( y i ) ) =\sum_{i=1}^{m}p(y_i|x_i)*log(y_i|x_i)-\sum_{i=1}^{m}p(y_i|x_i)*log(p(y_i)) =i=1mp(yixi)log(yixi)i=1mp(yixi)log(p(yi))
算到这里,我们可以看到前者就是我们前面计算的条件熵。因此可以记作: − E ( p ( y ∣ x ) ) -E(p(y|x)) E(p(yx))

后者就有一点麻烦,需要转化一下。
让我们接着前面的计算。于是上面公式第二项变成了
∑ i = 1 m p ( y i ∣ x i ) p ( y i ) ∗ p ( y i ) ∗ l o g ( p ( y i ) ) \sum_{i=1}^{m}\frac{p(y_i|x_i)}{p(y_i)}*p(y_i)*log(p(y_i)) i=1mp(yi)p(yixi)p(yi)log(p(yi)).
如果这个公式里面的 p ( y i ∣ x i ) p ( y i ) \frac{p(y_i|x_i)}{p(y_i)} p(yi)p(yixi)始终等于1,我们上面的式子就会等于前面说的熵 E ( p ( y ) ) E(p(y)) E(p(y))

下面我们证明在什么条件下这个假设成立,在这个过程中,我们用到两个基本知识:
1)条件概率怎么计算: p ( A ∣ B ) = p ( A B ) / p ( B ) p(A|B)=p(AB)/p(B) p(AB)=p(AB)/p(B)其中 p ( A B ) p(AB) p(AB)表示两者相交的概率,也就是联合概率。
2)互相独立变量的联合概率怎么计算: p ( A B ) = p ( A ) ∗ p ( B ) p(AB)=p(A)*p(B) p(AB)=p(A)p(B),必须注意到条件是两者互相独立

首先根据条件概率可得
p ( y i ∣ x i ) p ( y i ) = p ( y i , x i ) p ( y i ) ∗ p ( x i ) \frac{p(y_i|x_i)}{p(y_i)}=\frac{p(y_i, x_i)}{p(y_i)*p(x_i)} p(yi)p(yixi)=p(yi)p(xi)p(yi,xi)
再根据第二个基础知识可以知道:
p ( y i , x i ) p ( y i ) ∗ p ( x i ) = p ( y i ) ∗ p ( x i ) p ( y i ) ∗ p ( x i ) = 1 \frac{p(y_i, x_i)}{p(y_i)*p(x_i)}=\frac{p(y_i)*p(x_i)}{p(y_i)*p(x_i)}=1 p(yi)p(xi)p(yi,xi)=p(yi)p(xi)p(yi)p(xi)=1

到这里我们证明了两者的KL散度就是两个熵做减法。
即: K L ( p ( y ∣ x ) ∗ p ( y ) ) = − E ( p ( y ∣ x ) ) + E ( p ( y ) ) KL(p(y|x)*p(y)) = -E(p(y|x)) +E(p(y)) KL(p(yx)p(y))=E(p(yx))+E(p(y))

这时,条件熵 p ( y ∣ x ) p(y|x) p(yx)越小,而熵 p ( y ) p(y) p(y)越大,则散度越大 (注意到KL散度中计算exp函数不改变单调性),则IS值越高,图片质量和多样性则好。到这里证明就基本结束了。

剩下的问题就是怎样知道 x i , y i x_i, y_i xi,yi两者是独立的呢?而且显然两者是不独立的,也就是说上面的证明过程中,这个条件并不满足。 但可能并不影响这样的使用。这也有待进一步探讨。

另外,前面说到IS的缺点,就是当模式倒塌发生时,我们的IS依然很高,但是这显然不是我们希望的结果,因为这时候的多样性为0。这时我们就可以从上面推导公式的条件出发,当模式倒塌发生时,生成的图片 x i x_i xi和它对应的 y i y_i yi就完全不独立了,而是一个确定性关系。这时我们也就理解了为什么IS无法检测模式倒塌。

我们再从另一个角度来分析,也就是KL散度之间的物理意义来分析,毕竟每次去做数学推导有点难受。
我们知道KL散度是衡量两个分布之间的“距离”,这里引号表示这不是严格意义上的距离,因为KL散度不满足三角不等式和对称性,这里就不细说这个了,但这不影响我们说后面的内容。总之记住:KL散度是衡量两个分布之间的距离
我们再把前面的那幅图拿来:
在这里插入图片描述
从图上来看,我们希望条件概率 p ( y ∣ x ) p(y|x) p(yx)是一个确定的数,我们可以将它理解成一个方差为0的高斯分布。
而另一个概率 p ( y ) p(y) p(y)是一个均匀分布,也就是方差为无穷大的高斯分布。
在这样的情况,我们可以忽略高斯分布的均值是多少了,这样两个分布就相差很大了。这个过程也就是距离,所以距离越大,图片质量和多样性就越好

**写到这里,我还想再说明一点,那就是数学中距离的公式很重要。**大家都知道点与点之间的距离,但是点与分布之间的距离呢?本文就要使用到分布与分布之间的距离。推荐大家在记这些公式的时候记一记他们的物理含义。

FID(Fréchet Inception Distance )

以下内容重新更新,主要讲解FID的意义,为何FID能够表示生成图像的多样性和质量,为什么FID越小,则图像多样性越好,质量也越好

在计算FID中我们也同样使用inception network网络。我们还是先来简单回顾一下什么是inception network,它就是一个特征提取的深度网络,最后一层是一个pooling层,然后可以输出一张图像的类别。在计算FID时,我们去掉这个最后一层pooling层,得到的是一个2048维的高层特征,以下简称n维特征。我们继续简化一下,那么这个n维特征是一个向量。则有:对于我们已经拥有的真实图像,这个向量是服从一个分布的,(我们可以假设它是服从一个高斯分布);对于那些用GAN来生成的n维特征它也是一个分布;我们应该立马能够知道了,GAN的目标就是使得两个分布尽量相同。假如两个分布相同,那么生成图像的真实性和多样性就和训练数据相同了。于是,现在的问题就是,怎么计算两个分布之间的距离呢?我们需要注意到这两个分布是多变量的,也就是前面提到的n维特征。也就是说我们计算的是两个多维变量分布之间的距离,数学上可以用Wasserstein-2 distance或者Frechet distance来进行计算。以下简单介绍一下如何计算这个距离。

假如一个随机变量服从高斯分布,这个分布可以用一个均值和方差来确定。那么两个分布只要均值和方差相同,则两个分布相同。我们就利用这个均值和方差来计算这两个单变量高斯分布之间的距离。但我们这里是多维的分布,我们知道协方差矩阵可以用来衡量两个维度之间的相关性。所以,我们使用均值和协方差矩阵来计算两个分布之间的距离。均值的维度就是前面n维特征的维度,也就是n维;协方差矩阵则是n*n的矩阵。

最后,我们可以使用下面的公式计算FID(看这个公式之前务必要记住这个公式的物理意义,毕竟我们不是专门的数学学习者):
在这里插入图片描述
公式中, T r Tr Tr 表示矩阵对角线上元素的总和,矩阵论中俗称“迹”(trace)。均值为 μ \mu μ 协方差为 Σ \Sigma Σ 。此外 x x x表示真实的图片, g g g是生成的图片。

较低的FID意味着两个分布之间更接近,也就意味着生成图片的质量较高、多样性较好。

FID对模型坍塌更加敏感。相比较IS来说,FID对噪声有更好的鲁棒性。因为假如只有一种图片时,FID这个距离将会相当的高。因此,FID更适合描述GAN网络的多样性。

同样的,FID和IS都是基于特征提取,也就是依赖于某些特征的出现或者不出现。但是他们都无法描述这些特征的空间关系。如下图:

这里我们我们人不会认为这是一张好的人脸图片。但是根据FID和IS,他们就是一个很好的人脸图片。因为它有人脸必要的特征,虽然这些特征的空间关系不好。

pytorch代码实现

请查考个人GitHub地址查看compute_FID_for_GAN 和 compute_IS_for_GAN
地址:https://github.com/xml94/open/tree/master
更新(2022年5月2日):更新版计算FID,简单好用

参考

值得一看,总结了IS和FID的历史发展
IS参考
FID参考

点赞给个鼓励呗

如果本文解决了你的困惑,不妨点个赞鼓励一下。
不管你信不信,也不管你同不同意,实际上,你的每一次点赞都标志着你自身的进步。而打赏乃是点赞的高级形式。
曾经有无数个点赞的机会,但是我都没有好好珍惜,假如时光可以倒流,我一定为他们也为自己点赞。

在此,也感谢给我反馈的小伙伴们,让我自己更加知道该怎么将这些概念弄得更清楚。
@丹童。
@刘鸣凤。
@jxvl假装。注意到了我在推导过程中出现了一个错误,负号的位置放错。现在已经改正过来。2020年3月28日13点03分。
@pzSuen。注意到公式中符号有误,特意全文检查一次,现在已经改正。2020-08-02 11:40:12。

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐