【学习】GAN 2、VAE


前言

昨天已经学习了GAN的大概知识,今天学习GAN的理论。


一、GAN

假如我们的generation是要做以下内容:x是一个高维图片,我们想要找到Pdata(x)的数据分布,在这个分布里面,是一些高可能性的图片,在这个分布外面,是低可能性的图片。GAN就是要找出这个分布。
在这里插入图片描述

maximum likelihood estimation

在GAN之前的generation是maximum likelihood estimation。
步骤:
1、给定一个数据分布Pdata(x),我们可以从中取样,但是不知道具体的样子。
2、我们有一个分布PG(x;θ),这个分布由θ操控。
例如:PG(x;θ)是一个高斯混合模型,θ就是均值和方差。我们想去找到一个θ(调整均值和方差)使得PG(x;θ)很接近Pdata(x)。
3、从Pdata(x)里面取样{x1,x2,…,xm}
4、假设给定θ,那我们计算PG(xi;θ),那就知道PG是什么样子。
5、然后可以计算生成样本的可能性。
在这里插入图片描述
6、找到θ*可以让L最大。
在这里插入图片描述

maximum likelihood estimation = minimize KL divergence

在这里插入图片描述
怎么定义PG呢?如果是很复杂的NN,就没办法计算可能性。
在这里插入图片描述
下面是PG和Pdata取样的区别:
在这里插入图片描述
我们希望找到一个discriminator可以清楚区分两个类别。当两个类别的divergence是比较大的时候,discriminator就能很好区分。根据目标函数V(G,D)可以看出,知道我们让左边的项最大,右边项也最大,就能得到最大的目标函数,就越能区别两个类别。
在这里插入图片描述
在这里插入图片描述

为什么目标函数和divergence是有关系的?

1、我们固定G,找到D能最大化V。假设D(x)是任意的方程,事实上在NN里面需要无数多层才能实现任意方程。然后求V救得到了最大化中括号里面的内容:
在这里插入图片描述
2、给定x,我们要找到D
使得下面的式子最大化。

在这里插入图片描述
在这里插入图片描述
D*(x)的式子就是max,代表原式子梯度为0.
在这里插入图片描述
在这里插入图片描述
KL散度是不对称的,训练神经网络会因为不同的顺序造成不一样的训练结果,为了克服这个问题,提出了JS散度。
1.对称
2.非负
3.值域范围
JS散度的值域范围是[0,1],相同则是0,相反为1。相较于KL,对相似度的判别更确切了。
当两个概率分布不一样的时候,它们的值是不是会随着距离的变大而变大。两个概率分布完全不一样的时候,距离是log(2)。
在这里插入图片描述
下面是一些示例:
因为divergence跟目标函数有关,所以我们用目标函数代替散度。下面是三个例子,假设只有三种G,我们需要找到最好的G,使得在最大的目标函数里面找到最小的G。首先就是分别在三个函数里面找到最大值点,然后选择最小的G。
在这里插入图片描述
那怎么找出G呢?
在这里插入图片描述
把maxV(G,D)当做L(G),然后寻找最好的G使得L(G)最小。像之前一样,不断迭代更新找到最小的θ。但是L(G)里面是算最大值,我们能找得到吗?可以,就像下面一样,有三个函数是属于f(x)的。我们需要计算他的微分,那就是把它当做一个曲折的折线,分别算每段的微分就好了。
在这里插入图片描述
给定G0,我们要找D0
可以让V(G0,D)最小。然后我们用这个来算微分,得到G1,然后循环计算……这个跟GAN是一样的!

在这里插入图片描述
这个跟我们不断减小JS散度很相似。但是从G0变到G1,事实上我们的方程会改变,可能会出现最大值不在附近的情况。而实际上我们的D0和D1是很相近的,所以不要一步更新太多的G。所以我们在训练discriminator的时候,需要比较多的迭代才能训练到底。但是generator应该少一点迭代。
在这里插入图片描述
在实际做的时候,我们会选择m份数据进行计算:
在这里插入图片描述

测量JS散度(训练descriminator)

这个方法其实跟二元分类很像,我们最大化V就相当于最小化交叉熵。
我们从之前的分布里面取样m个杂讯作为Pprior(z),然后带入到generator里面得到生成数据xi。我们需要训练θd,使得V~最大化。
在这里插入图片描述
但是事实上,我们并不一定能得到maxV(G,D)。
我们训练discriminator是为了测量JS散度,训练generator是为了最小化JS散度。

