Generative Adversarial Networks overview(2)
Libo1575899134@outlook.com
Libo
(原创文章,转发请注明作者)
本文章会先从Gan的简单应用示例讲起,从三个方面问题以及解决思路覆盖25篇GAN论文,第二个大部分会进一步讲Gan的所有领域应用
-----------------------------------------------------------------------------------
上一篇说到最近有人关于encoder给出了更加直观的解释:
从另一个角度理解,传统的A是我们希望的map,两个domain的图像,都是向左的map到一起,都是向右的map到一起,如果用传统Gan去学,会导致b的情况,Mode Missing的问题
这样会导致生成这样的东西很模糊,有点像生成的平均一样,可以和之前很多Gan的模型生成的比较模糊联系到一起
第三个是简单把一个Gan加一个encoder的办法,细节不一样,但是概括了刚才说的三种方法,如果只加一个encoder的话,虽然能在一定程度上限制B领域的东西也能映射会A邻域,就会导致结果出现震荡,一会学到朝左的箭头,一会学到朝右的箭头,导致训练出来的结果只是一个偶然。
所以就有了后面三篇基本长得一样的,后面三篇基本长的一样,cycleGan 来自朱骏彦的作品,如果一个encoder学的是单向隐射,G:x->y 最好也要求F:Y->x,这个才能保证学到的东西是一一对应的
可以明显看到,Gan Loss函数包括了一个原始Gan+另一个方向的Gan+CycGan
两个encoder 两组Gan
下面是CycleGan的结果,把马变斑马,夏天变冬天,把画作变真实照片,风格迁移的任务,工作的突破是可以将整幅图的风格转换成莫奈的风格,而不是莫奈某幅画的风格
还可以转换成不同画家的作品的图片
下面是苹果变橘子,作者补充到,CycleGan只能应用到形状比较相似的物品上,马和斑马其实也是有细微的差异,苹果变成香蕉可能暂时不会work
CycleGan也提到了一些Mode-missing的问题,下图对比了BiGan和CoGan的工作,这两篇工作也用到了两个encoder,并不是向那三篇说的只用了一个encoder,但是明显看到BiGan没学起来。
那么具体来看BiGan做了哪些事情,BiGan并不是直接学两个样本空间的映射,而是学一个样本空间和一个隐含空间的特征映射,Z代表的就是隐空间。和CycleGan 不太一样的地方,说明了隐空间学习有时候不如在样本空间直接学。
DiscoGan 解释ModeMissing 就会更有意思一些,a,代表的是原始的图像,b ,是Gan ,c ,是加了一个encoder的Gan, D,是加了两个encoder的双向Gan。
比较后面两幅图,为什么只加一个encoder对于Mode missing的问题也解决的不太好呢,C中绿色区域的三个点其实没有区出来,下面的区分情况也不太好,但是如多是DiscoGan 就可以把10个点,10个Mode,区分的非常好。不同的颜色和背景代表了判别器的输出大小,如果颜色的深浅很均匀的话(0.8-0.6)学的比较好。
B是一个encoder的情况,C是用2个encoder的情况。A 是传统gan Mode-missing 最严重的情况,基本学出来都是一个方向的。
所以第二个Mode-Missing的第三类问题问题已经基本解决了,双向的encoder&noise input。就是即使不考虑JS散度,优化目标会导致Mode-Missing问题,刚才的一些方法就可以解决。
最后一个是比较火的Wasserstein Distance或者也叫WGan,翻译成中文推土机距离,可以看到下图γ属于联合分布,把生成数据分布和真实数据分布做一个联合分布,γ属于联合分布中的任意一种分布,对于这样的分布,取两个点的距离的整体的期望的下界。
为什么比KL散度和JS散度好呢?为什么叫推土机距离,形象理解为把X变到Y需要推的土有多少
假设X和Y的分布分别如下图,需要费多大的力才能把X的形状的分布变成Y形状的分布,如果是一个离散的分布可以这么理解,假如有10个可能的样本,10种可能的取值,不同的概率是柱子的高度,如何可以变到右边,当然变的不是样本取值而只是概率值,是一个NP问题且并不是唯一的,有些解需要费的力比较大,类似汉诺塔,最优规划路径问题
所以距离可以理解成:把生成分布变到真实分布所需要的最优距离的最小值,为什么比KL和JS散度好呢?在一种可以忽略不计的假设下,它是一个连续可分可微的度量,且最重要的是他直接解决了JS散度在两个分布不重合的时候,无意义这件事。即使两个分布远在天边 WD也可以衡量两者距离到底有多远,所以永远都可以提供一个有效的梯度,直接解决了梯度消失 ,不稳定的问题。
如果用JSD来做的话,两个分布就会有一些突变,但是如果Wasserstein的话就是渐变的
有了距离以后怎么具体变成Gan的目标函数呢?因为下届是不能直接计算的,于是用了一个KR对偶性的方法,做了转换,损失函数里的log被去掉了,下面再解释为什么没有了。
有了之后,并不是从刚才的直接等价过来的,条件是需要D的function是符合Lipschitz连续性的
解释下什么是Lipschitz连续性,对于一个连续函数或者实数的function,如果导函数的绝对值,在任意情况下都小于一个常数的话,那么就说这个函数是Lipschitz 连续的。要求函数导数的变化程度或者倾斜度角度不要太大
有了Lipschitz连续性之后就要把WD应用到Gan的损失函数中,需要满足D的函数符合这个连续性,所以原始的paper 就是把D的导数(weight)限制到一定的范围内,[-c,c] 如果超过这个范围就用weight clip的方法截断,就会出现个问题,选择C其实挺重要的,论文里也给了一些解决办法。
总之,WGan就可以改变gan中的目标函数,去掉log,应为原始的判别器是在判别一个二分类问题,fake or true ? 所以D的top layer 一般是一个sigmod layer,现在做了这个转变其实是在逼近Wasserstein的距离,逼近两个分布的距离,相当于变成一个回归问题,把最后的sigmod直接给去掉了
所以作者发现,如果用了WD之后,绿色和蓝色是原始Gan中的分布,发现梯度消失的很剧烈,D很快就变平了,就是没有梯度了,给它啥都判断的很对,也就没有啥变化了,用Wasserstein学出来发现梯度就会很平稳,形象证明了他们可以解决这个问题。
所以第二个困难点就解决了,第二个困难点在于如果用JS散度来衡量两个几乎不可能重叠的分布的时候,梯度没有办法得到有效信息,梯度消失的问题,就被Wgan解决掉了。
接下来介绍W-gan 的优点,和能做哪些事情,因为现在D输出的不是0或者1,输出的是一个真实值,说明了它逼近distance的程度,所以作者指出D的输出可以作为衡量trianing的进度,随着训练进行的越来越好,距离应该降低越来越少,蓝色曲线越来越低,图像质量越来越好
所以它做到了两件事,一个是终于有一个可靠的数值,来衡量生成样本的质量,因为生成样本的评价问题是个很难的问题,一直在用人工评价或者很多不靠谱的方法。相当于提出了副产品。
可以看到下图,变形度在慢慢降低,清晰度在慢慢提高,坏点再慢慢减少,上面是Wgan下面是DCgan,发现用Wgan的训练方法训练DCGan的结构,可以发现质量上面的清晰度和变形度更好一些。
在介绍DC-GAN是发现了他们还是用了BN,但是BN并不是所有情况下都好,有时候还会破坏训练,发现用DC去掉BN后train不出来因为增加了稳定性,但是W-GAN即使不用BN,依然能训练不错的结果。
有了DCGAN后大家不太用MLP了,因为MLP表现能差,表现在生成的样本不能逼近很复杂的图像,MLP学mnist还是不错的,三层就可以,但是如果SBA这种就不太好,用standard Gan学出来会更差,但是如果用W-GAN 的话,连MLP 也可以进行很好的学习了。
在最后一部分,有人发现,为了满足Lipschitz连续性的要求,直接简单粗暴的方式是weight clip,不仅仅有选择困难的问题,还会出现,如果C显得比较大,下面红色的先出现了梯度爆炸的问题,选的小时会出现梯度消失,越小消失的越厉害。
所以他们提出了一种Gradient Penalty(梯度惩罚)的方法,就会一直比较平稳。
对于weight clipping的情况下 甚至会学出两种极端的情况,判别器的weight不是-c就是c,导致学出来的D变得很简单。降低了学习能力。
下面做了一个展示, Weight clipping 会忽略掉高阶的动量,所以无法完成复杂的判别任务。
进一步分析,为什么会出现这个问题,用原始的W-gan 就跟gan一样会得到一个最优的D,会让判别器所有的梯度都在1左右,1就是指C,发现其实是跟norm有关的,所以就提出不要直接clip数,去控制norm,把现在的梯度和最优的值,之间差距有多少,用一个L2的loss,加到原始的W-gan的损失函数中。
下图看到黄色跟绿色收敛的特别快,GP效果好,不加BN效果还是好。
建议
1 如果要做Gan相关任务传统的就不要再试了,试试最新的。
2 尝试noise input
3 分析特殊结构,例如:U-net 在encoder和decoder上面加了skip connection,其实是针对特定的pair的问题最有效的,需要让feature一一映射过去
4 不要总是尝试高斯的noise,尝试形状,大小等等
不同的noise直接影响了学出来的东西,不是说有情况下都一定要加显性noise,比如noise input 不需要Z的vetor,比如dropout 相当于已经加了noise。
下面的连接中总结了二十多种技巧,可以看一下。
----------------------------------------------------------
至此Gan相关的原理全部介绍完毕,大致从3个主要问题,以及对应的解决对二十多篇Gan模型进行整理,下一篇会整理行业所有领域对gan的应用程度
下一篇:Generative Adversarial Networks overview(3)
Generative Adversarial Networks overview(2)的更多相关文章
- Generative Adversarial Networks overview(1)
Libo1575899134@outlook.com Libo (原创文章,转发请注明作者) 本文章会先从Gan的简单应用示例讲起,从三个方面问题以及解决思路覆盖25篇GAN论文,第二个大部分会进一步 ...
- Generative Adversarial Networks overview(3)
Libo1575899134@outlook.com Libo (原创文章,转发请注明作者) 本文章主要介绍Gan的应用篇,3,主要介绍图像应用,4, 主要介绍文本以及医药化学其他领域应用 原理篇请看 ...
- Generative Adversarial Networks overview(4)
Libo1575899134@outlook.com Libo (原创文章,转发请注明作者) 本文章主要介绍Gan的应用篇,3,主要介绍图像应用,4, 主要介绍文本以及医药化学其他领域应用 原理篇请看 ...
- 生成对抗网络(Generative Adversarial Networks,GAN)初探
1. 从纳什均衡(Nash equilibrium)说起 我们先来看看纳什均衡的经济学定义: 所谓纳什均衡,指的是参与人的这样一种策略组合,在该策略组合上,任何参与人单独改变策略都不会得到好处.换句话 ...
- 生成对抗网络(Generative Adversarial Networks, GAN)
生成对抗网络(Generative Adversarial Networks, GAN)是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的学习方法之一. GAN 主要包括了两个部分,即 ...
- 论文解读(GAN)《Generative Adversarial Networks》
Paper Information Title:<Generative Adversarial Networks>Authors:Ian J. Goodfellow, Jean Pouge ...
- (转)Introductory guide to Generative Adversarial Networks (GANs) and their promise!
Introductory guide to Generative Adversarial Networks (GANs) and their promise! Introduction Neural ...
- 论文笔记之:Semi-Supervised Learning with Generative Adversarial Networks
Semi-Supervised Learning with Generative Adversarial Networks 引言:本文将产生式对抗网络(GAN)拓展到半监督学习,通过强制判别器来输出类 ...
- 《Self-Attention Generative Adversarial Networks》里的注意力计算
前天看了 criss-cross 里的注意力模型 仔细理解了 在: https://www.cnblogs.com/yjphhw/p/10750797.html 今天又看了一个注意力模型 < ...
随机推荐
- 用 LinkedList 实现一个 java.util.Stack 栈
用 LinkedList 实现一个 java.util.Stack 栈 import java.util.LinkedList; public class Stack<E> { priva ...
- scrapy爬虫框架windows下的安装问题
windows操作系统 python版本是3.6.0 通过Anaconda命令conda install scrapy安装scrapy,安装过程中没有问题. 然后在命令行输入命令准 ...
- UML统一建模语言介绍
统一建模语言简介 统一建模语言(Unified Modeling Language,UML)是用来设计软件蓝图的可视化建模语言,1997 年被国际对象管理组织(OMG)采纳为面向对象的建模语言的国际标 ...
- CRLF will be replaced by LF in XXX when git commit
转载自Git-warning: CRLF will be replaced by LF in XXX 今天,普通平凡的一天,平凡的使用 git add .,然后又出现一个之前没遇到的错误提示 . 真开 ...
- 一起来学习.net core程序使用中介者模式:MediatR插件
中介者模式是一种常见的设计模式,旨再降低程序的耦合性,因为传统的三层模式层层之间需要显示的调用,必须上层依赖下层,耦合性很高,为了解耦,将所有的指令单独放在一个位置处理,其他位置均通过这个位置来间接的 ...
- 我的第一个netcore2.2 api项目搭建(二)
上一章快速使用SqlSugar搭建了netcore api项目,我的第一个netcore2.2 api项目搭建(一) 这一章实现目标二:api使用Swagger,实现api文档管理 效果图:第一张收缩 ...
- C# 特性和索引(C#学习笔记06)
特性 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签. 特性可以当成一个特殊的类看待 列举特性语法: [attribute(pos ...
- localStorage、sessionStorage、Cookie的区别及用法
1.webstorage 本地存储,存储在客户端,包括localStorage和sessionStorage. (1)localStorage:生命周期是永久,这意味着除非用户显示在浏览器提供的UI上 ...
- Microsoft SQL Server数据库语法
目录 关于数据库的语法: 1.创建数据库 create database 数据库名on primary(主文件属性(name,filename,size等)) -用逗号隔开次要主要文件和次要文件( ...
- JS 数组克隆方法总结(不可更改原数组)
ES5 方法总结 1.slice let arr = [2,4,434,43]; let arr1= arr.slice();//let arr1 = arr.slice(0); arr[0] = ' ...