The neural network perspective
传统的 Autoencoder 结构如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/313d8b30543fa65e5babab78d58cb654.jpeg)
但是这种结构没法生成新数据,只能做数据压缩。怎么改进呢?可以考虑加一个正则项,让隐变量趋近一个单位高斯分布。
generation_loss = mean(square(generated_image - real_image))
latent_loss = KL-Divergence(latent_variable, unit_gaussian)
loss = generation_loss + latent_loss
其中两个高斯分布的 KL divergence 可以套公式计算如下,
# z_mean and z_stddev are two vectors generated by encoder network
latent_loss = 0.5 * tf.reduce_sum(tf.square(z_mean) + \
tf.square(z_stddev) - tf.log(tf.square(z_stddev)) - 1,1)
值得一提的是,encoder 不是直接生成隐变量 z 的分布,而是先假设隐变量服从一个高斯分布,让 encoder 生成高斯分布的均值和方差。代码是这样的
samples = tf.random_normal([batchsize,n_z],0,1,dtype=tf.float32)
sampled_z = z_mean + (z_stddev * samples)
![](https://i-blog.csdnimg.cn/blog_migrate/a738ed6b4655dffed8136c1a35a95c43.jpeg)
下面用公式形式化地描述上面的过程,用
那么对单个样本 xi 的损失为
Li(θ,ϕ)=−Ez∼qθ(z|xi)[logpϕ(xi|z)]+KL(qθ(z|xi)∥p(z))
前者是重构损失,用对数是因为要极大化整体训练集的对数似然函数;后者是 KL divergence 的正则项。 p(z)∼N(0,I)
假设 encoder 得到的高斯分布的均值为 μ(x) ,方差是 Σ(x) ,而 p(z) 服从标准正态分布,即 p(z)∼N(0,I) ,其中 I 是单位矩阵。那么 KL divergence 计算如下,
The probability model perspective
![无标题.png-39.5kB](https://i-blog.csdnimg.cn/blog_migrate/f3de71ce6479c9abc2a9214bf38246cf.png)
如果是概率图模型的角度,有隐变量 z 和观察变量
p(x,z)=p(z)