毕业论文
您现在的位置: 语言识别 >> 语言识别发展 >> 正文 >> 正文

万字综述之生成对抗网络GAN

来源:语言识别 时间:2023/2/7

机器之心经授权转载

作者:郭晓锋(爱奇艺)

前阵子学习GAN的过程发现现在的GAN综述文章大都是年IanGoodfellow或者自动化所王飞跃老师那篇。可是在深度学习,GAN领域,其进展都是以月来计算的,感觉那两篇综述有些老了。

最近发现有一篇最新的GAN综述论文,四十余页,介绍了GAN的各个方面,于是就学习并整理笔记如下。文中许多内容大都根据自己所学总结,有不当之处欢迎指出。

此外,本文参考了许多博客资料,已给出参考链接。如有侵权,请私信删除。文章目录如下:

GAN的基本介绍

生成对抗网络(GAN,GenerativeAdversarialNetworks)作为一种优秀的生成式模型,引爆了许多图像生成的有趣应用。GAN相比于其他生成式模型,有两大特点:

1.不依赖任何先验假设。传统的许多方法会假设数据服从某一分布,然后使用极大似然去估计数据分布。

2.生成real-like样本的方式非常简单。GAN生成real-like样本的方式通过生成器(Generator)的前向传播,而传统方法的采样方式非常复杂,有兴趣的同学可以参考下周志华老师的《机器学习》一书中对各种采样方式的介绍。

下面,我们围绕上述两点展开介绍。

GAN的基本概念

GAN(GenerativeAdversarialNetworks)从其名字可以看出,是一种生成式的,对抗网络。再具体一点,就是通过对抗的方式,去学习数据分布的生成式模型。

所谓的对抗,指的是生成网络和判别网络的互相对抗。生成网络尽可能生成逼真样本,判别网络则尽可能去判别该样本是真实样本,还是生成的假样本。示意图如下:

隐变量z(通常为服从高斯分布的随机噪声)通过Generator生成Xfake,判别器负责判别输入的data是生成的样本Xfake还是真实样本Xreal。优化的目标函数如下:

对于判别器D来说,这是一个二分类问题,V(D,G)为二分类问题中常见的交叉熵损失。对于生成器G来说,为了尽可能欺骗D,所以需要最大化生成样本的判别概率D(G(z)),即最小化log(1-D(G(z))),注意:log(D(x))一项与生成器G无关,所以可以忽略。

实际训练时,生成器和判别器采取交替训练,即先训练D,然后训练G,不断往复。值得注意的是,对于生成器,其最小化的是

,即最小化V(D,G)的最大值。

为了保证V(D,G)取得最大值,所以我们通常会训练迭代k次判别器,然后再迭代1次生成器(不过在实践当中发现,k通常取1即可)。当生成器G固定时,我们可以对V(D,G)求导,求出最优判别器D*(x):

把最优判别器代入上述目标函数,可以进一步求出在最优判别器下,生成器的目标函数等价于优化Pdata(x),Pg(x)的JS散度(JSD,JensonShannonDivergence)。

可以证明,当G,D二者的capacity足够时,模型会收敛,二者将达到纳什均衡。此时,Pdata(x)=Pg(x),判别器不论是对于Pdata(x)还是Pg(x)中采样的样本,其预测概率均为1/2,即生成样本与真实样本达到了难以区分的地步。

目标函数

前面我们提到了GAN的目标函数是最小化两个分布的JS散度。实际上,衡量两个分布距离的方式有很多种,JS散度只是其中一种。如果我们定义不同的距离度量方式,就可以得到不同的目标函数。许多对GAN训练稳定性的改进,比如EBGAN,LSGAN等都是定义了不同的分布之间距离度量方式。

f-divergence

f-divergence使用下面公式来定义两个分布之间的距离:

上述公式中f为凸函数,且f(1)=0。采用不同的f函数(Generator),可以得到不同的优化目标。具体如下:

值得注意的是,散度这种度量方式不具备对称性,即Df(Pdata

Pg)和Df(Pg

Pdata)不相等。

LSGAN

上面提到,LSGAN是f-divergence中

时的特殊情况。具体来说LSGAN的Loss如下:

