结合李宏毅老师机器学习2021——GAN课程和网上查阅的资料,总结一下对GAN的理解
GAN的本质是什么
GAN本质是分布的拟合。 详细说就是,把输入的向量拟合成特定的分布。例如,输入一个随机向量,另外给一堆二次元图像,要求将这个随机向量生成二次元的头像,其实就是将这个向量,拟合为二次元的分布形式,训练完成后生成的图片与真实的二次元图片是分不开的(很相似)。因此它的本质还是一个拟合问题。
- GAN真的创造新的信息了吗?
我认为是没有的。因为它的本质只是一个学到了原始数据分布的生成模型,所生成的图片也只是从学到的分布中采样得到的而已
更详细的解释:我们需要一个生成模型来生成真实的样本,最简单的方式是获得真实样本的分布,然后随机取值从分布中抽取,就可以得到真实的样本了。但是我们不知道这个真实的分布是什么,所以我们用神经网络来模拟它->得到了生成器G。生成器生成样本之后,我们不知道该如何判断这个样本是不是真实的,所以我们再次用一个神经网络来模拟它->得到了判别器D。理想条件下,G可以完美模拟真实样本的分布,生成的每一张图都是真的,不在库中的,但他们是同一个分布。所以我不认为GAN真的创造了新的信息。
参考知乎:https://www.zhihu.com/question/315259993
GAN是怎么工作的,它和RL(Reinforcement Learning)有何联系?
- GAN的工作方式?
GAN全称是生成对抗网络,由一个生成器和一个判别器组成。随机向量经过生成器后,生成了某一张图像,判别器判断该图像与样本图像是否属于同一类(例如都是二次元)。生成器的目的就是骗过判别器,判别器的目的就是识别出来生成的图像与实际图像的区别。就这样反反复复的生成、对抗,使得生成器越来越完美。生成器最终的意义在于,输入一个随机向量,输出一个符合特定分布的向量。因为我们输入的随机向量是通过采样得到的,因此生成的随机向量也可以认为是从学到的分布中采样得到的而已。
我们不知道这个真实的分布是什么,所以我们用神经网络来模拟它->得到了生成器G。生成器生成样本之后,我们不知道该如何判断这个样本是不是真实的,所以我们再次用一个神经网络来模拟它->得到了判别器D。 - GAN与RL的联系?
回答这个问题之前,需要先了解RL的工作方式。RL是机器根据当前环境的reward后改变模型,然后执行下一步action,循环下去。GAN是生成了新的图片,然后判别器判断图片行不行,然后去改进生成器。从直观上感觉这两个之间是有一定联系的。RL是根据环境的reward,执行下一步action,GAN是生成数据然后根据判别器改生成器。因此我们是否可以认为GAN是近似的一种逆强化学习呢(GAN可以看成生成器生成一个action,然后判别器给出这个action的reward,是一种逆向的)?
GAN是怎么求LOSS的?
假设PG是生成器生成的分布,Pdata是原始数据的分布。GAN的损失函数,就是 PG 跟 Pdata 的 Divergence,就是它们两个分布之间的距离,它们两个越近,那就代表这个生成出来的 PG 跟 Pdata 越像,所以 PG 跟Pdata,我们希望它们越相像越好。因此问题转换为,我们怎么求他们之间的分布距离。
-
最原始的方法是通过 J-S散度 求解,也就是下面的公式。
其实这个很好理解,我们希望判别器D在Pdata上尽可能都判别为真(因为都是对的,所以loss(D)就小),因此公式中第一项就小,而判别器D在生成器中都判别为假,因此loss(D)就大,不过通过1-D(y)的操作后,也就小了。因此这个公式意义就在于,判别器在真实分布中都判别为真,在生成分布中都判别为假。GAN的Pytorch代码参考:
https://blog.youkuaiyun.com/junbaba_/article/details/106185743
https://blog.youkuaiyun.com/iice_dream/article/details/87935793 -
然而原论文中J-S散度存在一个问题:JS Divergence 有个特性,是两个没有重叠的分布,JS Divergence 算出来,就永远都是 Log2,不管这两个分布长什麼样,所以两个分布只要没有重叠,算出来就一定是 Log2。
但是我们希望,如果这两个分布很相近的话,那是可以显示出来的,所以这个JS散度有很大局限性。基于此,有一种叫做WGAN的方法被提出。WGAN 实际上就是用,当你用 Wasserstein Distance,来取代 JS Divergence 的时候,这个 GAN 就叫做 WGAN。
接下来你会遇到的问题就是,Wasserstein Distance 是要怎么算,Pdata 跟 PG,它的 Wasserstein Distance 要怎么计算,这边怎么计算就不讲过程,直接告诉结果,解下面这个 Opimilazion 的 Problem,解出来以后你得到的值,就是Wasserstein Distance
y 如果是从 Pdata 来的,那我们要计算它的 D(y) 的期望值;y 如果是从 PG 来的,我们计算它的 D(y) 的期望值,但是前面乘上一个负号。但是这边还有另外一个限制,它不是光大括号裡面的值变大就好,还有一个限制是,D 不能够是一个随便的Function,D必须要是一个 1-Lipschitz 的 Function。
那么具体参考的代码和一些代码中的限制条件,参考:https://blog.youkuaiyun.com/qq_41433002/article/details
https://blog.youkuaiyun.com/junbaba_/article/details/106185743
Evalution可能会出现的问题:
我们如何判断生成的图片(或其他向量)的好坏呢,当然我们直接看图片可以,但是这种方法太主观了,因此我们需要像一些办法做评估(evalution)
- Mode Collapse: 模式坍塌
你会发现说 Generative Model,它输出来的图片来来去去,就是那几张
那为什么会有 Mode Collapse,这种现象发生,就直觉上你还是比较容易理解,你可以想成说,这个地方就是 Discriminator 的一个盲点,当 Generator 学会生成这种图片以后,就可以永远的骗过 Discriminator,Discriminator 没办法看出这样子的图片是假的,这是一个 Discriminator 的盲点,Generator 会抓到这个盲点就硬train一发,就发生 Mode Collapse 的状况。 - Mode Dropping: 模式下降(但我更愿意翻译为模式遗漏、模式缺失)
Mode Dropping 的意思是说,你的真实的资料分布可能是上图这个样子,但是你的生成出来的资料,只有真实资料的一部分,单纯看生成出来的资料,你可能会觉得还不错,而且分布,它的这个多样性也够;但你不知道说真实的资料,它的多样性的分布,其实是更大的。 - 评估方式
目前针对上述两种情况依然没有很好地解决思路。目前评估GAN生成图片的好坏,有一种叫做 Inception Score 的方法,该方法主要取决于两个评价指标,一个是生成质量,另一个生成多样性。
评估生成质量时看一张图片,该图片属于各个类型的占比(肯定是某一种类别的占比越高越好);评估多样性时看一堆图片,这一堆图片属于哪些种类(肯定是这一堆图片分散的越均匀越好)
此外,还有其他评估方法,例如FID等等,有机会再去探索,