深度学习9

Theory behind GAN
比如说,假如我们想要生成一些人脸图,实际上,我们是想找到一个分布,从这个分布内sample出来的图片,像是人脸,而不属于这个distribution的分布,生成的就不是人脸。而GAN要做的就是找到这个distribution。
在这里插入图片描述
Maximum Likelihood Estimation
最大似然估计的理念是,假如说我们的数据集的分布是Pdata​(x) ,我们定义一个分布 PG​(x;θ),我们想要找到一组参数 θ ,使得 PG​(x;θ)接近Pdata​(x) 。比如说,加入 PG​(x;θ)如果是一个高斯混合模型,那么 θ \thetaθ 就是均值和方差。
MLE=Minimize KL Divergence
在这里插入图片描述
数学上KL divergence使用来衡量两个分布的差异程度的,那么现在我们的目标就是找一组θ来最小化Pdata和PG的KL divegence。但是我们常常要先假定一个具体的分布去逼近实际分布,我们的分布PG​不一定是高斯分布。因此我们需要一个通用的分布,去逼近这个复杂的图像真实分布。因此要用GAN的Generator来解决这个问题。

Generator
Generator的方法,是从一个简单的分布(比如正态分布)中sample出样本,然后扔进一个network(即generator),然后得到输出,把这些输出统统集合起来,我们会得到一个distribution, 这个distribution就是我们要找的PG,而我们的目标是使得与Pdata越接近越好。

在这里插入图片描述
Discriminator
虽然我们不知道 PG和Pdata的公式,但是我们可以从这两个分布中sample出一些样本出来。对于

Pdata来说,我们从给定的数据集中sample出一些样本就可以了。对于PG来说,我们随机sample一些向量,扔到Generator里面,然后generator会输出一些图片,这就是从PG里面sample了。
在这里插入图片描述
问题就变成我们怎么从sample的数据求PG和Pdata?其实我们可以使用Discriminator来衡量PG和Pdata的Divergence。

蓝色星星: data sampled from Pdata,橙色星星: data sampled from PG。
在这里插入图片描述

我们可以用Discriminator来区分两个Distribution,公式是上图的:V(G,D)。前面一项是表示数据sampled from Pdata,值越大越好,后面一项是表示数据sampled from PG,值越小越好。上面公式的形式和训练一个二分类Classifier的目标函数长得一样,就是说可以把PG和Pdata看成两个分类。训练Discriminator就好比训练一个二分类。
如果两个分布的数据很接近(small divergence),那么Discriminator很难把数据分开,也就是上面的公式很难找到一个D,使得D*取得很大的值。那么就找到最大的divergence,使得两个分布的数据相隔远一些,我们的Discriminator就能容易的将数据分开。
在这里插入图片描述
通过这一系列的化简,我们可以知道,最大化 V(G,D∗),其实就是求解分布 Pdata和PG的JS divergence。所以当去训练一个distriminator,就是通过Pdata和PG sample出来的样本去求这两个分布的差异。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
GD Algorithm for GAN

在这里插入图片描述
在这里插入图片描述
Step1:首先固定生成器,找到一个能够使V最大的D;
Step:然后固定D,找到能够使这个最大D情况下V最小的G。不停的迭代…
那么找最好的G的话就用梯度下降(和一般的train是一样的);θ是表示G的参数,但是L(G)有个max操作,但是它依然也是可以做微分的: 假设有个函数f(x)是max三个子函数,f(x)其实 就是每个阶段取最大值 最终求微分的过程就是在每一个点x,先看哪个子函数在这个点最大,微分值就是最大的那个子函数的微分值。也就是梯度下降依然适用,就是每次更新参数的时候先看自己在那个范围,再用这个范围的函数求梯度,然后更新;重复…
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最终的算法:

首先train判别器,实际上没办法train到收敛,可以定义训练k次;之后train生成器:其中第一项是与生成器无关的,由于G不能训练太多,所以updata一次就好(最小化JS散度)

1.首先初始化判别器和生成器

2.然后从database中抽取m个图片(like batch size);从一个分布中抽取m个vector,使用m个vector产生m个image。 之后去调整判别器:首先把m张真实图片都拿出来,经过判别器得到分数,然后经过log再统统平均起来(当然希望这个越大越好,因为希望真实的图片得分高);对于生成器生成的m张图片当然希望值越小越好,因此用1-值,其越大越好。因此使用梯度上升的方法,调节判别器参数。(实际训练过程是给真实图片赋值为1,生成图片赋值为0;训练二分类器;等同于上述过程)

3.从一个分布中抽取m个vector,重新生成m张图片,G(Z)就是一张图片,再把它丢到判别器中D(G(Z));再对所有的生成的求平均,在D不改变的情况下,希望这个值越小越好
在这里插入图片描述
我们的训练过程就是分开训练Gernerator和Discriminator:固定Gernerator,训练Discriminator网络来最大化Pdata和PG之间的距离,训练好Discriminator然后就固定住,接着训练Gernerator,最小化公式中的argminG​V(G),因为因为这道公式最小说明我们通过神经网络实现了类似于极大似然法,找到了网络的最优解θ*。