原作中取a=c=1,b=0。LSGAN有两大优点:

稳定训练:解决了传统GAN训练过程中的梯度饱和问题改善生成质量:通过惩罚远离判别器决策边界的生成样本来实现

对于第一点,稳定训练,可以先看一张图:

上图左边是传统GAN使用sigmoid交叉熵作为loss时,输入与输出的对照关系图。上图右边是LSGAN使用最小二乘loss时,输入与输出的对照关系图。可以看到,在左图,输入比较大的时候,梯度为0,即交叉熵损失的输入容易出现梯度饱和现象。而右边的最小二乘loss则不然。

对于第二点,改善生成质量。这个在原文也有详细的解释。具体来说:对于一些被判别器分类正确的样本,其对梯度是没有贡献的。但是判别器分类正确的样本就一定是很接近真实数据分布的样本吗?显然不一定。

考虑如下理想情况,一个训练良好的GAN,真实数据分布Pdata和生成数据分布Pg完全重合,判别器决策面穿过真实数据点,所以,反过来,我们利用样本点离决策面的远近来度量生成样本的质量,样本离决策面越近,则GAN训练的越好。

上图b中,一些离决策面比较远的点,虽然被分类正确,但是这些并不是好的生成样本。传统GAN通常会将其忽略。而对于LSGAN,由于采用最小二乘损失,计算决策面到样本点的距离,如图c,可以把离决策面比较远的点“拉”回来,也就是把离真实数据比较远的点“拉”回来。

Integralprobalitymetric(IPM)

IPM定义了一个评价函数族f,用于度量任意两个分布之间的距离。在一个紧凑的空间

中,定义P(x)为在x上的概率测度。那么两个分布Pdata,Pg之间的IPM可以定义为如下公式:

类似于f-divergence,不同函数f也可以定义出一系列不同的优化目标。典型的有WGAN,FisherGAN等。下面简要介绍一下WGAN。

WGAN

WGAN提出了一种全新的距离度量方式——地球移动距离(EM,Earth-moverdistance),也叫Wasserstein距离。关于Wasserstein距离的介绍可以参考:白话Wassertein距离[1]。

Wasserstein距离具体定义如下:

(Pdata,Pg)表示一组联合分布,这组联合分布里的任一分布γ的边缘分布均为Pdata(x)和Pg(x)。

直观上来说,概率分布函数(PDF)可以理解为随机变量在每一点的质量,所以W(Pdata,Pg)则表示把概率分布Pdata(x)搬到Pg(x)需要的最小工作量。

WGAN也可以用最优传输理论来解释,WGAN的生成器等价于求解最优传输映射,判别器等价于计算Wasserstein距离,即最优传输总代价[4]。关于WGAN的理论推导和解释比较复杂,不过代码实现非常简单。具体来说[3]:

判别器最后一层去掉sigmoid生成器和判别器的loss不取log每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c

上述第三点,在WGAN的后来一篇工作WGAN-GP中,将梯度截断替换为了梯度惩罚。

f-divergence和IPM对比

f-divergence存在两个问题:其一是随着数据空间的维度

的增加,f-divergence会非常难以计算。其二是两个分布的支撑集[3]通常是未对齐的,这将导致散度值趋近于无穷。

IPM则不受数据维度的影响,且一致收敛于Pdata},Pg两个分布之间的距离。而且即便是在两个分布的支撑集不存在重合时,也不会发散。

辅助的目标函数

在许多GAN的应用中,会使用额外的Loss用于稳定训练或者达到其他的目的。比如在图像翻译,图像修复,超分辨当中,生成器会加入目标图像作为监督信息。EBGAN则把GAN的判别器作为一个能量函数,在判别器中加入重构误差。CGAN则使用类别标签信息作为监督信息。

其他常见生成式模型

自回归模型:pixelRNN与pixelCNN

自回归模型通过对图像数据的概率分布Pdata(x)进行显式建模,并利用极大似然估计优化模型。具体如下:

上述公式很好理解,给定x1,x2,...,xi-1条件下,所有p(xi)的概率乘起来就是图像数据的分布。如果使用RNN对上述依然关系建模,就是pixelRNN。如果使用CNN,则是pixelCNN。具体如下[5]:

