主要参考博客:https://lilianweng.github.io/posts/2018-08-12-vae/

Autoencoder

autoencoder 是一种神经网络,旨在以无监督的方式学习一种恒等变换,先通过encoder网络将数据压缩为低维表示,再用decoder网络对数据进行还原,通过这样的方式可以找到数据更高效的表示。

encoder 和 decoder 网络本质上是拟合两个函数变换:

encoder function:由 $\phi$ 参数化为 $g_\phi(.)$

decoder function:由 $\theta$ 参数化为 $f_\theta(.)$

则整个网络的数据过程可以表示为 $\mathbf{x}’=f_\theta(g_\phi(\mathbf{x}))$

$(\theta,\phi )$ 由通过学习以重建数据样本 $x$(可通过多种指标评估重建前后的向量差异进行训练)

e.g. 使用均方误差:$L_\text{AE}(\theta, \phi) = \frac{1}{n}\sum_{i=1}^n (\mathbf{x}^{(i)} - f_\theta(g_\phi(\mathbf{x}^{(i)})))^2$

Variational Autoencoder

相比于将输入映射为固定向量,我们可以将其映射为一个分布。假设这个分布为 $p_\theta$ ,参数化为 $\theta$ 。则数据输入 $\mathbf{x}$ 和 latent encoding vector $\mathbf{z}$ 可以被定义为:

  • 先验 $p_\theta(\mathbf{z})$ (假设服从标准正态分布)
  • 似然 $p_\theta(\mathbf{x}|\mathbf{z})$
  • 后验 $p_\theta(\mathbf{z}|\mathbf{x})$

取样本点 $\mathbf{z}^{(i)}$ 来自先验分布 $p_\theta(\mathbf{z})$ (但是这里可能产生误解,一般这个先验分布是标准正态分布,不包含 $\theta$ )然后由条件分布 $p_\theta(\mathbf{x}|\mathbf{z}=\mathbf{z}^{(i)})$ 生成 $\mathbf{x}^{(i)}$

则由于要最大化生成真实样本点的概率,因此最优参数 $\theta^{*}$ 满足

\[\theta^{*} = \arg\max_{\theta} \prod_{i=1}^{n} p_\theta(\mathbf{x}^{(i)})\]

<=> $\theta^{*}=\arg \underset{\theta}{\max} \sum_{i=1}^{n} \log p_\theta(\mathbf{x}^{(i)})$

其中 $p_\theta(\mathbf{x}^{(i)})=\int p_\theta(\mathbf{x}^{(i)}|\mathbf{z}) p_\theta(\mathbf{z})d\mathbf{z}$

但是这种形式想要计算需要对 $p_\theta(\mathbf{x}^{(i)}|\mathbf{z}) $ 使用贝叶斯公式,就会需要后验分布 $p_\theta(\mathbf{z}|\mathbf{x}^{(i)})$ 的表达式,而这个表达式不可直接获取,因此需要一种新的近似函数 $q_\phi(\mathbf{z}|\mathbf{x})$,这个近似函数往往是高斯分布并且可以参数化为 $\phi$

这里可以把 $\mathbf{z} \overset{p_\theta(\mathbf{x}|\mathbf{z})}{\rightarrow} \mathbf{x}$ 类比Autoencoder的decode过程

把 $\mathbf{x} \overset{q_\phi(\mathbf{z}|\mathbf{x})}{\rightarrow} \mathbf{z}$ 类比为Autoencoder的encode过程

梳理一下:我们有一个观测点 $\mathbf{x}$,通过一个由 $\phi$ 参数化的分布 $q_\phi(\mathbf{z}|\mathbf{x})$ 采样一个 $\mathbf{z}$,再通过由 $\theta$ 参数化的分布 $p_\theta(\mathbf{x}|\mathbf{z})$ 得到重构的 $\mathbf{x}’$。后续目标一是最小化分布间的距离,二是最小化重构的损失,这两个优化目标同时进行。

损失函数:ELBO

我们可以使用Kullback–Leibler divergence来量化两个分布之间的距离,$D_{KL}(\mathbf{X}|\mathbf{Y})$ 测量如果使用分布 $\mathbf{Y}$ 来表示分布 $\mathbf{X}$ 会损失多少信息。

$D_{KL}(P | Q)=\sum_{x\in \chi}P(x) \log(\frac{P(x)}{Q(x)})$

因此我们希望最小化 $D_{KL}(q_\phi(\mathbf{z}|\mathbf{x})| p_\theta(\mathbf{z}|\mathbf{x}) )$ 关于 $\phi$

