https://www.bilibili.com/video/av9770302/?p=15

前面说了auto-encoder,VAE可以用于生成

VAE的问题,

AE的训练是让输入输出尽可能的接近,所以生成出来图片只是在模仿训练集,而无法生成他完全没有见过的,或新的图片

由于VAE并没有真正的理解和学习如何生成新的图片,所以对于下面的例子,他无法区分两个case的好坏,因为从lost上看都是比7多了一个pixel

所以产生GAN,

大家都知道GAN是对抗网络,是generator和discriminator的对抗,对抗是有一个逐渐进化的过程

而generator不会看到训练集,训练集只用来训练discriminator,所以generator是试图去生成新的图片,而不是单纯的模仿训练集

过程是,

我们通过V1的generator的输出和real images来训练V1的discriminator,让V1的discriminator可以判别出两者的差别

然后,将V1的generator和V1的discriminator作为整体network训练(这里需要固定discriminator的参数),目标就是让generator产生的图片可以骗过V1的discriminator

这样就产生出V2的generator,重复上面的过程,让generator和discriminator分别逐渐进化

训练Discriminator的详细过程,

训练generator的详细过程,

可以看到 generator会调整参数,产生image让discriminator判别为1,即骗过discriminator

并且在网络训练的时候,虽然是把generator和discriminator合一起训练,但是要fix住discriminator的参数,不然discriminator只需要简单的迎合generator就可以达到目标,起不到对抗的效果

下面从理论上来看下GAN,

GAN的目的是生成和目标分布(训练集所代表的分布)所接近的分布

Pdata就是训练数据所代表的分布

PG是我们要生成的分布

所以我们的目标就是让PG和Pdata尽可能的close

从Pdata中sample任意m个点,然后用这些点去计算PG,用最大似然估计,算likelihood

让这些点在PG中的概率和尽可能的大,就会让PG分布接近Pdata

这里的推导出,上面给出的最大似然估计,等价于求Pdata和PG的KL散度,这个是make sense的,KL散度本身就用来衡量两个分布的相似度

这里PG可以是任意函数,比如,你可以用高斯混合模型来生成PG,那么theta就是高斯混合中每个高斯的参数和weight

那么这里给定参数和一组sample x,我们就可以用混合高斯的公式算出PG,根据上面的推导,也就得到了两个分布的KL散度

当然高斯混合模型不够强大,很难很好的去拟合Pdata

所以这里是用GAN的第一个优势,我们可以用nn去拟合PG

这个图就是GAN的generator,z符合高斯分布,z是什么分布不关键也可以是其他分布

通过Gz函数,得到x,z可以从高斯分布中sample出很多点,所以计算得到很多x,x的分布就是PG;只要nn足够复杂,虽然z的分布式高斯,但x可以是任意分布

这里和传统方法,比如高斯混合的不同是,这个likelihood,即PG不好算,因为这里G是个nn,所以我们没有办法直接计算得到两个分布的KL散度

所以GAN需要discriminator,它也是一个nn,用discriminator来间接的计算PG和Pdata的相似性,从而替代KL散度的计算

GAN可以分成Generator G和Discriminator D,其中D是用来衡量PG和Pdata的相似性

最终优化目标的公式,看着很唬人,又是min,又是max

其实分成两个步骤,

给定G,优化D,使得maxV(红线部分),就是训练discriminator,计算出两个分布之间的差异值;在上图中就是在每个小图里找到那个红点

给定D,优化G,使得min(maxV),就是在训练generator,最小化两个分布之间的差异;就是在上图中挑选出G3

这里有个问题没有讲清楚的是,

为何给定G,优化D,使得maxV,得到的V可以代表两个分布的差异?

如果这个问题明白了,下一步优化G,去最小化这个分布间的差异是很好理解的

做些简单的转换,如果我们要最后一步这个积分最大,那么等价于对于每个x,积分的内容都最大

这里是给定G,x,Pdata(x),PG(x)都是常量,所以转换成D的一个简单函数

求最大值,就极值,就是求导找到极点

这里推导出当V max的时候, D的定义,并且D的值域应该在0到1之间

上面推导出如果要Vmax,D要满足

所以进一步将D带入V的公式,这里经过一系列推导得到,V就等价于jensen-shannon divergence

