《GAN》论文笔记

142 阅读3分钟

论文链接: proceedings.neurips.cc/paper/2014/…

论文代码: github.com/devnag/pyto…

顾名思义, GAN是一个对抗网络。具体来说,会有一个生成器(Generator),和一个判别器(Discirminator),两个模型互相对抗,共同进步。举一个生活中的例子,例如造假币的人是这里的生成器,查假币的人是判别器,那么生成器的任务就是让造出的假币让判别器以为是真钱一样,而判断器的任务就是能很好的分别出生成器造出的钱是假币。

生成器

输入一个n维的noise的向量z,一般是随机产生的,例如满足高斯分布/均值分布的噪声,生成器的任务是将向量z生成图片x,可以通过MLP等神经网络

判别器

输入是图片数据,输出是一个标量,用于判断输入数据是来自真实数据还是生成器

训练方式

通过上面网络的简介知道,需要训练两个网络,所以训练方式目的也是让两个网络都能够有效的学习

  • 上式中D是判别器,G是生成器
  • 先看前一项,Expdata[logD(x)]E_{x \sim p_{data}}[logD(x)]表示从真实数据pdatap_{data}中采样样本x,让判别器判断x的来源。在辨别器判断正确的情况下Dx=1D_x=1, 则logD(x)=0logD(x)=0
  • 后面一项,Ezpz(z)[log(1D(G(z)))]E_{z \sim p_{z}(z)}[log(1-D(G(z)))]表示从随机噪声数据pz(z)p_{z}(z)中生成噪声z, 先让生成器z生成类似x的数据G(z)G(z),再让判别器判断生成的数据来源,在判别器完美的时候,能分出G(z)G(z)不是真实样本,则D(G(z))=0D(G(z))=0
  • 在D犯错的时候,log(D(x)log(D(x)为负数,因此需要最大化D的损失, 而G(z)G(z)需要生成的和x尽可能相似,需要最小化G的损失
  • 整个模型设计用的是博弈论的思想,min和max都需要优化,且互相对抗。感兴趣可以看看minmax算法相关的知识:en.wikipedia.org/wiki/Minima…。在博弈论中,在包含两个或两个以上参与者的非合作博弈中,如果每个参与者都选择了对自己最有利的策略,则最后会达到均衡点,称为纳什均衡(Nash equilibrium)

网络的优化过程在图1中有形象化的示例,图1中,蓝色的线是判别器,黑色是真实数据,绿色是生成器

  • 在图1(a)中,生成器生成的数据和真实数据相差比较大,但判别器判断的也不是太好
  • 图1(b)更新了判别器,能很好的区分是否是生成器生成的数据
  • 图1(c)中更新了生成器,生成的数据和真实数据变得很相似
  • 图1(d)中随着生成器和辨别器都进行优化,最终生成器拟合的数据和真实数据基本一致,而判别器也无法判断数据来源,则模型优化完毕

代码逻辑如下所示:

  • 第一个for循环是迭代的次数
  • 然后会将判别器循环更新k次,再将生成器更新1次

其中k是一个超参数,如果判别器更新的太好,生成器就没法玩了,而要是更新的太差,生成器就没有动力继续优化

算法的原理到这里基本上就整理完了,论文中第四部分章节有关于损失函数正确的理论证明,感兴趣也可以阅读下

总结

gan算法实际上训练完后主要使用的是生成器,在方法中其实对生成器已经有了优化,所以为什么还要引入判别器呢?其实光从生成器的优化上,很难通过损失判断生成器的好坏,而引入判别器可以更全局的判断生成器的效果,也通过博弈的方法让生成器能达到更好的效果

欢迎关注我的公众号!