fGAN
在这里插入图片描述
上图所示,我们可以将散度函数统一定义为上面这个公式,f()就是不同的散度函数,Df就是在f散度函数下,P,Q分布的差异。规定f是凸函数(为了用琴生不等式),f ( 1 ) = 0(如果两个分布一样,刚好公式=0)。

在这里插入图片描述
共轭函数(Fenchel Conjugate)
每一个散度函数都有对应的共轭函数,定义为:在这里插入图片描述
对于每个t都可以找到一个x,使得x t − f ( x ) xt−f(x)xt−f(x)最大,比如找t1,t2,两个点,x取x1,x2,x3,可以看到上图

y(t)=xt−f(x)可以看做是t的函数,是条线,t是任意的,因此可以画出很多条线,每个t总会找到一个对应的最大y值和对应的x,可以猜到这样的点连起来应该是个凸函数:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到,我们的散度里的f(x)可以用上面求max的来表示,我们可以训练个D(x),输入x输出t,从而替换进公式,然后可以化为期望
在这里插入图片描述

我们的目标G:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不同的散度函数都可与GAN,会产生不同的效果。
在这里插入图片描述
这个主要是说,我们的真实数据集是分散的,但是生成的可能比较集中,从二次元头实验可以看到,好多头像很类似,就是这个问题。

Mode Dropping
在这里插入图片描述
出现以上问题可能是因为散度函数没选好。
在这里插入图片描述
不同散度函数,学到的分布是不一样的,第一个看起来比较平滑,因此可能生成的图像比较模糊,第二个生分布比较集中,就可能出现Mode Collapse和Mode Dropping问题,所以如果发现生成效果不好,那就可以更换散度函数来进行优化。

Tips for Improving GAN
最原始的 GAN 使用的是 JS Divergence 测量生成数据分布与原始数据分布的距离
是有一个严重的问题:可能两个分布没有任何的重叠,因为在衡量PG和Pdata的散度的时候,我们是从两个分布中sample得到两堆data,再去量他们之间的散度,即使计算分布有重叠,但是data之间是没有重叠的,我们完全可以视data的得到的分布没有任何交集(可以用弯曲的线划开)。
在这里插入图片描述

只要两个分布没有重叠,不管他们是不是接近,算出来的JS散度就是Log2。例子如图:虽然G1比G0更接近Pdata,但是从JS散度看起来,两者是没有差别的。这样的话,train起来是有问题的。
在这里插入图片描述

我们有两群data,把它视为两个class,然后判别器就是一个二元分类器,然后最小化交叉熵损失;只要两堆数据没有重合,那么他们的loss就是一样的,这意味着量出来的JS散度是一样的。
另外一个直观的想法是:当你learn一个二元分类器的话,会给蓝色的点0分,绿色点1分;output是sigmoid函数,在接近0或1的地方特别平,我们期待的是你train一个生成器,它会带领蓝色的点顺着梯度去移动分布,但是蓝色的点几乎是不动的,因为它的附近梯度几乎是0。
在这里插入图片描述

Least Square GAN (LSGAN)
看我们上图中的右下角,将输出的sigmiod换成linear…从分类问题,变成了回归问题。正样本越接近1越好,负样本越接近0越好。
Wasserstein GAN (WGAN)
换一种方式来衡量PG和Pdata,用的是earth mover’s distance;意思是假设你有两堆data P 和 Q,而你开着一个推土机,将 P土 推到 Q土 ,这个走过的距离就叫earth mover’s distance。
在这里插入图片描述

上面的分布是简化了的,土堆应该是这样:
在这里插入图片描述

同样的分布,推土机可能走过的路程不一样:

上图中的左边是是把邻近的土进行移动,右边是比较远的土进行移动。我们一般用左边的那种。穷举所有可能的铲土的方法,每一种方法我们叫做moving plan,看哪个方法的距离最小,就是earth mover’s distance。
在这里插入图片描述

上图中右边是这个例子中最好的一个moving plan

Why Earth Mover’s Distance?
我们来看:当你使用JS散度的时候,不重叠都是log2;当使用W散度的时候,当两个分布虽然不重叠但是当距离变小的时候,散度也小。
在这里插入图片描述

x是从Pdata中sample出来的,让它的判别器输出越大越好;

x是从PG中sample出来的,让它的判别器输出越小越好;

除此之外,还要有一个约束,就是判别器必须是一个1-Lipschitz函数;一个重要特点就是它很平滑
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GAN to WGAN
我们首先看一下原始GAN 的算法:
在这里插入图片描述

在这里插入图片描述
WGAN: 要改四个地方:

改V
sigmoid拿掉变成线性
使用Weight clipping 或者 Gradient Penalty(加上正则化项)等
改生成器更新公式

Energy-based GAN (EBGAN)
把判别器改成了 autoencoder:
在这里插入图片描述

对于一般的判别器,你需要让生成器慢慢变强,你的判别器才会强;但是autoencoder的判别器可以pre-train,可以用正样本进行预训练;一开始的判别器会很强,这样你的生成器一开始就会产生很好的image;
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值