GAN
basic idea of GAN
generator
对于generation的认识
我们的generator可以是一个NN,也可以是一个function(在DCGAN中是CNN)
discriminator
同样判别器也可以是一个NN、function…
output是一个数值,判断input的“好坏”
基础的思想
那生物进化的例子来说,
1.首先蝴蝶是鲜艳的,那么波比鸟知道说有鲜艳颜色的很有可能是蝴蝶
2.蝴蝶开始进化,颜色不再鲜艳,这个时候波比鸟需要学习到说有蝴蝶纹理的可能是蝴蝶
3.蝴蝶再次进化,纹理和树叶类同,这个时候波比鸟就发现不了蝴蝶了
作假钱的例子:
那我们的GAN的思想也是类似:
Theoretical Results
在训练的时候,我们希望得到以下图这个结果:
对于上图的解释:
A、绿线表示我们生成样本的概率分布 黑色表示是真实样本的概率分布 蓝色表示我们辨别器判断什么时候是真的还是假的
B、我们首先需要让判别器知道什么是好的什么是坏的
C、然后固定住判别器 ,让生成器更加接近真实的样本,骗过辨别器
…
到最后 如果生成器和真实的样本完全一致,辨别器就无法区分出是真实的还是生成的
手写数字举例
工作流程
上图中的目标函数:
1.整个式子由两项构成。x表示真实图片,z表示输入G网络的噪声,而G(z)表示G网络生成的图片。
2.D(x)表示D网络判断真实图片是否真实的概率(因为x就是真实的,所以对于D来说,这个值越接近1越好,而D(G(z))是D网络判断G生成的图片的是否真实的概率。
3.G的目的:G应该希望自己生成的图片“越接近真实越好"。
4·D的目的:D的能力越强,D(x)应该越大,D(G(x))应该越小。这时V(D,G)会变大。因此式子对于D来说是求最大(max_D)
algorithm
初始化G、D
在每一次训练轮回中:
step1:fix G,update D
因为我们判别器首先需要知道什么是好的,什么是不好的,才能给G生成的图片打分,这个时候需要给予真实图片的分数越高越好,给G生成的图片越小越好。
step2:fix D, update G
现在D给予我们G生成的image分数很低,那么我们G需要进步,骗过现在的D,得到更高的分数,也就是越来越接近真实的图片。
整个流程:
Advantages and disadvantages
advantages
1.可以产生更加清晰的图片,更加真实的样本
2.无监督的学习,可以被广泛用在无监督学习和半监督学习领域
3.GAN应用到一些场景上,比如图片风格迁移,超分辨率,图像补全,去噪,避免了损失函数设计的困难,只要有一个的基准,直接上判别器,剩下的就交给对抗训练了。
disadvantages
这个部分会细说GAN的一些问题:训练困难、生成器和判别器的loss无法指示训练进程、生成样本缺乏多样性等问题。
第一个问题:训练困难、不稳定
问题的根源——目标函数对D(这个时候G是固定住的,去找到最优的判别器,即最大化目标函数的时候得到D):
我们对这个目标函数进行变形,:
去简化算式,然后求导,得到最优的D:
但是我们在训练GAN的时候,我们说不能把判别器训练得太好,否则在实验中生成器会完全学不动(loss降不下去),这是为什么呢?
我们接着对上面的式子变形,我们已经知道了最优的D是什么样子的,我们把它代入到原本的目标函数中去。
我们为什么要向上面那样去做呢,是为了将我们的目标函数转化成JS散度。
(预先科普一下JS散度的公式)
简单的转换:
得到的结论:根据原始GAN定义的判别器loss,我们可以得到最优判别器的形式;而在最优判别器的下,我们可以把原始GAN定义的生成器loss等价变换为最小化真实分布Pdata与生成分布PG之间的JS散度。我们越训练判别器,它就越接近最优,最小化生成器的loss也就会越近似于最小化Pdata和PG之间的JS散度
所以我们发现我们的最优化D是和JS散度有关系的,那这个会有什么问题呢?问题在JS散度上面。
第二个问题:多样性不足
生成器的loss:
我们对KL散度进行变形:
我们对生成器的loss进行变形(就是上面的公式左右移动一下):
我们会发现很严重的问题:
1.它同时要最小化生成分布与真实分布的KL散度,却又要最大化两者的JS散度,一个要拉近,一个却要推远。
2.KL散度项也有毛病,因为KL散度不是一个对称的衡量
development
后面会一个一个提到。-_-