跳转至

VAE1

定义

两个空间

在VAE中, 会出现两个空间. 一个是 像素空间(pixel space), 另一个是 潜空间(latent space). (1) 像素空间是我们所观测到的像素所处的空间, 用\(\mathbf{x_{dog}}\)来表示一幅狗的图片, 它处于\(\mathbb{R}^d\)的像素空间中, \(\mathbf{x_{dog}}=\{x_{dog_1}, x_{dog_2}, ..., x_{dog_d}\}\), \(x_{dog_i}\)表示的是图\(\mathbf{x_{dog}}\)的第\(i\)个像素. 这个空间很高维, 如图片经常是由上千上百万个像素点组成的. (2) 潜空间是潜向量所处的空间, 这张图片\(\mathbf{x_{dog}}\)对应一个潜向量\(\mathbf{z_{dog}}\), 这个空间维度相对较低, 如\(\mathbb{R}^k\), 表示一个潜向量有\(k\)维.

四个分布

(1) \(p(\mathbf{Z})\): 这是所有潜向量(即整个潜空间)的分布. (2) \(p(\mathbf{Z}|\mathbf{X}=\mathbf{x})\): 这是给定一个任意的图片后其潜向量的分布, 如\(p(\mathbf{Z}|\mathbf{X}=\mathbf{x_{dog}})\)表示的是给定一张小狗的图片后其对应潜向量的分布. (3) \(p(\mathbf{X}|\mathbf{Z}=\mathbf{z})\): 这是给定一个任意的潜向量后其像素向量的分布, 如\(p(\mathbf{X}|\mathbf{Z}=\mathbf{z_{dog}})\)表示的是给定一个含义为狗的潜向量后其对应像素向量的分布. (4) \(p(\mathbf{X})\): 这是所有像素向量(即图像)在像素空间上的分布.

四个概率

(1) \(p(\mathbf{Z}=\mathbf{z})\): 这个表示的是在未观察到任何图像的前提下的潜向量的概率. 即在潜空间中随机取, 取到\(\mathbf{z}\)的概率. (2) \(p(\mathbf{X}=\mathbf{x})\): 这个表示的是在不依赖具体的潜向量的情况下, 随机在所有可能的图像中, 抽到\(\mathbf{x}\)的概率. (3) \(p(\mathbf{Z}=\mathbf{z}|\mathbf{X}=\mathbf{x})\): 这个表示的是我们已经观察到某个具体的图像\(\mathbf{x}\)时, 该图像对应潜向量为\(\mathbf{z}\)的概率. (4) \(p(\mathbf{X}=\mathbf{x}|\mathbf{Z}=\mathbf{z})\): 这个表示的是我们已经得知某个潜向量\(\mathbf{z}\)的情况下, 该潜向量对应图像为\(\mathbf{x}\)的概率.

原理

在普通的AE中, 我们在潜空间中随机选一个潜向量, 再通过decoder生成的像素向量所代表的图片往往是没有意义的噪声, 这是因为普通AE的encoder只将输入的图片映射到了潜空间中的一个潜向量上, 所以潜空间中只有一些特定的潜向量能够重构回原图, 这会导致潜空间的"支离破碎", 其他的潜向量经过解码器后只会得到没有意义的噪声, 如潜向量1能重构图1, 潜向量2能重构图2, 但是在潜向量1和潜向量2之间的潜向量3经过decoder会得到一张没有意义的图片.