减小JS散度(训练generator)

我们同样从前的分布里面取样m个杂讯作为Pprior(z),然后更新生成参数θg去最小化V~。我们对θg进行少量更新,避免更新过多得到错误的数据。
在这里插入图片描述
因为刚开始的位置D(x)的值很小,所以我们这里加入一个负号,让-D(x)值在刚开始很大,就容易训练。
在这里插入图片描述
蓝色的点表示生成数据的分布,绿色的点表示真实数据的分布。我们训练目标函数希望得到生成数据与真实数据之间的散度越小越好,通过discriminator得到的分数越大越好。所以蓝色的点就会向右移动,两个分布的点比较近,discriminator的Loss比较大,JS散度比较小。然后他们越来越近的时候(数据几乎一样了,discriminator分辨不出来了),discriminator就会变成直线。
在这里插入图片描述
现在有很多种GAN的方法,他们说的训练方法可能会有矛盾,还有待时间的考量。

KL散度

KL 散度,是一个用来衡量两个概率分布的相似性的一个度量指标。
信息熵:在这里插入图片描述
交叉熵:
在这里插入图片描述
P(x) 为各字符出现的频率,log1/P(x)为该字符相应的编码长度,log 1/Q(x) 为对应于Q的分布各字符编码长度。
KL散度又可称为相对熵,描述两个概率分布 P 和 Q 的差异或相似性,用 D_{KL}(P | |Q) 表示
D_{KL}(P |  |Q)=H(P,Q)-H(P)
很显然,散度越小,说明概率 Q 与概率 P 之间越接近,那么估计的概率分布与真实的概率分布也就越接近。
在这里插入图片描述

二、fGAN(general framework of GAN)

fGAN主要可以:用不同的divergence来量生成值和真实值之间的差异
我们有以下方法定义f-divergence:
限制:f是凸面的,f(1)=0
满足这两个要求就可以说它是什么分布的。
在这里插入图片描述
在这里插入图片描述

如果P和Q分布是一模一样的,那么他们之间的距离就是0;如果他们有一点不一样,那么Df算出来的值都是会大于0的。
在这里插入图片描述

fenchel conjugate芬切尔共轭物

每一个凸面方程f都有一个共轭方程f*。凸面函数是指仅有一个极值,且极值为极小值的函数。共轭函数f可以根据以下计算:
我们要计算f
(t),就要计算使得xt-f(x)最大的那个。

在这里插入图片描述
我们可以固定x,t是变化的:
在这里插入图片描述
如果我们找t1最大的值,那就是找各条直线上最大的那个值。
找到上限,我们得到的函数都是凸函数,也就是f*一定是凸函数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这两个函数互为共轭函数:

fenchel conjugate与GAN的联系

我们可以寻找一个discriminator,使得它找到的最大值逼近Df。
在这里插入图片描述
p(x)是一个概率,那就能得到下面的推断:
在这里插入图片描述
这个跟GAN很像
在这里插入图片描述
不同散度的目标函数:
在这里插入图片描述
不同的散度有什么用呢?

mode collapse问题

问题描述:
在真实数据的分布是很大的,但是生成数据的分布是很小的。例子:当我们生成二次元人物图片的时候,我们的迭代次数越多,就会出现很多的相同图片,他们都会聚集在真实数据的一块地方。

在这里插入图片描述

mode dropping问题

例如:真实数据有两类,但是生成数据只有一类。下面是只会产生一种肤色的例子在这里插入图片描述
会有上面的问题并不完全是选择不同的散度所造成的。
我们的distribution在训练的时候,左图中,我们的真实数据有两个峰,但是我们生成的数据是处于一个中间位置的,那这样就会变成输出包含两类真实数据的情况(模糊)!右边的reverse KL,会只取其中的一类。
在这里插入图片描述

LSGAN(least square GAN)

我们在二元分类器区分real和fake的时候用的激活函数是sigmoid方程的话,在real和fake两类的函数都是比较平坦的,梯度为0,那么这样我们就很难进行训练。LSGAN就是把sigmoid换成linear,那这样就没有这个问题了。如果是正例子,那就把他的值接近1,如果是负例子,就把它的值接近0.
在这里插入图片描述

(wasserstein GAN)

把GAN里面的JS散度换成earth mover‘s distance来衡量两个分布之间的差异。earth mover‘s distance是平均最短的距离。
在这里插入图片描述
在这里插入图片描述
这个是很麻烦的,因为要算一个optimization。
在这里插入图片描述

