VAE一步一步详细推导

VAE

最近在推DM,发现VAE又忘了,重新看一遍Tutorial on Variational Autoencoders 挺费事的,这一次干脆把每一步的推导过程和需要注意的细节都尽量记录下来,加深印象也方便下次快速捡起来。

引言

目的是从样本集 X X X估计其概率分布 P ( X ) P(X) P(X),最直观的就是先对 P ( X ) P(X) P(X)做一些假设,如正态分布、均匀分布等,然后用最大似然估计(Max Likelihood Estimation, MLE):

M L E = ∑ i n l o g P ( x ; θ ) MLE = \sum_i^nlogP(x;\theta) MLE=inlogP(x;θ)

或者(Maximum a Posteriori,MAP)估计参数 θ \theta θ

M A P = ∑ i n l o g P ( θ ∣ x ) = ∑ i n ( l o g P ( x ∣ θ ) + l o g P ( θ ) − l o g P ( x ) ) MAP=\sum_i^nlogP(\theta|x)=\sum_i^n(logP(x|\theta) + logP(\theta) - logP(x)) MAP=inlogP(θx)=in(logP(xθ)+logP(θ)logP(x))

在任务复杂的情况下,假设目标服从某个简单分布一般不符合实际情况,比如二值图像不符合高斯分布,邻域内像素之间的关联性等,因此,这种方法不太可行。

MAP和MLE,参数估计两大方法各有特点,如果考虑先验和evidence的话MAP更合适。具体分析网上文章很多。

Latent variable

一个分布经过足够复杂的高维抽象后可以映射到另一个分布,如下图所示。基于此,换个思路,我们可以把一个简单易采样的分布P(z),通过一个足够复杂且可微的函数g,映射到另一个我们想要的分布g(P(z))。
在这里插入图片描述
VAE把这个简单分布定义为隐变量 z z z,且 P ( z ) ∼ N ( 0 , I ) P(z)\sim N(0, I) P(z)N(0,I),那根据全概率定理改写公式:

P ( X ) = ∫ p ( x , z ) d z = ∫ p ( x ∣ z ) p ( z ) d z = ∑ i p ( x ∣ z i ) p ( z i ) ≈ 1 n ∑ i p ( x ∣ z i ) \begin{align} P(X) &=\int p(x,z)dz \\ &=\int p(x|z)p(z)dz \\ &= \sum_i p(x|z_{i})p(z_{i}) \\ &≈ \frac{1}{n}\sum_i p(x|z_{i}) \end{align} P(X)=p(x,z)dz=p(xz)p(z)dz=ip(xzi)p(zi)n1ip(xzi)
这里, p ( x ∣ z ) p(x|z) p(xz)可以当作一个decoder, z → X z\rightarrow X zX,也可以写作 f ( z ; θ ) f(z;\theta) f(z;θ)

即正态分布经过一个decode网络生成一个目标图像。为了便于求导(如果是二值图像可以假设为Bernoulli),假设
P ( X ∣ z ; θ ) ∼ N ( X ∣ f ( z ; θ ) , σ 2 ∗ I ) P(X|z;\theta)\sim N(X|f(z;\theta), \sigma^{2}*I) P(Xz;θ)N(Xf(z;θ),σ2I)

这样操作后,把对P(X)采样的问题,转换成了对p(z)的映射问题。

ELBO

接上一步,对z进行采样,然后估计P(x|z)会碰到问题:

  • z是连续值,大部分z对应的p(x|z)可能是等于0的,即无效采样;
  • z和X不能很好对应起来

