GANs和低效映射

生成对抗网络(GANs)被誉为生成艺术领域的下一纪元,这是有充分理由的。新技术一直是艺术的驱动因素,从颜料的发明到照相机再到Photoshop-GAN是自然而然的。例如,考虑下面的图片,由埃尔加马勒发表在2017年的论文。

如果你不熟悉GAN,那么本文将简要介绍训练过程。简而言之,GAN将随机噪声作为输入,并且产生的输出与真实数据是无法区分的(如果训练顺利的话),其中真实数据几乎可以是任何东西(一组抽象绘画,名人头像照片,手写数字等) )。

在GAN文献中,与之前的变分自编码器一样,输入值常常与输出没有明确的关系,这是一个得到充分证明的问题。正如我前面提到的,GANs接受随机噪声(通常是100个随机的、正态分布的值)作为输入,每个随机数都可以看作是输出的控制杠杆。理想情况下,每个杠杆都对应一个特征,例如在生成人脸的情况下,将有一个杠杆用于微笑和皱眉,一个用于肤色,一个用于头发长度,等等;在艺术创作时这种情况很少发生,因此使用GANs进行艺术创作就成了一种挑战。作为这个问题的可视化,考虑以下动画:

在这里,我使用16维的空间在MNIST手写数字数据集上训练了一个GAN。我使用这个GAN生成了一个随机样本,然后说明当一个输入值被调整而其他值被固定在适当的位置时,输出是如何变化的。正如你所看到的,这两种杠杆都不会以人类可能觉得直观或有用的方式改变输出;第一个杠杆控制数字是7还是9以及笔画角度,而第二个杠杆控制数字是7还是9以及笔画厚度。可以想象生成“手写”数字的理想工具是什么样子的:第一个控制杆控制要生成的数字,从0到9;第二杠杆控制冲程的厚度;第三个控制笔画角度;第四,循环,你懂的。相反,我们看到这些特征中的一些是由一个杠杆控制的,而这些特征中的一个是由多个杠杆控制的。想象一下,如果Photoshop的旋转工具也通过色轮旋转图像的色调,那该有多令人沮丧!

这里的一个明显的问题是,这使得生成图像的接口效率很低,而且非常混乱。然而,还有另一个不太明显的问题:输入和输出之间扭曲而复杂的关系也妨碍了训练并限制了输出的整体质量。

问题一:螺旋

正如我在本文中所解释的,GAN本质上是用于对某些数据分布建模的工具,无论是正态分布还是人脸分布。因此,GAN是从某些潜在空间到某些样本空间的转换或映射。当GAN作为学生全神贯注于诸如图像生成之类的高维问题时,这一点常常被忽视。在这里,我打算使用简单的二维问题来演示低效的映射问题,其中第一个问题在此处进行了说明:

