训练与普遍挑战:为成功而GAN

一、评估

回顾一下第1章中伪造达・芬奇画作的类比。假设一个伪造者(生成器)正在试图模仿达・芬奇,想使这幅伪造的画被展览接收。伪造者要与艺术评论家(判别器)竞争,后者试图只接收真正的作品进入展览。如果你是那位伪造者,目的是伪造这位伟大艺术家的“遗失的作品”,以对达・芬奇风格的完美模仿欺骗艺术评论家,要如何评价自己的做得有多好呢?

GAN试图解决伪造者与艺术评论家之间水无止境的竞争问题。考虑到生成器通常比判别器更受关注,考虑它的评估时应该格外仔细。但是要如何量化一个伟大画家的风格,或者说如何模仿他呢?以及如何才能量化生成作品的整体质量?

1. 评估框架

首选解决方案是拥有达・芬奇用他的风格画出的所有可能的作品,然后看看用GAN生成的图像会不会在这个收藏集中。可以将此过程视为最大化最大似然的非近似版本。事实上,我们已经知道一个图像是否在该集合中,因此不涉及任何可能性。这种解决方案在实际中是水远不可能实现的。

次优的解决方案是评估图像并指出对应要检查的地方,然后合计所有错误或伪造的画的数量。这样局限性很大,而且最终总是需要人类评论家来审查作品。从根本上讲,这种解决方案尽管可能是次优的,但也是不可大规模使用的。

要用一种统计方法来评估生成样本的质量,这样可以扩大评估规模并可在实验中使用。如果没有一个易于计算的度量标准,也就无法监控进展。想象一下,循环中每次超参数初始化时,测量或者反向传播都需要人为调整——这对于评估不同的实验尤其是一个问题。GAN对超参数非常敏感,从而让这个问题更为致命。因此,如果没有统计指标会非常困难,每次要评估训练质量时都必须人为核对。

那为什么不能直接用已经了解的方法(如最大似然)作为指标呢?最大似然是统计的放法,可以度量一些模糊的期望,而且不管怎样都能从中得到隐式的结果。尽管如此,最大似然还是很难使用,因为要对基础分布及其可能性进行正确的估计,这可能意味着要处理数十亿图像。即使只有一个好的样本一一我们从训练集中获得的有效内容,也有理由想要得到超越最大似然的效果。

最大似然还存在什么问题呢?它可是许多机器学习研究中固定使用的指标。最大似然具有许多期望性质,但正如上文所说,将其用于GAN的评估并不容易。

此外,实际中,最大似然近似容易过度泛化,因此生成的样本由于太过多样化而显得不真实。使用最大似然可能会生成在现实世界中永远不会出现的样本,例如有多个头的狗或者只长着几十只眼睛却没有身体的长颈鹿。因为不希望GAN的“暴力生成”给任何人带来噩梦,所以应该使用损失函数和/或评估方法,淘汰“过于泛化”的样本。

考虑过度泛化的另一种方法是从伪数据和真实数据的概率分布开始,看看距离函数(一种测量真假图像分布之间距离的方法)在概率质量为0的情况下的作用。如果这些样本之间没有太大的差异,那么因这些样本过度泛化而造成的额外损失可能很小,例如,除了几个关键问题(如多个头),这些模式都接近真实数据。根据真实数据生成的不应该有一头牛有多个头的样本,但是一个过度泛化的度量标准允许创建这样的样本。

这就是为什么研究人员认为需要不同的评估原则,即使我们切实在做的事一直是使可能性最大化,只是以不同的方式对其进行衡量而已。稍后讲到的KL散度和JS散度也是基于最大似然的,因此这里可以将它们视为可互换的。

我们必须评估样本,但是又不能简单地使用最大似然。接下来将讨论用于统计评估生成样本质量的两个最常用且公认的度量标准: Inception Score(IS)Frechet Inception Distance(FID)。这两个指标的优点在于,它们已被广泛证实与至少某些期望性质(如图像的视觉吸引力或真实感)高度相关。IS完全是基于“样本应该是可识别的”这一理念设计的,但也被证明与人类对真实图像构成的直觉有关。

2. IS

