白话Variational Autoencoder(变分自编码器)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/starwxd/article/details/79880942

本文将简单介绍一下Variational Autoencoder。作者也在学习当中,如有不正确的地方,请大家指正,谢谢~

原始的autoencoder一般分为两个部分encoder part和decoder part。 encoder是将input转化为encoding vector,之后通过decoder network重新构造input。


图1 origanal autoencoder (from wikipedia)

VAE(变分自编码器) 与原始autoencoder不同的是,在encoder部分通过用概率分布来表示每一个潜在的特征。

举个例子:


图2 (from reference)

上面的图中,在经过encoder部分后,我们用一个具体的数来表述每一个潜在的特征,比如smile的值是0.99。但是有些时候,我们希望用一个区间来表示所有可能的潜在特征值,这就有了下图的表示,通过用一个概率分布函数来表示潜在的特征。当我们通过潜在状态decoding时,我们首先对每个概率分布生成随机样本,之后再重新构造input。


图3 (from reference)

VAE的结构如下图所示:


图4 

下面简单介绍一下VAE背后的统计知识。


图5

我们有一个隐含变量(hidden variable)Z 是由 X生成的,关系如上图所示。我们目前只知道X,但是我们想要获得Z的特征,换句话说,我们希望计算条件概率p(z|x),应该如何计算呢?

我们知道

其中积分部分非常难计算,所以我们考虑用variational inference间接估算p(z|x)的值。这其中我们用到KL divergence(用来计算两个概率分布相似度)。我们通过q(z|x),来近似估计p(z|x)的值,即我们希望minKL(q(z|x) || p(z|x))。具体的推倒过程就不在这里详细讲述了。

最后想要说明的一点,在实际应用过程中,为了做backpropagation,(如下面左边的图中,z的值是一个随机变量,所以在反向传播过程中我们没有办法计算对z导数)我们通常用reparametrization trick代替randomly sample,(即通过引入一个高斯分布e,将z变成一个确定的值,从而使得反向传播可以得以计算)具体过程如下:(图中圆圈代表随机变量,方块代表变量的值是确定的)


图6

参考资料:

https://www.jeremyjordan.me/variational-autoencoders/

注:文中未标明出处的图都是作者自己画的, 如有错误和补充, 请留言。转载请标明出处。谢谢~

展开阅读全文

没有更多推荐了,返回首页