在github上找到了一个链接,作者汇总了最近的GAN网络论文及其code,非常详细
链接 : https://github.com/zhangqianhui/AdversarialNetsPapers
还有一个OpenAI研究科学家Ian Goodfellow在会上作为主题为《生成对抗网络(Generative Adversarial Networks)》的演讲:http://c.m.163.com/news/a/C7UE2MLT0511AQHO.html?spss=newsapp&spsw=1
在其中摘出一部分实用的来:
其中的Tips & Tricks:
1. 有标签比没标签好
2. label smoothing。如果我们给了GAN一些有标签的数据,这些标签最好是平滑(smooth)过的,也就是说把要么是0要么是1的离散标签变成更加平滑的0.1和0.9等等。对于假数据,我们还是建议保留标签为0。一个平滑,另一个不平滑,也就称为one-sided label smoothing(单边标签平滑)。标签平滑化有很多好处,特别对于GAN而言,这能让判别函数不会给出太大的梯度信号(gradient signal),也能防止算法走向极端样本的陷阱。
3. batch norm。直接用batch norm也有问题的。同一批(batch)里面的数据太过相似,对一个无监督的GAN而言,很容易被带偏而误认为它们这些数据都是一样的。也就是说,最终的生成模型的结果会混着同一个batch里好多其它特征。这不是我们想要的形式。这里,我们依旧是取出R,但是所有的新数据x做规范化的时候,我们把x也加入到R中形成一个新的virtual batch V。并用这个V的平均值和标准差来标准化x。这样就能极大减少R的风险。
4. 平衡好G和D。通常,在对抗网络中,判别模型D会赢。并且在实际中,D也比G会深很多。Ian建议大家不要太担心D会变得太聪明,我们可以用下面这些方法来达到效果最大化:就像之前说的,使用非饱和(non-saturating)博弈来写目标函数,保证D学完之后,G还可以继续学习。
GAN依旧面临着几大问题:
1. 问题:不收敛。解决方案:目前表现最好的GAN变种是minibatch GAN。
问题解释:现在GAN面临的最大问题就是不稳定,很多情况下都无法收敛(non-convergence)。原因是我们使用的优化方法很容易只找到一个局部最优点,而不是全局最优点。或者,有些算法根本就没法收敛:模式崩溃(mode collapse)。遇到了模式崩溃,我们的数据生成结果就会少很多多样性,基本上仅会带有部分的几个特征(因为学习出来的特征都只聚集在全部特征中几个地方)。
解决方案:把原数据分成小batch,并保证太相似的数据样本不被放到一个小batch里面。这样,至少我们每一次跑的数据都足够多样。原理上讲,这种方法可以避免模式崩溃。(更多的优化方法还有待学界的研究。)
other methods:Unrolling GAN(不滚的GAN)也就是说,每一步并不把判别模型D这个学习的雪球给滚起来,而是把K次的D都存起来,然后根据损失(loss)来选择最好的那一个。它的效果似乎也不错。
2.问题:评估。没法科学地进行评估。比如你拿一堆图片生成另一堆图片,可是这两批图片其实可能看起来天差地别。人可以判断出生成的小狗照片对不对,机器却没法量化这个标准。
3. 问题:离散输出。到目前为止我们提到的输出或者案例都是连续的情况。如果我们的G想要生成离散值,就会遇到一个数学问题:无法微分(differentiate)。
4. 问题:强化学习的连接。
State-of-the-art:
这就是在NIPS几天前刚刚发布的PPGN(Plug and Play Generative Models/即插即用生成模型)(Nguyen et al, 2016) 了。这是生成模型领域新的State-of-the-art(当前最佳)级别的论文。它从ImageNet中生成了227*227的真实图片,是目前在这个数据集上跑得最惊人的一套算法。