显然,我们需要一种好的统计评估方法。让我们从理想的评估方法所要达到的高层次要求开始。

  1. 生成的样本要看起来像真实的可分辨的东西,如桶或奶牛。样本不但要看起来通真,而且要是数据集中的物品。此外,分类器确信它看到的就是它识别成的物品。幸运的是,我们已经有了计算机视觉分类器,它能够将图像分类为某个特定类别,并具有一定的可信度。IS本身就是以其中的一个分类器——以 Inception网络命名的。
  2. 生成的样本是多种多样的,并且理想情况下应该包含原始数据集中表示的所有类别。这一点也很重要,生成的样本应该是训练数据集的代表。如果生成 MNIST数据集的GAN始终不能生成数字8,则说明它不是一个好的生成模型。不应该存在类间模式崩溃( interclassmode collapse)。

虽然我们可能会对生成模型还有更多的要求,但这是一个良好的开端。

IS最初出现在2016年的一篇论文中,该论文对IS进行了全面的验证,证实它确实与人类对高质量样品构成的直觉有关。此后,这个指标在GAN研究界流行起来。

我们已经解释了为什么要使用这一指标。现在深入了解一下技术细节,计算IS的过程很简单:

  1. 采用真实分布和生成分布之间的 Kullback- Leibler(KL)差异。
  2. 对第1步的结果求指数。

举个例子:辅助分类器生成对抗网络( Auxiliary Classifier GAN, ACGAN)的失效模式,我们试图从 ImageNet3数据集中生成雏菊样本。当在以下ACGAN失效模式下运行Inception网络时,会看到下图所示的内容。你得到的结果可能会与此有些差异,这取决于操作系统、TensorFlow版本和实施细节。

这里要注意的重点是, Inception分类器不确定它在看什么,尤其是在前3个类别中。人们会觉得它可能是一朵花,但就连我们也不确定。对预测的总体信心(指数)也很低(分数总和应为1.00)。这是一个IS较低的例子,它符合本节开始的两个要求。因此这一探索指标的过程是成功的,因为它符合我们的直觉。

3. FID

下一个要解决的问题是样本多样性的缺乏。通常,GAN只能学习到每个类别中的一小部分图像。2017年,有人提出了一个新的解决方案: Frechet Inception Distance(FID)。FID通过提高对噪声的鲁棒性检测类内( intraclass)样本遗漏来改进IS。

这是很重要的,如果接受IS基准,那么仅生成一种类型的图像。从技术上来说,这已经满足了能生成此类别的要求。但是,假如想创建猫咪生成算法,这实际上并不是我们想要的(比如,有多个品种的猫的样本)。此外,我们还希望GAN可以从不同角度输出代表猫的样本,并且通常是明显不同的图像。

我们同样不希望GAN只是简单地记住图像。幸运的是,这个问题容易检测——查看像素空间中图像之间的距离即可,如下图所示。(GAN主要通过记忆样本获取模式,这也产生了不良结果;表明GAN并未学到很多有用的信息,很可能不会泛化。证据就在图中:前两排是重复的样本;最后一排是中间那排在训练集中最近邻的样本。请注意,由于GAN设置的分辨率较低,显示这些样本的分辨率非常低)FID的技术实现也很复杂,但背后的高级想法是我们正在寻找一个样本的生成分布,使得为了确保生成分布与真实分布相似而必须进行的修改最小化

FID是通过Inception网络运行图像来计算的。在实际应用中,我们比较的是中间表示(特征图或层)而不是最终输出(换句话说,是嵌入它们)。更具体地说,计算嵌入均值的距离、方差和两个分布(真实分布和生成分布)的协方差。

为了从图像中抽象出来,如果我们有一个包含一些容易理解的分类器的域,就可以使用它们的预测来衡量特定样本看起来是否真实。总而言之,FID是一种从人类评估者那里抽象出来的方法,它可以根据分布进行统计推理,甚至可以用于诸如图像的真实感这样难以量化的事物。

这一指标实在是太新了,因此我们仍然有必要拭目以待,看看以后的论文会不会发现它的缺陷。但考虑到已经有很多知名的学者开始使用这个指标,本章便将其包括在内了。

二、训练中的挑战

训练GAN可能很复杂,我们将在本节介绍最优方法,但仅给出高级的、易于理解的解释。

