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 变分自编码器
首先我们有一批数据样本 X 1 , … , X n {X1,…,Xn} X1,…,Xn,其整体用 X X X来描述,我们本想根据 X 1 , … , X n {X1,…,Xn} X1,…,Xn得到 X X X的分布 p ( X ) p(X) p(X),如果能得到的话,那我直接根据 p ( X ) p(X) p(X)来采样,就可以得到所有可能的 X X X了(包括{X1,…,Xn}{X1,…,Xn}以外的),这是一个终极理想的生成模型了。当然,这个理想很难实现,于是我们将分布改一改
p ( X ) = ∑ z p ( X ∣ Z ) p ( Z ) p(X) = \sum_zp(X|Z)p(Z) p(X)=∑zp(X∣Z)p(Z)
这里我们就不区分求和还是求积分了,意思对了就行。此时 p ( X ∣ Z ) p(X|Z) p(X∣Z)就描述了一个由Z来生成X的模型,而我们假设Z服从标准正态分布,也就是 p ( Z ) = N ( 0 , 1 ) p(Z) = N(0, 1) p(Z)=N(0,1)。如果这个理想能实现,那么我们就可以先从标准正态分布中采样一个Z,然后根据Z来算一个X,也是一个很棒的生成模型。接下来就是结合自编码器来实现重构,保证有效信息没有丢失,再加上一系列的推导,最后把模型实现。
在整个VAE模型中,我们并没有去使用 p ( Z ) p(Z) p(Z)(隐变量空间的分布)是正态分布的假设,我们用的是假设 p ( Z ∣ X ) p(Z|X) 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 = f 1 ( X k ) , log σ 2 = f 2 ( X k ) \mu_k = f_1(X_k), \log\sigma^2 = f_2(X_k) μk=f1(Xk),logσ2=f2(Xk)来算它们。选择拟合 log σ 2 \log\sigma^2 logσ2而不是直接拟合 σ 2 \sigma^2 σ2,是因为 σ 2 \sigma^2 σ2总是非负的,需要加激活函数处理,而拟合 log σ 2 \log\sigma^2 logσ2不需要加激活函数,因为它可正可负。
最小化 D ( X k ^ , X k ) 2 D(\hat{X_k}, X_k)^2 D(Xk^,Xk)2。
分布标准化
最小化 D ( X k ^ , X k ) 2 D(\hat{X_k}, X_k)^2 D(Xk^,Xk)2会使方差为0,方差为零就等于没有噪声了。VAE让所有的都向标准正态分布看齐,防止噪声为零,保证模型具有生成能力。方法是在重构误差的基础上加入额外的loss:
和 L μ = ∣ ∣ f 1 ( X k ) ∣ ∣ 2 和 L σ 2 = ∣ ∣ f 2 ( X k ) ∣ ∣ 2 和L_{\mu} = ||f_1(X_k)||^2 和 L_{\sigma^2} = ||f_2(X_k)||^2 和Lμ=∣∣f1(Xk)∣∣2和Lσ2=∣∣f2(Xk)∣∣2
因为它们分别代表了均值和方差的对数,达到标准分布就是希望它们尽量接近于0。对于这个两个损失的比例怎么选取,原论文直接算一般(各分量独立的)正态分布与标准正态分布的KL散度 K L ( N ( μ , σ 2 ) ∣ ∣ N ( 0 , 1 ) ) KL(N(\mu, \sigma^2)||N(0, 1)) KL(N(μ,σ2)∣∣N(0,1))作为这个额外的loss。
KL散度 Kullback-Leibler Divergence
在统计应用中,我们经常需要用一个简单的,近似的概率分布
f
∗
f^∗
f∗来描述
观察数据 D 或者另一个复杂的概率分布f。这个时候,我们需要一个量来衡量我们选择的近似分布
f
∗
f^∗
f∗相比原分布f究竟损失了多少信息量,这就是KL散度起作用的地方。
一个概率分布对应的熵的表达: H = − ∑ i = 1 N p ( x i ) ⋅ log p ( x i ) H = -\sum_{i=1}^Np(x_i)\cdot \log p(x_i) H=−∑i=1Np(xi)⋅logp(xi)
在Variational Inference中,我们希望能够找到一个相对简单好算的概率分布q,使它尽可能地近似我们待分析的后验概率p(z|x),其中z是隐变量,x是显变量。在这里我们的“loss函数”就是KL散度,他可以很好地测量两个概率分布之间的距离。如果两个分布越接近,那么KL散度越小,如果越远,KL散度就会越大。