PGGAN(ProGAN) 介绍 2022/05/06
\(\quad\)本次毕业设计准备使用 StyleGAN,但是介绍 StyleGAN 之前,首先需要介绍他的前身 PGGAN,本篇论文准备介绍 PGGAN 的基础知识。
1.PGGAN 引入
\(\quad\) Progressive Growing of GANs for Improved Quality, Stability, and Variation Tero Karras, Timo Aila Published 27 October 2017(Citations 3711) 是 英伟达实验室 Tero Karras 大神提出的生成对抗网络模型,本文的中心思想是通过 Progressive Growing 的训练方法,加速训练过程并稳定模型,并取得非常好的实验效果。同时本还给出了提出了增加图片多样性,减少 G 和 D恶性竞争的方法。以及衡量GAN的指标。
\(\quad\)下面我们主要从网络架构、增加图片多样性、正则化生成器和判别器、实验细节 等四个方面来进行讲解。
2.PGGAN 的网络架构
\(\quad\)本部分对应原始论文第二段 2 PROGRESSIVE GROWING OF GANS。 Progressive Growing 的思想,是本文最大的卖点,也是后来 StyleGAN 延续使用的部分。
\(\quad\)这种渐进式的学习过程是从低分辨率开始,通过向网络中添加新的层逐步增加生成图片的分辨率。该种方法主观上允许我们首先学习图片分布的大的结构特征(低分辨率),在机构特征学习之后,逐步学习图片的细节部分(高分辨率),而不是同时学习所有尺度的特征。倘若同时学习所有尺度的特征网络的训练难度过大,试想当图片的大型结构仍需要继续学习,然而细节部分已经学习成功,又出现一个我们不想看到的问题,图片的大型结构一旦改变,网络的细节部分需要重新开始学习。从该角度来看,Progressive Growing 的网络训练架构是相当合理的!
\(\quad\)图一展示了PGGAN训练的大致流程,从4x4,8x8,再到16x16...他的分辨率随着epoch的不断进行而增加,正是 progressive growing 的思想。
\(\quad\)然而,因为网络训练的阶段性,倘若训练16x16直接转移到32x32的网络架构,因为新加入层的网络权重可能"很坏",网络可能因此坏掉。为了解决该问题,PGGAN 设计了 fade in 的过渡流程。
\(\quad\)如图2所示,当16x16转移到32x32时,我们通过控制 alpha 因此,来实现一种渐进的过程,避免网络突然坏掉!
\(\quad\)下图是 PGGAN 在1024 X 1024 时的完整的网络架构。
\(\quad\)作者Tero Karras 在论文中说道,使用该种方法,用 wgan-gp 作为损失函数,训练过程较为稳定;而且还可以减少2-6倍训练时间
3.增加生成图片多样性
\(\quad\)该部分对应原文的第三段 3 INCREASING VARIATION USING MINIBATCH STANDARD DEVIATION,提出了minibatch standard deviation(minibatch std)来增强图片多样性的方法。
\(\quad\)生成对抗网络总有一种捕获训练数据中部分数据分布的倾向,学术界称之为 mode collapse,情况严重的话,称之为 mode dropping。这与我们 GAN 生成对抗网络的原本思想背道而驰,我们希望 GAN能够捕捉出所有数据的分布,进而生成器可以产生尽可能真实、多样的图片。为了应对这种情况,作者提出了一种方法 minibatch standard deviation。
\(\quad\)该方法的前身是 Minibatch discrimination。是生成对抗网络之父 Ian Goodfellow 在 2016 年 Improved Techniques for Training GANs 中提出,具体的步骤如下图所示:
\(\quad\)Ian Goodfellow 在论文中曾经说道 Minibatch Discriminator 的中心思想在于让 discriminator 每一次看多个 instance 的组合,而不是单独的看一个 instance。(这样可以增加 mode collapse 的惩罚)。每次看多个样本的方法,有一点和 Batch Normalization 类似。然而,考虑到 Minibatch Disrminator 只是作为防止 mode collapse 的工具,因此,我们对他进一步限制,查看我们生成的图像距离是否足够的 '接近'。 查看样本之间距离的方法很多,作者进行大量的实验,介绍的 Minibatch Disrminator 就是一个较好的衡量距离的方法。
\(\quad\)我们假设图片集合为 \({x_1, x_2, ..., x_n}\), \(f(x)\) 为网络 Discriminator 某一层的映射函数(包含的前面的所有层), 输入图片 \(x_i\), 该层的输出应该为 \(f(x_i)\), 而且\(f(x_i)\in \R^A\),(论文中确实是将其当做一个特征向量了,我们可以理解为将 C, H, W 展平了)。之后,我们将 vector \(f(x_i)\) 乘以张量(可学习) \(T, T\in \R^{A\times B \times C}\), 得到矩阵 \(M_i \in \R^{B\times C}\)。之后,我们计算 \(c_b(x_i, x_j)=exp(-||M_{i,b}-M_{j,b}||_{L_1}) \in \R\)。 之后具体的计算公式可以如下图所示。
\(\quad\)这里我们可以细节的探讨一下,为什么这样做。 Minibatch Discriminator 的中心思想在于计算多个 Instance 之间的距离,在上文的计算中, 某层运算之后的 Instance 可以视为 \(f(x_i) \in \R_A\),但是倘若之间计算 Instance 之间的距离,没有可学习的参数的话,很难得到较好的衡量方法(我认为作者 Ian Goodfellow 应该尝试了这方面的方式,效果不是特别理想)。因此,他加入了一个 张量 \(T \in \R^{A\times B \times C}\),将原本的特征 \(f(x_i)\) 通过学习的方式映射到了 \(M_i \in \R^{B\times C}\),更为方便计算样本之间的 distance,之后作者设计了一种方法,来衡量一个样本,和其他所有样本之间的距离向量 \(o_i\),最后显然,我们需要将每个样本计算完成的距离向量 \(o(x_i)\) 和他的特征进行 concat \(f(x_i)\),作为 side information,来帮助增加我们图像的多样性,据 Ian 说,该方法还可以加速训练速度(这就玄学,因为我感觉他多样性和速度关系不大)。
\(\quad\)根据上文的介绍可以看出,Minibatch discrimination 这种方法较为复杂,而且可学习的参数较多,因此本文作者 Tero Karras 对其进行优化,创造了现在的 Minibatch standard deviation,非常简洁,而且代码很是方便书写。
\(\quad\)不过论文中的叙述,倒是非常的绕,我是结合代码才看懂他在说什么。
\(\quad\)Minibatch std 既没有可学习的参数也没有需要人为调控的超参数,而且计算方法也较为简单。首先,我们对 N, C, H, W 的张量,沿着 BatchSize(N) 计算standard deviation,产生 1, C, H, W 的张量,然后对其平均 avg 得到一个常数 scaler,然后将常量复制多次 reshape 成为 N, 1, H, W 的形状,作为一个特征层 concat 到我们原本 N, C, H, W 的张量中,得到 N, C+1, H, W 形状的张量。(是不是比 Minibatch Discriminator 简单多了)。但是中心思想还是没变,衡量多个样本之间的距离,不过 minibatch std 将其浓缩成了一个 scaler,然后 expand 形成一个 特征层。
\(\quad\)下面展示的是 pytorch 中 minibatch_std 操作的代码,因为没有可学习的参数,甚至可以不用封装为层。
def minibatch_std(self, x):
batch_statistics = (
torch.std(x, dim=0).mean().repeat(x.shape[0], 1, x.shape[2], x.shape[3])
)
# we take the std for each example (across all channels, and pixels) then we repeat it
# for a single channel and concatenate it with the image. In this way the discriminator
# will get information about the variation in the batch/image
return torch.cat([x, batch_statistics], dim=1)
4.正则化生成器判别器
\(\quad\)此部分对应论文第四段 4 NORMALIZATION IN GENERATOR AND DISCRIMINATOR
作者Tero Karras对传统的 BN 进行怀疑,认为用于解决协变量偏移的 BN 没有办法防止 GAN D和G因恶性竞争导致的梯度问题(无法训练,乃至崩溃)。本文给出了两种方法来限制网络的恶性竞争,第一种是 Equalized Learning Rate,第二种是 Pixel Norm。
EQUALIZED LEARNING RATE
\(\quad\)均衡学习率。和传统的 careful 权重初始化不同,我们动态的控制网络权重。 \(w_i=w_i/c\),\(c\)为何凯明初始化常数。采取这种方法非常的为微妙,和尺度不变性相关。
\(\quad\)倘若仅仅是初始化,那么训练过程中存在 dynamic range 很大的参数(范围一定很大,波动就大,难以训练),可能需要花费更长的时间去训练。 而且甚至有些参数,可能某一阶段学习率对其而言太小,某一阶段学习率对其太大,因此传统 initialize 的方法无法解决。因此,提出了这个 ELR 的方法。\(w_i=w_i/c\),其中\(c\)为何凯明初始化常数 (膜拜何凯明大神)
PIXELWISE FEATURE VECTOR NORMALIZATION IN GENERATOR
\(\quad\)为了防止 G, D因为竞争 螺旋上升,失去控制,我们使用了 PN, 在 Generator 的每个 Conv 后面,同时 Pixel Norm 也非常简单,公式如下所示:
\(\quad\) \(b_{k,i,j}=a_{k,i,j} / (\sqrt{\sum_{c=0}^{C-1}a_{c,i,j}^2}+\epsilon)\), 其中 k 表示通道维度,i, j 表示图片高宽的位置。 C表示图片的所有维度。
5.PGGAN 的训练细节
$\quad$1-4部分对 PGGAN 进行了详细的介绍,囊括了 PGGAN 的中心思想,下面我们对 PGGAN 中训练细节进行简要的介绍,大部分内容对应 A.1 1024 1024NETWORKS USED FOR CELEBA-HQ部分
\(\quad\)首先,作者是在 8 个 Tesla V100 GPU 上训练了 4天,知道没有办法观察到训练质量的提升。 同时,因为网络架构过大,而且不同 Stage (Resolution) 对显存的要求不同,batch_size 也在变化(为了最大化的利用显卡,并且 minibatch std 对batch_size也有所限制)。 (By the way,英伟达实验室应该很有钱,显卡不缺.)
\(\quad\)训练过程中,4x4训练是直到查看 800k real images停止,4x4到8x8 fade in 过程需要查看800k real images, 8x8 需要查看800k real images... 也就是说,我们在训练网络的过程中,不能仅仅单单看 epoch 的大小,更应该看 dataset 含有多少数据。倘若 dataset 含有 1000 张图片,我们我们每一个阶段需要训练 800 个 Epoch。
\(\quad\)其次是 latent space 为512 dimensional, leakyReLU 斜率为 0.2。初始化 bias 为0, weight Norm(0, 1), Adam 优化器参数设置为 \(\rm \alpha =0.001, \beta _1 =0, \beta _2 =0.99\)
\(\quad\)使用了 WGAN-GP, 并且设置 \(n_{critic}=1\)
参考文献
Progressive Growing of GANs for Improved Quality, Stability, and Variation