VAE:变分自编码器
- 有别于普通自编码器,VAE通过对中间隐变量(记为Z)加上服从标准高斯分布的限制,使得解码器具有从标准高斯分布进行生成的能力;
- 此时解码器的输入Z为分布采样得到,已非普通(编码器输出的常量)输入,因此训练过程是一个变分求导过程;
- 实际训练时,为了能顺利反向求导,对隐变量Z的分布采样过程 使用重参数化技巧进行巧妙避开;
- 下图介绍了几种生成模型,包括VAE(图片来自B站 揣摩研习社 分享的PPT)
VAE的一种推导
VAE的目标是最大化数据集X的似然,记为,x指X中某一个样本;引入log函数可简化为
;以下以一条样本为例进行推导,即最大化
引入隐变量z及其后验分布,有
将(1)式称为ELBO(Evidence Lower Bound),我们可以通过不断优化ELBO来间接优化;
优化ELBO,先分析ELBO,引入:
将式(2)的两项 根据它们的作用 分别记为:
第一项形象的表示了VAE的结构,即引入隐变量空间,因此需要一个隐变量的encoder(即),自然而然还需要一个用于生成的decoder(即
);
第二项则是希望对隐变量空间有一定的约束,通常将设置为标准高斯分布,以简化计算;
由(2)式可知,优化ELBO就是增大 reconstruction term,减小prior_matching_term;
VAE的具体实现
根据prior_matching_term,隐变量z 被约束为 服从高斯分布;
直接生成一个服从高斯分布的z(并添加prior_matching_term约束)或者搞出一个高斯分布再从中采样z,都不利于代码实现;
实际实现时,会采用重参数化技巧,即令,此时
(用一个网络表示)学习的就是均值和方差(标准差);
为了添加prior_matching_term约束,可以从一个标准高斯分布中采样一个值
,利用下式得到z:
(3)式等价于从采样z;
利用上述重参数化技巧,计算(4)式就简单了;
同时,有了z之后,只需要将构建为接收z为输入的另一个网络,即可计算(3)式;
其他说明
参考实现代码:GitHub - bojone/vae: a simple vae and cvae from keras