jensen-shannon divergence的定义,如下,

比KL divergence好的是,KL是非对称的,而jensen-shannon divergence是对称的,可以更好的反应两个分布间的差异

那么这里的推导就证明,给定G,优化D让V最大的时候,V就表示Pdata和PG的jensen-shannon divergence,所以这个Vmax就可以表示这个两个分布的差异,也就回答了前面的问题

总结一下,

GAN,有两部分Generator G,Discriminator D

我们的目的是找到一个G,可以生成出足够好的x,即满足minmaxV(G,D),其中V的定义在蓝框中

GAN分两步,先给定G,去MaxD,然后再通过找到最优的G以满足,Pg(x) = Pdata(x)

MaxV,给定G,找到最大D,所以可以看成G的函数,设为L(G)
那么这样找到最优G,就是对L(G)进行梯度下降

这里的问题是L(G)中有一个Max,如何梯度下降?
下面给出一个例子,给定x先找出max的D,再对D做梯度下降

所以算法的步骤,

给定G0,max V得到D0,这里V(G0,D0)就Pdata和PG的JS divergence

然后固定D0,对V进行梯度下降,尽量降低JS divergence,得到G1,。。。。。。

但这里会有一个问题,

从G0梯度下降到G1,如果step太大,会导致图中的情况,在G1,D1会和D0差的比较远,这样有可能V(G,D)反而变大了

但是我们只要控制住G的变化程度,这个问题就可以避免

在实际实现的时候,对于V,我们是无法算出Pdata,PG的期望的

所以只能sample,对Pdata,PG中进行m个sample

所以对于给定G,我们要算使得V max的D,这就是在训练discriminator

把m个sample的数据带入V的公式,期望E就变成求平均

这个式子就等同于binary classifer,这个很直觉,本身discriminator就是在训练一个二元分类,来判断是否是生成数据

完整的过程如上,分为两部分,

Learning D,需要固定G,去maximize V,所以这里用的梯度上升,这个步骤可以做多次,以尽量找到max

Learning G,固定D,去minimize V,用梯度下降,这个步骤只做一次,上面说了如果G变化太大,会导致JS divergence变大而不是变小;用红线划掉部分,因为和G无关,所以梯度下降时可以去掉

实现上,learning G的时候,我们往往不会对上面那个式子做梯度下降,因为你可以看图,D(X)比较小的时候(开始训练时,D会很小),这个曲线的梯度是很小的,很难训练

所以会用下面的式子替代,这样,在开始训练时候梯度会比较大,训练较快

在训练GAN的时候,往往会出现discriminator过强,导致无法训练的问题,

比如上面的例子,强弱两种generator,但是在discriminator看来,没有区别,它都可以很轻松的判别出他们是false的,这样就会无法训练,因为没有梯度

为何discriminator很容易判断出Pdata和PG是完全没有交集?

两个原因,首先因为我们只是对分布做了sample,所以虽然两个分布有交集,但是我们sample的数据有可能很容易被过拟合绕开

再者,data是高维空间的manifold,所以重叠的部分可能非常的小,导致discriminator认为没有重叠

所以问题就在于,你无法从PG0直接跳到PG100,需要逐渐演化,而过强的discriminator会导致在100之前,JS divergence一直是log2,这样就完全没有梯度

这个比较简单的解决方法就是给discriminator加noise,效果如图,会让分布的overlap更加明显

但这个noises需要随着时间递减,因为随着generator变强,noise会干扰正常的训练

Conditional GAN

Conditional GAN的不同就是,需要给一个条件输入,比如这里的text,train
这里用GAN和其他简单的模型的差异是,GAN还有一个输入是z,在是一个prior distribution的sample,所以一个条件train对应的不是一个输出,而是一个分布
这里对于train可能有很多种picture,所以更为合理,普通的nn一个输入只对应一个输出

同样对于discriminator,也要同时输入condition和x,来进行判别