下面列举了一些训练中的主要问题。

  1. 模式崩溃。在模式崩溃中,某些模式(如某些类)在生成的样本中没有很好地表示出来。即使真实数据分布中有样本分布在这一部分,该模式也崩溃了。例如,MNIST数据集没有生成数字8。注意,即使网络已经收敛,模式崩溃也可能发生。我们在解释IS时已经讨论了类间模式崩溃,在解释FID时讨论了类内模式崩溃。
  2. 收敛速度慢。这是GAN在GAN和无监督场景下的一个大问题。在这种情况下,收敛速度和可用的计算资源是主要的限制;而在监督学习中,可用的标记数据通常是首要障碍。有些人认为,未来的人工智能竞赛的决定因素将会是计算力,而不是数据。此外,每个人都希望不出几天的训练就能快速得到模型。
  3. 过度泛化。我们特别讨论一下不应该得到支持(不应该存在)的模式(潜在数据样本),例如,一头牛有多个身体但只有一个头,或者只有一个身体但有多个头。当GAN过度泛化并学习到基于真实数据不应该存在的事物时,这种情况就会发生。

注意,模式崩溃和过度泛化有时可以通过重新初始化算法来简单地解决,但这样的算法是脆弱的。上面列出的问题大致提出了两个关键指标:速度和质量。即便是两个指标,它们也是相似的,许多训练最终都专注于更快地消除真实分布和生成分布之间的差距。

那么该如何解决呢?在GAN训练方面,下列几种技术可用于改善训练过程。

  1. 增加网络深度。
  2. 更改网络设置。
    • 原始论文提出的最小—最大(Min-Max)设计和停止判则。
    • 原始论文提出的非饱和(Non- Saturating)设计和停止判则
    • 最近的改进——沃斯坦生成对抗网络( Wasserstein GAN)
  3. 其他一些的训练技巧。
    • 归一化输入
    • 梯度惩罚。
    • 多训练判别器。
    • 避免稀疏梯度。
    • 使用平滑和带噪声的标签。

1. 增加网络深度

与许多机器学习算法一样,最简单的使学习更稳定的方法是降低复杂性。如果可以从简单的算法开始并逐步地增加复杂性,则训练过程可以更稳定收敛更快,并且还有潜在的其他好处。

我们可以使用简单的生成器和判别器来快速实现稳定性,然后在训练时增加复杂性,正如在GAN论文中所解释的那样。论文中提到, NVIDIA的研究者逐步扩大这两个网络,在每个训练周期结束时将生成器的输出大小加倍,判别器的输入也加倍。我们从两个简单的网络开始训练,直到获得良好的性能。

这样可确保不是从一个比初始输入大几个数量级的巨大参数空间开始,而是从生成一个4像素×4像素的图像开始,在将输出大小加倍之前操控这个参数空间。重复此操作,直到获得大小为1024像素×1024像素的图像。

看看效果多么令人印象深刻——下图中的两幅图都是生成的。现在,我们已经超越了自编码器生成的64像素×64像素的模糊图像。

这种方法具有以下优点:稳定、训练速度快,最重要的是生成样本的质量好、尺寸大。在实验中一定要用这种方法的原因还包括这种技术几平可以应用于任何类型的GAN。

2. 游戏设置

思考GAN的双方博弃本质的一种方法是,想象正在玩围棋游戏或其他可能在任何时候结束的棋盘游戏,比如国际象棋(并将其分为策略网络和价值网络)。作为一名玩家,你不仅需要了解游戏的目的和两个玩家都想达成的目标,还需要了解你离胜利有多近。因此,要有规则并且有距离(胜利)指标,如丢失的棋子数量。

但正如并非每一个棋盘游戏的胜利指标都适用于其他游戏一样,某些GAN胜利指标距离或散度一一往往用于特定的游戏设置。我们有必要分别研究每个损失函数(胜利指标)和玩家动态(游戏设置)。

3. 最小—最大GAN

我们可以从游戏理论的角度思考GAN的设置,这种假设下有两个玩家都在试图超越对手2014年的原始论文也提到游戏有两个版本。原则上,更易理解且理论上更有根据的方法正是现在所描述的:仅将GAN问题视为一个最小一最大min-max)博弃。下式描述了判别器的损失函数。

\[\text{J}^D = E_{x\sim p_r}log[D(x)] + E_{z\sim p_g}log[1 - D(G(z))]\qquad\qquad\qquad(式5.1)
\]

Es代表对x(真实数据分布)或z(潜在空间)的期望,D代表判别器的函数(将图像映射到概率),G代表生成器的函数(将潜在向量映射到图像)。任何二元分类问题都应该熟悉这第一个方程。如果给一定的自由并摆脱复杂性,则可以把这个方程改写为

