ProGAN:NVIDIA如何生成前所未有的图像质量?
逐步增长的GAN使它们变得更大,更稳定
上面的高分辨率图像中的人可能看起来很真实,但实际上并非如此。它们是由经过数百万名人图像训练的ProGAN合成的。“ProGAN”是NVIDIA开创的一种生成对抗网络的口语术语。它由Karras等人在去年出版。去年,GAN的进步增长提高了质量、稳定性和变化。在这篇文章中,我们将通过本文来了解这种类型的网络如何工作,它如何产生如上所述的图像,以及为什么这是一个突破。
本文假设您熟悉一般的视觉任务的深度学习,但并不是说您对GAN有广泛的了解。
GAN的简史
一种新的生成模型
生成对抗网络(GAN)已经存在了几年。它们是由蒙特利尔大学的Ian Goodfellow及其同事在2014年的一篇著名论文中介绍的,从那以后就一直是一个受欢迎的研究领域。
简而言之,GAN是一种生成模型,试图合成与训练数据无法区分的新数据。这是一种无监督学习的形式。它有两个神经网络,锁定在竞争中:一个生成器,它被馈送一个随机数的矢量并输出合成数据;一个鉴别器,它被馈送一个数据并输出它来自训练集的概率(如反对合成)。换句话说,生成器创建“假货”,并且鉴别器试图将这些“假”样本与“真实”样本区分开。
在一个典型的GAN中,随机码z被馈送到发生器G中以产生“假”样本。然后,鉴别器网络D(单独地)馈送生成样本x'和来自训练集的真实样本x。它为每个样本分配一个真实的概率,这取决于赝品的可信度以及鉴别者的成熟程度。然后使用这两个概率来计算对抗性损失,我们通过backprop训练D和G。
两个网络的任务刚开始的时候都表现不佳,但是当训练进展顺利时,它们会同时改进,直到产生令人信服的“赝品”。这两个网络被锁定在零和博弈中,其中一个的成功对应于另一个的失败。因此,在任何给定时间,损失函数的值都不能告诉我们整个系统的训练有多好,只能得到发电机或鉴别器相对于另一个有多好的消息。
我们输入生成器的随机码特别重要。它是噪声源,使合成的样品称为新的独特的东西,通常也倾向于以有趣的方式控制输出。当我们围绕随机代码的向量空间进行线性插值时,相应的生成输出也可以平滑地插值,有时甚至以对我们人类来说直观的方式进行插值。
通过线性内插随机码z在MNIST上训练的GAN中获得的数字。正如您所看到的,它似乎从1平滑过渡到5,表明它已经学会了这些数字的一些内部表示。
挑战和局限
虽然这对于研究未标记数据表示的新方法感兴趣的研究人员来说非常令人兴奋,但在实践中使用GAN通常非常困难。从一开始,从业者就注意到他们很难接受训练。这主要是由于称为模型崩溃的问题。当鉴别器基本上“赢得”游戏时,模型崩溃可能发生,并且发生器的训练梯度变得越来越不实用。这可以在训练期间相对快速地发生,并且当它发生时,鉴别器每次开始生成几乎相同的样本。它会越来越好。
甚至Ian Goodfellow也承认,当他为他的第一个GAN选择的超参数是用直觉时,他们其实很容易失败,在此后的几年里,研究界已经提出了许多方法来使训练更加可靠。某些体系结构似乎比其他体系更好,并且已经探索了对抗性损失函数的几种变体,其中一些似乎比其他人更稳定。
然而,这些方法都没有完全消除这个问题,模型崩溃的理论原因仍然是一个积极的研究领域。
生成图像
图像生成的一个重大改进发生在2016年,当时Radford等人发表了一篇关于深度卷积生成对抗网络的无监督表示学习的论文。他们找到了一系列GAN架构,这些架构适用于创建图像,简称为“DCGAN”。DCGAN摆脱了某些CNN中使用的池化层,并依靠卷积和转置卷积来改变表示大小。大多数层之后是批量标准化和泄漏的ReLU激活。
然而,即使DCGAN也只能创建一定大小的图像。图像的分辨率越高,鉴别器就越容易从“赝品”中分辨出“真实”图像。这使模式崩溃的可能性更大。虽然合成32x32甚至128x128图像成为常规教程材料,但生成分辨率高于512x512的图像仍然具有挑战性。
一些图像到图像的转换技术可以处理高分辨率的图像,但这是一个不同的任务,因为这些技术只能改变输入图像的表面特征,而不是从头开始生成一个全新的图像。
正如您可能想象的那样,从头开始生成大型图像的难度严重限制了GAN在许多实际应用中的用途。
走向更高的图像分辨率
正是在这种背景下,NVIDIA的团队展示了由他们的新ProGAN生成的惊人详细的1024x1024图像(在本文的顶部)。更好的是,他们知道他们的技术无法用于合成更高分辨率的图像。它比以前的GAN更有效(就训练时间而言)。
越来越多的GAN
与通常的做法不同,该团队并没有尝试同时训练生成器和鉴别器的所有层,而是逐渐增加了GAN,一次一层,以逐步处理图像的更高分辨率版本。
ProGAN开始生成非常低分辨率的图像。训练稳定后,会添加一个新图层并将分辨率加倍。这一直持续到输出达到所需的分辨率。通过这种方式逐步增长网络,首先学习高级结构,并且训练稳定。
为此,他们首先人为地将他们的训练图像缩小到非常小的起始分辨率(仅4x4像素)。他们创建了一个只有几层的生成器来合成这种低分辨率的图像以及相应的镜像架构鉴别器。由于这些网络非常小,因此训练相对较快,并且只学习了模糊图像中可见的大型结构。
当第一层完成训练后,他们再向G和D添加另一层,将输出分辨率加倍至8x8。保留了较早层中的训练权重,但没有锁定,新层逐渐消失,以帮助稳定过渡(稍后更多)。训练重新开始,直到GAN再次合成令人信服的图像,这次是在新的8x8分辨率下。
通过这种方式,他们继续添加图层,将分辨率加倍并进行训练,直到达到所需的输出尺寸。
增长GAN的有效性
通过逐步提高分辨率,我们不断要求网络从整体问题中学习更简单的部分。渐进式学习过程极大地稳定了训练。这与我们将在下面讨论的一些训练细节相结合,可以减少模式崩溃的可能性。
从低到高的分辨率趋势也迫使逐渐增长的网络首先关注高级结构(图像的最模糊版本中可辨别的模式),并在稍后填写细节。这通过降低网络中某些高级结构出现严重错误的可能性来提高最终图像的质量。
与同时初始化所有层的传统方法相比,逐步增加网络大小有更高的计算效率。较少的层训练更快,因为它们中的参数更少。由于除了最终的一组训练迭代之外的所有迭代都是通过最终层的子集完成的,因此这会带来一些令人印象深刻的效率提升。Karras等人发现,他们的ProGAN通常训练速度比相应的传统GAN快2-6倍,具体取决于输出分辨率。
该图反映了渐进式增长的卓越效率训练。对于给定量的训练时间,ProGAN(绿色)能够训练比传统GAN(蓝色)更多的图像。在早期训练中,差异是最极端的,因为此时逐渐增长的网络是最小的。
架构
除了逐步发展网络之外,NVIDIA论文的作者还其他几项架构进行了更改,以促进稳定、高效的训练。
给定分辨率k的生成器体系结构遵循熟悉的高级模式:每组层使表示大小加倍,并且将通道数减半,直到输出层创建仅具有与RGB对应的三个通道的图像。鉴别器几乎完全相反,将表示大小减半,并使每组图层的通道数加倍。在两个网络中,通过将滤波器的数量限制在合理的值(例如512)来中断通道加倍模式,以防止参数的总数变得太高。
从这个意义上讲,ProGAN类似于早期的图像生成GAN。DCGAN使用了类似的结构。
但是,DCGAN使用转置卷积来改变表示大小。相比之下,ProGAN使用最近邻进行放大和平均汇总以进行缩减。这些是简单的操作,没有学习参数。然后是两个卷积层。
生成器结构的详细视图,当它“增长”到分辨率k时。每组图层的分辨率大小加倍,最近邻放大操作后进行两次卷积。为了稳定训练,最近添加的图层被“淡入”。该过程由α控制,α是0到1之间的数字,在许多训练迭代中线性增加,直到新层完全到位。
“淡入”新层
每次训练在现有分辨率下完成时,通过添加一组新的层来逐步增加网络的分辨率。添加新图层时,先前图层中的参数仍是可训练的。
为了防止突然添加新顶层中预先存在的下层中的冲击,顶层被线性地“淡入”。这种衰落由参数α控制,参数α在许多训练迭代的过程中从0到1线性内插。如上图所示,最终生成的图像是生成器中最后一层和倒数第二层的加权和。
像素标准化
作者不是像通常那样使用批量标准化,而是使用像素标准化。该“pixelnorm”层没有可训练的权重。它将每个像素中的特征向量归一化为单位长度,并在生成器中的卷积层之后应用,这样做是为了防止信号幅度在训练期间失控。
跨C通道的每个像素(x,y)的值被标准化为固定长度。这里,a是输入张量,b是输出张量,ε是防止除以零的小值。
鉴别者
发生器和鉴别器大致是彼此的镜像,并且总是同步生长。鉴别器采用输入图像x,其是发生器的输出,或者是缩小到当前训练分辨率的训练图像。作为GAN鉴别器的典型,它试图将“真实”训练集图像与“假”生成图像区分开。它输出D(x),该值捕获鉴别器对输入图像来自训练集的置信度。
鉴别器结构的详细视图,当它“增长”到分辨率k时。这里,x是输入图像(生成或来自训练集),α是最后一个生成器层“淡入”的程度,D(x)是生成器分配给x的概率。训练集。通过平均池并操作在每组图层处将表示大小减半。
Minibatch标准偏差
通常,GAN倾向于产生比训练集中发现的变化更少的样本。解决此问题的一种方法是使鉴别器计算批次中的统计数据,并使用此信息来帮助区分“真实”训练数据批次与“假”生成的批次。这鼓励生成器产生更多种类,使得在生成的批次中计算的统计数据更类似于来自训练数据批次的统计数据。
在ProGAN中,这是通过在鉴别器末端附近插入“minibatch标准偏差”层来完成的。该层没有可训练的参数,它计算批次中要素图像素的标准偏差,并将它们作为额外通道附加。
均衡的学习率
作者发现,为了确保发生器和鉴别器之间健康竞争,各层以相似的速度学习是至关重要的。为了实现这种均衡学习率,他们根据图层的权重来缩放图层的权重。他们使用与He初始化中使用的相同的公式来执行此操作,他们在训练期间的每个前向传递中执行此操作,而不是仅在初始化时执行。
通过在每个前向传递之前缩放权重,可以跨层来均衡学习速率。例如,在使用大小为[k,k,c]的f滤波器执行卷积之前,我们将缩放这些滤波器的权重,如上所示。
由于这种干预,权重初始化不需要什么花哨的技巧,只需用标准正态分布初始化权重就可以了。
损失函数
作者说损失函数的选择与它们的贡献是正交的- 意味着上述改进都不依赖于特定的损失函数。使用过去几年中出现的任何流行的GAN损失函数是合理的。
但是,如果您希望完全遵循该论文,他们会使用改进的Wasserstein损失函数,也称为WGAN-GP。它是较为常见的损失函数之一,并已被证明可以稳定训练并提高收敛的可能性。
WGAN-GP损耗方程。这里,x'是生成的图像,x是来自训练集的图像,D是鉴别器。GP是一种梯度惩罚,有助于稳定训练。梯度罚分中的a项指的是0和1之间的随机数的张量,随机均匀选择。设定λ= 10是很常见的。由于我们通常分批训练,因此上述损失通常在小批量上进行平均。
值得注意的是,WGAN-GP损失函数期望D(x)和D(x')是无界实数值。换句话说,预期鉴别器的输出不是0和1之间的值。这与传统的GAN公式略有不同,传统的GAN公式将鉴别器的输出视为概率。
结果
如果你已经做到这一点,恭喜!您现在对其中最先进的图像生成算法之一有了很好的理解。
当我们平滑地对输入向量z进行插值时,ProGAN的输出