《GAN》论文笔记


论文链接: https://proceedings.neurips.cc/paper/2014/file/5ca3e9b122f61f8f06494c97b1afccf3-Paper.pdf

论文代码: https://github.com/devnag/pytorch-generative-adversarial-networks

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

生成器

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

判别器

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

训练方式

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

enter description here

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

enter description here

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

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

代码逻辑如下所示:
enter description here

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

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

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

总结

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

欢迎关注我的公众号!

enter description here

-------------本文结束感谢您的阅读-------------