\[\text{J}^D = D(x) - D(G(z)), for D(x), D(G(z))\in[0, 1]\qquad\qquad\qquad(式5.2)
\]

这说明判别器正在尝试最大程度地减少将真实样本误认为是伪样本(第一部分)或将伪样本误认为是真实样本(第二部分)的可能性。

现在我们将注意力转向式5.2中生成器的损失函数。

\[\text{J}^G = -\text{J}^D
\]

因为只有两方起作用且它们彼此竞争,所以有理由认为生成器的损失对判别器来说是负损失。

将它们放在一起:有两个损失函数,而且一个是另一个的负值。这样对抗性就很明显了,生成器试图比判别器更聪明。至于判别器,请记住它是一个二元分类器,只输出一个数字(而不是两类),因此它会因其可信度或缺乏可信度而受到惩罚。剩下的只是一些花哨的数学运算,这些运算证明了一些很好的性质,例如JS散度的渐近一致性。

前面已经解释了通常不用最大似然的原因。我们使用如KL散度和JS散度以及最近的推土机距离(也称为 Wasserstein距离)来代替。所有这些散度均有助于理解真实分布与生成分布之间的差异。JS散度度量了两个概率分布的相似度,它是基于KL散度的变体,解决了KL散度非对称的问题。一般来说,JS散度是对称的

定义:JS散度(JSD)是KL散度的对称版本。\(若KL(p,q)!=KL(q,p),则有JSD(p,q)=JSD(q,p)\)

KL散度和JS散度通常被视为GAN最终在试图最小化的东西。这两种都是距离指标,有助于理解高维空间中两种分布的差异。一些精巧的证明将这些散度与GAN的min-max版本联系起来了。

最小一最大GAN(MM-GAN)用于给出良好的理论解释,除此之外通常不在实际中使用。它是理解GAN的一个简洁的理论框架:既是一个博弈论的概念(源于两个网络玩家之间的竞争本质),又是一个信息论的概念。除此之外,MM-GAN通常没有任何优势,接下来的两种结构更为典型。

4. 非饱和GAN

在实际应用中,我们经常发现 MM-GAN会带来很多问题,例如判别器收效缓慢。GAN的原始论文提出了一种替代方法:非饱和GAN( Non-Saturating GAN,NS-GAN)。在这一版本中,没有让两个损失函数成为彼此的直接竞争对手,而是使两个损失函数相互独立,如式5.3所示,但在方向上与原始公式(式5.2)一致。

同样让我们专注于一个一般性的解释:这两个损失函数不再直接相互抵消。但是在式5.3中,可以看到生成器正在试图最小化方程式5.4中判別器第二项的相反项,它试图让它所生成的样本不被发现(是假的)。

\[\text{J}^G = E_{z\sim p_g}log[D(G(z))]\qquad\qquad\qquad (式5.3)
\]
\[\text{J}^D = E_{x\sim p_r}log[D(x)]+E_{z\sim p_g}log[1-D(G(z))]\qquad\qquad\qquad (式5.4)
\]

从直观上看,判別器与之前完全相同——式5.1和式5.4相同,但是式5.2的等价形式已经变了。使用NS-GAN的主要原因是在 MM-GAN的情况下,梯度很容易饱和到接近0,这种情况下,反向传播的权重更新为0或很小,从而导致收敛缓慢。下图能更清晰地展示这点。(y轴是生成器的损失函数,而D(G(z))是判别器对生成样本可能性的“猜测”。可以看到, Minimax(MM)保持平坦状态的时间过长,给生成器的信息太少——梯度消失了)

可以看到在0.0附近,最大似然和MM-GAN的梯度都接近于0,这是很多早期训练发生的地方:而NS-GAN在0.0附近的梯度要高得多,所以训练在一开始就进行得更快。

对NS变体为什么会收敛到纳什均衡,没有很好的理论解释。实际上,由于NS-GAN是启发性的,因此使用这种形式不再提供过去获得的简洁的数学保证。由于GAN问题的复杂性,即使用NS-GAN训练,也有可能完全不收敛,尽管经验证明它表现得比MM-GAN更好。

