变分自编码

VAE的介绍主要按照[1606.05908] Tutorial on Variational Autoencoders (arxiv.org)的逻辑来进行,可以直接去看原文,这里只是做简单的梳理和总结

生成模型面临的挑战是生成具有特定结构的数据,而这些结构通常是相互依赖的、难以用抽象的逻辑直接表示的。以数字图像为例,每个像素的颜色和位置都可能受到周围像素的影响,同一个数字下面由于写字的速度等等问题,存在复杂的空间依赖关系(needs to choose not just the digit, but the angle that the digit is drawn, the stroke width, and also abstract stylistic properties. Worse, these properties may be correlated. )。因为数据的高度关联以及非线性,传统的方式做的不好。

在这一背景下,VAE通过引入隐变量来捕获数据的复杂关系。简而言之,依赖于隐变量的生成模型首先生成隐变量,然后使用这些隐变量来生成具体的数据。这种方法的优势在于能够更灵活地表示数据中的潜在结构,并且通过对隐变量的概率建模,VAE引入了一种概率性的生成过程,使其更适应真实世界中复杂多变的数据分布。相比之下,对抗生成网络(GAN)、扩散模型和流模型等生成模型采用不同的策略来解决这一问题。

首先我们从一个简单的隐变量的混合模型的角度出发,看一下里面存在什么问题,并且介绍VAE是怎么解决的。混合模型假设数据的生成方式如下:

  1. 从分布中采样一个
  2. 中采样得到

具体来说上面公式中的就是z的一个先验分布,我们的z从中进行采样,之后通过个一个依赖于z和参数的条件分布得到生成的X。

其中 是指需要优化的参数。一般来说,其中,是输入值为z参数为的一个网络。

隐变量的分布一般直接采用标准正态分布,一方面是其方便采样,另一方面是正态分布具有很好的性:(The key is to notice that any distribution in d dimensions can be generated by taking a set of d variables that are normally distributed and mapping them through a sufficiently complicated function)

模型可以采用极大似然估计的方式,使用给定的数据集进行训练,通过优化参数来最大化下面的概率:

上面式子改成抽样的形式,优化的目标函数就可以写作:

其中按照之前的假设实际上就是一个正态分布,由于正态分布概率的对数形式和成反比,也就是说实际上最大化就是最小化预测和样本的距离。也就是说其损失函数实际上就是是距离相似度损失。参数优化会朝着更近的方向进行,正态分布中的,为模型提供泛化性,如果很小,就意味着强迫模型的朝着两者更接近的方向优化。生成过程只会生成与样本足够接近的数据。

image-20231118133247632

设想下面的情形,图片(a)是提供的样本,(b)和(c)是生成的两个样本,只管来看当然是(c)更好,而(b)则是不应该生成的(生成的概率小),属于应该排除在外的部分(在模型的范围之外)。但是实际上从距离的角度来说(a)与(b)才是更接近的:(the squared distance between X and Figure 3(c) is .2693 (assuming pixels range between 0 and 1), but between X and Figure 3(b) it is just .0387.)

也就是说为了排除(b)我们需要将这个超参数设置的足够小,但是这也就将(c)也排除了,结果是只剩了和(a)高度相似的图像,也就是模型学习到的知识对样本的简单重复,这当然不是我们想要得到的效果。不仅如此较小,同时也意味着模型的训练效率低:

因为只有抽样到能够生成距离样本很近的的时候的值才会大,在采样的次数N一定的情况下,越小,得到的越小,参数的更新也就越慢。这一点可以从一个简单的神经网络的反向传播的公式进行理解:

一个以距离函数作为损失函数的神经网络中参数的更新公式和两者的距离成正比,也就是说两个的差异越大,参数更新的越快

尤其是生成任务中样本的维度通常都很高,采样次数也就需要很高,计算效率就很低。

总结一下,基于最小二乘法去对边际分布(混合分布)去优化参数的模型存在下面两个问题:

  1. 损失函数过于简单,导致模型的泛化性和“准确性冲突”
  2. 计算效率不高,大部分采样对模型的更新作用不大

从采样的角度出发,看一下上面的模型,因为采样得到的生成的大部分数据都是接近于0的,也就是偏离样本很远的值。针对于这个问题,如果采样能够得到更倾向于生成样本的就好了,于是就换成从也就是z的后验分布中采样。(The key idea behind the variational autoencoder is to attempt to sample values of z that are likely to have produced X, and compute P(X) just from those. )

但是后验分布 的前提就是先要算下面的边际分布,也就是上面要算的。

为了绕过这个地方,引入了Varational Inference的方式去近似这个后验概率,也就是VAE中的V。VI的目的就是希望取得一个分布,去近似,也就是最小化下面的KL散度

可以使用贝叶斯公式进行化简最终得到:

因为可以是任意的分布函数,在VAE中Q也可以通过一个Encoder也就是一个多层网络导出,也就是去确定,于是有:

上面的公式右侧就是著名的ELBO,左侧包含了需要优化的 ,还有一个估计的后验与真实后验的近似程度,由于神经网络是high-capacity的,在最大化右侧的时候,很容易得到一个和真实后验相近的Q满足这个条件,所以可以只用优化右侧的ELBO就行。

上面的讨论中通过VI近似后验分布得到一个Q来采样来解决了采样效率的问题,下面对于VAE如何解决泛化性的问题说一下我自己的理解。

将初始的公式也按照上面的形式,就得到下面的公式:

也就是:

相比于VAE的公式,优化的时候左侧的损失项就不能忽视了,并不随着优化的过程而改变,总是存在一个差值,在优化的过程中也没有去考虑,右侧中的值相当于只是一个距离的损失函数,没有正则项。