VAE 变分自编码器

Posted by in 未分类

  • 自编码器:
    自编码器架构分为 编码器(Encoder),解码器(Decoder),编码器将数据压缩为 低秩向量(低维空间中的一个点),而解码器将 压缩后的 低秩向量 重建为 原始数据 或是 根据 低秩向量 输出 所需内容。
  • 变分自编码器:
    变分自编码器同样分为 编码器和解码器,只不过 编码器不在学习数据的低维表达,而是尝试去学习分布。为什么学习分布?

为什么学习分布?

自编码器 将 原始数据 压缩到 潜空间(Latent Space)。直观地,我们希望相似的原始数据可以压缩到潜空间中的近似点。也就是说,对于相似的两个原始数据 \textbf{x}_1,\textbf{x}_2, {||\textbf{x}_1 – \textbf{x}_2||}_2 \le bound,我们希望对于他们的特征向量 \textbf{z}_1,\textbf{z}_2 满足 {||\textbf{z}_1 – \textbf{z}_2||}_2 \le another bound。除了相似的原始数据比较接近外,我们还希望越是不相似的原始数据,其距离也就越远。

对于一张图片来说,相似性可能衡量的内容包括 语义信息、色彩风格、构图风格……,我们尤为关注的可能是 语义信息。

当上述所有信息都比较接近时,我们可以认为 他们是 同一类图片

值得留意的是,图片样本是连续的,而非离散的,某一类图片应该可以连续的变化为另一类图片,因此,两类图片对应的 球体 之间最好是 有相交区域的,这样可以很好地刻画这种连续性。

只不过,自编码器并没有这种限制(限制潜空间必须像上述那样规整),因此,自编码器并不总能使得潜空间规整。

这也就是我们为什么选择学习分布。

数学推导

正因为 VAE 尝试去学习分布,所以其数学推导过程比较繁琐。

首先明确,VAE 的目标是尝试重建原始数据,其编码器会输出一个高斯分布 (通过预测均值和方差来实现),对应于高维空间中的一个高维椭球。

我们自然是希望对于输入数据 x,其编码器输出的高维椭球内的点可以被解码器重建为 x
所以我们可以构建一个损失函数:

Loss = ||x – D[M_{\theta}(x) + \epsilon S_{\theta}(x)]||_2

为避免方差过大,我们可以采样求期望:

Loss=\mathbb{E}[||x – D[M_{\theta}(x) + \epsilon S_{\theta}(x)]||_2]

同时,我们希望隐空间尽量规整化。
只需要增加一个衡量隐空间规整性的损失函数即可:
Loss =\mathbb{D}_{KL}(\mathcal{N}(0, I)||q(z|x))
其中,q(z|x) 可以看作 x 下,z 的编码概率分布,实际上,它反映了 x 应当如何编码,我们是通过 神经网络 来拟合这个 概率分布 的。
在不同的 x 下,z 的分布也会不同,不过我们希望 z 的分布尽可能符合标准正态分布,因此创造出了这个 KL 损失项,这可以看作是一种正则项,因为我们限制了神经网络的参数去肆意的生长变化。

为什么选择标准正态分布?
标准正态分布限制 均值为 0,所以在不同的 x 下,q(z|x) 均是一个距离原点较近的类单位球。球与球之间由于距离 原点较近,更容易重叠,同时,正态分布是非常常见且非常有物理意义的一种分布。

q(z|x)=M_{\theta}(x) + \epsilon S_{\theta}(x) ,所以我们可以求得 KL 散度的值,再将两个损失加在一起即可获得最终的损失函数,对其进行优化即可。

总结

变分自编码器实际上是对自编码器的变种,通过 KL 散度正则项使得生成的 潜在空间分布尽可能规整,避免过拟合。