但是这种可怕的牺牲带来了性能的显著提升。NS方法的优点不但在于初始训练更快,而且由于生成器学习得更快,判别器也学习得更快。这正是我们所期待的,(几乎)所有人在计算和时间上的预算都很紧,当然学习得越快越好。有人认为,在使用固定的计算力时,NS-GAN仍没有被超越,甚至 Wasserstein GAN也不能说是一个比它更好的架构。

5. 何时停止训练

严格地说,NS-GAN不再与JS散度渐近一致,且具有理论上更加难以解释的平衡状态。

第一点很重要,因为JS散度是一个有意义的工具,它可以解释为什么隐式生成分布应该完全收敛到真实分布,并从原则上给出了停止训练的标准。但是在实际中,这几乎毫无意义,因为永远无法验证真实分布和生成分布何时收敛。人们一般通过每隔几次迭代査看生成的样本来决定何时停止。最近,有些人开始考虑通过FID、IS或不太流行的分段 Wasserstein距离来定义停止标准。

第二点也很重要,因为不稳定显然会导致训练出现问题。一个更重要的问题是知道何时停止。GAN问题的两个原始公式从来没有给出在实际中完成训练的明确条件。原则上总是说一旦达到纳什均衡训练就完成了,但实践中这又很难验证,因为高维性使得均衡难以证明。如果绘制生成器和盘别器的损失函数,它们通常会随处乱跳。这很容易解释,因为它们互相竞争,如果一个变得更好,另一个损失就会更大。因此,仅通过观察两个损失函数还不能知道何时真正完成了训练。

NS-GAN的拥护者们声称,NS-GAN仍然比 Wasserstein GAN快得多。因此,NS-GAN或许可以通过更快地运行来克服这些限制。

6. WGAN

最近,GAN训练的新发展迅速在学术界流行起来: Wasserstein GAN(WGAN)。现在几乎所有主要学术论文和从业人员都会提到它。归根结底,WGAN之所以重要,有以下3个原因。

  1. 它显著改进了损失函数,使得损失函数现在可以解释并提供了更清晰的停止标准。
  2. 根据经验,WGAN往往可以得到更好的结果
  3. 与许多对GAN的研究不同,WGAN从损失开始就有明确的理论支持,还表明我们试图估计的KL散度在理论上和实践上最终都是不合理的,并在此基础上提出了一种较好的损失函数来解决这一问题。

第一点的重要性在第5节中已经相当明显。由于生成器和判别器之间的竞争性质,没有个明确的停止训练的时间点。WGAN使用推土机距离( earth movers distance)作为损失函数,该函数与生成样本的视觉质量明显相关。第二点和第三点的好处是显而易见的——我们当然希望拥有更高质量的样本和更好的理论基础。

这是怎么实现的?让我们先来详细看看判别器或者说批评家(critic)的 Wasserstein损失,如式5.5所示。

\[maxE_{x\sim P_r}[f_w(x)]-E_{z\sim p(z)}[f_w(g_\theta(z))]\qquad\qquad\qquad(式5.5)
\]

该方程式与之前看到的类似(作为方程式5.1的高级简化),但有一些重要的区别。公式中有函数\(f_w\),它充当判别器。判别器试图估计推土机距离,并在函数的不同(有效)参数下,寻求真实分布(第一项)与生成分布(第二项)之间的最大差异。现在只是简单地测量差异,判别器试图让生成器的处境变得最困难——通过查看在共享空间中使用\(f_w\)的不同投影,来最大化生成器必须移动的概率量。

式5.6展示了生成器,它现在必须包括推土机距离。

\[minE_{x\sim P_r}[f_w(x)]-E_{z\sim p(z)}[f_w(g_\theta(z))]\qquad\qquad\qquad(式5.6)
\]

在此公式中,我们试图最小化真实分布的期望与生成分布的期望之间的距离。介绍WGAN的论文很复杂,但它的要点是\(f_w\)是满足技术约束的函数。

注意:\(f_w\)满足的技术约束为\(1-Lipschitz\):\(对于所有x1, x2:|f(x)_1-f(x)_2|\le|x_1 - x_2|\)​。

生成器试图解决的问题与之前类似,在这里更详细地介绍一下:

  1. 从真实分布(\(x\sim P_r\))或生成分布\(x^*(g_\theta(z)), 其中Z\sim p(z)\)中提取x。
  2. 生成样本是从z(潜在空间)中采样,通过\(g_\theta\)进行变换以在同一空间中获得样本(\(x^*\)),然后使用\(f_w\)进行评估。
  3. 试图最小化损失函数或距离函数,本例中是推土机距离。实际的数是用推土机距离计算出来的。