显然,不论是对于pixelCNN还是pixelRNN,由于其像素值是一个个生成的,速度会很慢。语音领域大火的WaveNet就是一个典型的自回归模型。

VAE

PixelCNN/RNN定义了一个易于处理的密度函数,我们可以直接优化训练数据的似然;对于变分自编码器我们将定义一个不易处理的密度函数,通过附加的隐变量z对密度函数进行建模。VAE原理图如下[6]:

在VAE中,真实样本X通过神经网络计算出均值方差(假设隐变量服从正态分布),然后通过采样得到采样变量Z并进行重构。VAE和GAN均是学习了隐变量z到真实数据分布的映射。但是和GAN不同的是:

1.GAN的思路比较粗暴,使用一个判别器去度量分布转换模块(即生成器)生成分布与真实数据分布的距离。

2.VAE则没有那么直观,VAE通过约束隐变量z服从标准正态分布以及重构数据实现了分布转换映射X=G(z)。

生成式模型对比

1.自回归模型通过对概率分布显式建模来生成数据;

2.VAE和GAN均是:假设隐变量z服从某种分布,并学习一个映射X=G(z),实现隐变量分布z与真实数据分布Pdata(x)的转换;

3.GAN使用判别器去度量映射X=G(z)的优劣,而VAE通过隐变量z与标准正态分布的KL散度和重构误差去度量。

GAN常见的模型结构

DCGAN

DCGAN提出使用CNN结构来稳定GAN的训练,并使用了以下一些trick:

BatchNormalization使用Transposeconvlution进行上采样使用LeakyReLu作为激活函数

上面这些trick对于稳定GAN的训练有许多帮助,自己设计GAN网络时也可以酌情使用。

层级结构

GAN对于高分辨率图像生成一直存在许多问题,层级结构的GAN通过逐层次,分阶段生成,一步步提生图像的分辨率。典型的使用多对GAN的模型有StackGAN,GoGAN。使用单一GAN,分阶段生成的有ProgressiveGAN。StackGAN和ProgressiveGAN结构如下:

自编码结构

经典的GAN结构里面,判别网络通常被当做一种用于区分真实/生成样本的概率模型。而在自编码器结构里面,判别器(使用AE作为判别器)通常被当做能量函数(Energyfunction)。对于离数据流形空间比较近的样本,其能量较小,反之则大。有了这种距离度量方式,自然就可以使用判别器去指导生成器的学习。

AE作为判别器,为什么就可以当做能量函数,用于度量生成样本离数据流形空间的距离呢?首先,先看AE的loss:

AE的loss是一个重构误差。使用AE做为判别器时,如果输入真实样本,其重构误差会很小。如果输入生成的样本,其重构误差会很大。因为对于生成的样本,AE很难学习到一个图像的压缩表示(即生成的样本离数据流行形空间很远)。所以,VAE的重构误差作为Pdata和Pg之间的距离度量是合理的。典型的自编码器结构的GAN有:BEGAN,EBGAN,MAGAN等。

GAN的训练障碍

理论中存在的问题

经典GAN的判别器有两种loss,分别是:

使用上面第一个公式作为loss时:在判别器达到最优的时候,等价于最小化生成分布与真实分布之间的JS散度,由于随机生成分布很难与真实分布有不可忽略的重叠以及JS散度的突变特性,使得生成器面临梯度消失的问题。

使用上面第二个公式作为loss时:在最优判别器下,等价于既要最小化生成分布与真实分布直接的KL散度,又要最大化其JS散度,相互矛盾,导致梯度不稳定,而且KL散度的不对称性使得生成器宁可丧失多样性也不愿丧失准确性,导致collapsemode现象[7]。

实践中存在的问题

GAN在实践中存在两个问题:

其一,GAN提出者IanGoodfellow在理论中虽然证明了GAN是可以达到纳什均衡的。可是我们在实际实现中,我们是在参数空间优化,而非函数空间,这导致理论上的保证在实践中是不成立的。

其二,GAN的优化目标是一个极小极大(minmax)问题,即

