Theory behind GAN

目录

摘要

ABSTRACT

一、Maximum Likelihood Estimation(最大似然估计)

二、MLE=Minimize KL Divergence

三、Generator

四、Discriminator

五、和divergence的关系证明

六、KL散度、JS散度和交叉熵

七、G*

八、GD Algorithm for GAN 

总结

摘要

在上周的学习中,明白了GAN的大概原理,不过没有具体写GAN背后的数学理论,这一篇尝试详细地推到一下GAN是怎么来的。生成器的目标是通过学习数据分布的潜在结构,生成逼真的样本。它接收一个随机噪声向量作为输入,并通过一系列的转换将其映射到数据空间。生成器的目标是最小化生成样本与真实样本之间的差异,通常使用生成样本与真实样本之间的损失函数来衡量。

ABSTRACT

In last week's study, I understood the general principles of GANs, but I didn't specifically write about the mathematical theory behind GANs. This article will attempt to provide a detailed derivation of how GANs work. The objective of the generator is to generate realistic samples by learning the underlying structure of the data distribution. It takes a random noise vector as input and maps it to the data space through a series of transformations. The generator aims to minimize the difference between the generated samples and the real samples, typically measured using a loss function that compares the generated samples to the real samples.

考虑一下,GAN到底生成的是什么呢?比如说,假如我们想要生成一些人脸图,实际上,我们是想找到一个分布,从这个分部内sample出来的图片,像是人脸,而不属于这个distribution的分布,生成的就不是人脸。而GAN要做的就是找到这个distribution。

在GAN出生之前,我们怎么做这个事情呢?

之前用的是Maximum Likelihood Estimation,最大似然估计来做生成的,我们先看一下最大似然估计做的事情。

一、Maximum Likelihood Estimation(最大似然估计)

最大似然估计的理念是,假如说我们的数据集的分布是 P_{data}(x)我们定义一个分布 P_{G}(x;\theta ),我们想要找到一组参数 θ ,使得 越P_{G}(x;\theta )接近 P_{data}(x)越好。比如说,加入 P_{G}(x;\theta ) 如果是一个高斯混合模型,那么 θ  就是均值和方差。

具体怎么操作呢
1、首先我们不知道真实的数据分布是什么样的,但是我们可以从P_{data}(x)抽样出一些样本(真实图片)。

2、对每一个sample出来的x,我们都可以计算它的lkelihood,也就是给定一组参数,我们就能够知道P_{G}(x;\theta )长什么样,然后我们就可以计算出在这个分布里面sample出某一个x的几率。
3、我们把在某个分布可以产生x_{i}的likelihod乘起来,可以得到总的likelihood:L=\prod_{i=1}^{m}P_{G}(x^{i};\theta ),我们要找到一组\theta ^{*},可以最大化 L

二、MLE=Minimize KL Divergence

其实最大似然估计的另一种解释是Minimize KL Divergence

但是我们常常要先假定一个具体的分布去逼近实际分布,我们的分布P_{G}不一定是高斯分布,如果P_{G}是一个NN,就没有办法算likelihood。因此我们需要一个通用的分布,去逼近这个复杂的图像真实分布。因此要用GAN的Generator来解决这个问题。

三、Generator

过去如果使用最大似然估计,采用高斯混合模型定义 P_{G},生成的图片会非常模糊。而现在我们用的Generator的方法,是从一个简单的分布(比如正态分布)中sample出样本,然后扔进一个network(即generator),然后得到输出,把这些输出统统集合起来,我们会得到一个distribution, 这个distribution就是我们要找的P_{G},而我们的目标是使得P_{G} 与 P_{data}越接近越好。

优化目标是最小化P_{G}P_{data}之间的差异:

                                                   G^{*}=arg\underset{G}{min}Div(P_{G},P_{data})

那么怎么计算两个分布的差异呢? P_{G}P_{data}的公式我们都是不知道的,怎么算呢?这里就要引出Discriminator了:

四、Discriminator

 虽然我们不知道P_{G}P_{data}的公式,但是我们可以从这两个分布中sample出一些样本出来。对于 P_{data}来说,我们从给定的数据集中sample出一些样本就可以了。对于P_{G}来说,我们随机sample一些向量,扔到Generator里面,然后generator会输出一些图片,这就是从P_{G}里面sample了。

问题就变成我们怎么从sample的数据求P_{G}P_{data},其实我们可以使用Discriminator来衡量P_{G}P_{data}的Divergence

