生成式对抗网络(GAN)学习笔记
图像识别和自然语言处理是目前应用极为广泛的AI技术,这些技术不管是速度还是准确度都已经达到了相当的高度,具体应用例如智能手机的人脸解锁、内置的语音助手。这些技术的实现和发展都离不开神经网络,可是传统的神经网络只能解决关于辨识的问题,并不能够为机器带来自主创造的能力,例如让机器写出一篇流畅的新闻报道,生成一副美丽的风景画。但随着GAN的出现,这些都成为了可能。
什么是GAN?
生成式对抗网络(GAN, Generative Adversarial Networks)是一种近年来大热的深度学习模型,该模型由两个基础神经网络即生成器神经网络(Generator Neural Network)和判别器神经网络(Discriminator Neural Network)所组成,其中一个用于生成内容,另一个则用于判别生成的内容。
GAN受博弈论中的零和博弈启发,将生成问题视作判别器和生成器这两个网络的对抗和博弈:生成器从给定噪声中(一般是指均匀分布或者正态分布)产生合成数据,判别器分辨生成器的的输出和真实数据。前者试图产生更接近真实的数据,相应地,后者试图更完美地分辨真实数据与生成数据。由此,两个网络在对抗中进步,在进步后继续对抗,由生成式网络得的数据也就越来越完美,逼近真实数据,从而可以生成想要得到的数据(图片、序列、视频等)。
发展历史
GAN最早是由Ian J. Goodfellow等人于2014年10月提出的,他的《Generative Adversarial Nets》可以说是这个领域的开山之作,论文一经发表,就引起了热议。而随着GAN在理论与模型上的高速发展,它在计算机视觉、自然语言处理、人机交互等领域有着越来越深入的应用,并不断向着其它领域继续延伸。


从上面的两份数据中可以看出不管是在ICASSP上发表的涉及到GAN的论文还是GAN的升级版模型,数量都获得了极大的增长,尤其是2017年至今。包含关键词:生成式(generative)的论文从6篇增加到31篇;对抗(Adversarial)的论文更是从2篇增加到42篇,而GAN的变种模型从2017年初的50多个增加到现在的近300个。
工作原理
我们将生成内容的网络称为G(Generator),将鉴别内容的网络称为D(Discriminator),下图中枯叶蝶进化的例子可以很好的说明GAN的工作原理。

图中的枯叶蝶扮演Generator的角色,相应的其天敌之一的麻雀扮演Discriminator的角色。起初,枯叶蝶的翅膀与其他的蝴蝶别无二致,都是色彩斑斓;
- 第一阶段:麻雀为了识别并捕杀蝴蝶升级自己的判别标准为非棕色翅膀;
- 第二阶段:为了躲避麻雀,枯叶蝶的翅膀进化为棕色;
- 第三阶段:麻雀更加聪明,识别枯叶蝶的标准升级为所看到的物体是否具有纹路;
- 第四阶段:枯叶蝶的翅膀进化出纹路更像枯叶;
- ……
如此不断的进行下去,伴随着枯叶蝶的不断进化和麻雀判别标准的不断升级,二者不断地相互博弈,最终导致的结果就是枯叶蝶的翅膀(输出)无限接近于真实的枯叶(真实物体)。
我们再以生成图片为例用数学语言进行描述。
- G是一个生成图片的网络,它接收一个随机的噪声z,通过这个噪声生成图片,记做G(z)。
- D是一个判别网络,判别一张图片是不是“真实的”。它的输入参数是x,x代表一张图片,输出D(x)代表x为真实图片的概率,如果为1,就代表100%是真实的图片,而输出为0,就代表不可能是真实的图片。

上图中的标记符号:
- Pdata(x) → 真实数据的分布
- X → pdata(x)的样本(真实图片)
- P(z) →生成器的分布
- Z → p(z)的样本(噪声)
其他符号前文中已作解释。
在训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量把G生成的图片和真实的图片分别开来。这样,G和D构成了一个动态的“博弈过程”。
最后博弈的结果是什么?在最理想的状态下,G可以生成足以“以假乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,因此D(G(z)) = 0.5。
用公式表示如下:
\[\min_{G} \max_{D}V(D,G) = E_{x \sim p_{data}(x)}[\log D(x)]+E_{z \sim p_{z}(z)}[\log (1-D(G(z)))] \]
整个式子由两项构成。X表示真实图片,Z表示输入G网络的噪声,而G(z)表示G网络生成的图片。D(x)表示D网络判断真实图片是否真实的概率(因为x就是真实的,所以对于D来说,这个值越接近1越好)。而D(G(z))是D网络判断G生成的图片的是否真实的概率。
G的目的:上面提到过,D(G(z))是D网络判断G生成的图片是否真实的概率,G应该希望自己生成的图片“越接近真实越好”。也就是说,G希望D(G(z))尽可能得大,这时V(D, G)会变小。因此我们看到式子的最前面的记号是(min_G)。
D的目的:D的能力越强,D(x)应该越大,D(G(x))应该越小。这时V(D,G)会变大。因此式子对于D来说是求最大(max_D)。
这个过程被下面这张图很好的描述了出来:

最终通过不断的训练,生成的图片会相当真实。
GAN的训练方法
应用实例
GAN最直接的应用在于数据的生成,也就是通过GAN的建模能力生成图像、语音、文字、视频等等。目前,GAN最成功的应用领域主要是计算机视觉,包括图像、视频的生成,如图像翻译、图像上色、图像修复、视频生成等。此外GAN在自然语言处理,人机交互领域也略有拓展和应用。
图像领域
根据文字描述生成对应图像(Text to Image Generation)
如下图所示,只需输入鸟类和花朵的关键特征,GAN,就能为我们输出对应的花鸟的图片。(论文地址:https://arxiv.org/abs/1605.05396)

由图像到图像的转化(Image to Image Translation)
图中,可以将黑白图像转换为彩色图像、将航拍图像变成地图形式、将白天的照片转换为黑夜的照片、甚至可以根据物体的轮廓、边缘信息,来生成实体包包的形式。(论文地址:https://arxiv.org/abs/1611.07004)

提升图像分辨率,改善图像质量(Increasing Image Resolution)
GAN还可以增加图像分辨率:从较低分辨率照片生成高分辨率照片。(论文地址:https://arxiv.org/abs/1609.04802)
视频领域
预测视频下一帧(Predicting Next Video Frame)
GAN还可以应用于视频预测,即生成器根据前面一系列帧生成视频最后一帧。(论文地址:https://arxiv.org/abs/1511.06380)

动图中左右两边的奥巴马讲话的镜头,你能第一眼就看出来哪边是合成的吗?
利用场景生成视频(Generating videos with scene dynamics)
Vondrick等人在视频领域取得了巨大进展,他们能生成32帧分辨率为64×64 的逼真视频,描绘的内容包括高尔夫球场、沙滩、火车站以及新生儿。(论文地址:https://arxiv.org/abs/1609.02612)

人机交互领域
Santana等人实现了利用GAN 的辅助自动驾驶。首先,生成与真实交通场景图像分布一致的图像,然后,训练一个基于循环神经网络的转移模型来预测下一个交通场景。
另外,GAN还可以用于对抗神经机器翻译,将神经机器翻译(neural machine translation, NMT)作为GAN 的生成器,采用策略梯度方法训练判别器,通过最小化人类翻译和神经机器翻译的差别生成高质量的翻译。
虽然目前GAN还只是集中应用于图像和视频领域,但是相信它将来也必然会在其他领域大放异彩。
变种模型
Ian在2014年提出的朴素GAN在生成器和判别器在结构上是通过以多层全连接网络为主体的多层感知机(Multi-layer Perceptron, MLP) 实现的,然而其调参难度较大,训练失败相当常见,生成图片质量也相当不佳,尤其是对较复杂的数据集而言。
DCGAN(论文地址:https://arxiv.org/abs/1511.06434)
由于卷积神经网络(Convolutional neural network, CNN)比MLP有更强的拟合与表达能力,并在判别式模型中取得了很大的成果。因此,Alec等人将CNN引入生成器和判别器,称作深度卷积对抗神经网络(Deep Convolutional GAN, DCGAN)。DCGAN的原理和GAN是一样的,它只是把上述的G和D换成了两个卷积神经网络(CNN)。但不是直接换就可以了,DCGAN对卷积神经网络的结构做了一些改变,以提高样本的质量和收敛的速度,这些改变有:
- 取消所有pooling层。G网络中使用转置卷积(transposed convolutional layer)进行上采样,D网络中用加入stride的卷积代替pooling。
- 在D和G中均使用batch normalization
- 去掉FC层,使网络变为全卷积网络
- G网络中使用ReLU作为激活函数,最后一层使用tanh
- D网络中使用LeakyReLU作为激活函数

DCGAN虽然没有带来理论上以及GAN上的解释性,但是其强大的图片生成效果吸引了更多的研究者关注GAN,证明了其可行性并提供了经验,给后来的研究者提供了神经网络结构的参考。此外,DCGAN的网络结构也可以作为基础架构,用以评价不同目标函数的GAN,让不同的GAN得以进行优劣比较。DCGAN的出现极大增强了GAN的数据生成质量。而如何提高生成数据的质量(如生成图片的质量)也是如今GAN研究的热门话题。
这是一组用DCGAN生成的逼真二次元头像。(论文地址:https://makegirlsmoe.github.io/assets/pdf/technical_report.pdf):

这效果已经可以和专业的画师比一比了。
WGAN(论文地址:https://arxiv.org/abs/1701.07875v2)
与前文的DCGAN不同,WGAN(Wasserstein GAN)并不是从判别器与生成器的网络构架上去进行改进,而是从目标函数的角度出发来提高模型的表现。Martin Arjovsky等人先阐述了朴素GAN因生成器梯度消失而训练失败的原因:他们认为,朴素GAN的目标函数在本质上可以等价于优化真实分布与生成分布的Jensen-Shannon散度。而根据Jensen-Shannon散度的特性,当两个分布间互不重叠时,其值会趋向于一个常数,这也就是梯度消失的原因。此外,Martin Arjovsky等人认为,当真实分布与生成分布是高维空间上的低维流形时,两者重叠部分的测度为0的概率为1,这也就是朴素GAN调参困难且训练容易失败的原因之一。
针对这种现象,Martin Arjovsky等人利用Wasserstein-1距离(又称Earth Mover距离)来替代朴素GAN所代表的Jensen-Shannon散度。Wasserstein距离是从最优运输理论中的Kantorovich问题衍生而来的,可以如下定义真实分布与生成分布的Wasserstein-1距离:
\[W(P_{r},P_{g}) = \inf_{\gamma \in \prod(P_{r},P_{g})} E_{(x,y)\sim\gamma}[\parallel x-y \parallel]\]
其中 \(p_{r},p_{g}\) 分别为真实分布与生成分布,$\gamma $ 为$ p_{r},p_{g}$ 分的联合分布。相较于Jensen-Shannon散度,Wasserstein-1距离的优点在于,即使 \(p_{r},p_{g}\) 互不重叠,Wasserstein距离依旧可以清楚地反应出两个分布的距离。为了与GAN相结合,将其转换成对偶形式:
\[ W(P_{r},P_{\theta}) = \sup_{\parallel f \parallel_{L}\leq1}E_{x\sim P_{r}}[f(x)]-E_{x \sim P_{\theta}}[f(x)]\]
从表示GAN的角度理解,fw表示判别器,与之前的D不同的是,WGAN不再需要将判别器当作0-1分类将其值限定在[0,1]之间,fw越大,表示其越接近真实分布;反之,就越接近生成分布。此外,$ ||f||_{L} ≤ 1 $ 表示其Lipschitz常数为1。显然,Lipschitz连续在判别器上是难以约束的,为了更好地表达Lipschitz转化成权重剪枝,即要求参数w ∈ [−c, c],其中为常数。因而判别器的目标函数为:
\[\max_{f_{w}}E_{x\sim P_{r}}[f_{w}(x)]-E_{z\sim p_{z}}[f_{w}(G(z))]\]
其中w ∈ [−c, c],生成器的损失函数为:
\[\min_{G}-E_{z\sim P_{z}}[f_{w}(G(z))]\]
WGAN的贡献在于,从理论上阐述了因生成器梯度消失而导致训练不稳定的原因,并用Wasserstein距离替代了Jensen-Shannon散度,在理论上解决了梯度消失问题。此外,WGAN还从理论上给出了朴素GAN发生模式坍塌(mode collapse)的原因,并从实验角度说明了WGAN在这一点上的优越性。最后,针对生成分布与真实分布的距离和相关理论以及从Wasserstein距离推导而出的Lipschitz约束,也给了后来者更深层次的启发,如基于Lipschitz密度的 损失敏感GAN(loss sensitive GAN, LS-GAN)。
WGAN—GP(论文地址:https://arxiv.org/abs/1704.00028)
虽然WGAN在理论上解决了训练困难的问题,但它也有各种各样的缺点。在理论上,由于对函数(即判别器)存在Lipschitz-1约束,这个条件难以在神经网络模型中直接体现,所以作者使用了权重剪枝(clip) 来近似替代Lipschitz-1约束。显然在理论上,这两个条件并不等价,而且满足Lipschitz-1约束的情况多数不满足权重剪枝约束。而在实验上,很多人认为训练失败是由权重剪枝引起的。对此Ishaan Gulrajani提出了梯度带梯度惩罚的WGAN(WGAN with gradient penalty, WGAN-GP),将Lipschitz-1约束正则化,通过把约束写成目标函数的惩罚项,以近似Lipschitz-1约束条件。


上图为WGAN与WGAN-GP的权重分布情况
因而,WGAN的目标函数可以写作:
\[\max_{f}E_{x\sim P_{r}}[f(x)]-E_{\widetilde{x} \sim P_{g}}[f(\widetilde{x})]+\lambda E_{\hat{x}\sim P_{\hat{x}}}[(\parallel \nabla_{\hat{x}}f(\hat{x})\parallel_{2}-1)^2]\]
其中\(p_{\bar{x}}\) 是 \(p_{r}\)与\(p_{g}\)之间的线性采样,即满足:
\[\hat x = \varepsilon x+(1-\varepsilon)\hat x, \varepsilon\sim uniform(0,1) \]
此外,生成器的目标函数与WGAN相同,取第二项进行优化即可。
WGAN-GP的贡献在于,它用正则化的形式表达了对判别器的约束,也为后来GAN的正则化模型做了启示。此外WGAN-GP基本从理论和实验上解决了梯度消失的问题,并且具有强大的稳定性,几乎不需要调参,即在大多数网络框架下训练成功率极高。
LSGAN(论文地址:https://arxiv.org/abs/1611.04076v3)
虽然WGAN和WGAN-GP已经基本解决了训练失败的问题,但是无论是训练过程还是是收敛速度都要比常规 GAN 更慢。受WGAN理论的启发,Mao 等人提出了最小二乘GAN (least square GAN, LSGAN)。LSGAN的一个出发点是提高图片质量。它的主要想法是为判别器D提供平滑且非饱和梯度的损失函数。这里的非饱和梯度针对的是朴素GAN的对数损失函数。显然,x越大,对数损失函数越平滑,即梯度越小,这就导致对判别为真实数据的生成数据几乎不会有任何提高。针对于此,LSGAN的判别器目标函数如下:
\[\min_D E_{x \sim P_{data(x)}}[(D(x)-b)^2]+E_{z\sim P_z(z)}[(D(G(z))-a)^2]\]
生成器的目标函数如下:
\[E_{z\sim P_{z}(z)}[(D(G(z))-c)^2]\]
这里\(a, b, c\)满足\(b − c = 1\)和\(b − a = 2\)。它等价于f散度中的散度 \(x^{2}\) ,也即是说,LSGAN用散度\(x^{2}\)取代了朴素GAN的Jensen-Shannon散度。
最后,LSGAN的优越性在于,它缓解了GAN训练时的不稳定,提高了生成数据的质量和多样性,也为后面的泛化模型f-GAN提供了思路。
f-GAN(论文地址:https://arxiv.org/abs/1606.00709)
(待更新。。。)
参考资料
1.一文看懂生成式对抗网络GANs:介绍指南及前景展望(http://36kr.com/p/5086889.html)
2.the-gan-zoo(https://github.com/hindupuravinash/the-gan-zoo)
3.台湾大学李宏毅:Generative Adversarial Network (GAN):Introduction(http://speech.ee.ntu.edu.tw/~tlkagk/courses/MLDS_2018/Lecture/GAN%20(v2).pptx)
4.Generative Adversarial Networks(https://arxiv.org/abs/1406.2661)
5.GAN学习指南:从原理入门到制作生成Demo(https://zhuanlan.zhihu.com/p/24767059)
6.Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks(https://arxiv.org/abs/1511.06434)
7.DCGAN-tensorflow(https://github.com/carpedm20/DCGAN-tensorflow)
8.AI可能真的要代替插画师了……(https://zhuanlan.zhihu.com/p/28488946)
生成式对抗网络(GAN)学习笔记的更多相关文章
- 生成式对抗网络GAN 的研究进展与展望
生成式对抗网络GAN的研究进展与展望.pdf 摘要: 生成式对抗网络GAN (Generative adversarial networks) 目前已经成为人工智能学界一个热门的研究方向. GAN的基 ...
- 【CV论文阅读】生成式对抗网络GAN
生成式对抗网络GAN 1. 基本GAN 在论文<Generative Adversarial Nets>提出的GAN是最原始的框架,可以看成极大极小博弈的过程,因此称为“对抗网络”.一般 ...
- 【神经网络与深度学习】生成式对抗网络GAN研究进展(五)——Deep Convolutional Generative Adversarial Nerworks,DCGAN
[前言] 本文首先介绍生成式模型,然后着重梳理生成式模型(Generative Models)中生成对抗网络(Generative Adversarial Network)的研究与发展.作者 ...
- 生成式对抗网络(GAN)实战——书法字体生成练习赛
https://www.tinymind.cn/competitions/ai 生成式对抗网络(GAN)是近年来大热的深度学习模型. 目前GAN最常使用的场景就是图像生成,作为一种优秀的生成式模型,G ...
- Keras入门——(3)生成式对抗网络GAN
导入 matplotlib 模块: import matplotlib 查看自己版本所支持的backends: print(matplotlib.rcsetup.all_backends) 返回信息: ...
- 不要怂,就是GAN (生成式对抗网络) (一)
前面我们用 TensorFlow 写了简单的 cifar10 分类的代码,得到还不错的结果,下面我们来研究一下生成式对抗网络 GAN,并且用 TensorFlow 代码实现. 自从 Ian Goodf ...
- 不要怂,就是GAN (生成式对抗网络) (一): GAN 简介
前面我们用 TensorFlow 写了简单的 cifar10 分类的代码,得到还不错的结果,下面我们来研究一下生成式对抗网络 GAN,并且用 TensorFlow 代码实现. 自从 Ian Goodf ...
- 人工智能中小样本问题相关的系列模型演变及学习笔记(二):生成对抗网络 GAN
[说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![握手][握手] [再啰嗦一下]本文衔接上一个随笔:人工智能中小样本问题相关的系列模型演变及学习 ...
- 学习笔记TF051:生成式对抗网络
生成式对抗网络(gennerative adversarial network,GAN),谷歌2014年提出网络模型.灵感自二人博弈的零和博弈,目前最火的非监督深度学习.GAN之父,Ian J.Goo ...
随机推荐
- 封装和static 以及关键字“this”的用法
1 封装 1.1 构造方法 构造方法是一种特殊的方法,专门用于构造/实例化对象,形式 [修饰符] 类名(){}: 1.1.1 无参构造 无参构造方法就是构造方法没有任何参数.构造方法在创建对象(new ...
- HTML5 页面编辑API之Range对象
在 HTML5 中,一个 Range 对象代表页面上的一段连续区域.通过 Range 对象,可以获取或修改页面上的任何区域.包含获取,修改,删除和替换等操作. 一:获取range对象的值 Range对 ...
- vue设置背景图片
现在data里面定义: note: { backgroundImage: "url(" + require("../../assets/home/bigdatabak.p ...
- 2018-2019-2 网络对抗技术 20165336 Exp2 后门原理与实践
2018-2019-2 网络对抗技术 20165336 Exp2 后门原理与实践 1.基础问题回答 (1)例举你能想到的一个后门进入到你系统中的可能方式? 下载自己不熟悉的软件时含有病毒. 网络钓鱼, ...
- linux软件安装方式
先插句题外话,快捷键 Ctrl+s 的功能是停止输入,Ctrl+q 恢复输入; 正题,在linux的应用软件安装有三种: 1,tar包 2,rpm包 3,dpkg包 以下介绍三种包的安装和卸载方式 1 ...
- 接口测试工具-Jmeter使用笔记(八:模拟OAuth2.0协议简化模式的请求)
背景 博主的主要工作是测试API,目前已经用Jmeter+Jenkins实现了项目中的接口自动化测试流程.但是马上要接手的项目,API应用的是OAuth2.0协议授权,并且采用的是简化模式(impli ...
- rpc轻量级框架实例
- 2018-2019-2 20165236郭金涛《网络对抗》Exp1 PC平台逆向破解
2018-2019-2 20165236郭金涛<网络对抗>Exp1 PC平台逆向破解 一.实验内容 1.掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(0.5分) 2.掌 ...
- zipkin链路追踪
zipkin架构说明 zipkin api 我想自己搞一些满足zipkin格式的日志,入库es,然后让zipkin仅做展示 1.需要了解zipkin组件 2,学习zipkin设计原理,何时何地产生日志 ...
- jenkins centos slave起不来报错The SSH key presented by the remote host does not match the key saved in the Known Hosts file against this host. Connections to this host will be denied until the two keys mat
场景:我的centos-204是一台centos的机器,本来用https://www.cnblogs.com/zndxall/p/8297356.html 的centos slave方式搭建ok的,一 ...