自编码器 Autoencoder

自监督模型
训练一个ae的encoder,就能把code和object对应起来,获得code。给定一个code,decoder就能输出对应的object。
Autoencoder存在什么问题?
  因为作为训练数据的object是有限的,导致decoder实际上只能把训练过程中见过的code给还原成对应的object。如果随机给一些code,它不会生成训练集中没有见过的object。
 
如何解决?
 
VAE:训练decoder的时候给code加点噪声,就能让decoder在生成的时候可以克服一些带噪声的code,即使没有在训练中见过,也能生成比较合理的object(直觉上的理解,训练的时候希望一定范围内的code都能重构输入)。
 
 
 

因此在VAE中,encoder输出的不直接是code,而是一组m和一组σ,而向量c才是真正的加了噪声的code,其中ci = exp(σi) x e+ mi。训练过程中的优化目标也不仅是重构误差,还有一项 Σ (exp(σi) - (1+σi) + (mi)2),要强迫加噪声的方差不能太小(因为是模型学习的参数,如果不做限制,为了能重构的更好会越更新σ越使得噪声方差接近0;而实际上我们希望σ接近0(真正的方差接近1),所以最小化exp(σi) - (1+σi),mi平方项可以理解为L2 norm正则)。

 

 
 
理论上分析 VAE
对 p(x) 的建模通过 p(x | z) * p(z) 来实现,很容易就想到GMM。如何从GMM 中采样数据?先根据多项式分布p(m)决定要从哪个高斯分布中采样,然后就根据对应的那组mean和variance决定的高斯pdf来采样x。
 

而VAE实际上就是GMM的 distributed representation 的版本,先从一个高斯分布中采样出一个向量z,再根据z来决定mean和variance。那由于 z 是连续的,所以有无穷多个z,就有无穷多个高斯的mean和variance(在GMM中有几个高斯就是固定的)。在z的空间中,每个点都可能被sample到,而每一个点都对应到一个高斯分布。那么如何得到 z 和高斯的mean、variance的对应关系呢?干脆就用一个NN。

所以在整个 VAE 模型中,关键不是使用 p(z)(先验分布)是正态分布的假设(z服从别的分布也可以),而是假设 p(z | x)(后验分布)是正态分布。

 

猜你喜欢

转载自www.cnblogs.com/chaojunwang-ml/p/11421454.html