[论文笔记]:PROGRESSIVE GROWING OF GANS FOR IMPROVED QUALITY, STABILITY, AND VARIATION


论文地址:
http://arxiv.org/abs/1710.10196
代码地址:
https://github.com/tkarras/progressive_growing_of_gans
https://blog.csdn.net/u013139259/article/details/78885815
补充材料:
https://research.nvidia.com/publication/2017-10_Progressive-Growing-of
https://youtu.be/G06dEcZ-QTg


论文翻译

在这里插入图片描述

摘要

我们为生成对抗网络GAN描述了一种新的训练方法。关键思想是渐进的让生成器和判别器增长:从一个低分辨率开始,随着训练发展,我们不断添加新层使模型增加更好的细节。这个方法既加速了训练又使训练更加稳定,生成的图片质量史无前例的好,例如: 102 4 2 1024^2 10242大小的CELEBA图片。我们还提出了一种简单的方法来增加生成图像的差异,并在无人监督的CIFAR10中获得创纪录的初始得分 8.80 8.80 8.80。此外,我们描述了若干实现细节,这些细节对于阻止生成器和鉴别器之间的不健康竞争非常重要。最后,我们提出了一种用于评估GAN结果的新指标,包括图像质量和变化。另外,我们构建了更高质量的CELEBA数据集。

1. 介绍