\[\begin{aligned} & D_\text{KL}( q_\phi(\mathbf{z}\vert\mathbf{x}) \| p_\theta(\mathbf{z}\vert\mathbf{x}) ) & \\ &=\int q_\phi(\mathbf{z} \vert \mathbf{x}) \log\frac{q_\phi(\mathbf{z} \vert \mathbf{x})}{p_\theta(\mathbf{z} \vert \mathbf{x})} d\mathbf{z} & \\ &=\int q_\phi(\mathbf{z} \vert \mathbf{x}) \log\frac{q_\phi(\mathbf{z} \vert \mathbf{x})p_\theta(\mathbf{x})}{p_\theta(\mathbf{z}, \mathbf{x})} d\mathbf{z} & \scriptstyle{\text{; Because }p(z \vert x) = p(z, x) / p(x)} \\ &=\int q_\phi(\mathbf{z} \vert \mathbf{x}) \big( \log p_\theta(\mathbf{x}) + \log\frac{q_\phi(\mathbf{z} \vert \mathbf{x})}{p_\theta(\mathbf{z}, \mathbf{x})} \big) d\mathbf{z} & \\ &=\log p_\theta(\mathbf{x}) + \int q_\phi(\mathbf{z} \vert \mathbf{x})\log\frac{q_\phi(\mathbf{z} \vert \mathbf{x})}{p_\theta(\mathbf{z}, \mathbf{x})} d\mathbf{z} & \scriptstyle{\text{; Because }\int q(z \vert x) dz = 1}\\ &=\log p_\theta(\mathbf{x}) + \int q_\phi(\mathbf{z} \vert \mathbf{x})\log\frac{q_\phi(\mathbf{z} \vert \mathbf{x})}{p_\theta(\mathbf{x}\vert\mathbf{z})p_\theta(\mathbf{z})} d\mathbf{z} & \scriptstyle{\text{; Because }p(z, x) = p(x \vert z) p(z)} \\ &=\log p_\theta(\mathbf{x}) + \mathbb{E}_{\mathbf{z}\sim q_\phi(\mathbf{z} \vert \mathbf{x})}[\log \frac{q_\phi(\mathbf{z} \vert \mathbf{x})}{p_\theta(\mathbf{z})} - \log p_\theta(\mathbf{x} \vert \mathbf{z})] &\\ &=\log p_\theta(\mathbf{x}) + D_\text{KL}(q_\phi(\mathbf{z}\vert\mathbf{x}) \| p_\theta(\mathbf{z})) - \mathbb{E}_{\mathbf{z}\sim q_\phi(\mathbf{z}\vert\mathbf{x})}\log p_\theta(\mathbf{x}\vert\mathbf{z}) & \end{aligned}\]

所以有:

\[\log p_\theta(\mathbf{x}) - D_\text{KL}( q_\phi(\mathbf{z}\vert\mathbf{x}) \| p_\theta(\mathbf{z}\vert\mathbf{x}) ) = \mathbb{E}_{\mathbf{z}\sim q_\phi(\mathbf{z}\vert\mathbf{x})}\log p_\theta(\mathbf{x}\vert\mathbf{z}) - D_\text{KL}(q_\phi(\mathbf{z}\vert\mathbf{x}) \| p_\theta(\mathbf{z}))\]

左式中的对数似然 $\log p_\theta(\mathbf{x})$ 正是我们希望最大化的,而我们同时希望最小化实际后验分布与估计后验分布(此时KL散度类似于正则项),由于KL散度的非负性,我们可以定义我们的损失函数如下:

\[\begin{aligned} L_\text{VAE}(\theta, \phi) &= -\log p_\theta(\mathbf{x}) + D_\text{KL}( q_\phi(\mathbf{z}\vert\mathbf{x}) \| p_\theta(\mathbf{z}\vert\mathbf{x}) )\\ &= - \mathbb{E}_{\mathbf{z} \sim q_\phi(\mathbf{z}\vert\mathbf{x})} \log p_\theta(\mathbf{x}\vert\mathbf{z}) + D_\text{KL}( q_\phi(\mathbf{z}\vert\mathbf{x}) \| p_\theta(\mathbf{z}) ) \\ \theta^{*}, \phi^{*} &= \arg\min_{\theta, \phi} L_\text{VAE} \end{aligned}\]

该损失函数即为变分下界,通过最小化损失,即可最大化生成真实数据样本的概率的下限。

https://kexue.fm/archives/5343 这篇博客中提到了使用联合分布可以更加直接地推得损失函数。

Reparameterization Trick

损失函数中的期望项调用 $z\sim q_\phi(\mathbf{z}|\mathbf{x})$,由于此时 $\phi$ 对 $z$ 来说不是一个显式可微的函数,也就是说要把这个随机的采样改写为确定性函数与一个带系数的标准正态分布和。

本质上是将原先由依赖参数 $\phi$ 的随机变量 $\mathbf{z}$ 拆分成了一个关于 $\phi$ 的确定函数和一个与 $\phi$ 无关的随机噪声,将随机性从参数中剥离出来,使得 $\mathbf{z}$ 对参数可微,进而使得参数可以被训练。