GAN及其变体CGAN、WGAN

生成式对抗网络GAN(无监督)

GAN由Goodfellow在2014年提出,启发自博弈论中的二人零和博弈。由一个生成模型G和一个判别模型D组成。生成模型捕捉样本数据的分布,判别模型是一个二分类器,判别输入的数据是真实数据还是生成的数据。G和D一般都是非线性映射函数,例如多层感知器、卷积神经网络等。

生成模型输入的是一个服从某一简单分布(高斯分布)的噪声变量z,输出的是与训练图像相同尺寸的伪图像;
判别模型输入的是真实图像和伪图像,输出的是一个置信度(概率值0-1),表示判别输入中伪图像是真实图像的概率
对于生成模型G来说要尽可能的欺骗D,使D输出高概率(误判为真实样本);对D来说要尽可能输出低概率,从而形成对抗。

GAN的优化过程是一个“二元极小极大博弈”问题:
GAN
作者后来又提出一个改进版本,即: log D(x)-log(D(G(z)))

固定模型G,训练网络D使得最大概率的分对训练样本的标签,即最大化 log D(x)+log(1-D(G(z)))
固定网络D,训练网络G使得最小化 log(1-D(G(z))),即最大化D的损失
D和G同时训练,训练时固定一方,更新另一方的网络参数,交替迭代,使得对方的错误最大化,最终,G能估计出样本数据的分布。

条件生成式对抗网络CGAN(有监督)

  • 起源
    原始GAN的输入是一个符合高斯分布的数据,通过生成网络和对抗网络交替式训练,从而在理论上达到逼近真实数据的效果。然而,这种不需要预先建模的方式太过自由,对于像素较多的情形,原始的GAN就无法解决问题。很自然的想到给原始输入加入一些约束,这就便有了CGAN(Conditional Generator Adversarial Nets)

  • 不同之处
    带条件约束的GAN,即在D和G 的建模中均引入条件变量y,使用额外信息y对模型增加条件,可以指导数据生成过程。这些条件变量可以基于多种信息:类别标签、用于图像修复的部分数据、来自不同模态的数据。如果y是类别标签,可以把CGAN看作是把纯无监督的GAN变成有监督模型的一种改进。

在生成模型中,先验输入模型P(z)和条件y联合组成了联合隐层表征。

CGAN的优化过程是一个“带条件的二元极小极大博弈”问题:
CGAN

WGAN

  • 起源
    原始GAN存在的问题:
    针对第一种形式(log D(x) + log(1-D(G(z)))):判别器训练得太好,生成器梯度消失,生成器loss降不下去;判别器训练得不好,生成器梯度不准,四处乱跑。只有判别器训练得不好不坏才行,但是这个火候又很难把握,甚至在同一轮训练的前后不同阶段这个火候都可能不一样,所以GAN才那么难训练。
    针对第二种形式(log D(x) - log(D(z))):最小化第二种生成器loss函数,会等价于最小化一个不合理的距离衡量,导致两个问题,一是梯度不稳定,二是collapse mode即多样性不足。

更多关于WGAN的由来可以详看参考文献第二篇,这里只是简要复述下它的损失函数。
我们构造一个含参数w的网络,在限制w不超过某个范围的条件下,使得以下函数达到最大,此时L就会近似真实分布与生成分布之间Wasserstein距离。
wgan-loss
L指示训练进程,其数值越小,表示真实分布与生成分布的Wasserstein距离越小,WGAN训练得越好。

L的第一次项与生成器无关,因此生成器的loss函数为:
在这里插入图片描述
判别器的loss函数为:
在这里插入图片描述
原始GAN做的是二分类任务,所以最后一层是sigmoid函数;而WGAN中的判别器做的是近似拟合Wasserstein距离,是回归任务,所以要去掉最后一层的sigmoid函数。

  • 不同之处
    (1)判别器最后一层去掉sigmoid
    (2)生成器和判别器的损失函数不加log
    (3)每次更新判别器的参数之后把他们的绝对值截断到不超过一个固定常量c
    (4)不要用基于动量的优化方法(包括momentum和Adam),推荐RMSProp,SGD也行

WGAN-GP

  • 起源
    将权重剪切到一定范围内,之后比如[-0.01,0.01],可能会出现如下情形:
    GAN及其变体CGAN、WGAN_第1张图片
    网路的大部分权重就只有两个可能数,无法发挥神经网络的拟合能力。强制剪切容易发生梯度消失和梯度爆炸。梯度消失即梯度为0,权重得不到更新;梯度爆炸就是梯度变化太大,每一次权重更新都变化很大,导致训练不稳定。导致这两种情况的原因就是权重剪切的范围选择。剪切过小会导致梯度消失,剪切过大又会导致梯度爆炸。于是作者提出“梯度惩罚”来满足lipschitz连续性条件。
    梯度惩罚:lipschitz限制是要求判别器的梯度不超过K,那么我们可以设计一个新的损失函数来满足这个要求,先计算出判别器的梯度d(D(x)),然后建立它和K之间的二范数即可。另外作者提出,没必要在整个样本空间上做lipschitz限制,只要从每一批次中采样即可。具体地,随机产生一个数,采用以下算法在真实数据以及生成数据上做一个插值:
    lipschitz限制
    最终的WGAN-GP的损失函数就是与原来WGAN的loss函数加权合并得到新的loss函数。
  • 贡献
    (1)提出了一种新的lipschitz连续性限制手法–梯度惩罚,解决了梯度消失以及梯度爆炸的问题
    (2)比标准GAN拥有更快的收敛速度,并能生成更高质量的样本
    (3)提供稳定的GAN训练方式,几乎不需要怎么调参,成功训练多种针对图片训练以及语音模型的GAN架构

参考:
https://blog.csdn.net/liuweizj12/article/details/73741434
https://blog.csdn.net/omnispace/article/details/54942668
https://blog.csdn.net/qq_25737169/article/details/78857788
https://blog.csdn.net/qq_38826019/article/details/80786061

你可能感兴趣的:(deep,learning)