蓝色星星: data sampled from P_{data}
​橙色星星: data sampled from P_{G}


 我们可以用Discriminator来区分两个Distribution,公式:

                             V(G,D)=E_{x\sim P_{data}}[logD(x)]+E_{x\sim P_{G}}[log(1-D(x)]

前面一项是表示数据sampled fromP_{data},值越大越好,后面一项是表示数据sampled fromP_{G},值越小越好
上面公式的形式和训练一个二分类Classifier的目标函数长得一样,就是说可以把P_{G}P_{data}看成两个分类。
训练Discriminator就好比训练一个二分类:
                                              D^{*}=arg\underset{D}{max}V(D,G)

而训练出来的\underset{D}{max}V(D,G)就相当于与JS divergence,来看下为什么是JS divergence。


如果两个分布的数据很接近(small divergence),那么Discriminator很难把数据分开,也就是上面的公式很难找到一个D,使D^{*}取得很大的值。那么就找到最大的divergence,使得两个分布的数据相隔ed远一些,我们的Discriminator就能容易的将数据分开。

也就是D^{*} 和divergence程度有关系,下面用数学来证明。

五、D^{*}和divergence的关系证明

 

 

六、KL散度、JS散度和交叉熵


KL散度、JS散度和交叉熵:三者都是用来衡量两个概率分布之间的差异性的指标。不同之处在于它们的数学表达。
对于概率分布P(x)和Q(x)

KL散度(Kullback–Leibler divergence)又称KL距离,相对熵。
当P(x)和Q(x)的相似度越高,KL散度越小。
KL散度主要有两个性质:

不对称性
尽管KL散度从直观上是个度量或距离函数,但它并不是一个真正的度量或者距离,因为它不具有对称性,即D(P||Q)!=D(Q||P)。
非负性
相对熵的值是非负值,即D(P||Q)>0。
JS散度(Jensen-Shannon divergence)JS散度也称JS距离,是KL散度的一种变形。
但是不同于KL主要又两方面:

值域范围
JS散度的值域范围是[0,1],相同则是0,相反为1。相较于KL,对相似度的判别更确切了。
对称性
即 JS(P||Q)=JS(Q||P),从数学表达式中就可以看出。
交叉熵(Cross Entropy)

在神经网络中,交叉熵可以作为损失函数,因为它可以衡量P和Q的相似性。

交叉熵和相对熵的关系:

以上都是基于离散分布的概率,如果是连续的数据,则需要对数据进行Probability Density Estimate来确定数据的概率分布,就不是求和而是通过求积分的形式进行计算了。

 

七、G*

生成器训练的目标是找到一个G^{*},去最小化 P_{G}与 P_{data},也就是:

                                              G^{*}=arg\underset{G}{max}Div(P_{G},P_{data})

而这个divergence我们没有办法直接去算,我们不知道P_{G}P_{data}的公式具体是什么。于是我们通过一个discriminator来计算两个分布间的差异:
                                             D^{*}=arg\underset{D}{max}(D,G)

那么我们的优化目标就变为:

                                            G^{*}=arg\underset{G}{min}\underset{D}{max}V(G,D)

这个看起来很复杂,其实直观理解一下,如下图,我们假设已经把Generator固定住了,图片的曲线表示,红点表示固定住G后的 \underset{D}{max}V(G,D) , 也就是P_{G}P_{data}的差异。而我们的目标是最小化这个差异,所以下图的三个网络中,G_{3}是最优秀的。

八、GD Algorithm for GAN 

具体的算法:

Step1:首先固定生成器,找到一个能够使V最大的D;

Step:然后固定D,找到能够使这个最大D情况下V最小的G。不停的迭代…

从数学看为什么这个算法是在解上面的最小最大过程:

用函数L(G)替代G^{*}中的\underset{D}{max}V(G,D):
                               G^{*}=arg\underset{G}{min}L(G)

那么找最好的G的话就用梯度下降(和一般的train是一样的);θ是表示G的参数

但是L(G)有个max操作,但是它依然也是可以做微分的: 假设有个函数f(x)是max三个子函数,f(x)其实 就是每个阶段取最大值 最终求微分的过程就是在每一个点x,先看哪个子函数在这个点最大,微分值就是最大的那个子函数的微分值。也就是梯度下降依然适用,就是每次更新参数的时候先看自己在那个范围,再用这个范围的函数求梯度,然后更新;重复…

总结

判别器的目标是区分生成样本和真实样本。它接收一个样本作为输入,并输出一个概率值,表示该样本是真实样本的概率。判别器的目标是最大化正确判断真实样本和生成样本的能力,通常使用交叉熵损失函数来衡量。

GAN的训练过程是一个博弈过程,生成器和判别器相互竞争。生成器试图生成逼真的样本以欺骗判别器,而判别器试图准确地区分真实样本和生成样本。通过交替训练生成器和判别器,GAN的目标是找到一个纳什均衡点,即生成器生成的样本无法被判别器准确区分。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值