GAN的评价指标IS和FID

如何评价GAN网络生成图像的好坏?有两个简单常用的衡量方法,一个是Inception Score(IS),另一个是Frechet Inception Distance(FID),下面分别对这两个算法进行介绍。

一、Inception Score(IS)

评价一个生成模型的好坏,需要从两方面考量:

  1. 生成的图像是否清晰,清晰度高的表示生成图像的质量高;

  2. 生成的图像是否具有多样性,即每个类别生成图像的数目尽可能相等。

在IS算法中,对以上两点是这样考虑的:

  1. 在评判生成图像是否清晰方面,引入Inception模型,对生成图像 x x x 进行分类判断,得到一个1000维的分类向量 y y y。如果图像 x x x 清晰,则该向量 y y y 在某一个维度上的取值较大(表示属于某一类的概率较大),而其他维度的取值较小。用专业的术语来说,对于一张清晰的图像,则 P ( y ∣ x ) P(y|x) P(yx) 的熵越小(熵越大代表混乱程度越大,即随机变量的取值越不确定)。
  2. 在图像的多样性方面,假设我们生成20000张图像,总共有1000个类别,那么最理想的情况是每一类的个数是平均的,即每类图像的个数为20个。换做专业术语,即对于生成图像在所有类别的边缘分布 P ( y ) P(y) P(y) 的熵越大,则多样性越好(最理想是均匀分布)。

结合上述的两点考虑,IS的计算公式如下所示:

I S ( G ) = e x p ( E x ∼ P g K L ( p ( y ∣ x ) ∣ ∣ p ( y ) ) ) IS(G)=exp(E_{x\sim P_{g}}KL(p(y|x)||p(y))) IS(G)=exp(ExPgKL(p(yx)p(y)))

其中,exp是为了公式的美观,意义不大。图像 x x x 是从生成数据的分布 P g P_{g} Pg 中采样的;KL表示KL散度; p ( y ∣ x ) p(y|x) p(yx)表示将生成图像 x x x 喂入 Inception网络得到的1000维的分类向量,原则上某一个维度越大越好; p ( y ) p(y) p(y) 是生成图片在所有类别上的边缘分布,我们希望越接近均匀分布越好。

因此,对于 p ( y ∣ x ) p(y|x) p(yx) 来说,我们希望他接近one-hot编码,即一个维度很大,其他维度值较小;对于 p ( y ) p(y) p(y) 来说,每个维度的值越平均越好。由于KL散度衡量的是两个分布之间的距离,因此在理想状况下,KL散度的值是最大的,即IS值越大,生成模型的效果越好。

深入理解 Inception Score

信息熵、条件熵、互信息

在深入理解IS之前,首先需要了解几个定义:

信息熵(熵)是衡量随机变量取值的不确定性的量,熵值越大,变量的不确定性越大。对于随机变量 x x x,其信息熵的定义如下:

H ( x ) = − ∑ i p ( x i ) l o g p ( x i ) H(x)=-\sum_{i}p(x_{i})logp(x_{i}) H(x)=ip(xi)logp(xi)

条件熵衡量的是在给定一定的条件下,随机变量取值的不确定性。对于给定条件 y y y,随机变量 x x x 的条件熵计算公式为:

H ( x ∣ y ) = − ∑ i , j p ( x i , y j ) l o g p ( x i ∣ y j ) H(x|y)=-\sum_{i,j}p(x_{i},y_{j})logp(x_{i}|y_{j}) H(xy)=i,jp(xi,yj)logp(xiyj)

互信息又称为信息增益,描述的是对于随机变量 x x x,在给定某个条件 y y y 后,随机变量 x x x 取值不确定性的减小程度。下面给出其原始公式和化简过后的结果:

I ( y ; x ) = ∑ x , y p ( x , y ) l o g p ( x , y ) p ( x ) p ( y ) = H ( x ) − H ( x ∣ y ) I(y;x)=\sum_{x,y}p(x,y)log \frac{p(x,y)}{p(x)p(y)}=H(x)-H(x|y) I(y;x)=x,yp(x,y)logp(x)p(y)p(x,y)=H(x)H(xy)

互信息满足对称性,即 I ( x ; y ) = I ( y ; x ) I(x;y)=I(y;x) I(x;y)=I(y;x)

IS背后的原理

在介绍了上面三个基本概念后,下面再拉回正题。对于IS的计算式,可以先将exp去除掉,然后进行化简:

l n ( I S ( G ) ) = E x ∼ P g K L ( p ( y ∣ x ) ∣ ∣ p ( y ) ) ln(IS(G))=E_{x\sim P_{g}}KL(p(y|x)||p(y)) ln(IS(G))=ExPgKL(p(yx)p(y))

= ∑ x p g ( x ) K L ( p ( y ∣ x ) ∣ ∣ p ( y ) ) =\sum_{x}p_{g}(x)KL(p(y|x)||p(y)) =xpg(x)KL(p(yx)p(y))

= ∑ x p g ( x ) ∑ i p ( y = i ∣ x ) l o g p ( y = i ∣ x ) p ( y = i ) =\sum_{x}p_{g}(x)\sum_{i}p(y=i|x)log\frac{p(y=i|x)}{p(y=i)} =xpg(x)ip(y=ix)logp(y=i)p(y=ix)

