VAE 与 GAN 的关系

VAE 与 GAN 的关系

VAE(Variational Auto-Encoder)和 GAN(Ganerative Adversarial Networks)都是生成模型(Generative model)。所谓生成模型,即能生成样本的模型。我们可以将训练集中的数据点看作是某个随机分布抽样出来的样本,比如:MNIST 手写体样本,我们就可将每一幅图像看作是一个随机分布p(x)p(x) 的抽样(实例)。如果我们能够得到这样的一个随机模型,我们就可以无限制地生成样本,再无采集样本的烦恼。但这个随机分布 p(x)p(x) 我们并不知道,需要通过对训练集的学习来得到它,或者逼近它。要逼近一个随机分布,其基本思想是:将一个已知的,可控的随机分布 q(z)q(z) 映射到目标随机分布 p(x)p(x) 上。在深度学习领域中,有两个典型的生成模型:1、VAE,变分自编码器;2、GAN,生成对抗性网络,它们的结构如图 1、图 2:

img

图 1 VAE 结构图

img

图 2 GAN 结构图
VAE 的工作流程是:
1、在训练集(Dataset)中抽样,得到样本xixi,xixi经过神经网络编码器(NN Encoder)得到一个正态分布(N(μ**i,σ2i)N(μi,σi2))的充分统计量:均值(以图 1 为例进行解释,μ**i=(m1,m2,m3)μi=(m1,m2,m3))和方差(σi=(σ1,σ2,σ3)σi=(σ1,σ2,σ3));
2、由N(μ**i,σ2i)N(μi,σi2) 抽样得到 zizi, 已知 zizi 的分布是标准正态分布 N(0,1)N(0,1);
3、zizi 经过 NN_Decoder 得到输出x****̂ ix^i
4、Los**s=‖x****̂ ixi‖Loss=‖x^i−xi‖,训练过程就是让 Loss 取得最小值。
5、训练好的模型,我们可以利用 Decoder 生成样本,即将已知分布 q(z)q(z) 的样本通过 Decoder 映射成目标 p(x)p(x) 分布的样本。
以上过程可以用图 3 进行概括。

img

图 3 VAE 原理图
为比较 VAE 和 GAN 的差异,参考图 4,简述 GAN 的工作原理如下:
1、在一个已知的、可控的随机分布q(z)q(z)(e.g.: 多维正态分布 q(z)=N(μ,σ2)q(z)=N(μ,σ2)) 采样,得到zizi;
2、zizi 经过生成器映射 G(zi)G(zi) 得到在样本空间(高维空间)的一个数据点 xgixig,有 xgi=G*(zi)xig=G(zi);
3、
xgixig 与样本流型(Manifolds)之间的距离在图中表示为 D(‖xgi*,x̂** **gi)=‖xgix****̂ g****i‖D(‖xig,xig)=‖xig−xig‖,其中 x****̂ g****ix^ig 表示 xgixig 在流型上的投影,生成器的目标是减少此距离,可以将此距离定义为生成器的损失(Loss)。
4、因为不能直接得到样本的流型,因而需要借助判别器 (Discriminator) 间接地告诉生成器(Generator)它生成的样本距样本流型是 “远了” 还是“近了”,即判别真(real)和假(fake)正确的概率,一方面要判别器提高判别准确性,一方面又要提高生成器的以假乱真的能力,由此形成了竞争导致的均衡,使判别器和生成器两者性能同时提高,最后我们可获得最优的生成器。
5、理想的最优生成器,能将生成的 x
g
*i*xig 映射到样本分布的流型中(即图中阴影部分)

img

