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成功学习了螺旋分布。但是,它有几个问题:
- 它比目标函数要瘦很多。尽管螺旋的某些部分具有一定的宽度,但GAN实质上已将这种分布减小为二维空间中的一维流形。
- 输出混乱。注意分散在螺旋形负空间中的点。这些永远不会在目标函数中发生,那么它们在做什么?
- 注意点(0.60,-0.63)和(0.45,0.17)上的奇怪伪像; 这些不连续性会在分布中造成漏洞。
- 将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和低效映射的更多相关文章
- Hibernate学习---第六节:数组&list&map&set的映射配置
1.实体类,代码如下: package learn.hibernate.bean; import java.util.Date; import java.util.HashMap; import ja ...
- CPU和GPU双低效,摩尔定律之后一万倍 ——写于TPU版AlphaGo重出江湖之际
本文来自计算机体系结构专家王逵.他认为,“摩尔定律结束之后,性能提升一万倍”不会是科幻,而是发生在我们眼前的事实. 2008年,<三体2:黑暗森林>里写到: 真的很难,你冬眠后不久 ...
- 面对key数量多和区间查询低效问题:Hash索引趴窝,LSM树申请出场
摘要:Hash索引有两个明显的限制:(1)当key的数量很多时,维护Hash索引会给内存带来很大的压力:(2)区间查询很低效.如何对这两个限制进行优化呢?这就轮到本文介绍的主角,LSM树,出场了. 我 ...
- Hibernatel框架关联映射
Hibernatel框架关联映射 Hibernate程序执行流程: 1.集合映射 需求:网络购物时,用户购买商品,填写地址 每个用户会有不确定的地址数目,或者只有一个或者有很多.这个时候不能把每条地址 ...
- hibernate多对多关联映射
关联是类(类的实例)之间的关系,表示有意义和值得关注的连接. 本系列将介绍Hibernate中主要的几种关联映射 Hibernate一对一主键单向关联Hibernate一对一主键双向关联Hiberna ...
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示
Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...
- .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper
好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...
- ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系
ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ...
随机推荐
- XML的相关基础知识分享(二)
前面我们讲了一下XML相关的基础知识(一),下面我们在加深一下,看一下XML高级方面. 一.命名空间 1.命名冲突 XML命名空间提供避免元素冲突的方法. 命名冲突:在XML中,元素名称是由开发者定义 ...
- windows 10 右键菜单注册表位置
1. 查找 1.1. 打开注册表 # 1. 使用快捷键打开 “运行” win + r # 2. 在 “运行” 中输入 regedit # 3. 回车 1.2. 点击 查找 # 1. 方法 1 : 点击 ...
- Spring 事务传播机制和数据库的事务隔离级别
Propagation(事务传播属性) 类别 传播类型 说明 支持当前事务 REQUIRED 如果当前没有事务,就新建一个事务.@Transaction的默认选择 支持当前事务 SUPPORTS 就以 ...
- MVC09
1.委托(delegate)调用静态方法 委托类似于C++中的函数指针. 某方法仅仅在执行的时候才能确定是否被调用. 是实现事件和回调函数的基础. 面向对象,安全性高. using System; u ...
- 移动端轮播图实现方法(dGun.js)
本文章介绍在移动端无缝隙轮播图实现的原理,这个轮子比较简单,但可以方便刚刚入门的同学参考.最终效果是在移动端无缝隙无限滑动,可以自定义轮播的速度.支持手势左右滑动.最后会放上源码. HTML部分 &l ...
- BEM命名及其在sass中的实践
Why use it 近几年web应用的发展可以用疯狂来形容,依靠浏览器的支持以及前端技术和框架的发展,很多应用已经把大量的逻辑从服务器端迁移到了浏览器端,使用前后端分离技术,浏览器端与用户进行交互来 ...
- CSS实现响应式布局
用CSS实现响应式布局 响应式布局感觉很高大上,很难,但实际上只用CSS也能实现响应式布局要用的就是CSS中的没接查询,下面就介绍一下怎么运用: 使用@media 的三种方法 1.直接在CSS文件中使 ...
- 【30分钟学完】canvas动画|游戏基础(5):重力加速度与模拟摩擦力
前言 解决运动和碰撞问题后,我们为了让运动环境更加自然,需要加入一些环境因子,比如常见的重力加速度和模拟摩擦力. 阅读本篇前请先打好前面的基础. 本人能力有限,欢迎牛人共同讨论,批评指正. 重力加速度 ...
- Codeforces Round #620 (Div. 2)
Codeforces Round #620 (Div. 2) A. Two Rabbits 题意 两只兔子相向而跳,一只一次跳距离a,另一只一次跳距离b,每次同时跳,问是否可能到同一位置 题解 每次跳 ...
- activiti设置customSessionFactories时的一个小坑
现象:activiti设置customSessionFactories不起作用,流程还是走原来的查询方法原因:新实现的XXXEntityManagerFactory的getSessionType方法返 ...