PGGAN(ProGAN) 介绍 2022/05/06
正文
本次毕业设计准备使用 StyleGAN,但是介绍 StyleGAN 之前,首先需要介绍他的前身 PGGAN,本篇论文准备介绍 PGGAN 的基础知识。
1.PGGAN 引入
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的指标。
下面我们主要从网络架构、增加图片多样性、正则化生成器和判别器、实验细节 等四个方面来进行讲解。
2.PGGAN 的网络架构
本部分对应原始论文第二段 2 PROGRESSIVE GROWING OF GANS。 Progressive Growing 的思想,是本文最大的卖点,也是后来 StyleGAN 延续使用的部分。
这种渐进式的学习过程是从低分辨率开始,通过向网络中添加新的层逐步增加生成图片的分辨率。该种方法主观上允许我们首先学习图片分布的大的结构特征(低分辨率),在机构特征学习之后,逐步学习图片的细节部分(高分辨率),而不是同时学习所有尺度的特征。倘若同时学习所有尺度的特征网络的训练难度过大,试想当图片的大型结构仍需要继续学习,然而细节部分已经学习成功,又出现一个我们不想看到的问题,图片的大型结构一旦改变,网络的细节部分需要重新开始学习。从该角度来看,Progressive Growing 的网络训练架构是相当合理的!
图一展示了PGGAN训练的大致流程,从4x4,8x8,再到16x16...他的分辨率随着epoch的不断进行而增加,正是 progressive growing 的思想。
然而,因为网络训练的阶段性,倘若训练16x16直接转移到32x32的网络架构,因为新加入层的网络权重可能"很坏",网络可能因此坏掉。为了解决该问题,PGGAN 设计了 fade in 的过渡流程。
如图2所示,当16x16转移到32x32时,我们通过控制 alpha 因此,来实现一种渐进的过程,避免网络突然坏掉!
下图是 PGGAN 在1024 X 1024 时的完整的网络架构。
作者Tero Karras 在论文中说道,使用该种方法,用 wgan-gp 作为损失函数,训练过程较为稳定;而且还可以减少2-6倍训练时间
3.增加生成图片多样性
该部分对应原文的第三段 3 INCREASING VARIATION USING MINIBATCH STANDARD DEVIATION,提出了minibatch standard deviation(minibatch std)来增强图片多样性的方法。
生成对抗网络总有一种捕获训练数据中部分数据分布的倾向,学术界称之为 mode collapse,情况严重的话,称之为 mode dropping。这与我们 GAN 生成对抗网络的原本思想背道而驰,我们希望 GAN能够捕捉出所有数据的分布,进而生成器可以产生尽可能真实、多样的图片。为了应对这种情况,作者提出了一种方法 minibatch standard deviation。
该方法的前身是 Minibatch discrimination。是生成对抗网络之父 Ian Goodfellow 在 2016 年 Improved Techniques for Training GANs 中提出,具体的步骤如下图所示:
Ian Goodfellow 在论文中曾经说道 Minibatch Discriminator 的中心思想在于让 discriminator 每一次看多个 instance 的组合,而不是单独的看一个 instance。(这样可以增加 mode collapse 的惩罚)。每次看多个样本的方法,有一点和 Batch Normalization 类似。然而,考虑到 Minibatch Disrminator 只是作为防止 mode collapse 的工具,因此,我们对他进一步限制,查看我们生成的图像距离是否足够的 '接近'。 查看样本之间距离的方法很多,作者进行大量的实验,介绍的 Minibatch Disrminator 就是一个较好的衡量距离的方法。
我们假设图片集合为 , 为网络 Discriminator 某一层的映射函数(包含的前面的所有层), 输入图片 , 该层的输出应该为 , 而且,(论文中确实是将其当做一个特征向量了,我们可以理解为将 C, H, W 展平了)。之后,我们将 vector 乘以张量(可学习) , 得到矩阵 。之后,我们计算 。 之后具体的计算公式可以如下图所示。
这里我们可以细节的探讨一下,为什么这样做。 Minibatch Discriminator 的中心思想在于计算多个 Instance 之间的距离,在上文的计算中, 某层运算之后的 Instance 可以视为 ,但是倘若之间计算 Instance 之间的距离,没有可学习的参数的话,很难得到较好的衡量方法(我认为作者 Ian Goodfellow 应该尝试了这方面的方式,效果不是特别理想)。因此,他加入了一个 张量 ,将原本的特征 通过学习的方式映射到了 ,更为方便计算样本之间的 distance,之后作者设计了一种方法,来衡量一个样本,和其他所有样本之间的距离向量 ,最后显然,我们需要将每个样本计算完成的距离向量 和他的特征进行 concat ,作为 side information,来帮助增加我们图像的多样性,据 Ian 说,该方法还可以加速训练速度(这就玄学,因为我感觉他多样性和速度关系不大)。
根据上文的介绍可以看出,Minibatch discrimination 这种方法较为复杂,而且可学习的参数较多,因此本文作者 Tero Karras 对其进行优化,创造了现在的 Minibatch standard deviation,非常简洁,而且代码很是方便书写。
不过论文中的叙述,倒是非常的绕,我是结合代码才看懂他在说什么。
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 形成一个 特征层。
下面展示的是 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.正则化生成器判别器
此部分对应论文第四段 4 NORMALIZATION IN GENERATOR AND DISCRIMINATOR
作者Tero Karras对传统的 BN 进行怀疑,认为用于解决协变量偏移的 BN 没有办法防止 GAN D和G因恶性竞争导致的梯度问题(无法训练,乃至崩溃)。本文给出了两种方法来限制网络的恶性竞争,第一种是 Equalized Learning Rate,第二种是 Pixel Norm。
EQUALIZED LEARNING RATE
均衡学习率。和传统的 careful 权重初始化不同,我们动态的控制网络权重。 ,为何凯明初始化常数。采取这种方法非常的为微妙,和尺度不变性相关。
倘若仅仅是初始化,那么训练过程中存在 dynamic range 很大的参数(范围一定很大,波动就大,难以训练),可能需要花费更长的时间去训练。 而且甚至有些参数,可能某一阶段学习率对其而言太小,某一阶段学习率对其太大,因此传统 initialize 的方法无法解决。因此,提出了这个 ELR 的方法。,其中为何凯明初始化常数 (膜拜何凯明大神)
PIXELWISE FEATURE VECTOR NORMALIZATION IN GENERATOR
为了防止 G, D因为竞争 螺旋上升,失去控制,我们使用了 PN, 在 Generator 的每个 Conv 后面,同时 Pixel Norm 也非常简单,公式如下所示:
, 其中 k 表示通道维度,i, j 表示图片高宽的位置。 C表示图片的所有维度。
5.PGGAN 的训练细节
1-4部分对 PGGAN 进行了详细的介绍,囊括了 PGGAN 的中心思想,下面我们对 PGGAN 中训练细节进行简要的介绍,大部分内容对应 A.1 1024 1024NETWORKS USED FOR CELEBA-HQ部分
首先,作者是在 8 个 Tesla V100 GPU 上训练了 4天,知道没有办法观察到训练质量的提升。 同时,因为网络架构过大,而且不同 Stage (Resolution) 对显存的要求不同,batch_size 也在变化(为了最大化的利用显卡,并且 minibatch std 对batch_size也有所限制)。 (By the way,英伟达实验室应该很有钱,显卡不缺.)
训练过程中,4x4训练是直到查看 800k real images停止,4x4到8x8 fade in 过程需要查看800k real images, 8x8 需要查看800k real images... 也就是说,我们在训练网络的过程中,不能仅仅单单看 epoch 的大小,更应该看 dataset 含有多少数据。倘若 dataset 含有 1000 张图片,我们我们每一个阶段需要训练 800 个 Epoch。
其次是 latent space 为512 dimensional, leakyReLU 斜率为 0.2。初始化 bias 为0, weight Norm(0, 1), Adam 优化器参数设置为
使用了 WGAN-GP, 并且设置
参考文献
Progressive Growing of GANs for Improved Quality, Stability, and Variation
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)