章节目标
- 了解ProGAN模型如何渐进式训练一个GAN来生成高质量图像。
- 理解ProGAN如何改进以构建StyleGAN — 一种高性能图像合成GAN。
- 探索StyleGAN如何调整以构建StyleGAN2 — 一种基于原始StyleGAN改进的经典模型。
- 学会这类模型的关键贡献,包括渐进式训练(progressive training),自适应实例归一化(adaptive instance normalization),权重调制及解调(weight modulation and demodulation),和路径长度正则化(path length regularization)。
- 过一遍自注意力GAN(Self-Attention GAN, SAGAN)的架构,融合注意力机制到GAN框架。
- 了解 BigGAN如何基于SAGAN论文扩充以生成高质量图像。
- 了解VQ-GAN如何使用码簿(codebook)来把图像编码为一组离散的tokens序列以方便利用Transformer建模。
- 了解 ViT VQ-GAN 如何采用VQ-GAN架构在编码器和解码器中利用Transformer 而非卷积层。
第四章介绍了生成对抗网络(GANs),这是一类可以在一系列图像生成任务上得到经典结果的生成式模型。其在模型架构和训练过程上的灵活性让学术界和深度学习实践者持续寻找新的方法来设计和训练GANs,这直接导致本章中我们将要探索的很多不同的高级架构特性。
如果要解释所有GAN的发展及其影响,我们很容易能够找到另一本书。Github上的 GAN Zoo repository 包含超过500种不同的 GANs样例及论文链接,从ABC-GAN到ZipNet-GAN!
在本章中,我们将覆盖领域有影响力的主要GANs,包括对模型架构和各自训练过程的细节解释。
我们首先探索来自NVIDIA的三种重要模型: ProGAN, StyleGAN及StyleGAN2,它们拓展了图像生成的边界。我们以足够的细节粒度分析这些模型,以理解底层架构的基础概念,并了解他们是如何基于早期的论文进行构建。
我们也将探索另外两类重要的融合了注意力的GAN架构: 自注意力GAN(Self-Attention GAN, SAGAN) 和 BigGAN,两者都是基于SAGAN的主要思想构建。我们已经在本书的第九章见证了注意力机制在Transformers上下文中的强大力量。
最后,我们也将涉及 VQ-GAN 和 ViT VQ-GAN,它们融合了 变分自编码器,Transformers 以及 GANs的思想。VQ-GAN是谷歌经典文生图生成式模型 Muse 的核心组件。我们将在第十三章探索所谓多模态模型(multimodal models)的更多细节。
训练你自己的模型 |
---|
简洁起见,在本书代码库中,我选择了不引入构建这些模型的代码,而是指出其公开实现,以帮助你在需要的情况下训练自己的模型。 |
ProGAN是NVIDIA Labs在2017年研发的一项技术,目标是提升GAN训练的速度和稳定性。ProGAN没有选择在高精度图像上直接训练GAN,而是建议在低分辨率图像(例如,4x4像素)上首先训练生成器和鉴别器,并在训练过程中逐渐增加网络层以提升分辨率。
让我们仔细看下渐进式训练的概念。
训练自己的ProGAN |
---|
在Paperspace blog上,有Bharath K贡献的使用Keras 实现Pro GAN的优秀教程。需要留意的是,要训练一个跟原始论文中一样效果的ProGAN需要大量算力。 |
跟经典的GANs一样,我们通常构建两个独立网络: 生成器和鉴别器,二者在整个训练过程中都为争夺主动权而斗争。
在一个正常的GAN中,即使是在训练的早期阶段,生成器总是输出全精度图像。我们很自然的能够想到这个策略可能并非最优 — 在训练的早期阶段, 生成器骤然接触复杂的,高精度的图像,其学习高级结构时可能很慢。如果我们首先训练一个轻量级 GAN来输出精确的低分辨率图像,然后再基于逐渐增加分辨率,是否会更好呢?
这个简单的想法导致了 渐进式训练,这是ProGAN论文的一个核心贡献。ProGAN的训练是分阶段的,它从一个使用插值降采样到 4 x 4 像素图像的训练集开始,如下图10-1。
一开始,我们可以训练一个生成器将一个隐输入噪声向量 z (比如说,长度为512)转换为一幅形状为 4 x 4 x 3 的图像。匹配的鉴别器需要将尺寸为 4 x 4 x 3 的输入图像转化为单一的标量预测。第一步的网络架构如图10-2所示。
生成器中的蓝框表示将特征图组转换到RGB (toRGB) 的卷积层, 鉴别器中的蓝框表示将 RGB转换到特征图组的卷积层 (fromRGB)。
论文中,作者训练了一对网络,知道鉴别器见过80万真实图像。现在,我们需要理解生成器和鉴别器是如何扩充以处理 8x8像素图像。
为了扩充生成器和鉴别器,我们需要融合额外的层。这个操作分两阶段:transition 和 stabilization,如下图10-3所示。
我们首先看看生成器。在transition阶段,我们在已有网络中加入新的上采样和卷积层,以及一个残差连接以保持当前训练好toRGB层的输出。关键在于,新层在初始化时使用整个 transition 阶段逐渐 从 0 增加到 1 的一个参数 α \alpha α,以允许新的 toRGB 输出更多。这是为了避免新层接管时网络震动(shock)过大。
最终,旧的 toRGB 层已无流通过,网络进入了 stabilization 阶段 — 训练的后期阶段,网络可以精调输出,无任何流进过旧的 toRGB 层。
鉴别器使用了一个相似的过程,如图10-4所示。
这里,我们需要融合额外的下采样和卷积层。同样的,这些层注入到网络中 — 这次是在网络的开始,直接接在输入图像之后。已有的 fromRGB 层通过残差连接,并随着新层在transition阶段逐渐接管而淡出。stabilization阶段允许鉴别器使用新层精调。
所有transition 和 stabilization 阶段一直持续,知道鉴别器完整看过 80万张真实图片。注意尽管网络是渐进式训练的,并没有哪层是固定的(frozen)。在整个训练过程中,所有的层都是充分可训练的。
整个过程一直持续,GAN也从 4x4 图像逐步成长到 8x8,然后是16x16, 32x32,等等,知道它达到了全精度 (1024x1024),如图10-5所示。
在完整的渐进式训练过程完成之后,生成器和鉴别器的整体结构如图10-6所示。
论文也做出了一些其它的重要贡献,例如 minibatch standard deviation, equalized learning rates, pixelwise normalization,在接下来的小节中我们会给出描述。
Minibatch standard deviation 是鉴别器中的一个额外层,它把minibatch中所有像素上特征值的标准差插入作为额外的(常量)特征。这有助于确保生成器在输出中构建更多发散度 — 如果minibatch中变化少,那么标准差会比较小,鉴别器可以使用这个特征来区分虚假batches 和 真实batches!因此,如果生成器被刺激以确保它生成与真实训练数据中相似量的变化。
ProGAN中所有的全连层和卷积层都使用 equalized learning rates。通常,神经网络的权重都是用某个方法来初始化,如 He initialization — 一个高斯分布,其标准差被放缩到与层的输入数目之平方根成反比。通过这种方式,具有大量输入的层在初始化时权重相对于0将有小的偏差,这增加了训练过程的稳定性。
ProGAN论文作者发现,上面的做法在联合现代优化器(如Adam 或 RMSProp)使用时会导致问题。这些方法对于每个权重都归一化其梯度更新,使得更新的尺寸独立于权重尺度(幅度)。然而,这意味着大动态范围的权重(也即,具有更少输入的层)在调整时会比小动态范围的权重(也即,具有更多输入的层)耗时更长。作者发现这导致了ProGAN中生成器和鉴别器不同层在训练时速度的不均衡,因此,他们使用了Equalized Learning Rates 来解决这一问题。
在ProGAN中,无论网络层输入数目时多少,权重都使用简单标准高斯初始化。归一化则是动态进行,作为网络层调用的一部分,而非仅仅只在初始化阶段。通过这种方式,优化器将每个权重看做相同动态范围,因而它们的学习率相同。只有当网络层被调用时权重才会通过HE初始化的方式进行放缩。
最后,ProGAN还在生成器中应用了 pixelwise normalization 技术,而非batch normalization。其将每个像素的特征向量归一化到单位长度,并阻止信号在网络传播过程中脱离控制。Pixelwise Normalization并无可训练权重。
除了CelebA数据集,ProGAN还应用到 大规模场景理解(Large-scale Scene Understanding, LSUN)数据集, 并取得了非常好的效果,如图10-7所示。这展示了 ProGAN相对于GAN架构的强大能力,并为未来的迭代如 StyleGAN 和 StyleGAN2 铺平了道路,这一部分我们下一小节将会介绍。
StyleGAN 是2018年提出的一个基于早期ProGAN论文的GAN架构。事实上,鉴别器部分是完全相同的,只有生成器部分发生了改变。
通常,当训练GANs时,我们很难在隐空间中分离出对应高层次属性的向量 — 它们常常是纠缠在一起的,意思是,如果想在隐空间中调整图像来给一幅人脸生成更多雀斑,可能都会无意的修改背景颜色。尽管 ProGAN 生成真实感图片,它在这个一般规律上也毫无意外。理想情况下,我们想要获得图像风格的完全控制,这要求对隐空间特征的蒸馏分离。
StyleGAN 通过在网络的不同点上显式注入风格向量实现了这一点: 一些控制高层次特征 (例如,人脸朝向),一些控制低层次细节 (例如,头发垂直前额的方式)。
StyleGAN 生成器的整体架构如图 10-8 所示。让我们从映射网络(mapping network) 开始,一起逐步审视一下该架构。
训练自己的StyleGAN |
---|
Soon-Yau Cheong在Keras官网上有一个StyleGAN实现的优秀教程。需要留意的是,要训练一个跟原始论文中一样效果的StyleGAN需要大量算力。 |
映射网络 f f f 是一个简单的前向网络,它可以把输入噪声 z ∈ Z \mathbf{z} \in \mathcal{Z} z∈Z 转换成一个隐空间向量 w ∈ W \mathbf{w} \in \mathcal{W} w∈W。这给了生成器机会来将带噪声的输入向量蒸馏出不同的变化因子,可以被下游风格生成层轻易获取。
这么操作的要点在于从给定风格图像的生成中(合成网络)分离出图像风格选取的过程(映射网络)。
合成网络是给定风格(通过映射网络提供)实际图像的生成器。从图10-8可以看到,风格向量 w \mathbf{w} w 在不同的点都注入到合成网络,每次通过一个不同的全连层 A i \mathbf{A}_i Ai, 这会产生两个向量: 一个偏置向量 y b , i \mathbf{y}_{b,i} yb,i 以及一个放缩向量 y s , i \mathbf{y}_{s,i} ys,i 。这两个向量定义了在该点上需要注入网络的特定风格 — 也即,它们告诉合成网络如何调整特征图来在特定风格方向上移动生成图像。
该调整通过 自适应实例归一化(adaptive instance normalization) (AdaIN) 层来获得。
(未完待续)