CV_basic idea of GAN

在GAN出现之前…

假设真实的data服从P_data,并且现在拥有属于这个分布的一些样本,但是这个P_data我们是无从得知的,但是我们希望可以得到一个崭新的同样属于这个分布的data。所以我们就对这个分布建立模型,其对应着分布P_G,希望这个P_G能够尽可能地逼近P_data,由于这个P_G是我们自己建立的,所以这个模型或者说P_G对我们而言必然是可知的。那么此时只要P_G能够尽可能地逼近P_data,那么任务就能由从未知的分布P_data中sample出数据data转换为从建立的模型对应的P_G中sample出data从而简单地被完成。关于这个模型的建立,是需要先验知识的,从而简化问题。首先去假设其满足某一个分布,那么任务进一步地被简化成只需要对这个分布中的参数进行估计即可。而对于这个模型的参数的估计,可以采用的方法是:利用已存在的样本,去估计这个假设的分布的参数,从而使得假设的分布P_G能够尽可能地逼近真实的分布P_data。常见的方法有MLL。这个方法的思路也就是很直观地,被采样到的样本属于P_data的样本必然是出现概率最高的样本,根据此去估计模型的参数。

这种方式的局限就在于,严重依赖模型的先验知识。P_data的分布往往是不那么简单的,即假设其所属于的分布往往是不准确的。这就严重导致了P_G的准确性,即时找到了最优的P_G,也可能喝P_data相距甚远。

这里的data可能是任何的data,这涉及到在计算机中数据的表示。例如image—>matrix或者vector。这样实际上就不会觉得关于image的分布这件事情很抽象了,本质上都是在某一个空间中的一些数据点,每个数据点都可以理解为一个vector,其维数等于这个空间的维数。

上述也提到了MLL的局限。那么如果希望能够使P_G能够尽可能地拟合P_data,就需要借助更为复杂的model—>NN

在MLL的公式中


可以近似为积分的形式,即将E的求解转换为积分的形式。由于是

运算,所以可以加入一个参数项

从而使式子整体变成KL散度。

用于衡量P_data和P_G的相似性。

所以GAN对应的是这样一个过程:给一个training dataset,表示sampled from P_data,一个P_prior表示随机噪声的分布,一个G和一个D。输入z sampled from P_prior,由G输出data_G,交给D让其判别data_G是realistic or fake;而在其他的迭代中,也加入data sampled from P_data,让D判别data_G是realistic or fake。若不将P_data中的data也参与训练,那么D只需要每次都输出0就可以获得很好的性能了…这样无法真正学到强势的D。所以这是一个D和G交替更新的过程。最终,收敛后,输入一个z sampled from P_prior就可以经过G生成一个G_data,并且这个G_data足够逼真…

所以这和AE是一样的过程,只不过Loss变了,AE的loss是由原始image和AE输出的data的相似性计算得到的,而GAN的loss是由D得到的。

解析GAN的Loss Function

其中,

如何理解这个Loss Function? 前述MLL方法实际上可以理解为在计算P_data和P_G的KL divergence,这里GAN的Loss Function也可以用同样的方法去分析。

本质上就是在找到D*。

<这里有一点需要注意,虽然是关于G和D的表达式,但是还隐含着随机变量x>

所以,很自然地,对D*进行求解,通过一次导求的极值点即可。这里除了给定x以外,还给定了G。

这里的P_data和P_G均为常数。

通过计算可得,

此时V(G, D*)取得最大值。

将D*代入V(G, D)

可得

将E根据定义进行表示,可得

可知,在给定G,x下,当D=D*时,V(G, D*)为P_data和P_G的JS divergence。<注意,是在D*=argmax_D V(G, D)时,V(G, D*)才表示JSD>

所以对于

相当于在求解能使得P_data和P_G的JS Divergence最小的G=G*,即当G*对应的P_G=P_data时,JSD(P_data, P_G*)最小。也就是说,Loss Function在引导着G向着P_data和P_G的JSD最小的方向逼近。

<这也就是为什么说original GAN和VAE没有本质区别,只是在Loss Function上,GAN是借助了D来构成Loss Function,或者说是借助了D来引导G的学习方向。这里的D实际上是在做一个JS divergence的度量,所以对D进行学习,就是在衡量P_data和P_G之间的距离,即JSD>

但在训练过程中,需要注意的是,这里的Loss Funtion中实际上是隐含着随机变量x的。以D的训练为例说明,通过argmax_D V(G, D)得到的D*,实际上应该是D*(x)。也就是说,对于D来说,他是一个constant—>dD/dD=1,但是对于x来说,他是一个function—>dD/dx=D’。而在训练时,是对x进行偏导从而进行gradient descent来更新D的参数。对于D的训练的Loss Function是max_D V(G, D),因为在给定的不同的x下,max_D V(G, D)是不同的值,所以对于x来说,这个Loss Function是一个max函数。

对GAN进行训练:

实际操作中,使用的是用样本来计算E。即用样本均值来替代E的定义计算。所以从P_data和P_G中分别sample出相同数目m的数据,分别用于计算

<注意,V(G, D)是由上述两部分共同构成的,所以既需要G生成的数据,同时也需要真实的数据用于GAN的训练,否则D只需要每次判别为fake就能达到收敛条件>

在D的训练中,是通过计算Loss对input x的偏导来进行gradient descent以更新模型参数的。这里的input x来源于两部分1.真实的数据 2.G生成的数据

在G的训练中,是通过计算Loss对input z的偏导来进行gradient descent以更新模型参数的。这里的input z是从P_prior中采样得到的,也就是随机噪声

一般情况下对D进行多次的更新后才对G进行一次的更新。原因在于,只有当D到达最优处,对应的max_D V(G, D)才是表示P_data和P_G之间的JSD(此时固定G,隐含着也固定x,将V(G, D)视为D的函数)。同时,对于G的更新,不能一次更新太多。

这是由于max_D V(G0, D0)在更新G0之后(固定D),V(G1, D0)的函数可能已经发生了变化,虽然在原先的D0下,V(G1, D0)的值会比V(G0, D0)更小,但是这会导致JSD的峰值(可能在D=Di处取到)反而变得更大了,从而在下一次固定G对D进行更新时,D达到此时V的最优处,使得V的值即JSD的值反而变得更大。而我们所希望的是G的更新能朝着令JSD整体更小的方向进行的。这就与目标相违背。

最后贴上关于GAN训练的实际算法(double loop)

Reference

台大深度学习_李宏毅

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值