GAN (Generative Adversarial Network)的更多相关文章

  1. GAN Generative Adversarial Network 生成式对抗网络-相关内容

    参考: https://baijiahao.baidu.com/s?id=1568663805038898&wfr=spider&for=pc Generative Adversari ...

  2. Face Aging with Conditional Generative Adversarial Network 论文笔记

    Face Aging with Conditional Generative Adversarial Network 论文笔记 2017.02.28  Motivation: 本文是要根据最新的条件产 ...

  3. 生成对抗网络(Generative Adversarial Network)阅读笔记

    笔记持续更新中,请大家耐心等待 首先需要大概了解什么是生成对抗网络,参考维基百科给出的定义(https://zh.wikipedia.org/wiki/生成对抗网络): 生成对抗网络(英语:Gener ...

  4. ASRWGAN: Wasserstein Generative Adversarial Network for Audio Super Resolution

    ASEGAN:WGAN音频超分辨率 这篇文章并不具有权威性,因为没有发表,说不定是外国的某个大学的毕业设计,或者课程结束后的作业.或者实验报告. CS230: Deep Learning, Sprin ...

  5. Speech Super Resolution Generative Adversarial Network

    博客作者:凌逆战 博客地址:https://www.cnblogs.com/LXP-Never/p/10874993.html 论文作者:Sefik Emre Eskimez , Kazuhito K ...

  6. DeepPrivacy: A Generative Adversarial Network for Face Anonymization阅读笔记

    DeepPrivacy: A Generative Adversarial Network for Face Anonymization ISVC 2019 https://arxiv.org/pdf ...

  7. 论文阅读之:Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network

    Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network  2016.10.23 摘要: ...

  8. 论文阅读:Single Image Dehazing via Conditional Generative Adversarial Network

    Single Image Dehazing via Conditional Generative Adversarial Network Runde Li∗ Jinshan Pan∗ Zechao L ...

  9. Generative Adversarial Network (GAN) - Pytorch版

    import os import torch import torchvision import torch.nn as nn from torchvision import transforms f ...

随机推荐

  1. 信用评分及模型原理解析(以P2P网贷为例)

    本博文将针对消费贷款领域的信用评分及其模型进行相关研究探讨.虽然人人都可以通过对借款方在Lending Club(国外最大的P2P网站)和Prosper上的历史借贷数据进行分析,但我相信,了解消费信贷 ...

  2. golang 类型转换

    import ( "bytes" "encoding/binary" "encoding/gob" "fmt" ) fu ...

  3. LRU原理和Redis实现——一个今日头条的面试题(转载)

    很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 Redis 中如何实现 LRU. 我的第一反应是操作系统课程里学过,应该是内存不够的场景下,淘汰旧内容的策略.LRU ...

  4. 《Effective Modern C++》翻译--条款2: 理解auto自己主动类型推导

    条款2: 理解auto自己主动类型推导 假设你已经读过条款1关于模板类型推导的内容,那么你差点儿已经知道了关于auto类型推导的所有. 至于为什么auto类型推导就是模板类型推导仅仅有一个地方感到好奇 ...

  5. Android开发导出apk报错:Unable to build: the file dx.jar was not loaded from the SDK folder

    问题背景 此问题一般出现在,同时使用了Eclipse和Android Studio,eclipse是不会去下载最新的Android的相关tools,但是studio有时候会自动更新最新的build-t ...

  6. 在SQL Server 2017 中,当Alwasyon group启用了DTC_SUPPORT = PER_DB, 会导致无法创建replicaiton.

    当Alwasyon group启用了DTC_SUPPORT = PER_DB, 会导致无法创建replicaiton.无法修改已经存在的replication. 原因: 当当Alwasyon grou ...

  7. [CI]jenkins安装&插件管理&java-helloworld之旅

    持续集成概述 没有持续集成时的情况 持续集成最佳实战 维护一个单一的代码库 使构建自动化 执行测试是构建的一部分 集成日志及历史记录 使用统一的依赖包管理库 每天至少集成一次 jenkins实现持续集 ...

  8. golang中值类型/指针类型的变量区别总结

    转自:https://segmentfault.com/a/1190000012329213 值类型的变量和指针类型的变量 先声明一个结构体: type T struct { Name string ...

  9. 怎么让Windows2012和Windows2008多用户同时远程

    具体方法请参照百度经验:http://jingyan.baidu.com/article/cd4c2979f19765756e6e60ec.html.经过实践证明,是没有问题的.

  10. [转]application.properties详解 --springBoot配置文件

    本文转载:http://blog.csdn.net/lpfsuperman/article/details/78287265###; # spring boot application.propert ...