作者:追一科技 AI Lab 研究员 Miracle
写在前面的话
笔者接触 GAN 也有一段时间了,从一开始的小白,到现在被 GANs 虐了千百遍但依然深爱着 GANs 的小白,被 GANs 的对抗思维所折服,被 GANs 能够生成万物的能力所惊叹。我觉得 GANs 在某种程度上有点类似于中国太极,『太极生两仪,两仪生四象』,太极阐明了宇宙从无极而太极,以至万物化生的过程,太极也是讲究阴阳调和。(哈哈,这么说来 GANs 其实在中国古代就已经有了发展雏形了。)
众所周知,GANs 的训练尤其困难,笔者自从跳入了 GANs 这个领域(坑),就一直在跟如何训练 GANs 做「对抗训练」,受启发于 ganhacks,并结合自己的经验记录总结了一些常用的训练 GANs 的方法,以备后用。
(⚠️本篇不是 GANs 的入门扫盲篇,初学者慎入。)
什么是 GANs?
GANs(Generative Adversarial Networks)可以说是一种强大的「万能」数据分布拟合器,主要由一个生成器(generator)和判别器(discriminator)组成。生成器主要从一个低维度的数据分布中不断拟合真实的高维数据分布,而判别器主要是为了区分数据是来源于真实数据还是生成器生成的数据,他们之间相互对抗,不断学习,最终达到Nash均衡,即任何一方的改进都不会导致总体的收益增加,这个时候判别器再也无法区分是生成器生成的数据还是真实数据。
GANs 最初由 Ian Goodfellow [1] 于 2014 年提出,目前已经在图像、语音、文字等方面得到广泛研究和应用,特别是在图像生成方面,可谓是遍地开花,例如图像风格迁移(style transfer)、图像修复(image inpainting)、超分辨率(super resolution)等。
GANs 出了什么问题?
GANs 通常被定义为一个 minimax 的过程:
![562e7103912ef25bfae06d514185e7bf.png](https://i-blog.csdnimg.cn/blog_migrate/b25e266e8301c2886b6faf60e5aa7d0b.jpeg)
其中 P_r 是真实数据分布,P_z 是随机噪声分布。乍一看这个目标函数,感觉有点相互矛盾,其实这就是 GANs 的精髓所在—— 对抗训练。
在原始的 GANs 中,判别器要不断的提高判别是非的能力,即尽可能的将真实样本分类为正例,将生成样本分类为负例,所以判别器需要优化如下损失函数:
![d9ef73b88a2c16cfcb6b8e79a996d65f.png](https://i-blog.csdnimg.cn/blog_migrate/6f9b4786c00d9fcdbcbd00bdbc025e84.jpeg)
作为对抗训练,生成器需要不断将生成数据分布拉到真实数据分布,Ian Goodfellow 首先提出了如下式的生成器损失函数:
![9aac5b04503f29e8bcdfd89cea061ff5.png](https://i-blog.csdnimg.cn/blog_migrate/7fdbb0649a4402071e3da27223765be9.jpeg)
由于在训练初期阶段,生成器的能力比较弱,判别器这时候也比较弱,但仍然可以足够精准的区分生成样本和真实样本,这样 D(x) 就非常接近1,导致 log(1-D(x)) 达到饱和,后续网络就很难再调整过来。为了解决训练初期阶段饱和问题,作者提出了另外一个损失函数,即:
![3fb9f872470fcde0ea44e94a71fd4d1c.png](https://i-blog.csdnimg.cn/blog_migrate/ee8dc39feb7e54360c5cc65c4298f6fe.jpeg)
以上面这个两个生成器目标函数为例,简单地分析一下GAN模型存在的几个问题:
Ian Goodfellow 论文里面已经给出,固定 G 的参数,我们得到最优的 D^*:
![ed6ddb0154b159817f8d03704ca96fb6.png](https://i-blog.csdnimg.cn/blog_migrate/59455126f487a7e2d4649372e99e0f11.jpeg)
也就是说,只有当 P_r=P_g 时候,不管是真实样本和生成样本,判别器给出的概率都是 0.5,这个时候就无法区分样本到底是来自于真实样本还是来自于生成样本,这是最理想的情况。
1. 对于第一种目标函数
在最优判别器下 D^* 下,我们给损失函数加上一个与 G 无关的项,(3) 式变成: