生成对抗网络
生成对抗网络(GAN)
一、概述
生成对抗网络(Generative Adversarial Networks)是一种无监督深度学习模型,用来通过计算机生成数据,由Ian J. Goodfellow等人于2014年提出。模型通过框架中(至少)两个模块:生成模型(Generative Model)和判别模型(Discriminative Model)的互相博弈学习产生相当好的输出。生成对抗网络被认为是当前最具前景、最具活跃度的模型之一,目前主要应用于样本数据生成、图像生成、图像修复、图像转换、文本生成等方向。
GAN这种全新的技术在生成方向上带给了人工智能领域全新的突破。在之后的几年中生GAN成为深度学习领域中的研究热点,近几年与GAN有关的论文数量也急速上升,目前数量仍然在持续增加中。
2018年,对抗式神经网络的思想被《麻省理工科技评论》评选为2018年“全球十大突破性技术”(10 Breakthrough Technologies)之一。 Yann LeCun(“深度学习三巨头”之一,纽约大学教授,前Facebook首席人工智能科学家)称赞生成对抗网络是“过去20年中深度学习领域最酷的思想”,而在国内被大家熟知的前百度首席科学家Andrew Ng也把生成对抗网络看作“深度学习领域中一项非常重大的进步”。
二、GAN基本原理
1. 构成
GAN由两个重要的部分构成:生成器(Generator,简写作G)和判别器(Discriminator,简写作D)。
- 生成器:通过机器生成数据,目的是尽可能“骗过”判别器,生成的数据记做G(z);
- 判别器:判断数据是真实数据还是「生成器」生成的数据,目的是尽可能找出「生成器」造的“假数据”。它的输入参数是x,x代表数据,输出D(x)代表x为真实数据的概率,如果为1,就代表100%是真实的数据,而输出为0,就代表不可能是真实的数据。
这样,G和D构成了一个动态对抗(或博弈过程),随着训练(对抗)的进行,G生成的数据越来越接近真实数据,D鉴别数据的水平越来越高。在理想的状态下,G可以生成足以“以假乱真”的数据;而对于D来说,它难以判定生成器生成的数据究竟是不是真实的,因此D(G(z)) = 0.5。训练完成后,我们得到了一个生成模型G,它可以用来生成以假乱真的数据。
2. 训练过程
- 第一阶段:固定「判别器D」,训练「生成器G」。使用一个性能不错的判别器,G不断生成“假数据”,然后给这个D去判断。开始时候,G还很弱,所以很容易被判别出来。但随着训练不断进行,G技能不断提升,最终骗过了D。这个时候,D基本属于“瞎猜”的状态,判断是否为假数据的概率为50%。
- 第二阶段:固定「生成器G」,训练「判别器D」。当通过了第一阶段,继续训练G就没有意义了。这时候我们固定G,然后开始训练D。通过不断训练,D提高了自己的鉴别能力,最终他可以准确判断出假数据。
- 重复第一阶段、第二阶段。通过不断的循环,「生成器G」和「判别器D」的能力都越来越强。最终我们得到了一个效果非常好的「生成器G」,就可以用它来生成数据。
3. GAN的优缺点
1)优点
- 能更好建模数据分布(图像更锐利、清晰);
- 理论上,GANs 能训练任何一种生成器网络。其他的框架需要生成器网络有一些特定的函数形式,比如输出层是高斯的;
- 无需利用马尔科夫链反复采样,无需在学习过程中进行推断,没有复杂的变分下界,避开近似计算棘手的概率的难题。
2)缺点
- 模型难以收敛,不稳定。生成器和判别器之间需要很好的同步,但是在实际训练中很容易D收敛,G发散。D/G 的训练需要精心的设计。
- 模式缺失(Mode Collapse)问题。GANs的学习过程可能出现模式缺失,生成器开始退化,总是生成同样的样本点,无法继续学习。
4. GAN的应用
1)生成数据集
人工智能的训练是需要大量的数据集,可以通过GAN自动生成低成本的数据集。
2)人脸生成
3)物品生成
4)图像转换
5)图像修复
三、GAN的数学原理
1.GAN的数学推导
生成模型会从一个输入空间将数据映射到生成空间(即通过输入数据,在函数作用下生成输出数据),写成公式的形式是x=G(z)。通常,输入z会满足一个简单形式的随机分布(比如高斯分布或者均匀分布等),为了使得生成的数据分布能够尽可能地逼近真实数据分布,生成函数G会是一个神经网络的形式,通过神经网络可以模拟出各种完全不同的分布类型。
以下是生成对抗网络中的代价函数,以判别器D为例,代价函数写作 J ( D ) J^{(D)} J(D),形式如下所示:
其中,E表示期望概率, x ∼ P d a t a x \sim P_{data} x∼Pdata表示x满足 P d a t a P_{data} Pdata分布。
对于生成器来说它与判别器是紧密相关的,我们可以把两者看作一个零和博弈,它们的代价综合应该是零,所以生成器的代价函数应满足如下等式:
J ( G ) = − J ( D ) J^{(G)} = -J^{(D)} J(G)=−J(D)
这样一来,我们可以设置一个价值函数V来表示 J ( G ) J^{(G)} J(G)和 J ( D ) J^{(D)} J(D):
我们现在把问题变成了需要寻找一个合适的 V ( θ ( D ) , θ ( G ) ) V(θ^{(D)},θ^{(G)}) V(θ(D),θ(G))使得 J ( G ) J^{(G)} J(G)和 J ( D ) J^{(D)} J(D)都尽可能小,也就是说对于判别器而言越大越 V ( θ ( D ) , θ ( G ) ) V(θ^{(D)},θ^{(G)}) V(θ(D),θ(G))好,而对于生成器来说则是越小越好 V ( θ ( D ) , θ ( G ) ) V(θ^{(D)},θ^{(G)}) V(θ(D),θ(G)),从而形成了两者之间的博弈关系。
在博弈论中,博弈双方的决策组合会形成一个纳什平衡点(Nash equilibrium),在这个博弈平衡点下博弈中的任何一方将无法通过自身的行为而增加自己的收益。在生成对抗网络中,我们要计算的纳什平衡点正是要寻找一个生成器G与判别器D使得各自的代价函数最小,从上面的推导中也可以得出我们希望找到一个 V ( θ ( D ) , θ ( G ) ) V(θ^{(D)},θ^{(G)}) V(θ(D),θ(G))对于生成器来说最小而对判别器来说最大,我们可以把它定义成一个寻找极大极小值的问题,公式如下所示:
我们可以用图形化的方法理解一下这个极大极小值的概念,一个很好的例子就是鞍点(saddle point),如下图所示,即在一个方向是函数的极大值点,而在另一个方向是函数的极小值点。
在上面公式的基础上,我们可以分别求出理想的判别器D*和生成器G*:
下面我们先来看一下如何求出理想的判别器,对于上述的D*,我们假定生成器G是固定的,令式子中的G(z)=x。推导如下:
我们现在的目标是希望寻找一个D使得V最大,我们希望对于积分中的项 f ( x ) = p d a t a ( x ) l o g D ( x ) + p g ( x ) l o g ( 1 − D ( x ) ) f(x)=p_{data}(x)logD(x)+p_g(x)log(1-D(x)) f(x)=p