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. [转]awsome-java

    原文链接 Awesome Java A curated list of awesome Java frameworks, libraries and software. Contents Projec ...

  2. IoC之AutoFac(三)——生命周期

    阅读目录 一.Autofac中的生命周期相关概念 二.创建一个新的生命周期范围 三.实例周期范围 3.1   每个依赖一个实例(InstancePerDependency) 3.2  单个实例(Sin ...

  3. repo命令详解

    Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上.研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Androi ...

  4. ffmpeg中AVBuffer的实现分析

    [时间:2017-10] [状态:Open] [关键词:ffmpeg,avutil,avbuffer, 引用计数] 0 引言 AVBuffer是ffmpeg提供的基于引用计数的智能指针的一个实现版本. ...

  5. 【iCore4 双核心板_uC/OS-II】例程五:信号量——共享资源

    一.实验说明: 信号量是操作系统中的一类事件,是实现任务间通信的一个中间环节.当系统中的多个任务 在运行时,经常需要互相无冲突地访问同一个资源,或者需要互相支持的依赖,甚至有时还要互 相加以必要的限制 ...

  6. 【C语言】 重拾

    [C语言] 因为以前学过C语言,只不过太长时间不用,已经忘得差不多了… 所以这篇文章的性质是把C语言中一些对于现在的我不是很符合预期的知识点记录一下. ■ HelloWorld程序 HelloWorl ...

  7. C# SMTP 邮件发送之QQ邮箱篇

    邮件发送大家都已经非常熟悉了,微软自带的System.Net.Mail也很好用,那为什么还要说呢? QQ邮箱的SMTP以前是非SSL,用未加密的25端口,后来发送都改成SSL了,端口为465或587( ...

  8. Kibana学习笔记——安装和使用

    1.首先下载Kibana https://www.elastic.co/downloads 2.解压 tar -zxvf kibana-6.2.1-linux-x86_64.tar.gz -C ~/s ...

  9. UITableView 自定义多选

    前言 在上一篇文章中介绍了UITableView的多选操作,有提到将 return UITableViewCellEditingStyleDelete | UITableViewCellEditing ...

  10. 又一次认识java(七) ---- final keyword

    你总以为你会了,事实上你仅仅是一知半解. final 关键字概览 final关键字可用于声明属性.方法.參数和类,分别表示属性不可变.方法不可覆盖.參数不可变和类不能够继承. 我们来分别看看它的使用方 ...