丰富的背景和纹理图像的生成是各类生成模型追求的终极目标,ImageNet的生成已然成为检验生成模型好坏的一个指标。在各类生成模型中GAN是这几年比较突出的, 18年新出的SNGANSAGAN让GAN在ImageNet的生成上有了长足的进步, 其中较好的SAGAN在ImageNet的128x128的图像生成上的Inception Score(IS)达到了52分,BigGAN 在SAGAN的基础上一举将IS提高了100分,达到了166分(真实图片也才233分),可以说BigGAN是太秀了,在FID 指标上也是有很大的超越。

论文引入

BigGAN现在已经挂在了arxiv上,在此之前,BigGAN正处于ICLR 2019的双盲审阶段, 大家也都在猜测BigGAN这样的大作是谁带来的。现在根据arxiv上的信息,这篇文章的作者是由英国赫瑞瓦特大学的Andrew Brock 以及DeepMind团队共同带来。拿到这篇论文看了一下摘要,我的第一反应是假的吧?what?仔细阅读,对比了实验才感叹GAN已经能做到这种地步了! 我们来看一下由BigGAN生成的图像:

是不是觉得生成的太逼真了,的确如此,图像的背景和纹理都生成的如此逼真真的是让人折服。其实我更想说,BigGAN做的这么优秀有点太秀了吧!好了, 我们进入正题。

随着GAN、VAE等一众生成模型的发展,图像生成在这几年是突飞猛进,14年还在生成手写数字集到18年已经将ImageNet生成的如此逼真了。这中间最大的贡献者应该就是 GAN了,GAN的对抗思想让生成器和判别器在博弈中互相进步,从而生成的图像是清晰逼真。SAGAN已经将ImageNet在生成上的IS达到了52分,在定性上我感觉 SAGAN已经把ImageNet生成的可以看了,我认为已经很优秀了。BigGAN的生成让我只能用折服来感叹,BigGAN为啥能实现这么大的突破?

其中一个很大的原因就是BigGAN如它题目“LARGE SCALE GAN TRAINING FOR HIGH FIDELITY NATURAL IMAGE SYNTHESIS”描述的Large Scale, 在训练中Batch采用了很大的Batch,已经达到了2048(我们平常训练Batch正常都是64居多),在卷积的通道上也是变大了,还有就是网络的参数变多了, 在2048的Batch下整个网络的参数达到了接近16亿(看了一下自己还在用的GTX1080突然沉默了)。这个就是BigGAN之所以称为BigGAN的原因, 我想BigGAN的题目不仅仅在说明网络的庞大,还想暗示这篇文章会给人带来很大的印象,确实我是被“吓”到了。

这么大的提升当然不可能是一味的增大Batch和网络参数能实现的,其中包括了Batch的加大、先验分布z的适时截断和处理、模型稳定性的控制等,我们在后续展开说明。 按照原文,总结一下BigGAN的贡献:

  • 通过大规模GAN的应用,BigGAN实现了生成上的巨大突破。
  • 采用先验分布z的“截断技巧”,允许对样本多样性和保真度进行精细控制
  • 在大规模GAN的实现上不断克服模型训练问题,采用技巧减小训练的不稳定

BigGAN提升生成之路

BigGAN在SAGAN的基础上架构模型,SAGAN不熟悉的可参看我之前论文解读的博客, BigGAN同样采用Hinge Loss、BatchNorm和Spectral Norm和一些其它技巧。在SAGAN的基础上BigGAN 在设计上做到了Batch size的增大、“截断技巧”和模型稳定性的控制。

Batch size的增大

SAGAN中的Batch size为256,作者发现简单地将Batch size增大就可以实现性能上较好的提升,文章做了实验验证:

可以看到,在Batch size增大到原来的8倍的时候,生成性能上的IS提高了46%。文章推测这可能是每批次覆盖更多模式的结果,为生成和判别两个网络提供更好的梯度。 增大Batch size还会带来在更少的时间训练出更好性能的模型,但增大Batch size也会使得模型在训练上稳定性下降,后续再分析如何提高稳定性。

在实验上,单单提高Batch size还受到限制,文章在每层的通道数也做了相应的增加,当通道增加50%,大约两倍于两个模型中的参数数量。这会导致IS进一步提高21%, 文章认为这是由于模型的容量相对于数据集的复杂性而增加。有趣的是,文章在实验上发现一味的增加网络的深度并不会带来更好的结果,反而在生成性能上会有一定的下降。

由于BigGAN是训练ImageNet的各个类,所以通过加入条件标签$c$实现条件生成,如果在BatchNorm下嵌入条件标签$c$将会带来很多的参数增加,文章采用了 共享嵌入,而不是为每个嵌入分别设置一个层,这个嵌入线性投影到每个层的bias和weight,这个思想借鉴自SNGAN和SAGAN,这降低了计算和内存成本, 并将训练速度(达到给定性能所需的迭代次数)提高了37%。BigGAN在先验分布z的嵌入做了改进,普遍的GAN都是将z作为输入直接嵌入生成网络, 而BigGAN将噪声向量z送到G的多个层而不仅仅是初始层。文章认为潜在空间z可以直接影响不同分辨率和层次结构级别的特征,对于BigGAN的条件生成上 通过将z分成每个分辨率的一个块,并将每个块连接到条件向量$c$来实现,这样提供约4%的适度性能提升,并将训练速度提高18%。