,也就是说,优化生成器的时候,最小化的是

。可是我们是迭代优化的,要保证V(G,D)最大化,就需要迭代非常多次,这就导致训练时间很长。

如果我们只迭代一次判别器,然后迭代一次生成器,不断循环迭代。这样原先的极小极大问题,就容易变成极大极小(maxmin)问题,可二者是不一样的,即:

如果变化为极小极大问题,那么迭代就是这样的,生成器先生成一些样本,然后判别器给出错误的判别结果并惩罚生成器,于是生成器调整生成的概率分布。可是这样往往导致生成器变“懒”,只生成一些简单的,重复的样本,即缺乏多样性,也叫modecollapse。

稳定GAN训练的技巧

如上所述,GAN在理论上和实践上存在三个大问题,导致训练过程十分不稳定,且存在modecollapse的问题。为了改善上述情况,可以使用以下技巧稳定训练:

Featurematching:方法很简单,使用判别器某一层的特征替换原始GANLoss中的输出。即最小化:生成图片通过判别器的特征和真实图片通过判别器得到的特征之间的距离。

标签平滑:GAN训练中的标签非0即1,这使得判别器预测出来的confidence倾向于更高的值。使用标签平滑可以缓解该问题。具体来说,就是把标签1替换为0.8~1.0之间的随机数。

谱归一化:WGAN和ImproveWGAN通过施加Lipschitz条件来约束优化过程,谱归一化则是对判别器的每一层都施加Lipschitz约束,但是谱归一化相比于ImproveWGAN计算效率要高一些。

PatchGAN:准确来说PatchGAN并不是用于稳定训练,但这个技术被广泛用于图像翻译当中,PatchGAN相当于对图像的每一个小Patch进行判别,这样可以使得生成器生成更加锐利清晰的边缘。

具体做法是这样的:假设输入一张x的图像到判别器,输出的是一个4x4的confidencemap,confidencemap中每一个像素值代表当前patch是真实图像的置信度,即为PatchGAN。当前图像patch的大小就是感受野的大小,最后将所有Patch的Loss求平均作为最终的Loss。

modecollapse的解决方案

针对目标函数的改进方法

为了避免前面提到的由于优化maxmin导致mode跳来跳去的问题,UnrolledGAN采用修改生成器loss来解决。具体而言,UnrolledGAN在更新生成器时更新k次生成器,参考的Loss不是某一次的loss,是判别器后面k次迭代的loss。

注意,判别器后面k次迭代不更新自己的参数,只计算loss用于更新生成器。这种方式使得生成器考虑到了后面k次判别器的变化情况,避免在不同mode之间切换导致的模式崩溃问题。此处务必和迭代k次生成器,然后迭代1次判别器区分开[8]。

DRAGAN则引入博弈论中的无后悔算法,改造其loss以解决modecollapse问题[9]。前文所述的EBGAN则是加入VAE的重构误差以解决modecollapse。

针对网络结构的改进方法

MultiagentdiverseGAN(MAD-GAN)采用多个生成器,一个判别器以保障样本生成的多样性。具体结构如下:

相比于普通GAN,多了几个生成器,且在loss设计的时候,加入一个正则项。正则项使用余弦距离惩罚三个生成器生成样本的一致性。

MRGAN则添加了一个判别器来惩罚生成样本的modecollapse问题。具体结构如下:

输入样本x通过一个Encoder编码为隐变量E(x),然后隐变量被Generator重构,训练时,Loss有三个。

DM和R(重构误差)用于指导生成real-like的样本。而DD则对E(x)和z生成的样本进行判别,显然二者生成样本都是fakesamples,所以这个判别器主要用于判断生成的样本是否具有多样性,即是否出现modecollapse。

Mini-batchDiscrimination

Mini-batchdiscrimination在判别器的中间层建立一个mini-batchlayer用于计算基于L1距离的样本统计量,通过建立该统计量去判别一个batch内某个样本与其他样本有多接近。这个信息可以被判别器利用到,从而甄别出哪些缺乏多样性的样本。对生成器而言,则要试图生成具有多样性的样本。

关于GAN隐空间的理解