= ∑ x , i p ( x , y = i ) l o g p ( y = i ∣ x ) p ( x ) p ( y = i ) p ( x ) =\sum_{x,i}p(x,y=i)log\frac{p(y=i|x)p(x)}{p(y=i)p(x)} =x,ip(x,y=i)logp(y=i)p(x)p(y=ix)p(x)

= ∑ x , i p ( x , y = i ) l o g p ( x , y = i ) p ( y = i ) p ( x ) =\sum_{x,i}p(x,y=i)log\frac{p(x,y=i)}{p(y=i)p(x)} =x,ip(x,y=i)logp(y=i)p(x)p(x,y=i)

= I ( x ; y ) = H ( y ) − H ( y ∣ x ) =I(x;y)=H(y)-H(y|x) =I(x;y)=H(y)H(yx)

经过一系列转化,IS取对数过后的值变为生成图像 x x x 与对应的类别向量 y y y之间的互信息。对于 H ( y ) H(y) H(y),它表示的是类别 y y y 取值的不确定性,我们希望这个值越大越好,因为生成的样本具有多样性;对于 H ( y ∣ x ) H(y|x) H(yx),我们希望这个值越小越好,因为对于每一张生成图像 x x x 来说,我们希望它在某一个维度上的值越大越好,即随机变量 y y y 取值越单一,图像的清晰度越高。因此,IS的取值越高,表明生成模型的效果越理想。

关于IS的计算过程可先计算生成图像在每个类别的边缘分布,随后对于每一张图像,计算其经过Inception模型得到的1000维向量与之间计算的边缘分布之间的KL散度即可,过程比较简单,不做赘述。

关于IS的一些缺点可以参考:https://www.jiqizhixin.com/articles/2019-01-10-18

二、Frechet Inception Distance(FID)

设计GAN的初衷是希望得到一个分布,使得该分布尽可能与真实分布靠近。但是IS只是考虑了生成图像的清晰度和多样性,完全忽略了真实数据的影响,再加上IS本身的一些缺点,显然不能胜任GAN评价指标的王者地位。

因此,Frechet Inception Distance(FID)应运而生。FID考虑的更多的是生成的图像与真实图像之间的联系。该算法也是通过Inception模型进行计算的。

不同的是,FID拿掉了Inception模型最后的一个用于分类全连接层,将前面一层的2048维向量进行输出。在这里,Inception不再进行分类,而是进行特征提取,得到的2048维向量,每一个维度都表示着某种特征。

取同样数目的生成图像和真实图像各 N N N 张,经过改造后的Inception网络,各自得到 N ∗ 2048 N*2048 N2048 维的特征向量,然后用下面的公式计算两个 N ∗ 2048 N*2048 N2048 维的特征向量之间的距离:

F I D ( g , r ) = ∣ μ g − μ r ∣ ∣ 2 2 + T r ( Σ g + Σ r − 2 ( Σ g Σ r ) 1 2 ) ) FID(g,r)=|\mu_{g}-\mu_{r}||_{2}^{2}+Tr(\Sigma_{g}+\Sigma_{r}-2(\Sigma_{g}\Sigma_{r})^\frac{1}{2})) FID(g,r)=μgμr22+Tr(Σg+Σr2(ΣgΣr)21))

其中 g g g r r r分别代表生成图像和真实图像, μ g \mu_{g} μg μ r \mu_{r} μr表示的是各自特征向量的均值, Σ g \Sigma_{g} Σg Σ r \Sigma_{r} Σr表示各自特征向量的协方差矩阵,Tr表示矩阵的迹(主对角线各元素的和),矩阵开根如果为复数,则只取实部。

FID表示的是生成图像的特征向量与真实图像的特征向量之间的距离,该距离越近,表明生成模型的效果越好,即图像的清晰度高,且多样性丰富。

FID相对于IS来说有着更好的鲁棒性,因此在评价GAN模型中受用面更广一些。

为了更直观的了解FID计算过程,最后给出FID算法的代码:

# calculate frechet inception distance
def calculate_fid(act1, act2):
	# calculate mean and covariance statistics
	mu1, sigma1 = act1.mean(axis=0), np.cov(act1, rowvar=False)
	mu2, sigma2 = act2.mean(axis=0), np.cov(act2, rowvar=False)
	# calculate sum squared difference between means
	ssdiff = np.sum((mu1 - mu2)**2.0)
	# calculate sqrt of product between cov
	covmean = linalg.sqrtm(sigma1.dot(sigma2))
	# check and correct imaginary numbers from sqrt
	if np.iscomplexobj(covmean):
		covmean = covmean.real
	# calculate score
	fid = ssdiff + np.trace(sigma1 + sigma2 - 2.0 * covmean)
	return fid

其中型参act1和act2表示两个 N ∗ 2048 N*2048 N2048维度的特征向量。

关于衡量GAN好坏的指标还有很多,IS和FID是比较经典的两类评价算法,虽然都有一些缺陷,但也是为衡量生成模型质量做出了巨大的贡献。

参考:

https://blog.csdn.net/qq_27261889/article/details/86483505

https://baijiahao.baidu.com/s?id=1647349368499780367&wfr=spider&for=pc

https://www.jiqizhixin.com/articles/2019-01-10-18

https://blog.csdn.net/jackzhang11/article/details/104995524

https://arxiv.org/abs/1706.08500017

https://machinelearningmastery.com/how-to-implement-the-frechet-inception-distance-fid-from-scratch/

你可能感兴趣的:(GAN,机器学习)