图 4 GAN 原理
由 GAN 的生成过程,我们可以很直观地得到两个 GAN 缺陷的解释(详细分析可见《Wasserstein GAN》):
1、模型坍塌(Model collapse)
GAN 只要求将 xgixig 映射至离样本分布流型尽可能近的地方,却不管是不是同一个点,于是生成器有将所有 zi*zi 都映射为一点的倾向,于是模型坍塌就发生了。
2、不收敛
由于生成器的 Loss 依赖于判别器 Loss 后向传递,而不是直接来自距离 D(
xgi,**x̂** **gi)D(xig,x^ig) ,因而若判别器总是能准确地判别出真假,则向后传递的信息就非常少(体现为梯度为 0),则生成器便无法形成自己的 Loss,因而便无法有效地训练生成器。正是因为这个原因,《Wasserstein GAN》才提出了一个新的距离定义(Wasserstein Distance)应用于判别器,而不是原型中简单粗暴的对真伪样本的分辨正确的概率。Wasserstein Distance 所针对的就是找一个方法来度量 D(xgi,**x̂** **g*i**)D(xig,x^ig)。

比较 VAE 与 GAN 的效果,我们可以得到以下两点:
1、GAN 生成的效果要优于 VAE

我认为GAN和VAE的一个本质区别就是loss的区别

VAE是pointwise loss,一个典型的特征就是pointwise loss常常会脱离数据流形面,因此看起来生成的图片会模糊

GAN是分布匹配的loss,更能贴近流行面,看起来就会清晰

但分布匹配的难度较大,一个例子就是经常发生mode collapse问题,小分布丢失,而pointwise loss就没有这个问题,可以用于做初始化或做纠正,因此发展了一系列GAN+VAE的工作


VAE 是一个在数学上具有完美证明的模型,其优化目标和过程都是显式的。由于 VAE 设计的强预设性,其优化过程强制性地把数据拟合到有限维度的混合高斯或者其他分布上,这导致两个结果:

  1. 映射过程中必然导致信息损失,特别是次要信息的损失
  2. 不符合预设分布的信息的编码和恢复效果差,如果强制性的把这样的分布投射到高斯分布上,就必然导致模糊

对应地,GAN 的训练中没有这样的强预设,它是通过判别器网络来进行优化的,让生成器产生数据的分布直接拟合训练数据的分布,而对具体的分布没有特别的要求。

2、GAN 比 VAE 要难于训练

文章:Variational Inference: A Unified Framework of Generative Models and Some Revelations,原文:arXiv:1807.05936,中文链接:https://kexue.fm/archives/5716。文章来自中山大学 数学学院 苏剑林。文中为两个生成模型建立了统一的框架,并提出一种为训练 Generator 而设计的正则项原理,它可以作为《Wasserstein GAN》的一个补充,因为 WGAN 给出的是 GAN 判别器 Loss 的改进意见,而该文却是对生成器下手,提出生成器的一个正则项原则。
以下是从变分推断(Variational Inference)角度对两个模型的推导过程:
p(x)p(x) 是真实随机变量的分布,样本集中的数据可认为是从这个分布中抽样出来的样本,它是未知的。我们希望用一个可控的、已知的分布 q(x)q(x) 来逼近它,或者说让这两个分布尽量重合。如何实现这个目标呢?一个直观的思路是:从一个已知的分布出发,对其中的随机变量进行映射,得到一个新的分布,这个映射后分布与目标分布尽量重合。在 VAE 中,这个映射由 Decoder 完成;在 GAN 中,这个映射由 Generator 来完成。而已知分布可以是:均匀分布或正态分布,例如:随机变量 zz 服从多维标准正态分布 zN(0,1)z∼N(0,1),它经过映射得到 xgi*xig,为表述方便我们统一用 G(zi)=xgixgiq*(x)G(zi)=xig,xig∼q(x) 表示经过映射后的随机变量 xg*xg 服从分布 q(x)q(x),它与真实变量分布 xrp*(x)xr∼p(x) 在同一个空间 XX。我们希望得到尽可能与 p(x)p(x) 重合的 q(x)q(x)。
为达到 “尽量” 这一目标,需要对重合程度进行量化,于是我们定义了一个测度的指标——KL 散度:

K**L(p(x)‖q(x))=∫p(x)logp(x)q(x)d**x(1)KL(p(x)‖q(x))=∫p(x)log⁡p(x)q(x)dx(1)

