论文阅读之Generative Adversarial Nets
Generative Adversarial Nets(GAN)
作者:IanJ.Goodfellow
.
一个生动的比喻:
生成器(Generator,G)即假钞制造者,辨别器(Discriminator,D)的任务是识别假钞,前者想要尽力蒙混过关,而后者则是努力识别出是真钞(来自于原样本)还是假钞(生成器生成的样本)。两者左右互搏(bushi),最后达到一种平衡:生成器能够以假乱真(或者说生成的与原样本再也没差),而判别器以1/2概率来瞎猜。
一些数学定义:
两个模型数学上的衡量:
衡量的函数如下:
其中判别器D的任务是最大化右边这个函数,而生成器G的任务是最小化右边函数。
那么这个函数是个啥意思呢,咱来感性地理解一下。首先先看一个式子:D(x)(1-D(G(z)),D(x)就是判别器D认为样本来自于原分布的概率,而D(G(z))就是判别器D误把来自于生成器G造的假样本判别成真的概率。那么D的任务自然是要最大化D(x)同时最小化D(G(z))嘛(即最大化1-D(G(z))),所以综合一下就是最大化D(x)(1-D(G(z)),为了以后方便干脆取个log,增减性不变,所以就成了logD(x)+log(1-D(G(z))。
而G想让pg和pdata足够像,也就是D(G(z))足够大;而logD(x)并不对它本身有啥影响,所以他的衡量函数可以只是min{log(1-D(z))},也可以加一个对他来说的常数后变为->minV(G,D)
这里作一点说明为何是1-D而不是D: 训练早期,当G的生成效果很差时,D会以高置信度拒绝生成样本,因为它们与训练数据明显不同,log(1-D(G(z)))饱和。因此选择最大化logD(G(z))而不是最小化log(1-D(G(z)))来训练G较好。
训练方法及算法
最小化目标函数的优化:迭代数值法。分别对判别器D和生成器G进行交互迭代,固定G优化D,之后再固定D优化G,直至过程收敛。
算法如上。 先选定m个z生成假样本pg(z),再选定m个真样本pdata(x),然后沿着梯度方向(函数上升最快方向)更新判别器D;然后固定D,更新生成器G。
上图为一例子,真实样本为黑点线,生成器G的生成样本pg为绿线,而判别器D的判别模型为蓝色点线,z噪声,为一个不变的分布,而被生成器G映射到x上(随着G的改进映射也在改变,本均匀的z在x轴上不同地方密度不一样代表着pg的变化)。
a图中最开始判别器D(蓝线)无法很好识别出二者(即使绿线是黑线的一个很糟糕的模拟);
然后我们固定绿线不动优化判别器D,可以看出b图中蓝线在右边生成器pg高的时候概率很低,说明已经能很好识别出二者;
接下来我们固定D来改进G,让它不断往判别器给的数值高的地方(同时也是原分布)接近,更加像pdata;
然后重复b和c过程直到d,最终收敛到了这样一个结果:G的pg完全模拟了原分布,而D也只能以处处1/2的概率瞎猜
数学推导
1.首先考虑任意给定G后,D的最佳:
证明:给定G,D的目的都是最大化V(G,D):(将期望E换为了计算式子积分形式)
其中第二个等式是把G将z转化为x的过程考虑进来了,直接用∫pg(x)log(1-D(x))dx,来代替
∫pz(z)log(1-D(g(z))dz,(当然这里应该再加个括号,两个都是积分项…一开始以为前一个是积分后一个直接把积分算出来了,吓了一跳)
而考虑函数:f(y)=alog(y)+blog(1-y),其最值取在y=a/(a+b)处,这里ab代入后也就是,给定pdata(x),pg(x)后,D(x)=pdata(x)/(pdata(x)+pg(x))可以使得积分号里面的东西取得最大值,也就是可以使得函数V取得最大值。那么就相当于任意G可以确定使得max达到的最好的D了,那么此时我们的V(G,D)就可以变为一个G的函数C(G):
(鬼知道这个图和上下行挨得有多紧密我截了多少次图…sigh 还是不太干净 就这样吧555)
那么接下来任务就是找到可以使得C(G)最小的G了。
2.可以证明pg=pdata时,C(G)取到最小值-log4。
证明:首先pg=pdata时,D*G(x)=1/2,此时代入后C(G)=log1/2+log1/2=-log4。然后证明其他情况的C(G)≥-log4。
因为:
所以C(G)=V(G,D*)=V(G,D*)-log4-Ex-pdata[-log2]-Ex-pg[-log2]
=-log4+KL(pdata||(pdata+pg)/2)+KL(pg||(pdata+pg)/2) =-log4+2JSD(pdata||pg)
又写了一遍具体运算过程,字丑orz
而KL散度或者JS距离来度量两个概率分布之间的相似性,JSD是≥0的,只能两分布相等取到0,故C(G)≥-log4,且仅在pg=pdata时取得最小值。因此,我们证明了所需结论。
但是,光证明了啥时候取得不够,我们还需要证明收敛性。
3.证明收敛性
命题:如果G和D有足够的性能,对于算法1中的每一步,给定G时,判别器D能够达到它的最优,并且通过更新pg来提高判别准则:
那么pg将收敛到pdata
证明:将V(G,D)=U(pg,D)视作pg的函数,则U为pg的凸函数,其上确界的次导数一定包括该函数最大值处的导数,所以给定D时,通过梯度下降算法更新pg从而优化G时,pg一定会收敛到最优值。而之前又证明了目标函数只有唯一的全局最优解,所以pg会收敛到pdata。(其实本人并没有很搞清楚这一步,上确界什么的…orz)
实际上优化G时是更新θg而不是pg。尽管缺乏理论证明,但是(据论文中说)实践效果不错。
实验
理论部分结束~下面来康康论文中提到的实验效果
- 该模型是多个数据集上进行了实验:MNIST、TFD、CIFAR-10
- 采用了多种激活函数(生成器混合使用rectifier linear activations和sigmoid激活函数,而判别器使用maxout激活):激活函数作用是可以在网络中引进非线性性质,否则网络就变成了一堆矩阵相乘的简单形式orz
- 衡量的标准为对数似然(熟悉的这货):
补充:
MNIST:https://www.cnblogs.com/xianhan/p/9145966.html
TFD未找到orz
CIFAR-10:https://blog.csdn.net/qq_36653505/article/details/87864405
训练生成样本结果:这图说实话没有特别看懂啥意思orz大概就是说右边框框里的是原来的图,左边那堆是咱们生成器G生成的。看别的还行,反正看那个人脸嘴的那块我jio还是不太行 有点瘆人(
这货还有另一个用途:就是随便选几个图片他给你生成连续的过渡图片,比如两头的给定,中间再插一个,他就能给你生成一串,左边那个可能康不出来,但是右边那个图很明显是插了一个7一个9和一个1,然后G就给你瞎编了这么多过渡图片出来,这好像是之前什么VAN做不到的(
实验结果数据:
这个数据应该就是那个C(G)在不同数据集上的数值表现了,那个±后面的数是方差。
- 缺点:方差较大,高维空间表现不是很好,但是即使这样仍然是已知方法中较好的一个了
- 优点:可以采样而非直接估计似然,促进了该模型的进一步评估
理论总结优缺点:
缺点:
- 没有明确给出pg(x)的式子来
- 训练期间G与D必须较好地同步,尤其是必须注意D的更新,否则比如固定一个较低级的D然后使劲更新G,那G不用很努力就能骗过这个D了,就懒得更新了,即使你给他不同的z可能生成的还是一样的x,反正都能骗过去了。这叫Helvetica
(https://blog.csdn.net/sdnuwjw/article/details/88691504,可以看出这位老哥真的是个文化人儿orz)
优点:
- 通过反向传播就能获得梯度,不用马尔科夫链(减少计算量 & 也可以模拟一些马尔科夫链弄不了的,比如很尖锐甚至退化的分布,而马尔可夫这货只能弄一些很模糊的)
- 学习期间无需推理(咱不懂啥意思orz)
- 模型可融入多种函数
- 对比其他模型,优势主要在计算上(一个大表格,对比各种方法,懒得弄进去了)
- 可用于数据实例
结论&未来研究方向:
该框架允许多种直接的拓展:
-
将c作为G和D的输入条件,可获得p(x|c)
-
给定x,可通过训练一个任意的模型来学习近似推理,从而预测z
-
可近似模型的条件概率:
(S为x的某一子集)(这条太丑了 不知道咋排版 就这样凑合着吧)
-
半监督学习:来自鉴别器或推理网络的特征,可以在标记数据有限时提高分类器的性能
-
效率改善:可设计更好方法来协调G和D/确定更好的分布来获得z
最后他老人家还建议了往这些方向努努力(
补充:
小班课上老师还说了一种情况,作为一个缺点补充:
比如原分布是有两种峰值的(比如产生猫和兔子的图片),而G只学习到了一种峰值(比如只会产出猫);而如果D不够厉害,只会说判断猫图片来了,对属于原样本,兔子图片来了,也属于原样本,那么一个只会产生猫图片的G也能完全骗过去D(因为产生图片全为猫,D全说对对)
就像这样,黑线是原样本,而红线只模拟了一个峰,就很菜(x
而这时候就需要更新D,比如让他还要判断判断生成图片猫和兔子比例啊之类的,不能让G只学一个峰。
但是实验中你如何判定D该更新了是很难的,这也是一个缺点吧hhh