在上述场景下,我们在处理过程中使用了分位函数。但如果我们不这么做,并且必须学习一个从输入空间到输出空间的映射,那该怎么办呢?这正是 GAN 旨在解决的问题。在《Training a GAN to Sample from the Normal Distribution》一文中,我们解释了在数据紧缺、并且没有可以使用的分位函数的情况下,如何使用 GAN 从正态分布中采样。阅读链接:https://towardsdatascience.com/training-a-gan-to-sample-from-the-normal-distribution-4095a11e78de从这个角度看来,我们发现不将 GAN 看做随机采样的工具,而是将 k 维潜在(输入)空间映射到 p 维采样(输出)空间是很有益的,后者可以被用来将潜在空间中的样本变换为采样空间中的样本。这样看的话,正如分位函数一样,就不会涉及到随机性的问题。在这种映射下,我们不妨考虑一下如何只将 0 到 1 之间的一维随机样本作为输入,从一个二维的正态分布中抽取随机样本。 图 5:一个二维的正态分布(橙色)和一维的均匀分布(蓝色)的示意图,样本量为 100,000。我们如何将蓝色直线中的 100,000 份样本映射到橙色部分中的 100,000 分样本中去呢?貌似没有很好的方法能做到这一点。当然,我们可以使用 Peano 曲线,但是这样我们就会失去某种很有用的特性,即:令数据点在输入空间中距离相近,也会使数据点在输出空间中接近,反之亦然。正因为如此,GAN 的潜在空间的维度必须大于或等于其采样空间的维度。这样的话,函数就有足够的自由度将输入映射到输出上。出于兴趣,让我们将只拥有一维输入的 GAN 学习多维分布的过程可视化出来。也许你不会对这些结果感到惊讶,但它们仍然非常有趣,值得一看。
3 二维高斯分布
首先,让我们讨论一下如图 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 在输出空间为高斯分布的前提下,实际上是有一定特殊性的,因为大量均匀分布的均值近似于正态分布(中心极限定理)。 4 八个高斯分布
图 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 在两个模式上并未能生成样本。 5 螺旋式分布图 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 散度的情况下,很难说上面哪种情况是最好的,但是覆盖率、均匀性、在负空间内的样本是很值得研究的问题。 6 结语
人们很容易陷入对 GAN 的狂热中,把它们当作“魔法机器”,用随机数作为燃料来创造出新的样本。了解一个工具如何工作的基本原理,对于有效地使用它以及在它损坏时进行故障排除是至关重要的。对于 GAN 来说,这就意味着理解生成器所做的是学习从一些潜在空间到一些采样空间的映射,并理解学习是如何进行的。将一维分布映射到高维分布的极端情况清晰地说明了这种任务有多复杂。本项目使用的所有代码可以从下面的 GitHub 代码仓库中获取:https://github.com/ConorLazarou/medium/tree/master/12020/visualizing_gan_dimensions 点击“阅读原文” 查看 ICLR 系列论文解读