GAN 系列模型强大的生成能力有目共睹。然而,为什么我们使用一组白噪声作为输入就可以生成逼真的样本呢?在这个生成的过程中,GAN 是如何拟合数据分布的呢?且看本文从统计的视角为大家揭秘 GAN 生成模型背后的那些事。
对抗生成网络(GAN)是一种在给定一组旧的「真实」样本的情况下,生成新的「人造」样本的工具。这些样本几乎可以是任何的东西:手写数字、人脸图片、表现主义绘画作品,等等所有你能想出的物体。
为了实现这一点,GAN 会学习到原始数据集背后的底层数据分布。在整个训练过程中,生成器会近似这个分布,而判别器将会告诉它哪里产生了错误,在这种博弈中,二者交替地得到提升。
为了从分布中抽取出随机的样本,我们将会把随机噪声作为生成器的输入。然而,你是否曾经想过:为什么 GAN 需要随机输入呢?
一种广为接受的答案是:这样,GAN 就不会每次生成相同的结果。这确实是事实,但这个问题的真正答案实际上还暗藏玄机!
一、随机采样
在我们继续讨论 GAN 之前,不妨先宕开一笔,讨论一下从正态分布中采样的问题。
假设你想要在 Python 环境下做到这一点,而你从未阅读过有关「numpy」库的文件,也不知道「np.random.normal()」方法的存在,此时你只能利用「random.random()」(该方法会均匀地生成(0,1)区间内的值)。
图 1:从我们的输入中采样得到 100,000 个样本的直方图,蓝色为均匀分布,橙色为我们的目标:正态分布。
简而言之,我们希望将图 1 中蓝色的分布转换为橙色的分布。幸运的是,有一种函数可以做到这一点:逆累积分布函数(又称分位函数)。
(非逆的)累积分布函数(CDF)如图二所示,它描述了从所讨论的分布中任意抽取出的值小于等于特定的 x 值的概率。
图 2:标准正态分布的 CDF 曲线
举例而言,如图 2 所示,在 x = 0 时,y = 0.5;这意味着 50% 的分布落在 x = 0 左侧。CDF
的一个方便的特性是:输出的范围在 0 到 1 之间,这正是我们可以通过「random.random()」函数得到的输入!如果我们对 CDF 求反函数(将其坐标轴翻转),我们就可以得到分位函数:
图 3:标准正态分布的分位函数
该函数为我们给出了确切的分位数(范围在 0 到 1 之间的 x)和相应的正态分布中的值的对应关系,让我们可以直接从正态分布中采样。也就是说「 f(random.random()) ~ N(0, 1)」,其中输入空间中的每个点都对应于输出空间中的唯一一个点。
图 4:使用分位函数将均匀分布(蓝色)映射到正态分布(橙色)的示意图。
二、这与 GAN 有何关系?
在上述场景下,我们在处理过程中使用了分位函数。但如果我们不这么做,并且必须学习一个从输入空间到输出空间的映射,那该怎么办呢?这正是 GAN 旨在解决的问题。
在《Training a GAN to Sample from the Normal Distribution》(https://towardsdatascience.com/training-a-gan-to-sample-from-the-normal-distribution-4095a11e78de)中,我们解释了在数据紧缺、并且没有可以使用的分位函数的情况下,如何使用 GAN 从正态分布中采样。
从这个角度看来,我们发现不将 GAN 看做随机采样的工具,而是将 k 维潜在(输入)空间映射到 p 维采样(输出)空间是很有益的,后者可以被用来将潜在空间中的样本变换为采样空间中的样本。这样看的话,正如分位函数一样,就不会涉及到随机性的问题。
在这种映射下,我们不妨考虑一下如何只将 0 到 1 之间的一维随机样本作为输入,从一个二维的正态分布中抽取随机样本。
图 5:一个二维的正态分布(橙色)和一维的均匀分布(蓝色)的示意图,样本量为 100,000。
我们如何将蓝色直线中的 100,000 份样本映射到橙色部分中的 100,000 分样本中去呢?貌似没有很好的方法能做到这一点。
当然,我们可以使用 Peano 曲线,但是这样我们就会失去某种很有用的特性,即:令数据点在输入空间中距离相近,也会使数据点在输出空间中接近,反之亦然。
正因为如此,GAN 的潜在空间的维度必须大于或等于其采样空间的维度。这样的话,函数就有足够的自由度将输入映射到输出上。
出于兴趣,让我们将只拥有一维输入的 GAN 学习多维分布的过程可视化出来。也许你不会对这些结果感到惊讶,但它们仍然非常有趣,值得一看。
三、二维高斯分布
首先,让我们讨论一下如图 5 所示的问题:将 0 到 1 之前的数据映射到二维正态(又称「高斯」)分布上。我们在这里将使用一个典型的原始 GAN 架构(代码链接见文末)。
图 6:一个潜在空间维数为 1 的 GAN 试图学习二维高斯分布。灰色的点是从真实分布中抽样得到的样本,红色的点是生成的样本。每一帧都是一个训练步。
如你所见,这种糟糕的办法并不知道应该要做什么。由于只有一个自由度,它很难探索采样空间。
更糟糕的是,由于生成的样本被密集地包围在一个一维的流形中(实际上,这个动图中灰色的点和红色点的数量是一样的!),判别器就可以懈怠了,永远不用努力地将真实点和生成的点区分开来,这样一来生成器就不会得到非常有用的信息(即使它有能力,也不足以学习一个空间填充曲线)。
图 6 展示了前 600 个训练步的情况。三万步后,结果如下图所示:
图 7:在 30,000 个训练步后,图 6 中的 GAN 学到的分布。
这个涂鸦一样的曲线很可爱,但它几乎与高斯分布无关。GAN 在 30,000 步后完全没有学习到映射。在这种背景下,让我们考虑一下具有相同架构和训练例程的 GAN 在给定二维、三维、十维,以及一百维潜在空间时,映射到上述分布时的表现:
图 8:拥有二维、三维、十维,以及一百维潜在空间的 GAN 在训练了 30,000 训练步后的输出。
拥有二维潜在空间的 GAN 的性能要远优于一维潜在空间的 GAN,但是仍然与目标分布差距很大,存在一些明显的扭结。拥有三维和十维潜在空间的 GAN 生成了具有视觉说服力的结果,而一百维的 GAN 生成了似乎具有正确方差但是均值错误的高斯分布。
但是我们要注意到,高维 GAN 在输出空间为高斯分布的前提下,实际上是有一定特殊性的,因为大量均匀分布的均值近似于正态分布(中心极限定理)。
四、八个高斯分布
图 9:八个高斯分布
顾名思义,图 9 中的八个高斯分布指的是:八个二维高斯分布围绕原点排列成一个圆圈,每个高斯分布的方差足够小、几乎没有重叠,协方差为零。
虽然样本空间是二维的,但这种分布的合理编码需要三个维度:第一个维度是离散的,描述了模式(编号为 1 到 8),另外的两个维度分别描述了该模式的 x 和 y 坐标。我将「latent_dim」设置为 1,在八个高斯分布上将 GAN 训练了 600 步,结果如下:
图 10:潜在维度为 1 的 GAN 试图学习八个高斯分布。灰色的点是从真实分布中抽取出来的样本,红色的点代表生成的样本。每一帧都是一个训练步。
正如所料,GAN 很闹学习到有效的映射。在 30,000 个训练步后,学到的分布如下:
图 11:图 10 中的 GAN 经过了 30,000 个训练步后学到的分布。
显然,GAN 很难将一维潜在空间映射到这个三维分布中:最右边的模式被忽略掉了,模式之间的区域生成了大量的样本,而且这些样本也并不服从正态分布。
作为对比,我们不妨再考虑下面四个 GAN,他们的潜在维度分别为 2,3,10,以及100,在经过了 30,000 个训练步后,结果如下所示:
图 12:潜在空间为二维、三维、十维以及一百维的 GAN,在经历了 30,000 个训练步后的输出。
在没有实际度量真实分布和学习到的分布之间的 KL 散度时,很难说上面哪种情况是最好的,但是潜在空间维度较低的 GAN 似乎在模式之间的负空间内生成的样本更少。
更有趣的是,二维的 GAN 并没有展现出模式崩溃的问题,三维和十维的 GAN 仅仅显示出了轻微的模式崩溃,而一百维的 GAN 在两个模式上并未能生成样本。
五、螺旋式分布
图 13:螺旋式分布。随着螺旋从圆心向外扩展,分布的密度在减小,在悬臂上横向的密度是均匀的。
如图 13 所示的螺旋式分布,从某种程度上来说比八个高斯分布的问题更简单。螺旋式分布只有一种模式(尽管被拉长和扭曲了),GAN 不会被迫将其连续输入离散化。它可以被高效地描述为两个维度:一个维度描述沿着螺旋的位置,另一个维度描述在螺旋内横向的位置。
我将 「latent_dim」设置为 1,对 GAN 训练了 600 步,结果如下:
图 14:潜在维度为 1 的 GAN 试图拟合螺旋分布。灰色的点是从真实分布中抽取出的样本,红色的点是生成的样本。每一帧都是一个训练步。
相同的,GAN 也难以学到有效的映射。在经历了 30,000 个训练步后,学到的分布如下:
图 15:图 14 中的 GAN 学到的分布,在经历了 30,000 个训练步后的结果。
与「八个高斯分布」一节中的情况相类似,GAN 在映射螺旋式分布时性能很差。螺旋中有两个区域没有能够被拟合,而且在负空间内生成了许多样本。
我在文章《GANs and Inefficient Mappings》(https://towardsdatascience.com/gans-and-inefficient-mappings-f185fdd62a78)中详细地讨论了这个低效率的映射问题,因此这里不再赘述;相反,我们不妨再考虑下面四个 GAN,他们的潜在维度分别为 2,3,10,以及100,在经过了 30,000 个训练步后,结果如下所示:
图 16:潜在空间为二维、三维、十维和一百维的 GAN 在经历了 30,000 个训练步后的输出。
同样的,在没有真正度量 KL 散度的情况下,很难说上面哪种情况是最好的,但是覆盖率、均匀性、在负空间内的样本是很值得研究的问题。雷锋网雷锋网雷锋网(公众号:雷锋网)
六、结语
人们很容易陷入对 GAN 的狂热中,把它们当作“魔法机器”,用随机数作为燃料来创造出新的样本。了解一个工具如何工作的基本原理,对于有效地使用它以及在它损坏时进行故障排除是至关重要的。
对于 GAN 来说,这就意味着理解生成器所做的是学习从一些潜在空间到一些采样空间的映射,并理解学习是如何进行的。将一维分布映射到高维分布的极端情况清晰地说明了这种任务有多复杂。
本项目使用的所有代码可以从下面的 GitHub 代码仓库中获取:
https://github.com/ConorLazarou/medium/tree/master/12020/visualizing_gan_dimensions
Via https://towardsdatascience.com/why-do-gans-need-so-much-noise-1eae6c0fb177
。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/138072.html