我们发现从高维度的数据分布中(例如图片)产生新颖样本的生成式方法正在广泛使用,例如语音合成(van den Oord et al., 2016a),图像到图像的转换(Zhu et al., 2017; Liu et al., 2017)以及图像修复(Iizuka et al.,2017)。目前最好的方法是自回归模型autoregressive models(van den Oord et al.,2016b;c),可变自动编码VAE(Kingma & Welling, 2014)以及生成对抗网络GAN((Goodfellow et al., 2014)。目前,它们都具有明显的优点和缺点。自回归模型(例如PixelCNN)可生成清晰的图像,但评估速度较慢,并且没有潜在的表现形式,因为它们直接对像素上的条件分布进行建模,从而可能限制了其适用性。
VAEs方法易于训练,但由于模型的局限性,往往会产生模糊的结果,尽管最近的工作正在改进这个缺点(Kingma et al., 2016)。GANs方法虽然只能在相当小的分辨率并且带有一些限制的可变性分辨率上产生清晰的图像,尽管最近取得了进展,但训练仍然不稳定 (Salimans et al., 2016; Gulrajaniet al., 2017; Berthelot et al., 2017; Kodali et al., 2017)。 混合方法Hybrid结合了这三个方法的不同优点,但是目前在图片质量上仍然不如GANs(Makhzani & Frey, 2017; Ulyanov et al.,2017; Dumoulin et al., 2016)。

通常,GAN由两个网络组成:生成器和鉴别器(aka critic)。 生成式网络生成样本,例如:从一个潜在的代码中生成一副图片,理想情况下,这些生成的图片分布和训练的图片分布是不可分辨的。因为通过创建一个函数来辨别是生成样本还是训练样本一般是不可能的,因此需要训练鉴别器网络来进行评估,因为网络是可区分的,所以我们也可以得到一个梯度用来引导网络走到正确的方向。通常,生成器是最主要的功能方,鉴别器是一种自适应损失函数,一旦训练了生成器就将其丢弃。

这个公式存在多种潜在的问题。例如:当我们测量训练分布和生成分布之间的距离时,如果分布之间没有实质性的重叠(即太容易区分),则梯度可以指向或多或少的随机方向(Arjovsky&Bottou,2017)。 最初,Jensen-Shannon散度用作距离度量(Goodfellow et al., 2014),最近该公式已得到改进(Hjelm et al., 2017),并且提出了许多更稳定的替代方法,包括最小二乘least squares(Mao et al., 2016b),绝对边缘误差absolute deviation with margin(Zhao et al., 2017)和Wasserstein 距离(Arjovsky et al., 2017; Gulrajani et al., 2017)。 我们的贡献在很大程度上与正在进行的讨论正交,我们主要使用改进的Wasserstein损失,但也尝试使用最小二乘least squares损失。

高分辨率图像的生成很困难,因为更高的分辨率使得判别器更容易分辨生成的图像和训练图像(Odena et al., 2017),从而极大地放大了梯度问题。 由于内存的限制,较大的分辨率还必须使用较小的批量minibatches处理,这进一步损害了训练的稳定性。 我们的主要亮点在于,我们可以从更简单的低分辨率图像开始,逐步增加生成器和鉴别器,随着训练的发展,不断添加新的层,用于引进更高分辨率细节。这个很大程度上加速了训练并提高了高分辨率的稳定性,正如我们在Section 2中讨论的。

GAN公式没有明确要求所有的训练数据分布都由生成的生成式模型来表述。传统方法会在图像质量和变化之间需要权衡取舍,但是这个观点最近已经改变 (Odena et al., 2017)。

保留的可变性的程度目前正受到关注,并提出了各种测量方法,包括起始评分inception score(Salimans et al., 2016),多尺度结构相似性(MS-SSIM)(Odena et al., 2017; Wang et al., (2003),生日悖论birthday paradox(Arora&Zhang,2017)以及发现的离散模式的显示测试explicit tests for the number of discrete modes discovered (Metz et al., 2016)。我们将在Section 3中描述鼓励可变性的方法,并在 Section 5中提出一个评估质量和可变性的新的度量。

Section 4.1讨论了对网络初始化的细微修改,从而使不同层的学习速度更加平衡。我们观察到在十几个minibatches的过程中,GAN会更快速的发生令人讨厌的传统的模式崩塌现象,通常当判别器处理过度时模式崩塌开始,导致梯度过大,并且会在两个网络信号幅度增大的地方伴随着一个不健康的竞争。我们提出了一个机制去阻止生成器参与这样的升级,以克服这个问题 (Section 4.2)。

我们使用CELEBA,LSUN,CIFAR10数据集评估我们的贡献。 我们提高了CIFAR10的最佳公开起始评分。 由于基准化生成方法中常用的数据集仅限于相当低的分辨率,因此我们还创建了CELEBA数据集的更高质量版本,该版本允许使用高达 1024 × 1024 1024 \times1024 1024×1024像素的输出分辨率进行实验。 该数据集和我们的完整实现可在https://github.com/tkarras/progressive_growing_of_gans上获得,受过训练的网络以及结果图像以及补充内容可以在https://drive.google.com/open?id=0B4qLcYyJmiz0NHFULTdYc05lX0U中找到。 说明数据集,附加结果和潜在空间插值的视频位于https://youtu.be/G06dEcZ-QTg

2. 逐步增长的GANS(Progressive growing of GANs)

我们的主要贡献是提出了一种针对GAN的培训方法:从低分辨率图像开始,然后通过向网络中添加层来逐步提高分辨率,如Fig. 1所示。这种递增的性质使训练可以首先发现大尺度的图像分布,然后将注意力转移到越来越精细的尺度细节上,而不必同时学习所有尺度。
在这里插入图片描述
Fig. 1: 我们的训练从具有 4 × 4 4\times 4 4×4像素低空间分辨率的生成器(G)和鉴别器(D)开始。 随着训练的进行,我们逐步将图层添加到G和D,从而提高了生成图像的空间分辨率。 在整个过程中,所有的现有层仍可训练。 这里的 N × N N \times N N×N是指在 N × N N \times N N×N分辨率图像上运行的卷积层。 这样可以实现高分辨率的稳定合成,并且还可以大大加快训练速度。 右边的一个显示了 6 6 6个示例图像,这些图像是使用 1024 × 1024 1024 \times 1024 1024×1024的渐进式增长生成的。

我们使用生成器网络和鉴别器网络,它们互为镜像,并且始终同步增长。在整个训练过程中,两个网络中所有的现有层都保持训练状态。将新的层添加到网络后,我们会平滑地淡入淡出效果减弱它们,如Fig. 2所示。这样可以避免对已经训练有素的较小分辨率的图层造成突然的冲击。附录A详细描述了生成器和鉴别器的结构,以及其他训练参数。

在这里插入图片描述
图2:将生成器(G)和鉴别器(D)的分辨率加倍时,我们会在新的层中平滑淡入淡出。 此示例说明了从 16 × 16 16 \times 16 16×16图像(a)到 32 × 32 32 \times 32 32×32图像(c)的过渡。 在过渡(b)中,我们将以较高分辨率操作的图层视为 “残差块”,其权重 α \alpha α从0到1线性增加。此处 2 × 2\times 2× 0.5 × 0.5\times 0.5×表示使用最近邻滤波(nearest neighbor filtering)和平均将图像分辨率加倍和平均池化(average pooling)减半。 toRGB表示将特征向量投影为RGB颜色的图层,而fromRGB则相反,都使用 1 × 1 1\times 1 1×1卷积。训练鉴别器时,我们会输入缩小后的真实图像,以匹配网络的当前分辨率。在分辨率转换期间,我们在真实图像的两个分辨率之间进行插值,类似于生成器输出将两个分辨率组合在一起的方式。

我们观察到渐进式训练有几个好处。早期,基本上较小的图像生成时更稳定,因为分类信息更少且模式更少(Odena等人,2017)。与从潜在向量中发现映射的最终目标相比,通过逐步提高分辨率,是一个更简单的方法。 102 4 2 1024^2 10242图片这种方法与Chen&Koltun(2017)最近的工作在概念上相似。在实践中,它充分稳定了训练,使我们能够可靠地使用WGAN-GP损失(Gulrajani等人,2017)甚至LSGAN损失(Mao等人,2016b)来合成百万像素级图像。

另一个好处是减少了培训时间。随着GAN的不断增长,大多数迭代都是在较低的分辨率下完成的,根据最终输出分辨率的不同,通常可获得的结果质量可提高 2 ∼ 6 2\sim6 26倍。

逐步增长GAN的想法与Wang等人(2017年)的工作有关,他们使用多个以不同空间分辨率操作的鉴别器。这项工作的反转是由Durugkar等人激发的(2016年),他们同时使用多个生成器和一个鉴别器。Ghosh等人(2017年)进行了相反的操作,同时使用一个生成器和多个鉴别器。 分层GAN(Denton等人(2015年),Huang等人(2016年),Zhang等人(2017年))为图像金字塔的每个级别定义了生成器和鉴别器。这些方法建立在与我们的工作相同的观察之上——从潜在图像到高分辨率图像的复杂映射更易于用逐步学习——但关键的区别在于我们只使用一个GAN,而不是它们的层次结构。与早期发展适应性增长的网络(例如增长的神经天然气网络(Fritzke,1995)和贪婪地增长网络的增强拓扑结构的神经演化(Stanley&Miikkulainen,2002)相反,我们只是推迟了预配置层的引入。从这个意义上讲,我们的方法类似于自动编码器的分层训练(Bengio等,2007)。

3. 使用小批量标准偏差增加可变性

GAN倾向于仅捕获训练数据中具有多样性的子集,Salimans et al.(2016年)提出了 “小批量鉴别(minibatch discrimination)” 作为解决方案。他们不仅从单个图像而且在整个小批量中计算特征统计量,因此促进了生成的小批量图片和训练图片展示出了相似的统计。这是通过在鉴别器的末尾添加一个minibatch层来实现的,在该层中,该层学习一个大张量,该张量将输入激活投影到一组统计数组中。在一个小批量中,每个示例都会生成一组独立的统计信息,并将其连接到图像的输出层,以便鉴别器可以在本质上使用这些统计信息。我们大大简化了此方法,同时也提高了多样性。

我们简化的解决方案既没有可学习的参数,也没有新的超参数。我们首先计算小批量上每个空间位置中每个特征的标准偏差(standard deviation)。然后,我们对所有特征和空间位置的这些估计值求平均,以得出单个值。我们复制该值并将其连接到所有空间位置以及整个小批量上,从而生成一个附加的(恒定的)特征映射。该层可以插入到鉴别器中的任何位置,但是我们发现最好将其插入到末尾(有关详细信息,请参见附录A.1)。我们尝试用一个更丰富的统计数据做实验,但无法进一步提高多样性。在并行工作中,Lin等人(2017年)提供了有关向鉴别器显示多个图像的好处的理论见解。

针对多样性问题的另一个解决方案包括:展开鉴别器(Metz et al., 2016)去正则化它的更新,以及一个 “repelling regularizer” (Zhao et al., 2017)方法,向生成器中添加一个新的损失项,尝试促进它与一个小批量中的特征向量正交化。Ghosh et al. (2017)提出的多个生成器也满足这样一个相似的目标。 我们承认,这些解决方案可能会比我们的解决方案增加更多的变化(或可能与之正交),但会在以后进行详细的比较。我们承认,这些解决方案可能会比我们的解决方案增加更多的变化(或者可能与之正交),但会在后面留有一个细节性的比较。

4. 生成器和判别器中的归一化

由于两个网络之间的不健康的一个竞争结果,GANs往往会有信号幅度升级情况。大多数早期的解决方案并不鼓励这种在生成器以及在判别器中使用批处理正则化的一个变量 (Ioffe & Szegedy, 2015; Salimans & Kingma, 2016; Ba et al., 2016)的方式。这些正则化方法原来是消除协变量偏移的。然而,我们没有观察到在GANs中存在这个问题,因此相信在GANs中需要的是制约信号幅度以及竞争问题。我们使用两个因素且都不包含可学习的参数。

4.1 调节学习速率

不同于当前谨慎进行权重初始化,使用了一个数学最简单的正态分布 N ( 0 , 1 ) N(0,1) N(01)初始化,在运行时显式缩放权重。确切地说,我们设置 w i ^ = w i / c \hat{w_i}=w_i/c wi^=wi/c,其中 w i w_i wi是权重, c c c是He等的初始化方法 (He et al., 2015)的前一层正则化常量。在初始化过程中动态做这种操作有一些微妙的好处,它关系到常规的使用自适应随机梯度下降法例如RMSProp (Tieleman & Hinton, 2012) 和 Adam (Kingma & Ba, 2015)方法保持的尺度不变性。这些方法通过评估标准差正则化一个梯度更新,因此使更新不依赖于参数的变化。所以,对于此前的方法,如果一些参数相比较其他参数而言有一个更大范围的动态变化,他们将花费更长的时间去调整。这是一个现在初始化问题面临的场景,因此有可能出现在同一时间学习速率既是最大值也是最小值的情况。我们的方法保证了动态范围,因此对于所有权重,学习速度都是一样的。

4.2 生成器中的像素pixel-wise特征向量归一化

为了避免由于竞争而导致生成器和鉴别器中的量级幅度失控的情况,我们对每个像素中的特征向量进行归一化使每个卷积层之后的生成器中的长度可以单位化。我们使用一个 “局部响应正则化(local response normalization)”(Krizhevsky et al., 2012)变量来进行此操作,按照公式 b x , y = a x , y / 1 N ∑ j = 0 N − 1 ( a x , y j ) 2 + ϵ b_{x ,y}=a_{x, y}/{\sqrt{\frac{1}{N}\sum_{j=0}^{N-1}(a_{x, y}^j)^2+\epsilon}} bx,y=ax,y/N1j=0N1(ax,yj)2+ϵ 来配置,其中 ϵ = 1 0 − 8 \epsilon=10^{-8} ϵ=108 N N N是特征匹配的数量,而 a x , y a_{x, y} ax,y b x , y b_{x, y} bx,y是像素 ( x , y ) (x, y) (x,y)的原始和归一化特征向量。 我们发现,这种繁重的约束在任何方式下看起来都不会危害到生成器,并且对于大多数数据集,它也不会改变太多结果,但是它却在有需要的时候非常有效地防止信号幅值的增大。

5. 评估GAN结果的多尺度统计相似度

为了将一个GAN的结果与另一个GAN的结果进行比较,需要调查大量的图像,这可能是乏味的,困难的并且主观性的。因此,依赖自动化方法,从大量的收集图片中计算一些指示性指标 是可取的。我们注意到,现存的方法例如MS-SSIM (Odena et al., 2017)在发现大尺度模式的崩塌很可靠,但是对比较小的影响没有反应(例如在颜色或者纹理上的损失变化),而且它们也不能直接对训练集相似的图片质量进行评估。

我们的直觉是一个成功的生成器会基于所有尺度,产生局部图像结构和训练集是相似的样例。我们建议通过考虑两个分别来自于生成的图像和目标图像的 Laplacian金字塔(Burt&Adelson,1987)表示的局部图片匹配分布的多尺度统计相似性,并从 16 × 16 16 \times 16 16×16像素的低分辨率开始,进行学习。随着每一个标准的训练,这个金字塔逐步翻倍,直到达到完整的分辨率为止,每个连续的水平的编码都不同于它先前的上采样版本。

一个单一的拉普拉斯金字塔等级对应于一个特定的空间频带。我们随机采样 16384 16384 16384张图像,并从拉普拉斯Laplacian金字塔的每一级中提取 128 128 128个描述符,每一级给我们提供 221 221 221个(2.1M)描述符。每个描述符都是具有 3 3 3个颜色通道的 7 × 7 7 \times 7 7×7相邻像素,记为 x ∈ R 7 × 7 × 3 = R 147 x \in \Bbb R^{7\times7\times3}= R^{147} xR7×7×3=R147。我们将训练集和生成集中的 l l l级别的patch匹配分别表示为 { x i l } i = 1 2 21 \{x_i^l\}_{i=1}^{2^{21}} {xil}i=1221 { y i l } i = 1 2 21 \{y_i^l\}_{i=1}^{2^{21}} {yil}i=1221。我们首先将 { x i l } \{x_i^l\} {xil} { y i l } \{y_i^l\} {yil} w.r.t. 每个颜色通道的均值和标准差,然后通过计算他们的SWD( { x i l } \{x_i^l\} {xil}, { y i l } \{y_i^l\} {yil})(sliced Wasserstein distance)值评估统计相似性,这是一种有效的使用 512 512 512个映射 (Rabin et al., 2011)计算随机近似的EMD值(earthmovers distance)的方法。

直观地,一个较小的Wasserstein距离表明了patch小块的分布是相似的,这意味着在此空间分辨率下,训练图像和生成器样本在外观和变化上都看起来相似。特别是,从最低分辨率的 16 × 16 16 \times 16 16×16图像中提取的patch色块集之间的距离表示在大尺度图像结构中存在相似性,而最精细finest-level的patch色块编码了有关像素级属性(如边缘的清晰度和噪声)的信息。

6. 实验

在本节中,我们讨论了为评估结果质量而进行的一组实验。 有关我们的网络结构和培训配置的详细说明,请参阅附录A。 我们也邀请读着去参阅另外的结果图片的附带视频(https://youtu.be/XOxxPcy5Gr4) 以及隐藏的空间插值。在本节中,我们将区分网络结构 (e.g., convolutional layers, resizing),训练配置(不同的正则化层,与小批量相关的操作)和训练损失(WGAN-GP,LSGAN)。

6.1 统计相似性中个体贡献的重要性

我们首先将使用SWD值和多尺度结构相似性(MSSSIM) (Odena et al., 2017) 去评估我们个体贡献的重要性,也从感知上验证度量指标本身。我们会在一个先前的最新损失函数 (WGAN-GP)的顶层进行编译并在一个 128 × 128 128\times128 128×128分辨率的 CELEBA (Liu et al., 2015)和LSUN BEDROOM (Yu et al., 2015)的非监督数据集上训练配置 (Gulrajani et al., 2017)。CELEBA 数据集特别适合这样的比较因为这些图片包含 了显著的伪迹(混叠,压缩,模糊),这些伪迹对于生成器来说重新准确的生成式很困难的。在这个测试中,我们通过选择一个相关的低容量网络结构(附件A.2)并且一旦判别器已经展示了总共 10 M 10M 10M的真实图片时就终止训练的方式来训练配置并放大训练配置间的差异。这样结果就不会全部相同(相似)。

Table 1列出了在若干训练配置中的SWD和MS-SSIM的数值,表明了我们的个人贡献逐渐的使基线的顶部(Gulrajani et al., 2017)一个接一个的成为可能。MS-SSIM个数是平均来自于10000对生成图片,SWD值计算在第5部分描述。Figure 3展示了来自于这些配置的生成的CELEBA图片。由于空间限制,这个图片仅仅展示了每行桌子的一小部分样例,但是在附近H中可以获得一个更广的集合。从直觉上说,一个好的评估标准应该奖励展示出的在颜色,纹理以及角度的大量变量中很相似的图片。然而,这并没有被MS-SSIM捕捉到:我们可以立刻看到配置(h)生成了比配置(a)更好的图片,但是MS-SSIM值保持近似不变因为它仅仅测量输出的变化而不测量输出与训练集的相似性。另一方面,SWD就有一个明显的改善。

在这里插入图片描述
Table 1: 生成样例和训练样例之间的SWD值( Sliced Wasserstein distance) (Section 5)和针对设置为 128 × 128 128\times128 128×128分辨率的若干训练集的生成样例之间的多尺度结构相似性 (MS-SSIM)。对于SWD,每一列展示了拉普拉斯金字塔的一个层级,最后一列给出了四个距离的平均值。

在这里插入图片描述
Fig. 3: (a) – (g) CELEBA样例对应Table 1中的行。这些是有意不收敛的。(h)我们的收敛结果。注意有些图片是混叠的并且有些图片是非尖锐的–这是一个数据集的缺陷,这种模型会学习如实的复制。

第一个训练配置(a)对应方法Gulrajani et al. (2017),特征化生成器中的批处理正则化,鉴别器中的层正则化,并且最小批处理大小为64的功能。(b)使网络逐渐增长,从而产生更清晰,更可信的输出图像。 SWD正确地发现生成的图像的分布与训练集更加相似。

我们的主要目标是输出高分辨率,这就要求减少小批量大小来保证运行在可获得的存储空间预算之内。我们在(c)中说明了随之而来的挑战,其中我们将最小批量大小从64减小到16。生成的图像是不自然的,在两个指标中均清晰可见。在(d)中,我们通过调整超参数以及删除批处理正则化和层正则化使训练进程稳定(附录A.2)。作为中间的一个测试(e∗),我们能够小批量的判别 (Salimans et al., 2016),有时也不能改善任何度量,包括测量输出变量的MS-SSIM值。相反,我们的小批量标准差 (e) 改善了SWD的平均得分还有图像。然后我们将我们的贡献用于 (f) 和(g)中,从而全面改善在SWD以及主观视觉质量。最后,在(h)中,我们使用一个非残缺网络non-crippled network以及更长的训练时间,我们认为生成图片的质量可以和目前最好的结果相媲美。

6.2 收敛和培训速度

在这里插入图片描述
Fig. 4: 在训练速度和收敛性方面渐进增长的影响。使用了一个NVIDIA Tesla P100 GPU测量时间。 (a) 关于Gulrajani et al. (2017)方法提到的挂钟,使用128 × 128分辨率的CELEBA数据集统计相似性。每个曲线都展示了拉普拉斯金字塔每一级的SWD值,垂直的线指示我们在Table 1中停止训练的点。(b)能够渐进增长的相同曲线。短的垂直线指示我们在G和D中双倍增加分别率的点。(c)在1024 × 1024分辨率以原训练速度渐进增长的影响。

没有渐进增长情况下,生成器和判别器的所有层都要求同时找到简洁的大尺度变化和小尺度细节的中间展示。然而,渐进增长下,现存的低分辨率层可能在早期就已经收敛了,所以网络仅仅要求随着新层的加入,通过增加更小尺度影响得到更精炼的展示。确实,我们在Fig. 4(b)中可以看到最大尺度的统计相似性曲线(16)很快的到达了它的优化值并且穿过训练的间断时间保持连续。更小尺度的曲线(32, 64, 128)随着分辨率的增加逐个的趋于平稳,但是每条曲线的收敛性是非常一致的。正如所料,非渐进训练的 Fig. 4(a)中,每个SWD度量的收敛值尺度都是不平稳的。

随着输出分辨率的提高,渐进式增长的加速也随之增加。Fig. 4© 显示了训练进度,以显示给鉴别器的实际图像数量为单位,当训练一直进行到 102 4 2 1024^2 10242分辨率时,它是训练时间的函数。我们看到,渐进式增长取得了重大的领先优势,因为网络在开始时就比较浅且易于评估。一旦达到全分辨率,两种方法之间的图像吞吐量就相等。该图显示,渐进式变体在96小时内可达到约640万张图像,而可以推断出非渐进式变体将花费大约520小时才能达到同一点。在这种情况下,渐进式增长可将速度提高大约5.4倍。

6.3 使用CELEBA-HQ数据集生成高分辨率图像

为了证明我们的结果是高输出分辨率,我们需要一个变化充分的高质量数据集。然而,以前在GAN文献中使用的几乎所有公开可用的数据集都局限于相对较低的从 3 2 2 32_2 322 48 0 2 480_2 4802的较低分辨率范围。为此,我们创建了一个高质量版本的CELEBA数据集,包含 30000 30000 30000张,分辨率为 1024 × 1024 1024 \times 1024 1024×1024 的图像,关于数据集生成的进一步细节,参考附录C。

我们的贡献允许我们以一个稳健高效的方式处理高分辨率的输出。Fig. 5选择了我们的网络生成的 1024 × 1024 1024 \times 1024 1024×1024 分辨率的图像。然而在另一个数据集上 (Marchesi, 2017),百万像素的GAN结果已经在这之前展示出来了,但我们的结果更加多样化,感知质量也更高。一个更大的结果图像集以及从训练数据中找到的最近邻图像集请参考附录F。附带的视频显示了潜在的空间插值和可视化的循序渐进的训练。插值的工作原理是,我们首先将每个帧的潜在代码随机化(从 N ( 0 , 1 ) N(0, 1) N(0,1)分别采样 512 512 512个分量),然后使用高斯模糊( σ \sigma σ== 45帧 @ 60Hz)跨越时间模糊化潜在特征,最后归一化每个向量到一个单位超球面上。

我们在8块Tesla V100 GPU上对网络进行了4天的训练,直到我们观察不到连续的训练迭代结果之间的质量差异。我们的实施方法被用在一个依赖于当前输出分辨率的自适应小批量大小的网络上,使可获得的内存预算被最佳利用。

为了证明我们的贡献在很大程度上和损失函数的选择是正交的,我们也使用 LSGAN 损失来替代WGAN-GP损失训练 了相同的网络。Fig. 1展示了我们使用 LSGAN方法产生的 1024 × 1024 1024\times1024 1024×1024分辨率的图片中的六个样例。附录B中提供了此设置的更多详细信息。

6.4 LSUN结果

Fig. 6展示了一个纯粹的我们的解决方案和在 LSUN BEDROOM数据集上的早期结果的视觉比较。Fig. 7给了被选择的7个不同的LSUN种类的 256 × 256 256\times256 256×256分辨率的样例。附件G中可以获得一个更大的,没有组织的所有30个LSUN种类的结果集,视频证明插值。我们不了解其中大多数类别的较早结果,尽管某些类别的效果优于其他类别,但我们认为总体质量很高。

6.5 CIFAR10分数

我们知道的CIFAR10(10个类别的 32 × 32 32\times32 32×32 RGB图像)的最佳初始分数:非监督数据集是7.90,带标签条件设置的数据集是8.87(Grinblat et al.,2017)。这两个数字之间的较大差异主要是由 “伪影ghosts” 引起的, “伪影ghosts” 必定会出现在无监督环境的类之间,而有标签条件时可以消除许多此类的问题。

我们的设置和方法都成功的时候,在无监督的环境中获得8.80的得分。附录D显示了一组代表性的生成图像,以及更全面的早期方法结果列表。网络和培训设置与CELEBA相同,当然进程限制为 32 × 32 32\times32 32×32分辨率。唯一限定的是WGAN-GP的正则化术语 E x ^ ∼ P x ^ [ ( ∥ ∇ x ^ D ( x ^ ) ∥ 2 − γ ) 2 / γ 2 ] \Bbb E_{\hat x \sim \Bbb P_{\hat x}}[(\parallel\nabla _{\hat x}D(\hat x)\parallel_2-\gamma)^2/\gamma^2] Ex^Px^[(x^D(x^)2γ)2/γ2]。Gulrajani et al. (2017)使用的 γ = 1.0 \gamma= 1.0 γ=1.0,对应于 1 − L i p s c h i t z 1-Lipschitz 1Lipschitz,但我们注意到实际上最好是使用快速转换( γ = 750 \gamma= 750 γ=750)可以最大程度地减少伪影,我们尚未在其他数据集中尝试过此技巧。

7. Discussion

虽然与早期的GANs相比,我们的结果质量通常很高,并且在高分辨率下训练稳定,但要实现真实的照片级效果还有很长的路要走。 对依赖数据的限制的语义敏感性和理解还有很多需要提高,例如确定的目标是直接可得的而不是间接得到的。 图像的微观结构也有改善的空间。 也就是说,我们认为令人信服的现实主义convincing realism现在是可能实现的,尤其是在CELEBA-HQ中。


内容总结

论文背景

生成高分辨率图像的问题:

  • 高分辨率放大训练分布与生成分布之间的差异,进而放大梯度问题(WGAN中有详细介绍)
  • 由于内存的约束,需要使用更小批量去处理数据,会导致训练不稳定

GAN目前遇到的问题:

  • 多样性问题,传统GAN倾向于捕获训练集多样性中的一种
  • 模型崩塌(判别器处理过度,导致G和D之间不健康竞争,成为猫捉老鼠的游戏)

网络结构如下图所示:
在这里插入图片描述

  • 为了保证学习率对不同特征都是合适的,对各个特征进行缩放;

  • 为了防止 G G G D D D因模式崩溃而逐步增长,作者提出在G的每个卷积层后对每个像素的feature进行归一化;

  • 网络训练时使用Adam优化策略, α = 0.001 , β 1 = 0 , β 2 = 0.99 , ϵ = 1 0 − 8 \alpha=0.001, \beta_1=0, \beta_2=0.99, \epsilon=10^{−8} α=0.001,β1=0,β2=0.99,ϵ=108

  • 训练时随着图像分辨率的上升,minibatch size逐渐减小;

  • 在每个minibatch上轮流优化G和D,也即设置 n c r i t i c = 1 n_{critic}=1 ncritic=1

  • loss函数使用Wassertein loss,在D的loss中增加一项,以防止其输出值过大 L ′ = L + ϵ d r i f t E x ∈ P r [ D ( x ) 2 ] L^{′}=L+\epsilon_{drift}E_{x∈P_r}[D(x)^2] L=L+ϵdriftExPr[D(x)2]

  • 为了有效抑制G和D的不健康竞争,确保训练稳定性,本文提出了用pixel norm作为正则化的方法,将生成器中特征向量逐像素正则化: b x , y = a x , y / 1 N ∑ j = 0 N − 1 ( a x , y j ) 2 + ϵ b_{x ,y}=a_{x, y}/{\sqrt{\frac{1}{N}\sum_{j=0}^{N-1}(a_{x, y}^j)^2+\epsilon}} bx,y=ax,y/N1j=0N1(ax,yj)2+ϵ

  • 使用均值为0,方差为1的标准正态分布 N ( 0 , 1 ) N(0,1) N(01)初始化,在运行时显式缩放权重,设置 w i ^ = w i / c \hat{w_i}=w_i/c wi^=wi/c,其中 w i w_i wi是权重, c c c是He初始化方法 (He et al., 2015)的每层正则化常量。

  • 采用相等学习率的前提是模型参数有相同大小的尺度,动态调整参数的好处就是可以使模型中所有参数具有相同的尺度。

生成器中的像素pixel-wise特征向量归一化

为了避免由于竞争而导致生成器和鉴别器中的量级幅度失控的情况,我们对每个像素中的特征向量进行归一化使每个卷积层之后的生成器中的长度可以单位化。我们使用一个 “局部响应正则化(local response normalization)”(Krizhevsky et al., 2012)变量来进行此操作,按照公式 b x , y = a x , y / 1 N ∑ j = 0 N − 1 ( a x , y j ) 2 + ϵ b_{x ,y}=a_{x, y}/{\sqrt{\frac{1}{N}\sum_{j=0}^{N-1}(a_{x, y}^j)^2+\epsilon}} bx,y=ax,y/N1j=0N1(ax,yj)2+ϵ 来配置,其中 ϵ = 1 0 − 8 \epsilon=10^{-8} ϵ=108 N N N是特征匹配的数量,而 a x , y a_{x, y} ax,y b x , y b_{x, y} bx,y是像素 ( x , y ) (x, y) (x,y)的原始和归一化特征向量。 我们发现,这种繁重的约束在任何方式下看起来都不会危害到生成器,并且对于大多数数据集,它也不会改变太多结果,但是它却在有需要的时候非常有效地防止信号幅值的增大。

渐进式生成

本文用到的渐进式生成的方式是先训练出低分辨率的图片,再逐步增加网络结构提升图片质量。生成器和分类器是镜像生成的, N × N N \times N N×N是指这部分的卷积网络作用在 N × N N \times N N×N分辨率的图像上,在分辨率增长的过程中采用fade in形式的增长,早期分辨率低时学习到的是大规模结构特征,再分辨率逐渐增加的过程中,转移到细节逐步学习。

优势:增强训练稳定性,减少训练时间,提高图像质量

fade in形式

引入残差块的概念,使网络逐步适应高分辨率,直至构建成新的网络结构,这样有助于利用前期训练好的网络。在实际训练中,先将 4 × 4 4\times4 4×4的网络训练到一定程度(文中的条件是判别器判别了 800 k 800k 800k真实图片),然后再两个阶段进行交替:fade in网络,也即b;稳定网络,也即c。每个阶段均训练到一定程度后进入下一阶段。在训练阶段,真实图片也需要跟生成图片一样,根据 α \alpha α值融合两个分辨率的图像,然后输入到判别器中。

在这里插入图片描述

增加多样性-MSD

常见的增加多样性的两种方法:

  • 优化loss让网络自己调整–WGAN
  • 设计衡量多样性的度量加到判别器中–imporoved GAN-MD

文章在MD的基础上提出了MSD,引入了特征的标准差作为衡量标准,以样本为单位,求取相应特征图的相应位置的特征的标准差,最后将所有特征差求出平均值,然后生成一个mean std,并填充成特征图大小,和每个样本原有的特征图进行concat,然后将这些特征图送入到判别器中。这个特征图中包含了不同样本之间的差异性信息,送入判别器后,经过训练,生成样本的差异性也会与训练样本的相似。
在这里插入图片描述
图来自:https://zhuanlan.zhihu.com/p/30637133 【写的很详细,易懂】

归一化-pixel norm

归一化主要是用来制约信号幅度,从而减少G与D之间的不正常竞争,沿channel维度对每个像素的特征长度归一化。
minibatch statistic layer沿着batch维度求标准差,而它沿着channel维度求norm
图源同上

Progressive Growing GANs简介+PyTorch复现

来源:https://zhuanlan.zhihu.com/p/30637133

1. 训练方式

采用progressive growing的训练方式,先训一个小分辨率的图像生成,训好了之后再逐步过渡到更高分辨率的图像。然后稳定训练当前分辨率,再逐步过渡到下一个更高的分辨率。

在这里插入图片描述
如上图所示。更具体点来说,当处于fade in(或者说progressive growing)阶段的时候,上一分辨率(44)会通过resize+conv操作得到跟下一分辨率(88)同样大小的输出,然后两部分做加权,再通过to_rgb操作得到最终的输出。这样做的一个好处是它可以充分利用上个分辨率训练的结果,通过缓慢的过渡(w逐渐增大),使得训练生成下一分辨率的网络更加稳定。

上面展示的是Generator的growing阶段。下图是Discriminator的growing,它跟Generator的类似,差别在于一个是上采样,一个是下采样。这里就不再赘述。

在这里插入图片描述
不难想象,网络在growing的时候,如果不引入progressive(fade in),那么有可能因为比较差的初始化,导致原来训练的进度功亏一篑,模型不得不从新开始学习,如此一来就没有充分利用以前学习的成果,甚至还可能误导。我们知道GAN的训练不稳定,这样的突变有时候是致命的。所以fade in对训练的稳定性来说至关重要。

说到growing的训练方式,我们很容易想到autoencoder也有一种类似的训练方式:先训各一层的encoder和decoder,训好了以后再过渡到训练各两层的encoder和decoder,这样的好处是避免梯度消失,导致离loss太远的层更新不够充分。PG-GAN的做法可以说是这种autoencoder训练方式在GAN训练上的应用。

此外,训练GAN生成高分辨率图像,还有一种方法,叫LAPGAN[2]。LAPGAN借助CGAN,高分辨率图像的生成是以低分辨率图像作为条件去生成残差,然后低分辨率图上采样跟残差求和得到高分辨率图,通过不断堆叠CGAN得到我们想要的分辨率。

在这里插入图片描述
LAPGAN是多个CGAN堆叠一起训练,当然可以拆分成分阶段训练,但是它们本质上是不同的,LAPGAN学的是残差,而PG-GAN存在stabilize训练阶段,学的不是残差,而直接是图像。

作者在代码中设计了一个LODSelectLayer来实现progressive growing。对于Generator,每一层插入一个LODSelectLayer,它实际上就是一个输出分支,实现在特定层的输出。从代码来看,作者应该是这样训练的(参见这里的train_gan函数),先构建44分辨率的网络,训练,然后把网络存出去。再构建88分辨率的网络,导入原来4*4的参数,然后训fade in,再训stabilize,再存出去。我在复现的时候,根据文章的意思,修改了LODSelectLayer层,因为pytorch是动态图,能够很方便地写if-else逻辑语句。

借助这种growing的方式,PG-GAN的效果超级好。另外,我认为这种progressive growing的方法比较适合GAN的训练,GAN训练不稳定可以通过growing的方式可以缓解。不只是在噪声生成图像的任务中可以这么做,在其他用到GAN的任务中都可以引入这种训练方式。我打算将progressive growing引入到CycleGAN中,希望能够得到更好的结果。

2. 增加生成多样性

增加生成样本的多样性有两种可行的方法:通过loss让网络自己调整、通过设计判别多样性的特征人为引导。

WGAN属于前者,它采用更好的分布距离的估计(Wasserstein distance)。模型收敛意味着生成的分布和真实分布一致,能够有多样性的保证。PG-GAN则属于后者。

作者沿用improved GAN的思路,通过人为地给Discriminator构造判别多样性的特征来引导Generator生成更多样的样本。Discriminator能探测到mode collapse是否产生了,一旦产生,Generator的loss就会增大,通过优化Generator就会往远离mode collapse的方向走,而不是一头栽进坑里。

Improved GAN引入了minibatch discrimination层,构造一个minibatch内的多样性衡量指标。它引入了新的参数。

在这里插入图片描述
而PG-GAN不引入新的参数,利用特征的标准差作为衡量标准。

在这里插入图片描述Minibatch statistic layer: averaging=“all”

这里说明了上面那张图做了什么。我们有N个样本的feature maps(为了画图方便,不妨假设每个样本只有一个feature map),我们对每个空间位置求标准差,用numpy的std函数来说就是沿着样本的维度求std。这样就得到一张新的feature map(如果样本的feature map不止一个,那么这样构造得到的feature map数量应该是一致的),接着feature map求平均得到一个数。这个过程简单来说就是求mean std,作者把这个数复制成一张feature map的大小,跟原来的feature map拼在一起送给Discriminator。

从作者放出来的代码来看,这对应averaging=“all”的情况。作者还尝试了其他的统计量:“spatial”,“gpool”,“flat”等。它们的主要差别在于沿着哪些维度求标准差。至于它们的作用,等我的代码复现完成了会做一个测试。估计作者调参发现“all”的效果最好。

3. Normalization

从DCGAN[3]开始,GAN的网络使用batch(or instance) normalization几乎成为惯例。使用batch norm可以增加训练的稳定性,大大减少了中途崩掉的情况。作者采用了两种新的normalization方法,不引入新的参数(不引入新的参数似乎是PG-GAN各种tricks的一个卖点)。

第一种normalization方法叫pixel norm,它是local response normalization的变种。Pixel norm沿着channel维度做归一化,这样归一化的一个好处在于,feature map的每个位置都具有单位长度。这个归一化策略与作者设计的Generator输出有较大关系,注意到Generator的输出层并没有Tanh或者Sigmoid激活函数,后面我们针对这个问题进行探讨。

在这里插入图片描述
第二种normalization方法跟凯明大神的初始化方法[4]挂钩。He的初始化方法能够确保网络初始化的时候,随机初始化的参数不会大幅度地改变输入信号的强度。

1 2 n l V a r [ w l ] = 1 ( w l : w e i g h t s   o f   l a y e r   l ; n l : n u m b e r   o f   w e i g h t s   a t   l a y e r   l ) \frac{1}{2}n_lVar[w_l]=1(w_l:weights~of~layer~l; n_l:number~of~weights~at~layer~l) 21nlVar[wl]=1(wl:weights of layer l;nl:number of weights at layer l)

根据这个式子,我们可以推导出网络每一层的参数应该怎样初始化。可以参考pytorch提供的接口

作者走得比这个要远一点,他不只是初始化的时候对参数做了调整,而是动态调整。初始化采用标准高斯分布,但是每次迭代都会对weights按照上面的式子做归一化。作者argue这样的归一化的好处在于它不用再担心参数的scale问题,起到均衡学习率的作用(euqalized learning rate)。

4. 有针对性地给样本加噪声

通过给真实样本加噪声能够起到均衡Generator和Discriminator的作用,起到缓解mode collapse的作用,这一点在WGAN的前传中就已经提到[5]。尽管使用LSGAN会比原始的GAN更容易训练,然而它在Discriminator的输出接近1的适合,梯度就消失,不能给Generator起到引导作用。针对D趋近1的这种特性,作者提出了下面这种添加噪声的方式

n o i s e   s t r e n g t h = 0.2 ∗ m a x ( 0 , d t − 0.5 ) 2 noise~strength=0.2*max(0, d_t-0.5)^2 noise strength=0.2max(0,dt0.5)2

其中, d t = 0.9 ∗ d t − 1 + 0.1 ∗ d d_t=0.9*d_{t-1}+0.1*d dt=0.9dt1+0.1d d t d_t dt d d d分别为第 t t t次迭代判别器输出的修正值、第 t − 1 t-1 t1次迭代真样本的判别器输出。

从式子可以看出,当真样本的判别器输出越接近1的时候,噪声强度就越大,而输出太小(<=0.5)的时候,不引入噪声,这是因为0.5是LSGAN收敛时,D的合理输出(无法判断真假样本),而小于0.5意味着D的能力太弱。

文章还有其他很多tricks,有些tricks不是作者提出的,如Layer norm,还有一些比较细微的tricks,比如每个分辨率训练好做sample的时候学习率怎么decay,每个分辨率的训练迭代多少次等等,我们就不再详细展开。具体可以参见官方代码,也可以看我复现的代码。

目前复现的结果还在跑,现在训练到了16*16分辨率的fade in阶段,放一张当前的结果图,4个方格的每个方格左边4列是生成的图,右边4列是真实样本。现在还处于训练早期,分辨率太低,过几天看一下高分辨率的结果。

在这里插入图片描述
16*16 resolution temporary results (phase=fade in)

Update(20171116): 训练开始变得很慢,不过稳定性似乎有所上升,现在训练到了32x32分辨率,效果图(每一方格左边四列是生成图,右边四列是原图)如下。另外,我补充了Generator的输出层使用linear激活函数的实验,实验效果也很好。

在这里插入图片描述32x32 resolution temporary result (phase=fade in)

Update(20171117): 128x128 fade in结果如下,左边两列是生成图,右边两列是真实图。获得类似的效果,可以参看github上面的说明。

在这里插入图片描述

PyTorch复现:github-pengge/PyTorch-progressive_growing_of_gans


参考:
https://blog.csdn.net/liujunru2013/article/details/78545882

https://blog.csdn.net/weixin_41024483/article/details/83116856

https://blog.csdn.net/Evabook/article/details/89185261

https://blog.csdn.net/u013412904/article/details/79045473

https://blog.csdn.net/u013139259/article/details/78885815

  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值