关于 VAE || 变分自编码器 的故事
Variational Autoencoder 的目的是将输入数据映射成潜在分布(隐分布)。
什么是潜在分布?就是特征提取后的有效低维空间的概率分布。
VAE包括编码器和解码器。
- 编码器负责将输入数据 \(\boldsymbol x\)(可能是高维向量)映射成低维的 \(\mu_{\boldsymbol x}\) 和 \(\log\left(\sigma^2_{\boldsymbol x}\right)\)(可能是低维向量)输出(这个编码器可以是CNN/RNN/Transformer)。
很神奇,不是吗?我们不把数据看作“确定的实体”,而是试图训练出一种将其映射成“可能的概率”;打个比方就是从一幅原画得到绘画风格。每个数据都有各自独立的分布,不涉及整体数据序列的联合分布。
\(\mu_{\boldsymbol x}\) 和 \(\log\left(\sigma^2_{\boldsymbol x}\right)\) 只是描述概率分布用的,编码器也只会输出这两个参数(\(\mu_{\boldsymbol x}\) 可以理解成 \(\boldsymbol x\) 在降维后,每个维度在概率空间各自的均值组成的向量)。
接下来,我们会使用“重参数化技巧”,也就是构造一个“潜在变量(隐变量)” \(\boldsymbol z\):
\[\boldsymbol z=\mu_{\boldsymbol x}+\exp(\frac{1}{2}\log(\sigma^2_{\boldsymbol x}))\cdot \varepsilon
\]
这个 \(\boldsymbol z\) 是连续的,可以用梯度下降法参与后续训练。
\(\mu_{\boldsymbol x}\) 项表示的是有效部分,\(\sigma_{\boldsymbol x}\) 项表示的是噪声部分。
- 解码器负责把 \(\boldsymbol z\) 映射回 \(\boldsymbol x\),也就是生成过程(根据不同的下游任务,这里生成的 \(\boldsymbol x\) 可以是连续/离散的)。
训练过程是自监督(无监督)的,损失函数由以下公式定义:
\[L=-E\left(\log(p(\boldsymbol x|\boldsymbol z))\right)+KL\left(q(\boldsymbol z|\boldsymbol x)||p(\boldsymbol z)\right)
\]
其中第一项称为“重构损失”,鼓励模型利用潜在表示重构出原始数据(训练解码器,增加特定数据的还原度);第二项称为“KL散度正则项”,使得潜在空间分布尽可能接近先验分布(训练编码器,增加整体分布的鲁棒性)。
\(p(\boldsymbol x|\boldsymbol z)\) 是先验分布(一般规定是正态分布),\(q(\boldsymbol z|\boldsymbol x)\) 是潜在空间分布。