WGAN-GP

这个方法是增加penalty:
一个可微函数是1-Lipschitz当且仅当它处处有范数小于或等于1的梯度。如果没有办法限制是1-Lipschitz那可以把他等价为下面的式子:梯度小于等于1.那我们就在V(G,D)里面加入一个项作为惩罚,如果是梯度大于1的就减去超过的值做的积分,不大于的就没有惩罚。
问题:不可能对所有的x都做积分,但是我们要求所有的x的梯度都是小于等于1的。
改正:加入我们的x是从一个实现确定的分布Ppenalty里面取样的,我们只保证在Ppenalty里面的x的梯度都是小于等于1。
在这里插入图片描述
做法:我们从两个分布的连线之间找出一个随意的样本,当做是Ppenalty里面的样本。
在这里插入图片描述
为什么只在蓝色的部分取样是可以的呢?只能说有人做过实验是好的,而且也是合理的。在我们训练的时候,其实PG是看着梯度来向Pdata里面移动的,也就是会经过中间的位置,这样做是合理的!在做实验的时候,他们希望梯度越接近1越好。还有别的方法是取红色块的地方。
spectrum norm:可以让每个位置的gradient norm都是小于1的。
原来的GAN:
在这里插入图片描述
WGAN:
在这里插入图片描述

EBGAN(energy-based GAN)

把discriminator改成autoencoder,generator不变。例子:输入一张图片,经过encoder和decoder(autoencoder)之后解出另外一张图片。然后算出autoencoder的reconstruction error,把这个error乘上负号变成discriminator的输出。如果reconstruction error越低,它就是一张高质量的图片。
优点:autoencoder在训练的时候不需要负样本,但是在训练discriminator的时候需要负样本(real数据和fake数据)。所以不能用二元分类器来训练只有正样本的数据。在刚开始G很弱,生成的负样本也很弱,学习出来的就是一个很弱的D。但是EBGAN就不一样,autoencoder可以被pretained,不需要负样本,它能在前面的几个epoch就能训练很清楚的图片。在这里,我们希望真实数据得到的reconstruction error越低越好。但是不是让生成图片的reconstruction error越小越好。

这里我们让生成图片的reconstruction error小于一个值就好了。

在这里插入图片描述

LSGAN(loss-sensitive GAN)

之前我们说WGAN如果是生成的图片就用小的值,如果是真实图片就用大值。那有没有种可能我们生成的图片已经好一点了,是不是应该调制赋值?LSGAN里面加入一个margin的概念,如果是生成图片和真实图片差距小那就让分数稍微比margin小一点就好。

在这里插入图片描述

三、generative models

在这里插入图片描述

pixel RNN

如果我们让及其生成一张图片(3*3),根据之前的像素生成下面的像素,这是一种无监督学习。
在这里插入图片描述
这种方法可以放在语音识别上
在这里插入图片描述

VAE

李老师做了一个宝可梦的generation实验,在测试资料上给了盖住不同地方的图片让机器画出盖住的地方是什么。机器很有创造力,我们的evaluation很难判断generation。因为在像素随机的过程中,机器随机到的数字大都比较“中间”(比如说如果输出经过sigmoid函数的话就不容易落在0和1这两个极端值上),那么对于像素居中的图片来说,这就是灰度比较高的图片。但是我们希望能得到一些亮色。所以李老师对像素表达进行修改:用1-of-N encoding代表每个像素,对于颜色比较接近的就放在一起。老师的模型用1层的LSTM和512cells,结果还是可以的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
加入随机性之后:
在这里插入图片描述
这种就叫做variational autoencoder (VAE)。
我们通常在做auto-encoder的时候是这样做的:输入一张图片,经过中间的NN之后输出类似的图片,我们希望这两张图片越接近越好。然后我们可以把中间的NN decoder拿出来,随机产生一个向量作为code放进NN encoder 里面,就能得到一张图片。
在这里插入图片描述
但是这种做法的performance还是没有那么好的,用VAE会比较好。
方法:NN encoder产生多个code,然后从一个正态分布里面随机一个同样长度的向量出来,把其中一个code先取指数然后鱼随机向量相乘,然后与另一个code加起来,最终代表的向量才是code。
在这里插入图片描述
VAE可以控制我们的输出图片!

在这里插入图片描述
在这里插入图片描述
用VAE写诗
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值