隐空间是数据的一种压缩表示的空间。通常来说,我们直接在数据空间对图像进行修改是不现实的,因为图像属性位于高维空间中的流形中。但是在隐空间,由于每一个隐变量代表了某个具体的属性,所以这是可行的。

在这部分,我们会探讨GAN是如何处理隐空间及其属性的,此外还将探讨变分方法如何结合到GAN的框架中。

隐空间分解

GAN的输入隐变量z是非结构化的,我们不知道隐变量中的每一位数分别控制着什么属性。因此有学者提出,将隐变量分解为一个条件变量c和标准输入隐变量z。具体包括有监督的方法和无监督的方法。

有监督方法

典型的有监督方法有CGAN和ACGAN。

CGAN将随机噪声z和类别标签c作为生成器的输入,判别器则将生成的样本/真实样本与类别标签作为输入。以此学习标签和图片之间的关联性。

ACGAN将随机噪声z和类别标签c作为生成器的输入,判别器则将生成的样本/真实样本输入,且回归出图片的类别标签。以此学习标签和图片之间的关联性。二者结构如下(左边为CGAN,右边为ACGAN):

无监督方法

相比于有监督方法,无监督方法不使用任何标签信息。因此,无监督方法需要对隐空间进行解耦得到有意义的特征表示。

InfoGAN对把输入噪声分解为隐变量z和条件变量c(训练时,条件变量c从均匀分布采样而来),二者被一起送入生成器。在训练过程中通过最大化c和G(z,c)的互信息I(c;G(z,c))以实现变量解耦(I(c;G(z,c))的互信息表示c里面关于G(z,c)的信息有多少,如果最大化互信息I(c;G(z,c)),也就是最大化生成结果和条件变量c的关联性)。

模型结构和CGAN基本一致,除了Loss多了一项最大互信息。具体如下[10]:

从上面分析可以看出,InfoGAN只是实现了信息的解耦,至于条件变量c每一个值的具体含义是什么,我们无法控制。

于是ss-InfoGAN出现了,ss-InfoGAN采用半监督学习方法,把条件变量c分成两部分,

。Css则利用标签像CGAN一样学习,Cus则像InfoGAN一样学习。

GAN与VAE的结合

GAN相比于VAE可以生成清晰的图像,但是却容易出现modecollapse问题。VAE由于鼓励重构所有样本,所以不会出现modecollapse问题。

一个典型结合二者的工作是VAEGAN,结构很像前文提及的MRGAN,具体如下:

上述模型的Loss包括三个部分,分别是判别器某一层特征的重构误差,VAE的Loss,GAN的Loss。

GAN模型总结

前面两节介绍了各种各样的GAN模型,这些模型大都是围绕着GAN的两大常见问题:模式崩溃,以及训练崩溃来设计的。下表总结了这些模型,读者可以根据下表回顾对照:

GAN的应用

由于GAN在生成样本过程成不需要显式建模任何数据分布就可以生成real-like的样本,所以GAN在图像,文本,语音等诸多领域都有广泛的应用。下表总结了GAN在各个方面的应用,后文会这些算法做相应介绍。

图像

图像翻译

所谓图像翻译,指从一副(源域)图像到另一副(目标域)图像的转换。可以类比机器翻译,一种语言转换为另一种语言。翻译过程中会保持源域图像内容不变,但是风格或者一些其他属性变成目标域。

Pairedtwodomaindata

成对图像翻译典型的例子就是pix2pix,pix2pix使用成对数据训练了一个条件GAN,Loss包括GAN的loss和逐像素差loss。而PAN则使用特征图上的逐像素差作为感知损失替代图片上的逐像素差,以生成人眼感知上更加接近源域的图像。

Unpairedtwodomaindata

对于无成对训练数据的图像翻译问题,一个典型的例子是CycleGAN。CycleGAN使用两对GAN,将源域数据通过一个GAN网络转换到目标域之后,再使用另一个GAN网络将目标域数据转换回源域,转换回来的数据和源域数据正好是成对的,构成监督信息。

超分辨

SRGAN中使用GAN和感知损失生成细节丰富的图像。感知损失重点

转载请注明:http://www.0431gb208.com/sjszyzl/3244.html