在VAE中的潜空间中, 大部分区域的潜向量都能重构回看起来合理的样本. 这是因为VAE的encoder会将输入的图片映射到潜空间中的一个分布上, 这个分布内的潜向量都能构建出一张和原图类似的图片, 在这些潜向量中, 某些潜向量构建出原图的概率更高, 某些潜向量构建出原图的概率较低. 假设图片1被映射到的潜空间中潜向量2...潜向量8...潜向量12这个区域内, 图片2被映射到潜空间中潜向量10...潜向量14...潜向量18的区域内, 那么如果我们从潜空间中取潜向量11, 经过decoder之后大概率得到的是图片1和图片2的融合品, 如图片1是猫, 图片2是狗, 那么出来的图片可能是带有狗鼻子的猫. 换句话说, 现在, 在这个潜空间中随机去一个点, 经过decoder都能得到一个有意义的图. 这让VAE不仅仅能够重建图片, 还能够创造新的图片.

VAE在训练的时候, 往往会让这些由encoder生成的潜向量的分布往潜空间本身的分布靠, 于此同时, 也不能让它们靠得太紧. (1) 为什么要往潜空间本身的分布靠? 举个例子, 如果图片1被映射到潜向量2...潜向量8...潜向量12, 图片2被映射到潜向量20...潜向量24...潜向量28, 那么如果我们取潜向量15, 经过decoder生成的是无意义的图片, 这种叫做潜空间的"真空区", 这个真空区内的潜向量经过decoder之后生成的是噪声, 所以要尽量减少这种分布之间的真空区; (2) 为什么不能靠得太紧? 举个例子, 如果图片1被映射到潜向量2...潜向量8...潜向量12, 图片2被映射到潜向量3...潜向量9...潜向量13, 那么我们甚至无法找到一个合理的潜向量去重构图1或者图2. 这就是为什么VAE的损失函数里面第一部分是重构损失, 第二部分是encoder生成的潜向量分布和潜空间本身分布的KL散度.

如果没有损失函数中的KL散度项, 即一个普通的AE, 得到的潜空间的分布\(p(\mathbf{Z})\)是无法预测的, 是稀疏的, 是支离破碎的. 在KL散度中, 我们通常选择让encoder生成的潜向量分布尽量往一个高维的标准正态分布靠, 即我们将\(p(\mathbf{Z})\)定义为一个高维标准正态分布\(\mathcal{N}(0, \mathbf{I})\), 然后最小化重构损失+KL散度做一个上一段中所属的trade-off. 最后, 由于不同图片对应的潜向量的分布被KL散度拉得很近, 所以从这个标准正态分布\(p(\mathbf{Z})\)中采样, 得到的往往是有意义的图片. 这里的潜空间分布实际上可以被定义为任何分布, 这里使用高维标准正态分布的原因是它方便采样, 数学性质好, 平滑性好, 计算KL散度的时候比较方便.

方法论

变分推断

在很多的贝叶斯模型中, 我们想知道后验分布\(p(\mathbf{Z}|\mathbf{X}=\mathbf{x})\), 使用公式可以写作:

\[p(\mathbf{Z} |\mathbf{X}=\mathbf{x}) = \frac{p(\mathbf{Z}, \mathbf{X}=\mathbf{x})}{p(\mathbf{X}=\mathbf{x})}\]

其中, \(p(\mathbf{X})\)可以用全概率公式计算:

\[p(\mathbf{X}=\mathbf{x})=\int _{\mathbf{z}}p(\mathbf{X}=\mathbf{x}|\mathbf{Z}=\mathbf{z})p(\mathbf{Z}=\mathbf{z})d\mathbf{z}\]

然而, 当\(\mathbf{Z}\)的维度较高的时候, 这个积分几乎无法求解, 用数值方法计算也会非常困难或者代价高昂. 正因为如此, 我们无法得到结果\(p(\mathbf{X}=\mathbf{x})\)然后代入到贝叶斯公式来得到\(p(\mathbf{Z}|\mathbf{X}=\mathbf{x})\). 所以在实际中, 我们会借助近似方法, 如变分推断, MCMC等来绕过求解该积分的难题.


  1. Kingma, D. P., & Welling, M. (2022). Auto-encoding variational bayes (No. arXiv:1312.6114). arXiv. https://doi.org/10.48550/arXiv.1312.6114