设置也很好,因为有一个更容易理解的损失(例如,没有对数)。我们还有更多可调的训练,因为在WGAN中必须设置一个裁剪常数( clipping constant),其作用类似于标准机器学习中的学习率。这为我们提供了一个额外的参数来调参,但是如果GAN架构对它非常敏感的话,就可能是一把双刃剑。在不深入研究数学的情况下,WGAN有如下两个实际意义。

  1. 有更清晰的停止标准,因为该GAN已被后来许多论文所验证,它们显示了判别器损失与感知质量之间的相关性。可以简单地测量 Wasserstein距离,这有助于告知何时停止训练。
  2. 可以训练WGAN直至收敛。这是相关的,因为有meta-review论文表明,使用JS损失和真实分布中生成器之间的差异来衡量训练进度通常是没有意义的。换言之,在国际象棋中有时需要输掉几个回合,暂时表现变差,以便在几次迭代中学习并最终做得更好。

这听起来像魔术,部分是因为WGAN使用的距离指标与迄今为止遇到的任何指标都不同。这个距离指标被称为推土机距离或 Wasserstein距离,其背后的想法很聪明。有两种高维分布:真实的数据分布(我们从未完全看到)和来自生成器的样本分布(假的)。试想一下,即使是32×32RGB(×3×256像素值)图像的样本空间会有多巨大。现在把这两个分布的概率质量都想象成两组山丘。

想象一下,我们必须把代表概率质量的所有土从假分布中移走,以使它看起来与真实分布完全相同,或者至少与我们所看到的类似。就好比你的邻居有一个超酷的沙堡,而你有很多沙子,并试图做出完全一样的沙堡。需要花费多少工夫オ能做得惟妙性肖?

使用 Wasserstein距离的近似形式,我们可以评估离生成看起来像来自真实分布的样本有多近。为什么是近似?因为从来没有看到过真实的数据分布,所以很难计算出确切的推土机距离。

推土机距离具有比JS散度或KL散度更好的性能,并且已经在WGAN的基础上有了重要的贡献,同时也验证了它的卓越性能。尽管在某些情况下,WGAN并没有完全胜过其他所有GAN,但它至少在任何情况下都表现得一样好。

总的来说,WGAN(或其梯度惩罚版本,WGAN-GP)得到了广泛的使用,并已经成为GAN的研究和实际应用中的行业标准一一尽管NS-GAN不应那么快被遗忘。如果你看到一篇新论文没有将WGAN作为比较的基准之一并且没有充分理由时,那就要当心了!

三、总结游戏设置

我们已经介绍了GAN结构的3个核心版本:最小ー最大GAN、非饱和GAN和WGAN。每篇论文的开头都会提到其中一个版本,你至少应该知道论文是使用原始的版本(更容易解释,但在实践中效果不佳),还是非饱和版本(失去了很多数学上的保证,但效果要好得多)还是更新的 Wasserstein版本(既具有理论基础,又具有出色的性能)。

下表列出了NS-GAN、WGAN甚至改进的WGAN-GP的公式。为完整起见,我们将WGAN-GP也列入表中,因为这3个都是学术和行业的首选。

名称 公式 注释
NS-GAN \(\begin{array}{l}L_{D}^{N S}=E[\log (D(x))]+E[\log (1-D(G(z)))] \\L_{G}^{N S}=E[\log (D(G(z)))]\end{array}\)​ 这是原始公式之一,除非作为基础模块或比较,通常不在实践中使用。这是一个和上文介绍的NS-GAN等价的公式,只是没有常数,它们实际上是等价的
WGAN \(\begin{array}{l}L_{D}^{W A N}=E[D(x)]-E[D(G(z))] \\L_{G}^{W A N}=E[D(G(z))]\end{array}\) 这是有着简化损失的WGAN,它似乎为GAN创造了一个新的范例,上文把这个方程更详细地解释为式5.5
WGAN-GP \(\begin{array}{l}L_{D}^{W A N-G P}=E[D(x)]-E[D(G(z))]+\text { GPterm } \\L_{G}^{W A N-G P}=E[D(G(z))]\end{array}\) 这是具有梯度惩罚(GP)GAN的例子。WGAN-GP通常有最好的结果。在本章中还没有详细讨论WGAN-GP:为了完整起见,我们将其包含在这里