当 p(x) 与 q(x) 完全重合,有 K**L(p(x)‖q(x))=0KL(p(x)‖q(x))=0,否则 K**L(p(x)‖q(x))>0KL(p(x)‖q(x))>0。直接求上述真实分布 p(x)p(x) 与生成分布 q(x)q(x) 的 KL 散度 K**L(p(x)‖q(x))KL(p(x)‖q(x)) 有时十分困难,往往需要引入隐变量(Latent Variables)构成联合分布 p(x,z)p(x,z) 和 q(x,z)q(x,z),计算 K**L(p(x,z)‖q(x,z))KL(p(x,z)‖q(x,z)) 来代替直接计算 K**L(p(x)‖q(x))KL(p(x)‖q(x))。
(1)GAN 的联合分布 p(x,z)p(x,z) 的拟合
GAN 在 Generator 生成了 xgixig 将与真实样本 xri*xir 一起作为输入xx,进入一个二选一选择器,该选择器以一定的概率(比如说 50%)选择其一(选择器可以看成是随机变量 yy ,它服从服从 0-1 分布), xx接着进入判决器,判决器判定输入xx的是真实样本(xrxr ),判断为 1,或是生成样本(xgxg),判断为 0,最后输出给定xx判为 1 的概率。
令联合分布是输入
xx 和选择器 yy 的分布,p(x,y)p(x,y) 表示真实的联合分布,而 q(x,y)q(x,y) 是判别器可控制的联合分布,是为拟合真实分布所设计的分布,由上机制可见,在 q(x,y)q(x,y) 中,x*x 与 yy 其实是相互独立的,因而有:

