GAN就对了:Generative Adversarial Nets

前言

Generative Adversarial Nets,生成对抗网络,也就是大家经常听到的 GAN,由Ian Goodfellow于2014年首先提出,之后迅速风靡学术圈。就连深度学习先驱之一的Yann LeCun也给予了高度评价,认为"GAN及其变种是数十年来机器学习领域最有趣的点子"。有关GAN的研究层出不穷,仿佛没有什么是“GAN”不出来的。

发展现状

根据GAN的发展情况,梳理相关内容:

名称 发表时间 解决问题 中文名称 论文链接
GAN 10 Jun 2014 GAN系列的开山之作 生成对抗网络 https://arxiv.org/pdf/1406.2661.pdf
CGAN 6 Nov 2014 原始GANs通过输入随机噪声来生成数据,但是无法指定生成内容。CGAN通过将一个one-hot向量连接到输入的随机噪声以告诉生成器生成特定类别的图像,从而解决输出不可控的问题。 条件生成对抗网络 https://arxiv.org/pdf/1411.1784.pdf
DCGAN 19 Nov 2015 原始GANs不一定使用基于卷积的操作,而是依赖于标准的多层感知器架构。DCGAN通过巧妙的设计卷积网络和采用策略改进原始GANs。 深度卷积生成对抗网络 https://arxiv.org/pdf/1511.06434.pdf
CoGAN 24 Jun 2016 比一个GAN更好的是什么?两个GAN!CoGAN所训练的就是两个GAN而不是一个。 耦合生成对抗网络 https://arxiv.org/pdf/1606.07536v2.pdf
CycleGAN 30 Mar 2017 CycleGAN 致力于解决图像到图像映射的问题,主要用于风格迁移。可以进行未配对的图像到图像的转换。 Cycle生成对抗网络 https://arxiv.org/pdf/1703.10593.pdf
WGAN 26 Jan 2017 WGAN提出了一种新的损失函数,有着非常好的性质。 Wasserstein 生成对抗网络 https://arxiv.org/pdf/1701.07875.pdf
ProGAN 27 Oct 2017 ProGAN通过增加生成图像的分辨率来帮助稳定 GAN的训练。 生成对抗网络的渐进式增长 https://arxiv.org/pdf/1710.10196.pdf
SAGAN 21 May 2018 SAGAN 使用了自注意力机制。 自注意力生成对抗网络 https://arxiv.org/pdf/1805.08318.pdf
BigGAN 28 Sep 2018 大Batch Size,采用先验分布 z 的“截断技巧”,对模型稳定性的控制。 大生成对抗性网络 https://arxiv.org/pdf/1809.11096.pdf
StyleGAN 12 Dec 2018 StyleGAN 不专注于架构和损失函数,而是改进了GANs对生成的图像进行精细控制的能力 。它可以与任何GAN一起使用。 基于风格的生成对抗网络 https://arxiv.org/pdf/1812.04948.pdf
··· ··· ··· ··· ···

论文《Generative Adversarial Nets》探秘

一、什么是GAN?

百度百科:生成式对抗网络(GAN, Generative Adversarial Networks )是一种深度学习模型,是近年来复杂分布上无监督学习最具前景的方法之一。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的*性而导致输出不理想。

百科中大致说明了GAN的结构、核心思想和问题。
GAN由两个部分组成:

  • 生成器 Generator,例如生成一张新的猫咪图片(不在数据集里)
  • 判别器 Discriminator,例如给定一张图,判断这张图里的动物是猫还是狗
    GAN就对了:Generative Adversarial Nets

核心思想:
零和博弈,通过让生成器 Generator和判别器 Discriminator相互对抗,Generator试图生成接近真实的数据,Discriminator试图区分真实的数据和由Generator生成的数据。最终达到一个“平衡”,即Generator生成的数据足够真实,Discriminator只是是随机猜测,无法再区分真实数据与生成数据的区别。

存在的问题:

  • 难训练
  • 有模式崩溃(Model Collapse)的可能

二、能GAN什么?

GAN就对了:Generative Adversarial Nets

  • 图像生成
    GAN最常使用的地方就是图像生成,如超分辨率任务,语义分割等等。
  • 数据增广
    对于小数据集,数据量不足,可以通过使用GAN生成的图像来做数据增广。

三、GAN的原理

真实数据集的分布为Pdata(x)P_{data}(x),对于生成器Generator而言,它的目标是希望能够学习到真实样本的分布,这样就可以随机生成以假乱真的样本。
GAN就对了:Generative Adversarial Nets
给定输入噪声 Pz(z)P_z(z),现有的 Generator 生成的数据分布假设为PG(z;θg)P_G(z;θ_g),这是一个由 θgθ_g控制的分布,θθ是这个分布的参数(如果是高斯混合模型,那么θθ就是每个高斯分布的平均值和方差)。然后定义判别器D(x;θd)D(x; θ_d),其中D(x)D(x)表示xx来自PdataP_{data}而非PgP_g的概率。
我们的目标是训练判断器D以使其能最大可能地区分来自PdataP_{data}PgP_g的样本,同时训练生成器G以最小化log(1D(G(z)))log(1-D(G(z))),从而生成D难辨真假的数据。D和G的博弈的价值函数V(G,D)V(G, D):
minGmaxDV(D,G)=ExPdata(x)[logD(x)]+EzPz(z)[log(1D(G(z)))]{\min_G}{\max_D} V(D, G) = \mathbb {E}_{x∼P_{data}(x)}[log D(x)] +\mathbb {E}_{z∼P_z(z)}[log(1-D(G(z)))]
其中,D(x)D(x)表示D判断真实数据是否是真实的概率,D(G(z))D(G(z))表示D判断G生成的数据是否是真实的概率。
G希望D(G(z))D(G(z))尽可能大,此时V(G,D)V(G, D)会变小,即minG\min_G
D希望D(x)D(x)尽可能大,D(G(z))D(G(z))尽可能小,此时V(G,D)V(G, D)会变大,即maxD\max_D
交替训练最终达到纳什平衡状态。
GAN就对了:Generative Adversarial Nets
论文中给出的网络训练算法如下,详解后续再做补充:
GAN就对了:Generative Adversarial Nets
论文链接:
https://arxiv.org/pdf/1406.2661.pdf
代码链接:
http://www.github.com/goodfeli/adversarial

参考资料:

[1] 深度学习最强资源推荐:一文看尽 GAN 的前世今生,https://www.sohu.com/a/325882199_114877
[2] GAN(生成式对抗网络)百度百科,https://baike.baidu.com/item/Gan/22181905?fr=aladdin
[3] GAN笔记——理论与实现,https://www.cnblogs.com/fydeblog/p/9439024.html
[4] GAN原理学习笔记,https://zhuanlan.zhihu.com/p/27295635
[5] AdversarialNetsPapers, https://github.com/zhangqianhui/AdversarialNetsPapers