生成对抗式网络
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生成对抗式网络相关的知识,希望对你有一定的参考价值。
本报告总结了 NIPS 上 Ian Goodfellow 的 生成式对抗网络课程。其内容有:(1)为何生成式建模是值得学习的话题;(2)生成式模型如何工作,GAN 与其他生成式模型的比较;(3)GAN 工作原理;(4)GAN 的研究前沿;(5)将 GAN 和其他方法组合的当前最优的图像模型。最后给出帮助读者学习的三个练习和相应的解答。
引言
本报告总结了 NIPS2016 上的生成对抗网络的课程。回答了很多之前的听众提出来的大多数问题,并尽可能地确保它对大家有用。当然,它不能算是 GAN 这个领域的完整的回顾;很多优秀的论文并没有得到展示,因为这些论文并不是针对大家提出来的这些问题的,而本课程是作为一个两个小时的演讲,所以也没有足够的时间来涉及所有话题。
本报告给出了:(1)为何生成式建模是一个值得研究的领域;(2)生成式模型如何工作,GAN 与其他的生成模型的对比(3)GAN 工作的细节(4)GAN 研究前沿和(5)组合 GAN 和其他方法得到了当前最优的图像模型。最后这个报告会包含三个练习及其解答。
而本课程的相关演示文档也可以获得,有 pdf 和 keynote 两种格式:http://www.iangoodfellow.com/slides/2016-12-04-NIPS.pdf 和 http://www.iangoodfellow.com/slides/2016-12-04-NIPS.key
课程视频是由 NIPS 录制的,过段时间应该能够看到。
生成式对抗网络是生成式模型的一种。“生成式模型”这个词有很多用法。本课程中,它表示任何一种可以接受训练集(从一个分布 pdata 采样的样本)学会表示该分布的估计的模型。其结果是一个概率分布 pmodel。有些时候,模型会显式地估计 pmodel,比如说图1所示。还有些时候,模型只能从 pmodel 中生成样本,比如说图2。有些模型能够同时这两件事情。虽说 GANs 经过设计可以做到这两点,我们这里把精力放在 GANs 样本生成上。
1 为何学习生成式建模?
大家有理由会想知道为何生成式模型值得学习,特别是那些只能够生成数据而不是能对密度函数进行估计的生成式模型。总而言之,当我们把它用在图像上是,这样的模型仅仅能够给出更多的图像,我们其实并不缺少图像啊。
下面给出几个学习和研究生成式模型的理由:
- 训练生成式模型和从生成式模型进行采样是我们表示和操纵高维概率分布的能力的特别好的检验。高维概率分布在很多的应用数学和工程领域都是举足轻重的研究对象。
- 生成式模型可以被以多种方式用在强化学习中。强化学习算法常常会被分类成两类:基于模型和免模型的,而基于模型的算法就是包含生成式模型的。时间序列数据的生成式模型可以被用来模型可能的未来。这样的模型可以被用来进行规划和多种方式的强化学习任务。用于规划的生成式模型可以学到在给定世界当前的状态和假设智能体会采取的行动作为输入时,关于世界的未来状态的条件分布。而智能体可以用不同的潜在行动来查询这个模型,选择模型预测为最可能从此行动得到想要的状态的行动。最近出来的这种模型例子是,Finn 等人的研究工作,而对把这个模型用于规划的例子就是 Finn 和 Levine 的研究工作。另一种生成式模型可以被用在强化学习上的方式是在一个想象的环境中进行学习,其中错误的行动不会给智能体带来真实的损失。生成式模型还可以通过追踪不同状态被访问的频率或者不同的行动被尝试的频率来指导探索,特别是 GANs,可以用在逆强化学习中,在第 5.6 节我们会讲其与强化学习的关联。
- 生成式模型可以用 missing 数据进行训练,并能够给出输入数据的 missing 部分。而 missing 数据的特别有趣的例子就是半监督学习(semi-supervised learning),其中很多(或者几乎所有)训练样本的标签都是丢失的。现代深度学习算法一般是要求有特别多的带标签样本才能够泛化得很好。半监督学习是降低样本标签的策略。这个学习算法可以通过研究大量无标签样本提升自己的泛化性能,而这些无标签样本是很容易获得的。生成式模型尤其是 GANs,能够很好地执行半监督学习算法。这个会在第 5.4 节介绍。
- 生成式模型尤其是 GANs,让机器学习能够更好地利用多模态输出。对很多任务,单个输入可能会对应不同的正确答案,这些答案中的每一个都是可以接受的。某些传统训练机器学习模型的方式,如最小化目标输出和模型预测输出的均方误差,并不能够训练出可以产生多个不同的正确答案的模型。这种场景的一个例子就是预测视频的下一帧,参见图 3。
- 最后,很多任务本质上都是需要某个分布中的采样的样本的。
我们在下面列举一些此类任务的例子:
- 单个图片超分辨率:这个任务的目标是以低分辨率图像为输入,合成高分辨率的相同内容的图片。生成式建模的作用就是让模型能够为图像加入原本就该属于输入的信息。有很多对应于低分辨图像的超分辨图像。这个模型应该选择一副采样自可能的图像的概率分布的图像。选择一幅是所有可能图像的平均图像可能会得到一个太过模糊的结果。参见图 4。
- 一些创作艺术的任务。两个近期项目表明生成式模型,尤其是 GANs,可以用于创建交互式程序来帮助用户创作对应于他们想象的粗线条场景的更加真实的图像。参见图 5 和图 6.
- 图像到图像的转换应用可以转换航摄照片成地图或者将线条转换为图像。有很多困难但是很有用的创造性的应用。参见图 7。
所有上面提到以及其他的生成式模型的应用都说明花时间和资源来提升生成式模型的性能是值得的。
2 生成式模型如何工作?比较 GANs 和其他生成式模型有何不同?
我们现在了解了生成式模型能做什么以及为何有必要来构建生成式模型。现在我们要问:生成式模型如何工作的?尤其是,相比于其他的生成式模型,GANs 如何工作?
2.1 最大似然估计(Maximum likelihood estimation)
为了简化讨论,我们先来看看通过最大似然原理进行的生成式模型。不是所有的生成式模型采用最大似然。一些生成式模型默认是不使用最大似然的,但是可以通过改动来使用(GANs 就落在这类)。如果忽略那些不使用最大释然,聚焦于一般不用最大似然的模型的最大似然版本的模型,我们可以去掉不同模型之间的一些让人格外分心的差异。
最大似然的基本想法是定义一个给出参数为 θ 的概率分布的估计的模型。然后将 似然(likelihood) 定义为模型分配给训练数据的概率
这个数据集包含 m 个样本 x(i)。
最大似然的原理实际上就是选择可以最大化训练数据的似然的模型参数。这在对数空间中很容易完成,我们可以将原来的乘积转化为求和。这样可以简化似然关于模型的导数的代数表达式,而且在用计算机实现的时候,也能够避免数值问题,比如说乘上几个很小的概率值的时候出现的下溢情形。
在(2)式中,我们用到了性质:对正数 v,有
由于对数函数是一个单调增函数,并不会概率最大值的位置。
在图 8 中我们给出最大似然过程的示例。
我们同样可以将最大似然估计看做是最小化生成概率分布和模型的 KL散度:
如果我们能够足够准确地做到此操作,那么若 pdata 处在分布 pmodel(x;θ) 族中,则模型能够准确地恢复 pdata。实践中,我们不能获取 pdata 本身,而仅仅是从pdata中采样出的 m 个样本的训练集。我们使用这些来定义 p^data,即将概率放在这 m 个点上的经验分布,来近似pdata。最小化 p^data 和 pmodel 之间的 KL 散度实际上就和最大化训练集的似然完全等价。
对最大似然和其他统计估计量更加详细的讨论参见 Goodfellow 等人深度学习书中第 5 章。
2.2 深度生成式模型的分类
如果我们将注意力放在通过最大化似然的深度生成式模型上,我们可以通过对比他们计算似然及其梯度或者近似这些量的方式来比较这几种模型。如前面提到的,这些模型中很多是不通过最大似然的原理进行的,但是我们可以检查这些模型的最大似然变体来减少这些方法之间的不同。所以按照这样的观点,我们构建了在图 9 中的分类。分类树的每个叶子都有其优缺点。GANs 为了避免这样缺点设计而成,但同时也引入一些新的缺点。
2.3 显式的密度模型
在分类树的左边分支是定义了显式的密度函数 pmodel(x;θ)。对这些模型,最大化似然是直接的;我们简单地将模型定义密度函数插入到似然函数的表达式中,然后使用梯度上升即可。
显式的密度模型引入的主要困难是设计一个可以刻画要被生成的数据所有复杂性的模型同时又能保持计算易解性。有两种不同的解决策略来解决这个问题:(1)精心设计模型来保证易解性,在 2.3.1 节会进行解释,(2)模型可以获得似然及其梯度的易解近似,在 2.3.2 节解释。
2.3.1 易解显式模型
在分类树最左的叶子上面的模型定义了一个显式的计算易解的密度函数。目前有两种方法来解决:全可见信念网络(Fully visible belief networks)和非线性独立成分分析(Non linear independent components analysis)。
全可见信念网络 全可见信念网络(Frey et al. 1996; Frey, 1998) 或者 FVBN 是使用概率链式法则将一个 n-维向量 x 分解为一维概率分布的乘积形式的概率分布:
FVBNs 是生成式建模的三个流行方法之一,另外两个是 GANs 和变分自编码器。他们形成了来自 DeepMind 复杂生成式模型(如 Wavenet,Oord et al., 2016)的基础。Wavenet 能够产生真实的人类语音。FVBNs 的主要缺点是样本必须每次产生一个:首先是 x1,然后是 x2
等等,所以生成一个样本的代价是 O(n)。在现代 FVBN 如 Wavenet 中,在每个 xi 上的分布用一个深度神经网络计算得出,所有这 n 个步骤需要特别大的计算量。而且,这些步骤不能并行。Wavenet 需要两分钟才能产生一秒的声音,不能进行交互式对话。GANs 设计为能够并行产生所有的 x,有着更好的生成速度。
非线性独立成分分析 另一类有着显式密度函数的深度生成式模型族是基于两个不同空间的连续、非线性变化的。例如,如果有一个隐含变量 z 向量和一个连续、可微分、可逆的变换 g 使得 g(z) 得到一个在 x 空间的模型产生的样本,那么
所以 px 易解当密度 pz 易解且g-1 Jacobian 行列式易解。换言之,在 z 上的简单的分布加上一个变换 g 可以用复杂方式来对空间进行变形可以产生一个 x 上的复杂分布,如果 g 设计得很巧妙,这个密度也会易解。使用非线性 g 函数的模型最早可以追溯到 Deco 和 Brauer(1995) 的工作。而这个族的最新成员是 real NVP(Dinh et al., 2016)。参见图 10中由 real NVP 生成的 ImageNet 样本。非线性 ICA 模型主要缺点是他们引入对函数 g 的限制。特别是,可逆性要求意味着隐含变量 z 必须有和 x 同样的维度。GANs 的设计思想就是减少这样的对 g 的限制,尤其是可以使用比 x 更大维度的 z。
如果想了解更多的关于用来定义 FVBN 的概率链式法则或者用来定义非线性 ICA 模型的概率密度函数的确定型变换的影响,请参考 Goodfellow et al. 书的第 3 章。
这里总结一下,定义了一个显式、易解密度函数的模型是非常有效的,因为他们可以直接在训练数据的对数似然上直接应用优化算法。然而,拥有易解密度的模型族其实很有限,不同的族也有相应不同的缺点。
2.3.2 需要近似的显式模型
为了避开由设计易解密度函数的要求带来的缺点,另外也有一些模型可以有显式的密度函数,这些函数是不易解的,需要使用近似来最大化似然。这些基本上被分为两个类别:使用确定型近似(一般就是指变分方法)和随机近似方法(Markov chain Monte Carlo,MCMC 方法)。
变分近似 变分方法定义了一个下界
最大化 L 的学习算法确保能够获得至少和其作用在 L 上一样高的似然值。对许多模型的族,即使在对数似然不是易解的情形下,可以定义一个 L 是计算易解的。目前,在深度生成式模型中变分学习最流行的方法就是 变分自编码器(Variational autoencoder)(Kingma, 2013;Rezende et al., 2014) 或者 简称 VAE。变分自编码器是最流行的三个深度生成式模型之一,除此之外就是 FVBNs 和 GANs。而变分方法的主要缺点就是,当近似后验分布太弱或者先验分布太弱,即使有一个完美的优化算法和无限的训练数据,L 和真实的似然之间的间隔会导致 pmodel 学到和真实的 pdata 不同的东西。GANs 被设计成无偏的,就是说在给定足够大的模型和无限数据的情况下,GAN 博弈的 Nash 均衡能够准确恢复 pdata。在实践中,变分方法通常能够获得非常好的似然,但是会产生低质量的样本。并没有一种好的方法来量化样本的质量,所以这其实是一个主观判断,不是实验事实。参见图 11 VAE 生成的样本。尽管很难指出 GAN 设计的一个方面说这是获得更好样本的起作用的部分,GANs 一般会生成更好的样本。对比 FVBNs,VAEs 是更难优化的,但是 GANs 并不是在这个方面做了优化,参考 Goodfellow 书的第 19 章。
实验中,高度灵活的先验或者灵活的近似后验的 VAEs 可以获得靠近他们自身对数似然 L 的值(Kingma et al., 2016; Chen et al., 2016)当然,这是测试目标和最大界的界之间的间隔。VAEs 能够得到与其他方面相差不多的似然,也就是说他们同样靠近目标的最大值。L. Dinh 和 D. Kingma 已经给出了一个猜想,模型族(Dinh et al., 2014; Rezende and
Mohamed, 2015; Kingma et al., 2016; Dinh et al., 2016) 可以用作 VAE 先验或者近似后验是通用近似子。如果这个被证明,就可以知道 VAEs 是渐进一致的。
Markov chain 近似 大多数深度学习算法使用某种形式的随机近似,至少是采用了使用小量随机选择的训练样本形成一个小批量来最小化期望损失函数。通常,基于采样的近似在有用的样本被快速采样(比如说,选择单个样本操作代价很小)并且只要这些样本方差也不高的情形下能够表现的很好。一些模型需要采取 Markov chain 来生成更加昂贵的样本。Markov chain 是一个通过重复采样样本 x‘~q(x‘|x) 来生成样本的过程。并根据变换算子 q来更新 x,Markov chain 方法可以保证 x 最终会收敛到一个来自 pmodel(x) 的样本。不幸的是,这个收敛过程会非常缓慢,也没有很好的方法来测试是否已经收敛,所以在实践中,通常会在其没有真正收敛到一个 pmodel 的样本时,过早使用 x。在高维空间中,Markov chain 更加低效。Botlzmann machiness (Fahlman et al., 1983; Ackley et al., 1985; Hinton et al., 1984; Hinton and
Sejnowski, 1986) 是依赖于 Markov chain 训练模型和生成样本的一类生成式模型。Botlzmann machines 在深度学习复兴的开始发挥了重要作用(Hinton et al., 2006; Hinton, 2007) 但是现在很少有人使用了,最大的原因是其依赖的 Markov chain 近似技术在 ImageNet 这样的问题上难以规模化。而且,即使 Markov chain 方法能够规模化很好用来训练,用其进行样本生成也有非常大的计算消耗,大家往往会选择单步生成方法。也是因为这样的原因,GANs 才设计成避免使用 Markov chain。对 Markov chain Monte Carlo 近似更详细的讨论参见 Goodfellow 书的第 18 章。在同一本书的第 20 章有对 Botlzmann machines 的介绍。
还有一些方法同时使用了变分和 Markov chain 近似。例如,深度 Boltzmann machine 用了这两个类型的近似(Salakhutdinov and Hinton, 2009).
2.4 隐式密度模型
有些模型可以不需要显式定义一个密度函数进行训练。这些模型给出了一种间接和pmodel进行交互的方式(通常是从中进行采样)训练模型。这些技术构成了图 9 中分类图的第二个分支。
一些基于从pmodel 进行采样的方式隐式模型定义了一个 Markov chain 转移算子,必须运行多次来从模型中获得一个样本。这个家族中的首个例子就是生成式随机网络(Generative stochastic network)(Bengio et al., 2014)。正如 2.3.2 节中讲的那样,Markov chain 常常不能规模化到高维空间中,而且在生成时也有过高的计算代价。GANs 就是针对这些问题进行设计的。
最后,最右边的叶子是单步生成样本的隐式模型族。在这个家族中,GANs 是唯一一个成员,但是后来也有了 Kernelized moment matching 这样的模型(Li et al., 2015; Dziugaite et al., 2015).
2.5 对比 GANs 和其他生成式模型
总结一下,GANs 针对其他生成式模型的缺点进行设计的:
- 他们可以并行生成样本,而不是随 x 的维度变化的运行时间。这是相对于 FVBN 的优点。
- 生成器函数的设计只有很少的限制。这个优点是对比于 Boltzmann machine 说的,因为很少概率分布能够给出易解的 Markov chain 采样,而相比较于非线性 ICA,则因为生成器必须是可逆的而且隐含编码 z 必须要和样本 x 有着同样的维度。
- 不需要 Markov chain。这相较于 Boltzman machines 和 GSNs
- 不需要有变分界,在 GANs 框架中可用的特定模型族已经证实是通用近似子,所以 GANs 其实是渐进一致的。某些 VAEs 被猜想是渐进一致的,但还没有被证实。
- 主观上判断 GANs 能够产生比其他方法更好的样本。
同时,GANs 也有新的缺点,训练 GANs 需要找到博弈的 Nash 均衡,这个其实是一个比优化目标函数更加困难的问题。
3 GANs 如何工作?
我们现在已经看过了几种其他的生成式模型,并解释了 GANs 与他们的不同原理。但是 GANs 是如何工作的呢?
3.1 GAN 框架
GANs 的基本思想是设置两个参与人的博弈。其中一个是生成器(generator)。生成器产生来自和训练样本一样的分布的样本。另外一个判别器(discriminator)。判别器检查这些样本来确定他们是真实的还是伪造的。判别器使用传统的监督学习技术进行训练,将输入分成两类(真实的或者伪造的)。生成器训练的目标就是欺骗判别器。我们可以将生成器当做一个伪钞制造者,而判别器是警察,想要找出伪钞。为了在这样的博弈中取胜,伪钞制造者必须学会制造出与真币相似的伪钞,生成器网络必须学会产生出和训练数据一致的分布的样本。图 12 解释了这个过程。
形式上看,GANs 是一种结构化概率模型(参看 Goodfellow 等人书的第 16 章)包含了隐含变量 z 和可观测变量 x。图结构在图 13 展示。
博弈中的两个参与人由两个函数表示,每个都是关于输入和参数可微分的。判别器是一个以 x 作为输入和使用 θ(D) 为参数的函数 D 定义。生成器由一个以 z 为输入使用 θ(G)为参数的函数 G 定义。
两个参与人有用两个参与人的参数定义的代价函数。判别器希望仅控制住 θ(D) 情形下最小化 J(D)( θ(D), θ(G))。生成器希望在仅控制 θ(D) 情形下最小化 J(G)( θ(D), θ(G))。因为每个参与人的代价依赖于其他参与人的参数,但是每个参与人不能控制别人的参数,这个场景其实更为接近一个博弈而非优化问题。优化问题的解是一个局部最小,这是参数空间的点其邻居有着不小于它的代价。而对一个博弈的解释一个纳什均衡。这里我们使用局部可微分 Nash 均衡这个术语。在这样的设定下,Nash 均衡是一个元组,( θ(D), θ(G)) 既是关于θ(D)的 J(D) 的局部最小值和也是关于θ(G)的 J(G) 局部最小值。
生成器 生成器是一个可微分函数 G。当 z 从某个简单的先验分布中采样出来时,G(z) 产生一个从 pmodel 中的样本 x。一般来说,深度神经网络可以用来表示 G。注意函数 G 的输入不需要和深度神经网络的第一层的输入相同;输入可能放在网络的任何地方。例如,我们可以将 z 划分成两个向量 z(1) 和 z(2),然后让 z(1) 作为神经网络的第一层的输入,将 z(2) 作为神经网络的最后一层的输入。如果 z(2) 是 Gaussian,这就使得 x 成为 z(1) 条件高斯。另外一个流行的策略是将噪声加到或者乘到隐含层或者将噪声拼接到神经网络的隐含层上。总之,我们看到其实对于生成式网络只有很少的限制。如果我们希望 pmodel 是 x 空间的支集(support),我们需要 z 的维度需要至少和 x 的维度一样大,而且 G 必须是可微分的,但是这些其实就是仅有的要求了。特别地,注意到使用非线性 ICA 方法的任何模型都可以成为一个 GAN 生成器网络。GANs 和变分自编码器的关系更加复杂一点;一方面 GAN 框架可以训练一些 VAE 不能的训练模型,反之亦然,但是两个框架也有很大的重合部分。 最为显著的差异是,如果采用标准的反向传播,VAEs 不能在生成器输入有离散变量,而 GANs 不能够在生成器的输出层有离散变量。
训练过程 训练过程包含同时随机梯度下降 simultaneous SGD。在每一步,会采样两个 minibatch:一个来自数据集的 x 的 minibatch 和一个从隐含变量的模型先验采样的 z 的 minibatch。然后两个梯度步骤同时进行:一个更新 θ(D) 来降低 J(D),另一个更新 θ(G) 来降低 J(G)。这两个步骤都可以使用你选择的基于梯度的优化算法。 Adam (Kingmaand Ba, 2014) 通常是一个好的选择。很多作者推荐其中某个参与人运行更多步骤,但是在 2016 年的年末,本文作者观点是最好的机制就是同时梯度下降,每个参与人都是一步。
3.2 代价函数
有几种不同的代价函数可以用在 GANs 框架中。
3.2.1 判别器的代价 J(D)
目前为 GANs 设计的所有不同的博弈针对判别器 J(D) 使用了同样的代价函数。他们仅仅是生成器 J(G) 的代价函数不同。
判别器的代价函数是:
这其实就是标准的训练一个 sigmoid 输出的标准的二分类器交叉熵代价。唯一的不同就是分类器在两个 minibatch 的数据上进行训练;一个来自数据集(其中的标签均是 1),另一个来自生成器(其标签均是 0)。
GAN 博弈的所有版本都期望判别器能够最小化(8)式。所有情况下,判别器有同样最优策略。读者现在可以尝试一下 7.1 节的练习并在 8.1 节可以考到给出的答案。这个练习展示了如何去推到最优的判别器策略并讨论了这个解的形式的重要性。
我们发现通过训练这个判别器,能够得到一个在每个点 x 对下面的比例的估计:
对其的估计可以让我们计算很多的散度和梯度。这其实是将 GANs 和变分自编码器和 Boltzmann machines 区分开的关键的近似技术。其他的深度生成式模型基于下界或者 Markov chain 进行近似;GANs 基于监督学习来估计两个密度的比例来进行近似。GANs 近似受到监督学习的影响:过匹配或者欠匹配。原则上讲,有最好的优化技术和足够多的训练数据,这些影响可以被克服。其他的模型使用不同的近似方法也有对应的缺点。
由于 GAN 框架可以被博弈论工具自然地分析,我们称 GANs “对抗”。但是我们同时也将其看做合作的,因为判别器估计密度之间的比例,然后自由地将这个信息分享给了生成器。从这一点看,判别器更加像是一名老师在教生成器如何提升效果。到目前为止,合作博弈的观点还没有产生特定的数学形式的变化。
3.2.2 Minimax
我们目前仅仅介绍了判别器的代价函数。而这个博弈需要的完整的说明包含对生成器的代价函数介绍。
最简单的博弈版本是零和博弈,其中所有参与人的代价总是 0。在这个版本的博弈中,
因为 J(G) 和 J(D) 直接捆绑,我们可以将整个博弈通过一个指定判别器收益的值函数来进行刻画:
Minimax 博弈由于其理论分析的便利,大家都比较喜欢。Goodfellow et al. (2014b) 使用这个 GAN 博弈变体展示了在这个博弈中的学习类似于最小化数据分布和模型分布 Jensen-Shannon 散度,当所有参与人的策略可以在函数空间直接进行更新时,这个博弈将收敛到均衡点。特别地,参与人由深度神经网络表示,更新则是在参数空间中,所以这些依赖于凸性(convexity)的结论不能应用。
3.2.3 启发式,非饱和博弈
在 minimax 博弈中用在生成器上的代价对理论分析很有用但是在实践中表现很糟糕。
最小化目标类和分类器预测的分布的交叉熵是很高效的,因为代价不会在分类器有错误的输出的时候饱和。最终代价会饱和到 0,但是仅仅是在分类器选择了正确的类标的情况下。
在 minimax 博弈中,判别器最小化交叉熵,但是生成器是最大化同一个交叉熵。这对于生成器是不利的,因为判别器成功地以高置信度反对生成器产生的样本时,生成器的梯度会消失。
为了解决这个问题,一种方式是继续使用交叉熵来最小化生成器。不过我们不是去改变判别器代价函数的正负号来获得生成器的代价。我们是将用来构造交叉熵代价的目标的正负号。所以,生成器的代价函数就是:
在 minimax 博弈中,生成器最小化判别器正确的对数概率。在这个博弈中,生成器最大化判别器错误的对数概率。
这个版本的博弈是启发式激发的想法,而非理论上的考量。而唯一的动机就是确保每个参与人在他要输掉博弈时有一个更强的梯度。
当然,这里已经不再是零和博弈了,所以不能被描述成一个单一值函数。
3.2.4 最大似然博弈
我们可能能够使用 GANs 进行最大似然学习,这就意味着可以最小化数据和模型之间的 KL 散度,见(4)。
在第 2 节中,为了简化模型之间的对比,我们提到 GANs 可以选择性地实现最大似然。
有很多中方式能够使用 GAN 框架来近似(4)式。 Goodfellow (2014) 使用下式:
其中 σ 是 logistic sigmoid 函数,等价于在假设判别式最优的情形下最小化(4)式。这个等价关系依照期望的形式成立;实践中,对 KL 散度进行随机梯度下降和GAN 训练过程由于通过采样(x 为最大似然而 z 为GANs)来构造期望梯度将会按照某个方差在真实的期望梯度附近。这个等价关系可以作为一个练习(参见 7.3 节练习,8.3 节答案)。
另外还有一些近似最大似然的方法。比如说 Nowozin et al. (2016).
3.2.5 选择散度是 GANs 的突出特点么?
作为我们讨论 GANs 如何工作的一部分,大家可能想知道什么让 GANs 能够产生更好的样本。
以前,很多人(包括作者本人)相信 GANs 能够产生清晰真实的图片是由于他们最小化了数据和模型之间的 Jensen-Shannon 散度而 VAEs 产生模糊的图片是其最小化 KL 散度 造成的。
KL 散度不是对称的;最小化 DKL(pdata || pmodel) 和 DKL(pmodel || pdata) 并不相同。最大似然估计执行的是前者,而最小化 Jensen-Shannon 散度某种程度上是后者。正如图 14 所示,后者可能会期望得到更好的样本因为使用这个散度训练的模型更倾向于生成仅仅来自训练分布的众数(mode)样本即使会忽略一些众数,而不是包含所有的众数但是生成不来自任何训练数据众数的一些样本。
某些更新的证据表明使用 Jensen-Shannon 散度并没有解释为何 GANs 得到更加清晰的图片:
- 3.2.4 节提到现在可以使用最大似然来训练 GANs 了。这些模型也能够产生清晰的样本,并且也选择了少量的众数。参见图 15.
- GANs 通常会从极少量的众数中选择生成;小于由模型容量带来的限制。逆 KL 倾向于生成和模型能够容纳的那么多的数据分布的众数;一般不会是更少的众数。这就意味着众数坍缩是由于散度之外的因素导致。
总之,GANs 由于训练过程的问题选择生成小量的众数,并不是选择最小化的散度导致。在 5.1.1 节会进行讨论。GANs 产生更加清晰的样本的原因还很模糊。可能是使用 GANs 训练的模型族和使用 VAEs 训练的模型族不同(例如,用 GANs 很容易使得模型的 x 有更加复杂的分布而不仅仅是一个各向同性 isotropic 高斯条件分布在生成器的输入上)可能是 GANs 的近似的类型有这个不同于其他框架使用的近似导致的效果。
3.2.6 代价函数的比对
我们可以讲生成式网络看成是一个特别的强化学习。不是被告知一个具体的输出 x 应该被关联上每个 z,生成器采取行动并接受奖励。特别是,注意到 J(G) 没有直接引用训练数据,所有关于训练数据的信息都仅是从判别器所学到的获得。(巧的是,这会让 GANs 不再害怕过匹配,因为生成器不能够直接复制训练样本)学习过程和传统的强化学习也有一点差异:
- 生成器能够同时观察奖励函数的输出和梯度
- 奖励函数不是静止的,奖励是基于学习生成器策略的变化的判别器的。
在所有的情形中,我们可以将采样过程看做是从一个特定 z 选择开始作为一个 可以获得奖励的 episode,而独立的行动对所有其他的 z 的值进行选择。给于生成器的奖励就是一个单个标量值的函数,D(G(z))。我们通常将这个用代价(负的代价)表示。生成器的代价总是在 D(G(z)) 中单调下降的,但是不同的博弈设计成让这个代价沿着曲线不同的部分下降更快。
图 16 展示了三个不同 GANs 的作为 D(G(z)) 函数的代价反应曲线。我们看到最大似然博弈结果是很高方差,大多数代价梯度来自很少的样本 z 对于那些更可能是真的样本。这个启发式设计的非饱和代价有低的样本方差,这就可能解释为何在实践中更加成功了。因为这表明方差降低技术可以成为一个提升 GANs 性能的重要的研究领域,特别是基于最大似然的 GANs。
3.3 DCGAN 架构
大多数 GANs 或多或少是基于 DCGAN 架构的 (Radford et al., 2015). DCGAN 全称“deep, convolution GAN”。尽管 GANs 在 DCGANs 前也是深的和卷积的,不过 DCGAN 就用来代表这一类风格的架构了。DCGAN 架构的关键点如下:
- 使用批规范化 Batch Normalisation,简称 BN (Ioffe and Szegedy, 2015) 层,在判别器和生成器中大多数层是 BN 的,有两个独立的 minibatch。生成器最后一层和判别器的第一层没有 BN,所以模型可以学到数据分布的正确的均值和尺度。参加图 17。
- 总体网络结构师从 all-convolutional net(Springenberg et al., 2015). 这个架构不含有 pooling 或者 unpooling 层。当生成器需要增加空间维度是,它使用了 stride 大于 1 的转置卷积。
- 使用 Adam 优化器而不是 SGD with momentum
在 DCGANs 前,LAPGANs 是唯一一个能规划化到高分辨率图像的 GAN。LAPGANs 需要一个多步骤生成过程,多个 GANs 产生在一个图像的 Laplacian 金字塔表示不同细节的层。DCGANs 是第一个学会单步生成高分辨率图像的 GAN。正如图 18 所示,DCGANs 在限制的图像领域能够产生高质量的图像,比如说卧室的图像。DCGANs 同样能够展示 GANs 学会以很多有意义的方式来使用他们的隐含编码,隐含空间中的简单的算术运算也有了语义上的意义,比如图 19 所示。
3.4 GANs 和 noise-contrastive 估计和最大似然有什么关联?
在理解 GANs 工作原理时,大家很自然地想了解他们和 noise contrastive estimation(NCE) (Gutmannand Hyvarinen, 2010)的关联。Minimax GANs 使用 NCE 的代价函数作为值函数,所以这两个方法看起来紧密关联。但实际上,他们学到的非常不同的东西,因为两个方法关注博弈中的不同参与人。粗略地说,NCE 的目标是学习判别器的密度模型,GANs 则是学习定义生成器的采样器。尽管这两个任务看起来在相近,其梯度完全不同。令人惊奇的是,最大似然是和 NCE 更为相近的,对应于进行一个用同样的值函数的 minimax 博弈,但是使用启发式更新策略而不是对参与人其中之一进行梯度下降。这个在图 20 中进行了总结。
4 建议和技巧
实践者们会使用一些提升 GANs 性能的技巧。我们很难去判断这些技巧会发挥什么样的作用了;很多技巧会在一些环境中有帮助但在另外一些环境中却又起到反作用。
NIPS 2016 同样包含一个关于对抗训练的 workshop,由 Soumith Chintala 给了称为“How to train a GAN”的邀请报告。这个报告和本文部分内容的目标类似,不过两者内容选择上有一定差异。想要了解本课程中没有的建议和技巧,请参考 GitHub 相关项目:https://github.com/soumith/ganhacks
4.1 带标签训练
以任意方式使用标签,形状或者形式总会给模型生成样本的主观判断的质量带来显著提升。这个首先由 Denton et al. (2015) 发现,他构建了一个 class-conditional GANs 相比自由生成任意类别的 GANs 能够生成更加好的样本。后来,Salimans et al. (2016) 发现即使生成器没有显式地利用类别信息也能让样本质量有所提升;训练这个判别器来识别真实对象的特定类别就足够了。
当然对这个技巧工作原理大家还不是完全清楚。可能是类别信息的引入给于训练过程有用的线索可以帮助优化。同时也可能是该技巧在样本质量上没有客观的提升,但是产生了一些样本在人类视觉系统关注的性质上的偏差。如果是后面这个情况,那么这个技巧并不会带来更好的数据产生分布模型,但是仍然对创造人类观众更享受的媒体有帮助,也可能帮助 RL 智能体执行依赖对环境的跟人类更相关的某些方面的知识的任务。
我们在比较不同结果时确保所有的情况都是在用这个技巧下进行的是非常重要的,利用标签训练的模型必须和同样使用标签训练的其他模型一起比较,class-conditional 模型也是要和其他 class-conditional 模型放在一起比较。否则就是不公平和没意思的 benchmark,因为这就像在图像任务上用一个卷积模型通常会超过非卷积模型一样。
4.2 单边标签平滑
GANs 在判别器估计两个密度的比例时工作,但是深度神经网络更易会产生高置信度的输出,输出的是正确的类别但是太极端的概率。这情况尤其在输入是对抗构造出来的时候格外常见;分类器倾向于线性 推断 extrapolate 并产生置信度特别高的预测(Goodfellow et al., 2014a)。
为了鼓励判别器估计出软一些的概率,我们可以采取一种称为单边标签平滑(Salimans et al., 2016)。
通常我们使用(8)公式来训练判别器。我们可以将其用 TensorFlow (Abadi et al., 2015)代码写出来:
d_on_data = discriminator_logits(data_minibatch)
d_on_samples = discriminator_logits(samples_minibatch)
loss = tf.nn.sigmoid_cross_entropy_with_logits(d_on_data, 1.) + tf.nn.sigmoid_cross_entropy_with_logits(d_on_samples, 0.)
单边标签平滑的想法是将真实样本的目标用一个稍微小于 1 的值代替,比如说 .9:
loss = tf.nn.sigmoid_cross_entropy_with_logits(d_on_data, .9) + \ tf.nn.sigmoid_cross_entropy_with_logits(d_on_samples, 0.)
这样会防止判别器的极端推断行为;如果它学会预测特别大的 logits 对应于一个达到 1 的概率,这样的方式能进行惩罚并鼓励将 logits 拉回到稍小的值。
不过对伪造样本的标签不需要平滑。假设我们对真实数据用一个 1-α 目标函数而伪造数据是 0+β 。那么最优的判别器函数就是
当 β 为 0 时,按照 α 去平滑并不会有什么影响,同时还降低了判别器的最优值的尺度。当 β 非 0 时,最优判别器函数的形状会变化。特别在 pdata(x) 非常小且 pmodel(x) 大一些的时候,D*(x) 会在 pmodel(x) 的伪造众数处有一个峰值。判别器将会在生成器中强化不正确的行为;生成器将会被训练成或者产生样本类似数据或者产生和其产生过的样本类似的样本。
单边标签平滑是一个更早的平滑标签技术的简单变化,可以追溯到 1980 年代。Szegedy et al. 2015 展示了标签平滑是一个在用于对象识别的卷积网络很好的正则化子 regularizer。这样的原因是它不会鼓励模型在训练集上选择不正确的类别,而仅会降低在正确类别的置信度。其他的正则化子如权重下降如果参数设置得过高通常会导致一些误分类的情况出现。Warde-Farley 和 Goodfellow (2016)揭示了标签平滑可以帮助降低对抗样本的影响,这表明标签平滑应该能帮助判别器更加有效地学会抵挡生成器的“进攻”。
4.3 虚拟批规范化 Virtual batch Normalisation
因为 DCGAN 的引入,大多数 GAN 架构包含了某种形式的 BN。BN 的主要作用是提升模型的优化,通过重参数化模型使得每个特征的均值和方差由和那个特征关联的单个均值参数和单个方差参数控制,而不是有一个复杂的由所有抽取特征的层的所有权重来确定。这个重参数化通过在一个 minibatch 上减去那个特征的均值并除上其标准差实现。规范化操作其实是模型的一部分,所有反向传播计算那些被定义为总是被规范化的特征的梯度。用这个方法,如果没有将规范化作为模型的一部分定义的话,特征频繁重规范化会降低效率。
BN 是很有用的,但是对 GANs 其实有一些不好的副作用。使用数据的不同的 minibatch 在每个训练步中计算规范化统计量会产生这些规范化常量的波动。当 minibatch 很小时(通常在尝试用有限的 GPU 内存来拟合大生成式模型的时候)这些波动会变得过大使得能够对生成的图像产生比输入 z 更大影响。参考图 21。
Salimans et al., (2016) 引入了技术来减轻这个问题。引用BN(Reference Batch Normalisation)运行网络两次:第一次在一个在训练开始时采样且不会被替换的 reference examples 的 minibatch 上,还有一个在当前要用来训练的 minibatch 上。每个特征的均值和标准差使用引用batch进行计算。每个 batch 的特征然后使用这些计算得到的统计量进行规范化。引用 BN 的缺点就是这个模型会对这个引用 batch 过匹配。为了稍微降低这个问题的影响,大家可以使用 virtual batch Normalisation,其中对每个样本的规范化统计量使用那个样本和引用 batch 的并集来计算。引用BN 和虚拟BN 独立处理,由生成器产生所有样本都是独立同分布的(除了那些定义了引用batch)。
4.4 我们能够保持 G 和 D 的平衡么?
很多人有一种直觉就是很有必要来平衡这两个参与人使得一方不要过强。如果这样的平衡是值得的并且易解,那么还没有一种有说服力的形式出现。
作者本人现在的相信 GANs 通过估计数据密度和模型密度的比例工作。这个比例仅会在判别器最优的时候被正确估计,所以对判别器来说超过生成器其实是很好的。
有时候生成器的梯度会在判别器太准确的时候消失。解决这个问题的正确方式是不去限制判别器的力量,但是可以使用参数化博弈使得梯度不会消失(参见 3.2.3 节)
有时候如果判别器置信度太高时生成器的梯度过大。与其让判别器准确度降低,更好的方式是使用单边标签平滑(4.2节)。
判别器应该总是最优来最好地估计比例意味着生成器训练每步则以 k > 1 步骤来训练判别器。实践中这种方式不一定有明显提升。
我们同样还能够通过选择模型大小来平衡生成器和判别器。实践中,判别器通常会更深,有时候有更多的过滤器。这个可能是因为对判别器来说正确估计两个密度之间的比值更加重要,但是也可能是众数坍缩问题——因为生成器在现在的训练方法下不能使出所有能力,实践者们也没看到提升生成器容量得到的好处。如果众数坍缩问题可以被解决,生成器的大小会增大。我们也不知道判别器的大小是否会按照比例同样增长。
以上是关于生成对抗式网络的主要内容,如果未能解决你的问题,请参考以下文章