从14年开始到现在两年多的时间里,GAN(Generative Adversarial Network,对抗生成网络)在机器学习、人工智能领域最具瞩目和创新性的研究成果之一。近些天,仔细看了多篇机器学习领域的论文和研究,更进一步加深了对GAN的敬佩之情。特地将自己的一些理解和看法记录下来,以飨读者,共勉。废话不多说,从GAN的兴起开始介绍吧。
GAN的思想
GAN最早于2014年底有Goodfellow大神提出。Ian Goodfellow 是世界上最重要的 AI 研究者之一,他在 OpenAI(谷歌大脑的竞争对手,由 Elon Must 和 Sam Altman 创立)工作过不长的一段时间(2015年底-2016年底),2017年3月重返 Google Brain, 加入Google Brain,他们建立了一个探索“生成模型”(generative models)的新研究团队。
我们在理解GAN时,首先要明白对抗生成网络拆开来是两个东西:一个是判别模型(Discremator,简称D模型),一个是生成模型(Generator,简称G模型)。
说一个具体点的例子:两个人比赛,看是 A 的矛厉害,还是 B 的盾厉害。在GAN模型中,我们会拿一些真实数据,同时混合上乱七八糟的虚构数据。A 拼命地把随手拿过来的假数据模仿成真实数据,并揉进真实数据里。B 则拼命地想把真实数据和假数据区分开。这里,A 就是一个生成模型,类似于卖假货的,一个劲儿地学习如何骗过 B。而 B 则是一个判别模型,类似于警察叔叔,一个劲儿地学习如何分辨出 A 的骗人技巧。如此这般,随着 B 的鉴别技巧的越来越牛,A 的骗人技巧也是越来越纯熟。一个造假一流的 A,就是我们想要的生成模型!这个基本的对抗思想就是GAN的精髓了。
GAN的困难
看似简单的GAN模型,在实际使用时却会遇到非常多的困难。最大的一个就是GAN的不收敛问题,如果大家有试验过GAN可能会知道,GAN的收敛是很困难的。往往就是需要设置很多的参数,比如学习率,比如说你的网络结构,你去很好的去提出G和D的能力,才能使得它最终达到收敛。最主要的原因来源于两部分。
第一、就是梯度消失的问题。当你优化的时候,对于公式里我们的生成器、判别器的损失函数会存在梯度消失的问题,那么我们需要设计一些更好的损失函数,使得梯度消失问题得到解决。
第二、就是模式发现问题。我们的生成器可能生成同样的数据而不是多样的数据。例如猫,它可能生成的都是黑猫、或者生成MNIST的数据全都是零。那么这个问题主要原因是来源于,因为我们的梯度下降实际上不区分min-max和max-min。那么会导致我们的生成器会希望多生成一些重复但是很安全的样本。比如说我生了一些黑猫或生成一些0,甚至可能到这样一个情况就是它生成的接真实的就完全一样,但它只适合这样一个情况。那么这是我们不希望,我们希望生成器会生成多样样本,尽量与真实样本多样化一致。
GAN的推动
不过从一提出开始,GAN网络就收到越来越多人的追捧和崇拜。其改进方法大概少说也有100种了,[Github](https://github.com/hindupuravinash/the-gan-zoo上已有列出。