四、训练技巧

1. 输入的归一化

根据几乎所有机器学习资源,包括Chintala的清单,将图像归一化在-1和1之间通常情况下是一个好主意。之所以进行归一化操作,是因为计算更容易处理,机器学习的其余情况也是如此。考虑到对输入的这种限制,最好使用tanh激活函数来限制生成器的最终输出。

2. 批归一化

对批归一化化的看法变化为:最初批归一化被认为是一种非常成功的技术;但最近研究表明,它有时会产生不好的结果,特别是在生成器中,但在判别器中,大多对提升结果有帮助。

3. 梯度惩罚

此训练技巧基于Chintala列表中的第10点,根据直觉,如果梯度的范数过高,就会出现问题。即使在今天,BigGAN之类的网络也在这一领域进行创新。

但技术问题仍然存在,简单的加权裁剪可能会产生其他深度学习中已知的梯度消失或爆炸问题。我们可以限制判别器输出相对于其输入的梯度范数。换言之,如果稍微改变输入内容,更新后的权重也不应该会有太大变化。这在WGAN结构中尤其重要,也可以应用在其他地方。许多论文都以某种形式使用了这一技巧。

4. 对判别器进行更多的训练

最近,对判别器进行更多的训练是一种成功的方法。在Chintala的原始列表中,这种方法被标记为效果不确定,因此请谨慎使用。这里主要有两种方法:

  1. 在生成器有机会生成任何样本之前对判别器进行预训练。
  2. 每个训练周期更多次地更新判别器,通常,判别器权重更新5次,生成器才更新1次。

5. 避免稀疏梯度

从直觉上讲,稀疏梯度(如ReLU或 MaxPool生成的梯度)会增加训练难度是有道理的原因如下。

  1. 直觉,尤其是平均池化,这样说可能会令人困惑,但请这样思考:如果使用标准的最大池化,那么将会失去除了卷积的感受野中的最大值以外的所有值,这使得在DCGAN的情况下使用转置卷积来恢复信息变得更加困难。使用平均池化至少可以知道平均值是多少,但它仍然不是完美——我们仍在丢失信息,但至少比以前少了,因为平均值比简单的最大值更具代表性。
  2. 如果使用ReLU激活,则会导致另一个问題——信息损失。解决此问题的一种方法是应用此操作时考虑丢失了多少信息,因为稍后可能需要恢复它。回想一下,ReLU(x)只是max(0,x),这意味着对于所有负值来说所有信息都会永远丢失。如果能确保把负数区域的信息留到以后处理并标记这些信息是不同的,就可以保留所有这些信息。

幸运的是,对于这两种问题,都有简单的解决方案:可以使用 LeakyReLU激活函数(例如对于x<0而言是0.1x,对于x≥0而言是x),平均池化也可以解决很多这些问题。还有其他激活函数(例如 sigmoid、ELU和tanh),但是人们最常用的是LeakyReLU激活函数。

注意LeakyReLU函数的值可以是任何实数,通常为0<x<1。

总的来说,我们试图最小化信息损失,并使信息流尽可能地合乎逻辑,而不是要求GAN以某种奇怪的方式反向传播错误,在这种情况下,它还必须学习映射。

6. 平滑和带噪声的标签

研究人员使用多种方法来给标签添加噪声或使其平滑。lan Goodfellow推荐使用单边标签平滑(例如,以0和0.9作为二元标签),但一般来说,增加噪声或裁剪似乎是个好主意。

五、总结

  1. 能够使训练更快的技巧如下

    • 归一化输入,这是机器学习中的标准做法。
    • 使用梯度惩罚令训练更具稳定性。
    • 预训练鉴别器可以提供良好的生成器,这样会为生成的样本设置更高的标准。
    • 避免稀疏梯度,因为它们会丢失太多信息。
    • 使用平滑和带有噪声的标签,而不是典型的二分类标签。