这是一个相当简单的函数,它将输入空间中的x轴映射到样本空间中沿着螺旋的位置(角度和半径),并将y轴映射到螺旋内的横向位置。出于可视化的目的,x轴也映射到色相,y轴也映射到值(彩色与黑色)。为了进一步阐明此功能,请考虑以下动画:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ieyY5MJz-1582722801728)(http://qiniu.aihubs.net/1_GPA8YvfHxPPJXoPjphn5_g.gif)]

因此,问题是要训练一个能够从这种螺旋分布中采样点的GAN,这样就很难分辨出GAN的批次和真实函数的批次。注意,GAN不必学习原始映射。只要输出分布相同,任何映射都可以。

结果:

使用典型的GAN训练技术对GAN进行了60000次步骤的训练(代码在本文结尾)。如你所见,GAN成功学习了螺旋分布。但是,它有几个问题:

  1. 它比目标函数要瘦很多。尽管螺旋的某些部分具有一定的宽度,但GAN实质上已将这种分布减小为二维空间中的一维流形。
  2. 输出混乱。注意分散在螺旋形负空间中的点。这些永远不会在目标函数中发生,那么它们在做什么?
  3. 注意点(0.60,-0.63)和(0.45,0.17)上的奇怪伪像; 这些不连续性会在分布中造成漏洞。
  4. 将GAN产生的螺旋中的色相和值的分布与原始函数中的相比较(图3);它们的顺序性不明显,并且在潜在空间(控制杆)和输出之间没有明确的关系。

在此动画中说明了所有这四个问题:

正如你所看到的,这四个问题实际上是同一个问题。对比图6和图4,我们可以看到GAN学会了一个低效的映射。首先,考虑潜空间右上角的撕裂;撕裂上方的潜在空间区域被映射到螺旋的最外层,而紧挨着撕裂下方的区域被映射到螺旋的中心。这种撕裂行为解释了混乱(问题2);位于裂缝上的任何一点都映射到这两个极端之间的某个地方,通常落在螺旋的负空间中。它也解释了(0.60,-0.63)处的伪影(问题3),因为在这个区域生成的点是从潜在空间的远处点映射而来的,这也是为什么颜色的色调和值也没有对齐(第4期)。最后,学习分布(问题1)的瘦性是由映射的复杂性来解释的;分布的大部分方差来自于沿螺旋的位置,在螺旋宽度内的位置不那么显著。因此,Gan首先学会了如何创造螺旋。每当它试图扩展时,映射的复杂性就会导致其他一些区域中断。Gan基本上把自己困在了一个无法逃脱的局部极小值中。如果你很好奇,以下是GAN在训练时的样子:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2qUbzCCg-1582722801730)(http://qiniu.aihubs.net/1_m3mAqofrq5dVsBD3vseQBw.gif)]

图显示GAN迅速了解了最外层和最内层区域的不兼容映射,并且分布的剩余 部分不得不在它们之间进行协调。

问题二:八个高斯

这个函数将2.5维空间映射到2维空间。潜在空间的前两个维度是独立的、标准的正态分布的值。剩下的“0.5”是一个包含8个可能值的离散维度,编码为长度为8的向量,其中一个值被设置为1,而其他值为0。在图8中,通过在x轴和y轴上绘制两个连续维度来表示潜在空间中的随机样本,而用颜色表示离散维度。目标函数将这个潜在空间映射到样本空间,方法是将正态分布重新缩小0.2倍,并根据潜在维度的值将其移动到8个点之一。过程如下:

因此,问题是要训练一个能够从这八个高斯分布中采样点的GAN,使得GAN的批处理和真实函数的批处理是无法区分的。请注意,就像上述螺旋问题一样,GAN不必学习原始映射,如果有一个简单的映射当然更好。

结果:

结果不好。GAN完全无法在两种模式下生成样本(模式崩溃),它在模式之间产生了大量的点,无法生成正态分布的模式,并且潜空间和样本空间之间显然没有合理的关系。在以下动画中,这一点更加明显:

很明显,两个连续潜值内的不同区域被切割并映射到六个样本空间模式。这和螺旋问题中的撕裂问题是一样的;落在裂缝上的点被映射到模式之间的负空间。尽管有简单的解决方案(即按比例缩小连续维度并将离散维度中的每个值映射到不同的模式),GAN还是陷入了局部最小值,无法再将自己挖出来。

问题三:一个高斯

八高斯问题显然太难了,所以这里有一个更简单的问题:把二维均匀噪声转换成二维标准正态噪声。就像在螺旋问题中一样,点是通过沿着x轴旋转色相和沿着潜在空间的y轴变化值来着色的。最简单的映射很简单:独立地展开每个维度。如下图所示:

结果:

如你所见,即使涉及从二维正态分布之类的简单样本中进行采样,GAN仍然将自身束缚在一起。最值得注意的是,GAN似乎将潜在空间折叠了起来,从而在样品空间的右下角产生了扭结,缝隙和突起。这是插值的动画:

总结

我希望上面的可视化说明已经清楚地表明,输入和输出特征之间的模糊关系不仅仅是一个难点,而是一个基本问题。如果你对用于训练上述GANs或可视化代码的代码感兴趣,可以通过以下github仓库获得:

https://github.com/ConorLazarou/medium/tree/master/12020/visualizing_gan_mapping

欢迎关注磐创博客资源汇总站:
http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:
http://pytorch.panchuang.net/

OpenCV中文官方文档:
http://woshicver.com/

posted @ 2020-02-23 19:58  人工智能遇见磐创  阅读(191)  评论(0编辑  收藏  举报