GAN 生成式对抗网络
“在机器学习过去的10年里,GAN是最有趣的一个想法。” ——Yann LeCun
GAN
2019年,是很重要的一年。在这一年里,GAN有了重大的进展,出现了 BigGan,StyleGan 这样生成高清大图的GAN,也出现了很多对GAN的可解释性方法,包括 苏剑林的OGAN。 还有GAN都被拿来烤Pizza了……(CVPR2019还有个PizzaGAN,demo paper)
这一切预示着GAN这个话题,马上就要被勤勉的科学家们攻克了。
从目标分类的被攻克,人脸识别的特征提取和loss改进,目标检测与分割的统一…… 深度学习的堡垒一个接一个的被攻克。一切都迅速都走上可应用化的道路。
深度学习的发展惊人,如果说互联网过的是狗年,一年抵七年,深度学习的发展一定是在天宫的,天上一天,地上一年。
生成式对抗网络(GAN, Generative Adversarial Networks )是近年来深度学习中复杂分布上无监督学习最具前景的方法之一。 监督学习需要大量标记样本,而GAN不用。 模型包括两个模块:生成模型(Generative Model)和判别模型(Discriminative Model),通过模型的互相博弈学习产生相当好的输出。原始 GAN 理论中,并不要求 G 和 D 都是神经网络,只需要是能拟合相应生成和判别的函数即可。但实用中一般均使用深度神经网络作为 G 和 D 。
GAN的目标,就是G生成的数据在D看来,和真实数据误差越小越好,目标函数如下:
从判别器 D 的角度看,它希望自己能尽可能区分真实样本和虚假样本,因此希望 D(x) 尽可能大,D(G(z)) 尽可能小, 即 V(D,G)尽可能大。从生成器 G 的角度看,它希望自己尽可能骗过 D,也就是希望 D(G(z)) 尽可能大,即 V(D,G) 尽可能小。两个模型相对抗,最后达到全局最优。
从数据分布来说,就是开始的噪声noise,在G不断修正后,产生的分布,和目标数据分布达到一致:
[1] Ian Goodfellow. "Generative Adversarial Networks." arXiv preprint arXiv:1406.2661v1 (2014). [pdf] (https://arxiv.org/pdf/1406.2661v1.pdf)
https://github.com/goodfeli/adversarial
“酒后脑洞”的故事…
2014 年的一个晚上,Goodfellow 在酒吧给师兄庆祝博士毕业。一群工程师聚在一起不聊姑娘,而是开始了深入了学术探讨——如何让计算机自动生成照片。
当时研究人员已经在使用神经网络(松散地模仿人脑神经元网络的算法),作为“生成”模型来创建可信的新数据。但结果往往不是很好:计算机生成的人脸图像要么模糊到看不清人脸,要么会出现没有耳朵之类的错误。
针对这个问题,Goodfellow 的朋友们“煞费苦心”,提出了一个计划——对构成照片的元素进行统计分析,来帮助机器自己生成图像。
Goodfellow 一听就觉得这个想法根本行不通,马上给否决掉了。但他已经无心再party了,刚才的那个问题一直盘旋在他的脑海,他边喝酒边思考,突然灵光一现:如果让两个神经网络互相对抗呢?
但朋友们对这个不靠谱的脑洞深表怀疑。Goodfellow 转头回家,决定用事实说话。写代码写到凌晨,然后测试…
Ian Goodfellow:如果你有良好的相关编程基础,那么快速实现自己的想法将变得非常简单。几年来,我和我的同事一直在致力于软件库的开发,我曾用这些软件库来创建第一个 GAN、Theano 和 Pylearn2。第一个 GAN 几乎是复制-粘贴我们早先的一篇论文《Maxout Networks》中的 MNIST 分类器。即使是 Maxout 论文中的超参数对 GAN 也相当有效,所以我不需要做太多的新工作。而且,MNIST 模型训练非常快。我记得第一个 MNIST GAN 只花了我一个小时左右的时间。
参考:
https://baijiahao.baidu.com/s?id=1615737087826316102&wfr=spider&for=pc
http://www.heijing.co/almosthuman2014/2018101111561225242
和监督学习的的网络结构一样,GAN的发展 也主要包含网络结构性的改进 和loss、参数、权重的改进。
Avinash Hindupur建了一个GAN Zoo,他的“动物园”里目前已经收集了近500种有名有姓的GAN。 主要是2014-2018年之间的GAN。 https://github.com/hindupuravinash/the-gan-zoo
那么问题来了:这么多变体,有什么区别?哪个好用?
于是,Google Brain的几位研究员(不包括原版GAN的爸爸Ian Goodfellow)对各种进行了loss,参数,权重修改的GAN做一次“中立、多方面、大规模的”评测。 在此项研究中,Google此项研究中使用了minimax损失函数和用non-saturating损失函数的GAN,分别简称为MM GAN和NS GAN,对比了WGAN、WGAN GP、LS GAN、DRAGAN、BEGAN,另外还对比的有VAE(变分自编码器)。为了很好的说明问题,研究者们两个指标来对比了实验结果,分别是FID和精度(precision、)、召回率(recall)以及两者的平均数F1。
其中FID(Fréchet distance(弗雷歇距离) )是法国数学家Maurice René Fréchet在1906年提出的一种路径空间相似形描述,直观来说是狗绳距离:主人走路径A,狗走路径B,各自走完这两条路径过程中所需要的最短狗绳长度,所以说,FID与生成图像的质量呈负相关。
为了更容易说明对比的结果,研究者们自制了一个类似mnist的数据集,数据集中都是灰度图,图像中的目标是不同形状的三角形。
最后,他们得出了一个有点丧的结论:
No evidence that any of the tested algorithms consistently outperforms the original one. :
都差不多……都跟原版差不多……
Are GANs Created Equal? A Large-Scale Study Mario Lucic, Karol Kurach, Marcin Michalski, Sylvain Gelly, Olivier Bousquet https://arxiv.org/abs/1711.10337
http://www.dataguru.cn/article-12637-1.html
这些改进是否一无是处呢?当然不是,之前的GAN 训练很难, 而他们的优点,主要就是让训练变得更简单了。
那对于GAN这种无监督学习的算法,不同的模型结构改进,和不同的应用领域,才是GAN大放异彩的地方。
此外,谷歌大脑发布了一篇全面梳理 GAN 的论文,该研究从损失函数、对抗架构、正则化、归一化和度量方法等几大方向整理生成对抗网络的特性与变体。 作者们复现了当前最佳的模型并公平地对比与探索 GAN 的整个研究图景,此外研究者在 TensorFlow Hub 和 GitHub 也分别提供了预训练模型与对比结果。 https://arxiv.org/pdf/1807.04720.pdf
原名:The GAN Landscape: Losses, Architectures, Regularization, and Normalization
现名:A Large-Scale Study on Regularization and Normalization in GANs
Github:http://www.github.com/google/compare_gan
TensorFlow Hub:http://www.tensorflow.org/hub
翻译 参见 http://www.sohu.com/a/241299306_129720
GAN的很多研究,都是对Generative modeling生成模型的一种研究,主要是为了对原有数据的分布进行模拟
怎么知道原有数据的分布呢?
1 Density Estimation 对原有数据进行密度估计,建模,然后使用模型进行估计 2 Sampling 取样,用对数据分布建模,并进行取样,生成符合原有数据分布的新数据。
Others' collection:
https://github.com/kozistr/Awesome-GANs
https://github.com/nightrome/really-awesome-gan
参考Mohammad KHalooei的教程,我也将GAN分为4个level,第四个level将按照应用层面进行拓展。
Level 0: Definition of GANs
Level | Title | Co-authors | Publication | Links |
---|---|---|---|---|
Beginner | GAN : Generative Adversarial Nets | Goodfellow & et al. | NeurIPS (NIPS) 2014 | link |
Beginner | GAN : Generative Adversarial Nets (Tutorial) | Goodfellow & et al. | NeurIPS (NIPS) 2016 Tutorial | link |
Beginner | CGAN : Conditional Generative Adversarial Nets | Mirza & et al. | -- 2014 | link |
Beginner | InfoGAN : Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets | Chen & et al. | NeuroIPS (NIPS) 2016 |
模型结构的发展:
在标准的GAN中,生成数据的来源一般是一段连续单一的噪声z, 在半监督式学习CGAN中,会加入c的class 分类。InfoGan 找到了Gan的latent code 使得Gan的数据生成具有了可解释性。
CGAN
[1411.1784]Mirza M, Osindero S,Conditional Generative Adversarial Nets pdf
通过GAN可以生成想要的样本,以MNIST手写数字集为例,可以任意生成0-9的数字。
但是如果我们想指定生成的样本呢?譬如指定生成1,或者2,就可以通过指定C condition来完成。
条件BN首先出现在文章 Modulating early visual processing by language 中,后来又先后被用在 cGANs With Projection Discriminator 中,目前已经成为了做条件 GAN(cGAN)的标准方案,包括 SAGAN、BigGAN 都用到了它。
https://github.com/znxlwm/tensorflow-MNIST-cGAN-cDCGAN
应用方向 数字生成, 图像自动标注等
LAPGAN
Emily Denton & Soumith Chintala, arxiv: 1506.05751
是第一篇将层次化或者迭代生成的思想运用到 GAN 中的工作。在原始 GAN和后来的 CGAN中,GAN 还只能生成32X32 这种低像素小尺寸的图片。而这篇工作[16] 是首次成功实现 64X64 的图像生成。思想就是,与其一下子生成这么大的(包含信息量这么多),不如一步步由小转大,这样每一步生成的时候,可以基于上一步的结果,而且还只需要“填充”和“补全”新大小所需要的那些信息。这样信息量就会少很多,而为了进一步减少信息量,他们甚至让 G 每次只生成“残差”图片,生成后的插值图片与上一步放大后的图片做加法,就得到了这一步生成的图片。
IcGAN
Invertible Conditional GANs for image editing
通常GAN的生成网络输入为一个噪声向量z,IcGAN是对cGAN的z的解释。
利用一个encoder网络,对输入图像提取得到一个特征向量z,将特征向量z,以及需要转换的目标attribute向量y串联输入生成网络,得到生成图像,网络结构如下,
https://arxiv.org/pdf/1611.06355.pdf https://github.com/Guim3/IcGAN
ACGAN
为了提供更多的辅助信息并允许半监督学习,可以向判别器添加额外的辅助分类器,以便在原始任务以及附加任务上优化模型。
和CGAN不同的是,C不直接输入D。D不仅需要判断每个样本的真假,还需要完成一个分类任务即预测C
添加辅助分类器允许我们使用预先训练的模型(例如,在ImageNet上训练的图像分类器),并且在ACGAN中的实验证明这种方法可以帮助生成更清晰的图像以及减轻模式崩溃问题。 使用辅助分类器还可以应用在文本到图像合成和图像到图像的转换。
SemiGan /SSGAN Goodfellow
Salimans, Tim, et al. “Improved techniques for training gans.” Advances in Neural Information Processing Systems. 2016.
Theano+Lasagne https://github.com/openai/improved-gan
tf: https://github.com/gitlimlab/SSGAN-Tensorflow
https://blog.csdn.net/shenxiaolu1984/article/details/75736407
InfoGan OpenAI
InfoGAN - Xi Chen, arxiv: 1606.03657
提出了latent code。
单一的噪声z,使得人们无法通过控制z的某些维度来控制生成数据的语义特征,也就是说,z是不可解释的。
以MNIST手写数字集为例,每个数字可以分解成多个维度特征:数字的类别、倾斜度、粗细度等等,在标准GAN的框架下,是无法在维度上具体指定生成什么样的数字。但是Info Gan 通过latent code的设定成功让网络学习到了可解释的特征表示(interpretable representation)
把原来的噪声z分解成两部分:一是原来的z;二是由若干个latent variables拼接而成的latent code c,这些latent variables会有一个先验的概率分布,且可以是离散的或连续的,用于代表生成数据的不同特征维度,如数字类别(离散),倾斜度(连续),粗细度(连续)等。通过找到对信息影响最大的c,来得到数据中最重要的特征。
InfoGAN: Interpretable Representation Learning by Information Maximizing Generative Adversarial Nets,NIPS 2016。
https://arxiv.org/abs/1606.03657
https://github.com/openai/InfoGAN
Level 1: Improvements of GANs training
然后看看 loss、参数、权重的改进:
Level | Title | Co-authors | Publication | Links |
---|---|---|---|---|
Beginner | LSGAN : Least Squares Generative Adversarial Networks | Mao & et al. | ICCV 2017 | link |
Advanced | Improved Techniques for Training GANs | Salimans & et al. | NeurIPS (NIPS) 2016 | link |
Advanced | WGAN : Wasserstein GAN | Arjovsky & et al. | ICML 2017 | link |
Advanced | WGAN-GP : improved Training of Wasserstein GANs | 2017 | link | |
Advanced | Certifying Some Distributional Robustness with Principled Adversarial Training | Sinha & et al. | ICML 2018 | link code |
Loss Functions:
LSGAN(Least Squares Generative Adversarial Networks)
LS-GAN - Guo-Jun Qi, arxiv: 1701.06264
[2] Mao et al., 2017.4 pdf
https://github.com/hwalsuklee/tensorflow-generative-model-collections https://github.com/guojunq/lsgan
用了最小二乘损失函数代替了GAN的损失函数,缓解了GAN训练不稳定和生成图像质量差多样性不足的问题。
但缺点也是明显的, LSGAN对离离群点的过度惩罚, 可能导致样本生成的'多样性'降低, 生成样本很可能只是对真实样本的简单模仿和细微改动.
WGAN
WGAN - Martin Arjovsky, arXiv:1701.07875v1
WGAN: 在初期一个优秀的GAN应用需要有良好的训练方法,否则可能由于神经网络模型的自由性而导致输出不理想。
为啥难训练? 令人拍案叫绝的Wasserstein GAN 中做了如下解释 : 原始GAN不稳定的原因就彻底清楚了:判别器训练得太好,生成器梯度消失,生成器loss降不下去;判别器训练得不好,生成器梯度不准,四处乱跑。只有判别器训练得不好不坏才行,但是这个火候又很难把握,甚至在同一轮训练的前后不同阶段这个火候都可能不一样,所以GAN才那么难训练。
https://zhuanlan.zhihu.com/p/25071913
WGAN 针对loss改进 只改了4点: 1.判别器最后一层去掉sigmoid 2.生成器和判别器的loss不取log 3.每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c 4.不要用基于动量的优化算法(包括momentum和Adam),推荐RMSProp,SGD也行
https://github.com/martinarjovsky/WassersteinGAN
WGAN-GP
Regularization and Normalization of the Discriminator:
WGAN-GP:
WGAN的作者Martin Arjovsky不久后就在reddit上表示他也意识到没能完全解决GAN训练稳定性,认为关键在于原设计中Lipschitz限制的施加方式不对,并在新论文中提出了相应的改进方案--WGAN-GP ,从weight clipping到gradient penalty,提出具有梯度惩罚的WGAN(WGAN with gradient penalty)替代WGAN判别器中权重剪枝的方法(Lipschitz限制):
[1704.00028] Gulrajani et al., 2017,improved Training of Wasserstein GANspdf
Tensorflow实现:https://github.com/igul222/improved_wgan_training
pytorch https://github.com/caogang/wgan-gp
参考 :
https://www.leiphone.com/news/201704/pQsvH7VN8TiLMDlK.html
Level 2: Implementation skill
GAN的实现
Title | Co-authors | Publication | Links | size | FID/IS |
---|---|---|---|---|---|
Keras Implementation of GANs | Linder-Norén | Github | link | ||
GAN implementation hacks | Salimans paper & Chintala | World research | link paper | ||
DCGAN : Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks | Radford & et al. | 2015.11-ICLR 2016 | link paper | 64x64 human | |
ProGAN:Progressive Growing of GANs for Improved Quality, Stability, and Variation | Tero Karras | 2017.10 | paper link | 1024x1024 human | 8.04 |
SAGAN:Self-Attention Generative Adversarial Networks | Han Zhang & Ian Goodfellow | 2018.05 | paper link | 128x128 obj | 18.65/52.52 |
BigGAN:Large Scale GAN Training for High Fidelity Natural Image Synthesis | Brock et al. | 2018.09-ICLR 2019 | demo paper link | 512x512 obj | 9.6/166.3 |
StyleGAN:A Style-Based Generator Architecture for Generative Adversarial Networks | Tero Karras | 2018.12 | paper link | 1024x1024 human | 4.04 |
指标:
1 Inception Score (IS,越大越好) IS用来衡量GAN网络的两个指标:1. 生成图片的质量 和2. 多样性
2 Fréchet Inception Distance (FID,越小越好) 在FID中我们用相同的inception network来提取中间层的特征。然后我们使用一个均值为 μμ 方差为 ΣΣ 的正态分布去模拟这些特征的分布。较低的FID意味着较高图片的质量和多样性。FID对模型坍塌更加敏感。
FID和IS都是基于特征提取,也就是依赖于某些特征的出现或者不出现。但是他们都无法描述这些特征的空间关系。
物体的数据在Imagenet数据库上比较,人脸的 progan 和stylegan 在CelebA-HQ和FFHQ上比较。上表列的为FFHQ指标。
DCGAN
Deep Convolution Generative Adversarial Networks(深度卷积生成对抗网络)
Alec Radford & Luke Metz提出使用 CNN 结构来稳定 GAN 的训练,并使用了以下一些 trick:
Batch Normalization 使用 Transpose convlution 进行上采样 使用 Leaky ReLu 作为激活函数 上面这些 trick 对于稳定 GAN 的训练有许多帮助
这是CNN在unsupervised learning领域的一次重要尝试,这个架构能极大地稳定GAN的训练,以至于它在相当长的一段时间内都成为了GAN的标准架构,给后面的探索开启了重要的篇章。