按照上述思想看一下BigGAN的生成网络的详细结构:

如左图所示将噪声向量z通过split等分成多块,然后和条件标签$c$连接后一起送入到生成网络的各个层中,对于生成网络的每一个残差块又可以进一步展开为右图的结构。 可以看到噪声向量z的块和条件标签$c$在残差块下是通过concat操作后送入BatchNorm层,其中这种嵌入是共享嵌入,线性投影到每个层的bias和weight。

“截断技巧”

对于先验分布z,一般情况下都是选用标准正态分布$\mathcal N(0, I)$或者均匀分布$\mathcal U[-1,1]$,文章对此存在疑惑,难道别的分布不行吗? 通过实验,为了适合后续的“截断”要求,文章最终选择了$z \sim \mathcal N(0, I)$。

所谓的“截断技巧”就是通过对从先验分布z采样通过设置阈值的方式来截断z的采样,其中超出范围的值被重新采样以落入该范围内。这个阈值可以根据生成质量指标 IS和FID决定。通过实验可以知道通过对阈值的设定,随着阈值的下降生成的质量会越来越好,但是由于阈值的下降采样的范围变窄就会造成生成上取向单一化, 造成生成的多样性不足的问题。往往IS可以反应图像的生成质量,FID则会更假注重生成的多样性。我们通过下图理解一下这个截断的含义:

随着截断的阈值下降,生成的质量在提高,但是生成也趋近于单一化。所以根据实验的生成要求,权衡生成质量和生成多样性是一个抉择,往往阈值的下降 会带来IS的一路上涨,但是FID会先变好后一路变差。还有在一些较大的模型不适合截断,在嵌入截断噪声时会产生饱和伪影,如上图(b)所示,为了抵消这种情况, 文章通过将G调节为平滑来强制执行截断的适应性,以便z的整个空间将映射到良好的输出样本。为此,文章采用正交正则化, 它直接强制执行正交性条件:

其中$W$是权重矩阵,β是超参数。这种正则化通常过于局限,文章为了放松约束,同时实现模型所需的平滑度,发现最好的版本是从正则化中删除对角项, 并且旨在最小化滤波器之间的成对余弦相似性,但不限制它们的范数:

其中$1$表示一个矩阵,所有元素都设置为1。通过上面的Table1中的Hier.代表直接截断,Ortho.表示采用正则正交可以看出来正则正交在性能上确实有所提升。

我认为BigGAN中的“截断技巧”很像Glow中的退火技巧,BigGAN通过控制采样的范围达到生成质量上的提高, Glow是通过控制退火系数(也是控制采样范围)达到生成图像平滑性的保证。

模型稳定性的控制

对于G的控制:

在探索模型的稳定性上,文章在训练期间监测一系列权重、梯度和损失统计数据,以寻找可能预示训练崩溃开始的指标。实验发现每个权重矩阵的前三个奇异值 $\sigma_0 , \sigma_1 , \sigma_2$是最有用的,它们可以使用Alrnoldi迭代方法 进行有效计算,实验如下图(a)所示,对于奇异值$\sigma_0$大多数G层具有良好的光谱规范,但有些层(通常是G中的第一层而非卷积)是表现不佳, 光谱规范在整个训练过程中增长,在崩溃时爆炸。

为了解决G上的训练崩溃,通过适当调整奇异值$\sigma_0$以抵消光谱爆炸的影响。首先,文章调整每个权重的顶部奇异值$\sigma_0$,朝向固定值$\sigma_{reg}$ 或者朝向第二个奇异值的比例$r$,即朝向$r \cdot sg(\sigma_1)$,其中$sg$是控制梯度的操作,适时停止。另外的方法是使用部分奇异值的分解来代替 $\sigma_0$,在给定权重W,它的第一个奇异值向量$\mu_0$和$\nu_0$以及固定的$\sigma_{clamp}$,将权重限制在:

其中固定的$\sigma_{clamp}$设置为$\sigma_{reg}$或者$r \cdot sg(\sigma_1)$,上述整个操作就是为了将权重的第一个奇异值$\sigma_0$控制住, 放置突然性的爆炸。实验观察到在进行权重限制的操作下,在有无光谱归一化的操作下,都在一定程度上防止了$\sigma_0$或者$\frac{\sigma_0}{\sigma_1}$ 的爆炸,但是即使在某些情况下它们可以一定程度上地改善网络性能,但没有任何组合可以防止训练崩溃(得到的结论就是崩溃无法避免)。

一顿操作后,文章得出了调节G可以改善模型的稳定性,但是无法确保一直稳定,从而文章转向对D的控制。

对于D的控制:

和G的切入点相同,文章依旧是考虑D网络的光谱,试图寻找额外的约束来寻求稳定的训练。如上图3中(b)所示,与G不同,可以看到光谱是有噪声的, 但是整个过程是平稳增长在崩溃时不是一下爆炸而是跳跃一下。文章假设这些噪声是由于对抗训练优化导致的,如果这种频谱噪声与不稳定性有因果关系, 那么相对采用的反制是使用梯度惩罚,通过采用$\mathcal R_1$零中心梯度惩罚:

其中在$\gamma$为10的情况下,训练变得稳定并且改善了G和D中光谱的平滑度和有界性,但是性能严重降低,导致IS减少45%。减少惩罚可以部分缓解这种恶化, 但会导致频谱越来越不良。即使惩罚强度降低到1(没有发生突然崩溃的最低强度),IS减少了20%。使用正交正则化,DropOut和L2的各种正则思想重复该实验, 揭示了这些正则化策略的都有类似行为:对D的惩罚足够高,可以实现训练稳定性但是性能成本很高。

如果对D的控制惩罚力度大,确实可以实现训练的稳定,但是在图像生成性能上也是下降的,而且降的有点多,这种权衡就是很纠结的。

实验还发现D在训练期间的损失接近于零,但在崩溃时经历了急剧的向上跳跃,这种行为的一种可能解释是D过度拟合训练集,记忆训练样本而不是学习真实图像和生成图像之间的一些有意义的边界。 为了评估这一猜测,文章在ImageNet训练和验证集上评估判别器,并测量样本分类为真实或生成的百分比。虽然在训练集下精度始终高于98%,但验证准确度在50-55%的范围内, 这并不比随机猜测更好(无论正则化策略如何)。这证实了D确实记住了训练集,这符合D的角色:不断提炼训练数据并为G提供有用的学习信号。

模型稳定性不仅仅来自G或D,而是来自他们通过对抗性训练过程的相互作用。虽然他们的不良调节症状可用于追踪和识别不稳定性,但确保合理的调节证明是训练所必需的, 但不足以防止最终的训练崩溃。可以通过约束D来强制执行稳定性,但这样做会导致性能上的巨大成本。使用现有技术,通过放松这种调节并允许在训练的后期阶段发生崩溃(人为把握训练实际), 可以实现更好的最终性能,此时模型被充分训练以获得良好的结果。

BigGAN实验

BigGAN实验主要是在ImageNet数据集下做评估,实验在ImageNet ILSVRC 2012(大家都在用的ImageNet的数据集)上128×128,256×256和512×512分辨率评估模型。 实验在定性上的效果简直让人折服,在定量上通过和最新的SNGAN和SAGAN在IS和FID做对比,也是碾压对方。

为了进一步说明G网络并非是记住训练集,在固定z下通过调节条件标签$c$做插值生成,通过下图的实验结果可以发现,整个插值过程是流畅的,也能说明G 并非是记住训练集,而是真正做到了图像生成。

当然模型也有生成上不合理的图像,但是不像以前GAN一旦生成不合理的图像,往往是扭曲和透明化的图,BigGAN训练不合理的图像也保留了一定的纹理和辨识度, 确实可以算是很好的模型了。

实验更是在自己的训练样本下训练,残暴的在8500类下29亿张图片训练,和ImageNet相似也是取的了很好的效果。

再来说一下实验环境,实验整体是在SAGAN基础上架构,训练采用Google的TPU。一块TPU的性能可以赶得上十几甚至更多GPU的性能,庞大的训练参数也是让人害怕, 至少我估计我的电脑是跑不动的了。

文章的另一大亮点是把实验的NG结果做了分析,把自己趟的坑和大家分享了,这个真是很良心有没有,我们截取其中一些坑分享一下:

  • 一味加深网络可能会妨碍生成的性能
  • 共享类的思想在控制超参数上是很麻烦的,虽然可能会提高训练速度
  • WeightNorm替换G中的BatchNorm并没有达到好的效果
  • 除了频谱规范化之外,尝试将BatchNorm添加到D(包括类条件和无条件),但并未取的好的效果
  • 在G或D或两者中使用5或7而不是3的滤波器大小,5的滤波器可能会有些许提升,但是计算成本也上去了
  • 尝试在128×128的G和D中改变卷积滤波器的扩张,但发现在任一网络中即使少量的扩张也会降低性能
  • 尝试用G中的双线性上采样代替最近领近的上采样,但这降低了性能

这篇论文的实验包括附录是相当充分的,可以看得出来是花了很长时间在模型训练和改进上的,Deep Mind作为Google旗下的AI团队展示了“壕气”, 为这片论文表示深深的敬意。

最后分享一下BigGAN惊艳的生成效果:

总结

BigGAN实现了GAN在ImageNet上的巨大飞跃,GAN的潜力被开发到一个新的阶段,IS或FID还能否进一步提升,再提升的话将是几乎接近真实的存在了。 通过大Batch,大参数,“截断技巧”和大规模GAN训练稳定性控制实现了BigGAN的壮举。同时庞大的计算量也是让人害怕,但是随着硬件的发展,可能很快AI 大计算会普及开,还是抱有很大的期待。

谢谢观看,希望对您有所帮助,欢迎指正错误,欢迎一起讨论!!!