q(x,y)={p(x)⋅p1q(x)⋅p0if y=1 if y=0 (2)q(x,y)={p(x)⋅p1if y=1 q(x)⋅p0if y=0 (2)

其中,p1p1 表示 y=1y=1 的概率,p0p0 表示 y=0y=0 的概率,有 p1+p0=1p1+p0=1。若判别器有足够的拟合能力,并达到最优时,则q(x,y)→p(x,y)q(x,y)→p(x,y),这意味着:

q(x)=∑y**q(x,y)→∑y**p(x,y)=p(x)(3)q(x)=∑yq(x,y)→∑yp(x,y)=p(x)(3)

为拟合,由(2)可得两个联合分布 KL 散度:

K**L(q(x,y)‖p(x,y))=∫[ p(x)⋅p1logp(x)p1p(y=1|x)p(x)+q(x)⋅p0logq(x)p0p(y=0|x)p(x)] d**x(4)KL(q(x,y)‖p(x,y))=∫[ p(x)⋅p1log⁡p(x)p1p(y=1|x)p(x)+q(x)⋅p0log⁡q(x)p0p(y=0|x)p(x)] dx(4)

p1=p0=0.5p1=p0=0.5,以 K**L(q(x,y)‖p(x,y))KL(q(x,y)‖p(x,y)) 为 Loss,因为p1p1、p0p0、p(x)p(x)、q(x)q(x) 与判别器参数无关,另外,判别器的输出是 p(y=1|x)=D(x)p(y=1|x)=D(x),因而:

K**L(q(x,y)‖p(x,y))∼∫p(x)log1p(y=1|x)d**x+∫q(x)log1p(y=0|x)d**x=∫p(x)log1D(x)d**x+∫q(x)log11−D(x)d**x=−E****xp(x)(logD(x))−E****xq(x)(log(1−D(x)))(5)KL(q(x,y)‖p(x,y))∼∫p(x)log⁡1p(y=1|x)dx+∫q(x)log⁡1p(y=0|x)dx=∫p(x)log⁡1D(x)dx+∫q(x)log⁡11−D(x)dx=−Ex∼p(x)(log⁡D(x))−Ex∼q(x)(log⁡(1−D(x)))(5)

GAN 的判别器要尽量分辨两个分布,因而要 KL 散度尽可能大,因而若 (5) 式要作为判别器的 Loss,则需取反,即:

LossD=E****xp(x)(logD(x))+E****xq(x)(log(1−D(x)))(6)D=argminDE****xp(x)(logD(x))+E****xq(x)(log(1−D(x)))LossD=Ex∼p(x)(log⁡D(x))+Ex∼q(x)(log⁡(1−D(x)))(6)D=arg⁡minDEx∼p(x)(log⁡D(x))+Ex∼q(x)(log⁡(1−D(x)))

(6)式与传统 GAN 判别器 Loss 分析结果(可参见:https://blog.csdn.net/StreamRock/article/details/81096105)相同。
讨论完判别器 Loss_D,接下来讨论生成器的 Loss_G,同样从(4)式入手,此时可调的参数是生成器的参数,p1p1、p0p0、p(x)p(x)、p(y=1|x)p(y=1|x) (即D(x)D(x)) 与生成器参数无关,与之相关的是q(x)q(x),因而有:

K**L(q(x,y)‖p(x,y))=∫[ p(x)⋅p1logp(x)p1p(y=1|x)p(x)+q(x)⋅p0logq(x)p0p(y=0|x)p(x)] d**x∼∫q(x)logq(x)(1−D(x))p(x)dx(8)KL(q(x,y)‖p(x,y))=∫[ p(x)⋅p1log⁡p(x)p1p(y=1|x)p(x)+q(x)⋅p0log⁡q(x)p0p(y=0|x)p(x)] dx∼∫q(x)log⁡q(x)(1−D(x))p(x)dx(8)

最优判决器应该具有如下特性:

D(x)=p(x)p(x)+q(x)(9)D(x)=p(x)p(x)+q(x)(9)

(9)式可以从图 5,直接得到。

img

图 5 最优判决器
将(9)代入(8)有:

Los**s_G=∫q(x)logq(x)(1−D(x))p(x)dx=∫q(x)logq(x)(1−p(x)p(x)+q(x))p(x)dx=∫q(x)log1p(x)p(x)+q(x)dx=−∫q(x)logD(x)dx=−E****xq(x)(logD(x))=−E****zN(0,1)(logD(G(z)))(10)Loss_G=∫q(x)log⁡q(x)(1−D(x))p(x)dx=∫q(x)log⁡q(x)(1−p(x)p(x)+q(x))p(x)dx=∫q(x)log⁡1p(x)p(x)+q(x)dx=−∫q(x)log⁡D(x)dx=−Ex∼q(x)(log⁡D(x))=−Ez∼N(0,1)(log⁡D(G(z)))(10)

于是可采用(10)作为生成器的损失 Loss_G,与传统推导的结果一致。考察(9)式,式中 q(x)q(x) 实际上是不断变化的,因而我们将 (9) 改造一下,q0(x)q0(x) 表示前一次生成器的状态,于是有:

D(x)=p(x)p(x)+q0(x)(11)Los**s_G=∫q(x)logq(x)(1−D(x))p(x)dx=∫q(x)logq(x)(1−p(x)p(x)+q0(x))p(x)dx=∫q(xlogq(x)D(x)q0(x)dx)=−E****xq(x)[logD(x)]+K**L(q(x)‖q0(x))=−E****zN(0,1)[logD(G(z))]+K**L(q(x)‖q0(x))(12)D(x)=p(x)p(x)+q0(x)(11)Loss_G=∫q(x)log⁡q(x)(1−D(x))p(x)dx=∫q(x)log⁡q(x)(1−p(x)p(x)+q0(x))p(x)dx=∫q(xlog⁡q(x)D(x)q0(x)dx)=−Ex∼q(x)[log⁡D(x)]+KL(q(x)‖q0(x))=−Ez∼N(0,1)[log⁡D(G(z))]+KL(q(x)‖q0(x))(12)

比较(10)与(12)发现 (12) 多了一项 K**L(q(x)‖q0(x))KL(q(x)‖q0(x)) , 此为生成器 Loss 的正则项,它要求q(x)q(x) 与 q0(x)q0(x) 尽可能小,由此可实现生成器的正则项,详细分析可见:https://kexue.fm/archives/5716

posted @ 2020-06-21 22:14  别再闹了  阅读(4898)  评论(0编辑  收藏  举报