自编码器 (Autoencoder)
自动编码器是一种数据的压缩算法,其中数据的压缩和解压缩函数是数据相关的、有损的、从样本中自动学习的。在大部分提到自动编码器的场合,压缩和解压缩的函数是通过神经网络实现的。
自编码器的基本结构,摘自 深度学习之自编码器AutoEncoder
因为是压缩算法,衡量性能的标准自然就是重建图像与原图像的差距了,因此网络的损失函数 (Loss function)就是原始输入和输出的diff。
变分自编码器(Variational Auto-Encoder, VAE)
相比于自编码器,VAE更倾向于数据生成。只要训练好了decoder,我们就可以从标准正态分布生成数据作为解码器的输入,来生成类似但不同于训练数据的新样本,作用类似GAN。
VAE跟GAN的目标基本是一致的——希望构建一个从隐变量Z生成目标数据X的模型,但是实现上有所不同。更准确地讲,它们是假设了Z服从某些常见的分布(比如正态分布或均匀分布),然后希望训练一个模型X=g(Z),这个模型能够将原来的概率分布映射到训练集的概率分布,也就是说,它们的目的都是进行分布之间的变换。VAE的结构比自编码器多了中间Z的部分。
摘自 变分自编码器:原来是这么一回事
那现在假设Z服从标准的正态分布,那么我就可以从中采样得到若干个Z1,Z2,…,Zn,然后对它做变换得到X’1=g(Z1),X’2=g(Z2)…,X’n=g(Zn)g有读者说不是有KL散度吗?当然不行,因为KL散度是根据两个概率分布的表达式来算它们的相似度的,然而目前我们并不知道它们的概率分布的表达式,我们只有一批从构造的分布采样而来的数据{X’1,X’2…,X’n},还有一批从真实的分布采样而来的数据{X1,X2,…,Xn}(也就是我们希望生成的训练集)。我们只有样本本身,没有分布表达式,当然也就没有方法算KL散度。
首先我们有一批数据样本{X1,X2,…,Xn},其整体用X来描述,我们本想根据{X1,X2,…,Xn}得到X的分布p(X),如果能得到的话,那我直接根据p(X)来采样,就可以得到所有可能的X了(包括{X1,X2,…,Xn}以外的),这是一个终极理想的生成模型了。当然,这个理想很难实现,于是我们将分布改一改
p
(
X
)
=
∑
Z
p
(
X
∣
Z
)
p
(
Z
)
p(X)=\sum\limits_{Z} p(X|Z)p(Z)
p(X)=Z∑p(X∣Z)p(Z) 这里我们就不区分求和还是求积分了,意思对了就行。此时p(X|Z)就描述了一个由Z来生成X的模型,由网络中的decoder来实现,而我们假设Z服从正态分布,也就是p(Z)=N(z_mean,z_log_var),我们就可以先在正态分布中采样一个Z,然后根据Z来算出一个X。那么问题来了,当我们要进行反向求导的时候,我们发现采样操作并不是可导的,这样我们就不能愉快地使用梯度下降了。为此作者采用了一个reparemerization的技巧(trick),在计算出均值和方差之后不直接对相应的正态分布采样,而是从标准正态分布中采样一个
ϵ
\epsilon
ϵ,然后乘方差加均值。这样一来,对于z_mean和z_log_var而言就是线性操作而不是采样操作了,变得可导,梯度下降得以顺利进行,而我们并不需要对
ϵ
\epsilon
ϵ进行求导。完整的VAE结构如下图所示:
VAE 结构框架,摘自 变分自编码器(Variational Auto-Encoder,VAE)