生成对抗网络(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/

GANs和低效映射的更多相关文章

  1. Hibernate学习---第六节:数组&list&map&set的映射配置

    1.实体类,代码如下: package learn.hibernate.bean; import java.util.Date; import java.util.HashMap; import ja ...

  2. CPU和GPU双低效,摩尔定律之后一万倍 ——写于TPU版AlphaGo重出江湖之际

    本文来自计算机体系结构专家王逵.他认为,“摩尔定律结束之后,性能提升一万倍”不会是科幻,而是发生在我们眼前的事实.   2008年,<三体2:黑暗森林>里写到:   真的很难,你冬眠后不久 ...

  3. 面对key数量多和区间查询低效问题:Hash索引趴窝,LSM树申请出场

    摘要:Hash索引有两个明显的限制:(1)当key的数量很多时,维护Hash索引会给内存带来很大的压力:(2)区间查询很低效.如何对这两个限制进行优化呢?这就轮到本文介绍的主角,LSM树,出场了. 我 ...

  4. Hibernatel框架关联映射

    Hibernatel框架关联映射 Hibernate程序执行流程: 1.集合映射 需求:网络购物时,用户购买商品,填写地址 每个用户会有不确定的地址数目,或者只有一个或者有很多.这个时候不能把每条地址 ...

  5. hibernate多对多关联映射

    关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...

  6. Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示

    Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...

  7. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

  8. .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper

    好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...

  9. ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系

    ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ...

随机推荐

  1. Android状态机StateMachine使用举例及源码解析

    Android frameworks源码StateMachine使用举例及源码解析 工作中有一同事说到Android状态机StateMachine.作为一名Android资深工程师,我居然没有听说过S ...

  2. 【5min+】保持程序健康的秘诀!AspNetCore的HealthCheck

    系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...

  3. CSV文件注入漏洞简析

    “对于网络安全来说,一切的外部输入均是不可信的”.但是CSV文件注入漏洞确时常被疏忽,究其原因,可能是因为我们脑海里的第一印象是把CSV文件当作了普通的文本文件,未能引起警惕. 一.漏洞定义 攻击者通 ...

  4. 操作系统-IO管理和磁盘调度

    I/O设备 IO设备的类型 分为三类:人机交互类外部设备:打印机.显示器.鼠标.键盘等等.这类设备数据交换速度相对较慢,通常是以字节为单位进行数据交换的 存储设备:用于存储程序和数据的设备,如磁盘.磁 ...

  5. git上传命令步骤

    1.登陆github后,进入Github首页,点击New repository新建一个项目 2. 填写相应信息后点击create repository即可 Repository name: 仓库名称( ...

  6. SpringBoot一些基础配置

    定制banner Spring Boot项目在启动的时候会有一个默认的启动图案: . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( ...

  7. 关于nw的简单应用

    最近使用到了桌面开发应用nw.js.进行简单的介绍一下,基本用法 nwjs实际上是基于node js的,支持node js的所有api 中文官网https://nwjs.org.cn/ 第一步.在官网 ...

  8. 如何在Flutter中使用flutter_markdown

    很多博客,论坛都支持markdown语法,flutter也有支持markdown语法的插件flutter_markdown 安装依赖 dependencies: flutter: sdk: flutt ...

  9. NLP(二十四)利用ALBERT实现命名实体识别

      本文将会介绍如何利用ALBERT来实现命名实体识别.如果有对命名实体识别不清楚的读者,请参考笔者的文章NLP入门(四)命名实体识别(NER) .   本文的项目结构如下:   其中,albert_ ...

  10. view添加阴影

    //@mg:masksToBounds必须为NO否者阴影没有效果 //    cell.layer.masksToBounds = NO; cell.layer.contentsScale = [UI ...