目录
摘要
1. Theory behind GAN
2. Maximum Likelihood Estimation
3.MLE=Minimize KL Divergence
4. Generator
5. Discriminator
6. GD Algorithm for GAN
7. Algorithm for GAN(Review)
结论与展望
从某种意义上来讲, GAN 图片生成任务就是生成概率分布。因此, 我们有必要结合概率分布来理解 GAN 生成对抗网络的原理。在GAN之前,是使用最大似然的方法来生成,根据李老师的数学推导,如果要去做一个模型的极大似然估计,那么相当于求真实模型和拟合模型之间的K L散度取最小值时的θ取值。但是模型公式真的很难列出来,除非加了很多限制,而且生成的图像非常模糊。于是我们使用神经网络来表述图像模型,即使用GAN中的Gernerator,而且使用Discriminator评估各个分布之间的距离,对抗训练来达到目的,这节课一大堆的数学公式和推导说的就是上面的过程。
考虑一下,GAN到底生成的是什么呢?比如说,假如我们想要生成一些人脸图,实际上,我们是想找到一个分布,从这个分布内sample出来的图片,像是人脸,而不属于这个distribution的分布,生成的就不是人脸。而GAN要做的就是找到这个distribution。
在GAN出生之前,我们怎么做这个事情呢?之前用的是Maximum Likelihood Estimation,最大似然估计来做生成的,我们先看一下最大似然估计做的事情。
最大似然估计的理念是,假如说我们的数据集的分布是Pdata(x) ,我们定义一个分布 PG(x;θ),我们想要找到一组参数 θ ,使得 PG(x;θ)接近Pdata(x) 。比如说,加入 PG(x;θ)如果是一个高斯混合模型,那么 θ \thetaθ 就是均值和方差。
具体怎么操作呢?
其实最大似然估计的另一种解释是Minimize KL Divergence
数学上KL divergence使用来衡量两个分布的差异程度的,那么现在我们的目标就是找一组θ来最小化Pdata和PG的KL divegence。但是我们常常要先假定一个具体的分布去逼近实际分布,我们的分布PG不一定是高斯分布。因此我们需要一个通用的分布,去逼近这个复杂的图像真实分布。因此要用GAN的Generator来解决这个问题。
过去如果使用最大似然估计,采用高斯混合模型定义PG,生成的图片会非常模糊。而现在我们用的Generator的方法,是从一个简单的分布(比如正态分布)中sample出样本,然后扔进一个network(即generator),然后得到输出,把这些输出统统集合起来,我们会得到一个distribution, 这个distribution就是我们要找的PG,而我们的目标是使得与Pdata越接近越好。
那么怎么计算两个分布的差异呢? 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出来的样本去求这两个分布的差异。
具体的算法:
那么找最好的G的话就用梯度下降(和一般的train是一样的);θ是表示G的参数,但是L(G)有个max操作,但是它依然也是可以做微分的: 假设有个函数f(x)是max三个子函数,f(x)其实 就是每个阶段取最大值 最终求微分的过程就是在每一个点x,先看哪个子函数在这个点最大,微分值就是最大的那个子函数的微分值。也就是梯度下降依然适用,就是每次更新参数的时候先看自己在那个范围,再用这个范围的函数求梯度,然后更新;重复…
最终的算法:
首先train判别器,实际上没办法train到收敛,可以定义训练k次;之后train生成器:其中第一项是与生成器无关的,由于G不能训练太多,所以updata一次就好(最小化JS散度)
首先初始化判别器和生成器
然后从database中抽取m个图片(like batch size);从一个分布中抽取m个vector,使用m个vector产生m个image。 之后去调整判别器:首先把m张真实图片都拿出来,经过判别器得到分数,然后经过log再统统平均起来(当然希望这个越大越好,因为希望真实的图片得分高);对于生成器生成的m张图片当然希望值越小越好,因此用1-值,其越大越好。因此使用梯度上升的方法,调节判别器参数。(实际训练过程是给真实图片赋值为1,生成图片赋值为0;训练二分类器;等同于上述过程)
GAN 的核心本质是通过对抗训练将随机噪声的分布拉近到真实的数据分布,那么就需要一个度量概率分布的指标—散度。我们熟知的散度有 KL 散度公式(KL 散度有一个缺点就是距离不对称性,所以说它不是传统真正意义上的距离度量方法)。Discriminator网络就这么诞生了,这个Discriminator网络干的事情就是输入一个x来自真实样本或者拟合样本,然后分析它们来自哪里,并输出一个标量。这个标量你可以训练它为一个判定标准,就是如果是真实样本就输出接近1的数,拟合样本就输出接近0的数这样子。这样我们的判别器也就有了,把判别器对于真实样本和拟合样本的所有判别做比较处理,则我们Gernerator网络需要的分布距离也就有了。
我们的训练过程就是分开训练Gernerator和Discriminator:固定Gernerator,训练Discriminator网络来最大化Pdata和PG之间的距离,训练好Discriminator然后就固定住,接着训练Gernerator,最小化公式中的argminGV(G),因为因为这道公式最小说明我们通过神经网络实现了类似于极大似然法,找到了网络的最优解θ*。