VAE 变分自编码器

VAE

学习+整理
来源:
https://www.spaces.ac.cn/archives/5253
https://www.cnblogs.com/blogofnickchen/p/7221641.html

分布变换

VAE和GAN它们两个的目标基本是一致的——希望构建一个从隐变量Z生成目标数据X的模型,但是实现上有所不同。更准确地讲,它们是假设了Z服从某些常见的分布(比如正态分布或均匀分布),然后希望训练一个模型X=g(Z)X=g(Z),这个模型能够将原来的概率分布映射到训练集的概率分布,也就是说,它们的目的都是进行分布之间的变换。

VAE 变分自编码器

首先我们有一批数据样本X1,,Xn{X1,…,Xn},其整体用XX来描述,我们本想根据X1,,Xn{X1,…,Xn}得到XX的分布p(X)p(X),如果能得到的话,那我直接根据p(X)p(X)来采样,就可以得到所有可能的XX了(包括{X1,…,Xn}{X1,…,Xn}以外的),这是一个终极理想的生成模型了。当然,这个理想很难实现,于是我们将分布改一改

p(X)=zp(XZ)p(Z)p(X) = \sum_zp(X|Z)p(Z)

这里我们就不区分求和还是求积分了,意思对了就行。此时p(XZ)p(X|Z)就描述了一个由Z来生成X的模型,而我们假设Z服从标准正态分布,也就是p(Z)=N(0,1)p(Z) = N(0, 1)。如果这个理想能实现,那么我们就可以先从标准正态分布中采样一个Z,然后根据Z来算一个X,也是一个很棒的生成模型。接下来就是结合自编码器来实现重构,保证有效信息没有丢失,再加上一系列的推导,最后把模型实现。

在整个VAE模型中,我们并没有去使用p(Z)p(Z)(隐变量空间的分布)是正态分布的假设,我们用的是假设p(ZX)p(Z|X)(后验分布)是正态分布!!

具体来说,给定一个真实样本Xk,我们假设存在一个专属于Xk的分布p(Z|Xk)(学名叫后验分布),并进一步假设这个分布是(独立的、多元的)正态分布。为什么要强调“专属”呢?因为我们后面要训练一个生成器X=g(Z),希望能够把从分布p(Z|Xk)采样出来的一个Zk还原为Xk。如果假设p(Z)是正态分布,然后从p(Z)中采样Z,那么我们怎么知道这个Z对应于哪个真实的X呢?现在p(Z|Xk)专属于Xk,我们有理由说从这个分布采样出来的Z应该要还原到Xk中去。

这时候每一个Xk都配上了一个专属的正态分布,才方便后面的生成器做还原。但这样有多少个X就有多少个正态分布了。我们知道正态分布有两组参数:均值μ和方差σ2(多元的话,它们都是向量)。用神经网络来拟合出专属于Xk的正态分布p(Z|Xk)的均值和方差!

构建两个神经网络μk=f1(Xk),logσ2=f2(Xk)\mu_k = f_1(X_k), \log\sigma^2 = f_2(X_k)来算它们。选择拟合logσ2\log\sigma^2而不是直接拟合σ2\sigma^2,是因为σ2\sigma^2总是非负的,需要加激活函数处理,而拟合logσ2\log\sigma^2不需要加激活函数,因为它可正可负。

最小化D(Xk^,Xk)2D(\hat{X_k}, X_k)^2

在这里插入图片描述

分布标准化

最小化D(Xk^,Xk)2D(\hat{X_k}, X_k)^2会使方差为0,方差为零就等于没有噪声了。VAE让所有的都向标准正态分布看齐,防止噪声为零,保证模型具有生成能力。方法是在重构误差的基础上加入额外的loss:

Lμ=f1(Xk)2Lσ2=f2(Xk)2和L_{\mu} = ||f_1(X_k)||^2 和 L_{\sigma^2} = ||f_2(X_k)||^2

因为它们分别代表了均值和方差的对数,达到标准分布就是希望它们尽量接近于0。对于这个两个损失的比例怎么选取,原论文直接算一般(各分量独立的)正态分布与标准正态分布的KL散度KL(N(μ,σ2)N(0,1))KL(N(\mu, \sigma^2)||N(0, 1))作为这个额外的loss。

KL散度 Kullback-Leibler Divergence

在统计应用中,我们经常需要用一个简单的,近似的概率分布ff^∗来描述
观察数据 D 或者另一个复杂的概率分布f。这个时候,我们需要一个量来衡量我们选择的近似分布ff^∗相比原分布f究竟损失了多少信息量,这就是KL散度起作用的地方。

一个概率分布对应的熵的表达: H=i=1Np(xi)logp(xi)H = -\sum_{i=1}^Np(x_i)\cdot \log p(x_i)

在Variational Inference中,我们希望能够找到一个相对简单好算的概率分布q,使它尽可能地近似我们待分析的后验概率p(z|x),其中z是隐变量,x是显变量。在这里我们的“loss函数”就是KL散度,他可以很好地测量两个概率分布之间的距离。如果两个分布越接近,那么KL散度越小,如果越远,KL散度就会越大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章