结果就是拟合效率低下甚至无法学习。为此,VAE设计了一个编码器Q(z|x)。样本x输入Q得到z,这个z和x就对应起来了,接着z输入P生成的 x ′ x_{}{'} x应该是最接近x的,这样就极大的约束了采样空间,提高了拟合效率。至此,VAE中涉及的P、Q、z、x就到齐了,下一步是把它们联系起来。直观的方法就是希望从两个方向估计的Q(z)足够接近:

D [ Q ( z ) ∣ ∣ P ( z ∣ X ) ] = E z ∼ Q [ l o g Q ( z ) − l o g P ( z ∣ X ) ] D[Q(z)∣∣P(z∣X)]=E_{z∼Q} [logQ(z)−logP(z∣X)] D[Q(z)∣∣P(zX)]=EzQ[logQ(z)logP(zX)]
右侧用贝叶斯公式展开:
D [ Q ( z ) ∣ ∣ P ( z ∣ X ) ] = E z ∼ Q [ log ⁡ Q ( z ) − log ⁡ P ( X ∣ z ) − log ⁡ P ( z ) ] + log ⁡ P ( X ) D[Q(z)||P(z|X)] = \mathbb{E}_{z\sim Q}[\log Q(z) - \log P(X|z) - \log P(z)] + \log P(X) D[Q(z)∣∣P(zX)]=EzQ[logQ(z)logP(Xz)logP(z)]+logP(X)
log ⁡ P ( X ) \log P(X) logP(X)是我们想要最大化的目标,去掉常数项,移项,部分替换成KL散度后:
log ⁡ P ( X ) − D [ Q ( z ) ∣ ∣ P ( z ∣ X ) ] = E z ∼ Q [ log ⁡ P ( X ∣ z ) ] − D [ Q ( z ) ∣ ∣ P ( z ) ] \log P(X) - D[Q(z)||P(z|X)] = \mathbb{E}_{z \sim Q}[ \log P(X|z)] - D[Q(z)||P(z)] logP(X)D[Q(z)∣∣P(zX)]=EzQ[logP(Xz)]D[Q(z)∣∣P(z)]
Q(z)替换成Q(z|x),目的是帮助建立z和x的联系,辅助推断x,形成一个编码器的结构(输入x,输出z),至此,Q的形式就和本小节开始时定义的形式就对应上了。

log ⁡ P ( X ) − D [ Q ( z ∣ X ) ∣ ∣ P ( z ∣ X ) ] = E z ∼ Q [ log ⁡ P ( X ∣ z ) ] − D [ Q ( z ∣ X ) ∣ ∣ P ( z ) ] \log P(X) - D[Q(z|X)||P(z|X)] = \mathbb{E}_{z \sim Q}[ \log P(X|z)] - D[Q(z|X)||P(z)] logP(X)D[Q(zX)∣∣P(zX)]=EzQ[logP(Xz)]D[Q(zX)∣∣P(z)]

至此左侧为优化目标,而右侧则是可以迭代优化的等价项。因为散度是非负的,所以:
log ⁡ P ( X ) ≥ E z ∼ Q [ log ⁡ P ( X ∣ z ) ] − D [ Q ( z ∣ X ) ∣ ∣ P ( z ) ] \log P(X) \geq \mathbb{E}_{z \sim Q}[ \log P(X|z)] - D[Q(z|X)||P(z)] logP(X)EzQ[logP(Xz)]D[Q(zX)∣∣P(z)]
最终,ELBO的形式如下:
E L B O = E z ∼ Q [ log ⁡ P ( X ∣ z ) ] − D [ Q ( z ∣ X ) ∣ ∣ P ( z ) ] = E Q ( z ∣ x ) [ log ⁡ ( p ( x , z ) Q ( z ∣ x ) ) ] ELBO = \mathbb{E}_{z \sim Q}[ \log P(X|z)] - D[Q(z|X)||P(z)] =E_{Q(z|x)}[\log(\frac{p(x,z)}{Q(z|x)})] ELBO=EzQ[logP(Xz)]D[Q(zX)∣∣P(z)]=EQ(zx)[log(Q(zx)p(x,z))]

优化技巧

最大化ELBO,等价于右侧最大化第一项,以及最小化第二项。

第一项,回想之前的关于p(x|z)的假设:
P ( X ∣ z ; θ ) ∼ N ( X ∣ f ( z ; θ ) , σ 2 ∗ I ) P(X|z;\theta)\sim N(X|f(z;\theta), \sigma^{2}*I) P(Xz;θ)N(Xf(z;θ),σ2I)
那么:

log ⁡ ( p ( x ∣ z ) ) = log ⁡ ( 1 2 π σ 2 ∗ e x p − ( x − f ( z ; θ ) ) 2 2 σ 2 ) = log ⁡ ( 1 2 π σ 2 ) − ( x − f ( z ; θ ) ) 2 2 σ 2 \begin{align} \log(p(x|z))&=\log(\frac{1}{\sqrt{2\pi\sigma^2}}*exp^{-\frac{(x-f(z;\theta))^2}{2\sigma^2}}) \\ &=\log(\frac{1}{\sqrt{2\pi\sigma^2}}) - {\frac{(x-f(z;\theta))^2}{2\sigma^2}} \end{align} log(p(xz))=log(2πσ2 1exp2σ2(xf(z;θ))2)=log(2πσ2 1)2σ2(xf(z;θ))2
因为 σ \sigma σ在这里是一个定值,因此
log ⁡ P ( X ∣ z ) ≃ C − 1 2 ∥ X − f ( z ; θ ) ∥ 2 / σ 2 \log P(X|z) \simeq C - \frac{1}{2} \| X - f(z;\theta) \|^2 / \sigma^2 logP(Xz)C21Xf(z;θ)2/σ2

第二项,对于两个高斯分布,KL散度的公式可以用解析法得到:
D [ N ( μ 0 , Σ 0 ) ∣ ∣ N ( μ 1 , Σ 1 ) ] = 1 2 ( tr ( Σ 1 − 1 Σ 0 ) + ( μ 1 − μ 0 ) T Σ 1 − 1 ( μ 1 − μ 0 ) − k + log ⁡ det ⁡ ( Σ 1 ) det ⁡ ( Σ 0 ) ) D[N(\mu_0, \Sigma_0) || N(\mu_1, \Sigma_1)] = \frac{1}{2}( \text{tr}(\Sigma_{1}^{-1} \Sigma_0) + (\mu_1 - \mu_0)^T \Sigma_{1}^{-1} (\mu_1 - \mu_0) - k + \log \frac{\det(\Sigma_1)}{\det(\Sigma_0)}) D[N(μ0,Σ0)∣∣N(μ1,Σ1)]=21(tr(Σ11Σ0)+(μ1μ0)TΣ11(μ1μ0)k+logdet(Σ0)det(Σ1))
至此,目标函数的两个部分就都i出来了。用流程图表示,就是文章里面最经典的那张图的左侧部分:
在这里插入图片描述

σ \sigma σ是一个常数,类似于loss的加权系数

Reparameterization

目前,我们推导出了待优化的目标函数形式,其流程如上图左。仔细一看会发现,P和Q中间的数据流 N ( , ) N(,) N(,)是不可微的,这就会导致梯度流无法传导。这里,作者用了一个技巧,较Reparameterization(重参数)。

简单的说,如果一个分布 z ∼ N ( μ , σ 2 ) z\sim N(\mu, \sigma^2) zN(μ,σ2),则我们可以通过另一个分布 ϵ ∼ N ( 0 , 1 ) \epsilon \sim N(0, 1) ϵN(0,1)用如下公式进行采样:
z = μ + σ ∗ ϵ z = \mu + \sigma * \epsilon z=μ+σϵ
基于此,我们改写ELBO:
E ϵ ∼ N ( 0 , I ) [ log ⁡ P ( X ∣ z = f ( z ; θ ) + σ ϵ ) ] − D [ Q ( z ∣ X ) ∣ ∣ P ( z ) ] \mathbb{E}_{\epsilon \sim N(0, I)} \left[ \log P(X | z = f(z;\theta) + \sigma\epsilon) \right] - D[Q(z|X)||P(z)] EϵN(0,I)[logP(Xz=f(z;θ)+σϵ)]D[Q(zX)∣∣P(z)]
对应上图右侧部分。

一些思考

关于 P ( x ∣ z ) P(x|z) P(xz) Q ( Z ) Q(Z) Q(Z)的假设

VAE假设P为正态分布,目的是方便计算并且正态分布大部分情况下都还算是比较合理的,也可以选择其他分布,如Bernoulli(在 l o g ( B ) log(B) log(B)的形式下是可微的)或者其他更复杂的形式比如混合高斯等。Q同样如此。

关于VAE生成质量

影响生成质量的有几点:

  • 图像的pix之间或者局部和整体之间都存在复杂的关联性,对图像的分布做各项独立的高斯分布假设不太合理;
  • VAE显示建模一个连续分布,连续分布的采样空间远大于离散分布,因此需要更庞大且多样的数据进行拟合;
  • ELBO的两个部分是一个对抗和均衡的过程,因此,在KL的误差范围内所有的特征都可能会被L2平滑。这样一定程度能够保证生成图像的连续性,坏处就是会模糊。

关于VAE的一些改进方法

  • VQVAE。实际是AE+PixelCNN,连续空间离散化,提高生成质量。
  • Perceptual Loss。更复杂的loss,从content和sytle层面出发。
  • Inverse Autoregressive Flow。提升分布假设的灵活性,更好的匹配真实分布。
  • 和GAN的结合方法,比如IntroVAE。
  • 其他的,NVAE

不知是否有没发现的错漏,到时候再改正。

Tutorial on Variational Autoencoders

An Introduction to Variational Autoencoders

Understanding Variational Autoencoders (VAEs) 这个写的挺好的,之前还看了几篇大牛写的忘了链接了,下次找到了再补上

  • 28
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@daviiid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值