GAN实战笔记——第五章训练与普遍挑战:为成功而GAN的更多相关文章

  1. GAN实战笔记——第四章深度卷积生成对抗网络(DCGAN)

    深度卷积生成对抗网络(DCGAN) 我们在第3章实现了一个GAN,其生成器和判别器是具有单个隐藏层的简单前馈神经网络.尽管很简单,但GAN的生成器充分训练后得到的手写数字图像的真实性有些还是很具说服力 ...

  2. GAN实战笔记——第三章第一个GAN模型:生成手写数字

    第一个GAN模型-生成手写数字 一.GAN的基础:对抗训练 形式上,生成器和判别器由可微函数表示如神经网络,他们都有自己的代价函数.这两个网络是利用判别器的损失记性反向传播训练.判别器努力使真实样本输 ...

  3. GAN实战笔记——第六章渐进式增长生成对抗网络(PGGAN)

    渐进式增长生成对抗网络(PGGAN) 使用 TensorFlow和 TensorFlow Hub( TFHUB)构建渐进式增长生成对抗网络( Progressive GAN, PGGAN或 PROGA ...

  4. GAN实战笔记——第七章半监督生成对抗网络(SGAN)

    半监督生成对抗网络 一.SGAN简介 半监督学习(semi-supervised learning)是GAN在实际应用中最有前途的领域之一,与监督学习(数据集中的每个样本有一个标签)和无监督学习(不使 ...

  5. Android群英传笔记——第五章:Android Scroll分析

    Android群英传笔记--第五章:Android Scroll分析 滑动事件算是Android比较常用的效果了,而且滑动事件他本身也是有许多的知识点,今天,我们就一起来耍耍Scroll吧 一.滑动效 ...

  6. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  7. 《Linux内核设计与实现》读书笔记——第五章

    <Linux内核设计与实现>读书笔记--第五章 标签(空格分隔): 20135321余佳源 第五章 系统调用 操作系统中,内核提供了用户进程与内核进行交互的一组接口.这些接口让应用程序受限 ...

  8. Programming Entity Framework-dbContext 学习笔记第五章

    ### Programming Entity Framework-dbContext 学习笔记 第五章 将图表添加到Context中的方式及容易出现的错误 方法 结果 警告 Add Root 图标中的 ...

  9. 深入理解 C 指针阅读笔记 -- 第五章

    Chapter5.h #ifndef __CHAPTER_5_ #define __CHAPTER_5_ /*<深入理解C指针>学习笔记 -- 第五章*/ /*不应该改动的字符串就应该用 ...

随机推荐

  1. 【刷题-LeetCode】222. Count Complete Tree Nodes

    Count Complete Tree Nodes Given a complete binary tree, count the number of nodes. Note: Definition ...

  2. 【刷题-LeetCode】123 Best Time to Buy and Sell Stock III

    Best Time to Buy and Sell Stock III Say you have an array for which the ith element is the price of ...

  3. Cesium入门2 - Cesium环境搭建及第一个示例程序

    Cesium入门2 - Cesium环境搭建及第一个示例程序 Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ 验 ...

  4. Nginx 根据不同的域名来代理转发内部主机-HTTP和HTTPS

    一.需求 由于公司只有一个公网,很多 web 项目都想通过 80 或 443 端口来访问,所以需要 Nginx 充当公司网关. 把唯一的公网 IP 80 端口和 443 端口跟 Nginx 网关主机 ...

  5. 入门-Kubernetes概述 (一)

    1 Kubernetes是什么 Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S. K8S用于容器化应用程序的部署,扩展和管理. K8S提供了容 ...

  6. CABasicAnimation基础核心动画

    核心动画之作用在层上面.     动画的本质是改图层的某一个属性.     CABasicAnimation *anim = [CABasicAnimation animation];     图层有 ...

  7. Eclipse导入项目java文件中文乱码

    感谢大佬:https://blog.csdn.net/ordinaryprogrammerc/article/details/83013710 本文链接:https://blog.csdn.net/o ...

  8. mysql导出到文件错误(err 1290)

    感谢大佬:https://blog.csdn.net/u014711094/article/details/78501771 select * into outfile 'g:/temp1.txt' ...

  9. 在TCP文件传输中如何判断java流的末尾

    感谢前辈们的解答:https://bbs.csdn.net/topics/280085530 问题描述: 服务端向客户端发送数据流,服务端发完了数据不关闭流. 我在客户端读流,我无法读到-1,所以无法 ...

  10. Category注意事项

    1.分类的使用注意事项 分类只能增加方法, 不能增加成员变量 @interface Person (NJ) { // 错误写法 // int _age; } - (void)eat; @end 分类中 ...