要理解变分自编码器的原理, 只要理解以下最核心几个要点就行了:

  1. 如何让难以求解的目标函数$P(X)$变得可以求解
  2. 为什么可以强制规定隐变量服从标准正太分布$\mathcal{N}(0, I)$
  3. 如何解决采样过程不可导导致难以用梯度下降进行训练的问题(reparameterization trick)

下面三节内容分别解答上面三个问题.

目标函数的转换

VAE的目标是最大化训练集中每个样本$X$通过生成函数生成$X$的概率$P(X)$, 即:

$$P(X) = \int{P(X|z;\theta)P(z)\mathrm{d}z}$$

为了求$P(X)$, 我们需要对$z$进行采样, 但是对于大多数的$z$, $P(X|z)$的值接近于零, 也就是说, 对于大多数的$z$很难生成$X$. 变分自编码的核心就在于, 尝试采样一些更可能生成$X$的$z$. 为此我们需要一个新的函数$Q(z|X)$. 该函数能够通过输入一个$X$得到一个服从$z$分布的, 且更容易生成$X$的$z$. 我们天真地认为函数$Q$缩小了我们$z$的采样空间, 有助于我们计算$E_{z\sim Q}P(X|z)$. 这时候问题来了, 怎么把$E_{z\sim Q}P(X|z)$和我们要求的$P(X)$联系起来了呢? 这就要借助于$P(z|X)$和$Q(z)$的KL散度的定义了:

$$\mathcal{D}[Q(z)||P(z|X)] = E_{z \sim Q}[\mathrm{log}Q(z) - \mathrm{log}P(z|X)]$$

利用贝叶斯定理, 我们可以把$P(X)$, $P(X|z)$放到公式中去:

$$\mathcal{D}[Q(z)||P(z|X)] = E_{z \sim Q}[\mathrm{log}Q(z) - \mathrm{log}P(X|z) - \mathrm{log}P(z)] + \mathrm{log}P(X)$$

上式之所以能够把$P(X)$从期望表达式拿出来是因为, $X$不依赖于$z$. 整理一下式子我们便有:

$$\mathrm{log}P(X) - \mathcal{D}[Q(z)||P(z|X)] = E_{z \sim Q}[\mathrm{log}P(X|z) - D[Q(z)||P(z)]$$

因为我们的目的是为了求解$P(X)$, 前面提到$Q$函数就是为了得到一个更可能生成$X$的$z$, 那么我们构造一个依赖于$X$的函数没什么不好的, 不仅如此, 这样还能使得$\mathcal{D}[Q(z)||P(z|X)]$更小. 最终我们得到了我们的目标函数:

$$\mathrm{log}P(X) - \mathcal{D}[Q(z|X)||P(z|X)] = E_{z \sim Q}[\mathrm{log}P(X|z) - D[Q(z|X)||P(z)]$$

我们的目标函数变成了最大化$P(X)$同时最小化一个误差项$\mathcal{D}[Q(z|X)||P(z|X)]$. 而式子右边则是我们能够用随机梯度下降法训练的表达式. 式子左边的第二项使得$Q(z|X)$与$P(z|X)$趋于一致, 在理想情况下, 二者达到一致散度就变为零, 此时我们就是在直接优化$P(X)$.

目标函数的优化和reparameterization trick

为了用随机梯度下降法训练我们的目标函数, 我们必须知道我们目标函数的具体形式. 这个时候我们必须指定$Q(z|X)$的分布形式. 我们目标向量:$z$向量服从什么分布, 它就是什么分布. 我们可以假定$Q(z|X) = \mathcal{N}(z|\mu(X; \theta), \Sigma(X; \theta))$, 其中$\mu$, $\Sigma$表示通过参数$\theta$决定的函数, 由数据学习而得到. 目标函数的最后一项就是两个正太分布的KL散度, 它的解析式为:

$$
\mathcal{D}[\mathcal{N}(\mu_0, \Sigma_0) || \mathcal{N}[\mathcal{N}(\mu_1, \Sigma_1)] =
1/2 (tr(\Sigma_{1}^{-1}\Sigma_0) + (\mu_1 - \mu_0)^{T}\Sigma_{1}^{-1}(\mu_1 - \mu_0) - k + \mathrm{log}(\frac{det\Sigma_1}{det\Sigma_0}))
$$

我们让$z$服从标准正太分布, 再将$Q(z|X)$的分布带入那, 上式就可以简化成:

$$
\mathcal{D}[\mathcal{N}(\mu(X)), \Sigma(X))) || \mathcal{N}[\mathcal{N}(0, I] =
1/2 (tr(\Sigma(X)) + (\mu(X))^{T}(\mu(X)) - k + \mathrm{log}(det\Sigma(X)))
$$

到目前位置, 目标函数右边第二项就求解完毕了, 那么怎么求解第一项$E_{z \sim Q}[\mathrm{log}P(X|z)$呢? 我们通过采样$z$来估计它, 在随机梯度下降法中, 我们用采样单个样本直接用单个样本代替期望. 求解它的主要困难在于, $E_{z \sim Q}[\mathrm{log}P(X|z)$不仅依赖$P$而且依赖$Q$, 如下图左边, 我们必须对Q进行采样, 才能通过$P$解得我们要的$E_{z \sim Q}[\mathrm{log}P(X|z)$, 而这个采样的过程不可导, 不能进行梯度回传, 整个网络就不能训练. 此时就要用到reparameterization 技巧. 通过采样一个噪声向$\epsilon$然后用$\mu(X) + \Sigma^{1/2}(X) * \epsilon$代替图左边的采样过程. 这样这个网络便可导了, 这个网络也就可以训练了(如图右边)!

reparameterization trick

为什么可以让$z$服从正太分布?

下面说说为什么可以强制规定$z$服从正太分布呢? 这主要是因为, 即使$z$服从正太分布, 我们还是能够通过一个足够复杂的函数, 将$z$变换成任意的分布. 例如下图左边的随机分布$z$, 通过一个足够复杂的函数$g(z) = z / 10 + z/||z||$可以变换成下图右边的分布.

所以, 我们可以把生成网络的前几层看成是将正太分布变换成数据集隐变量真正的分布的过程, 然后才开始真正的生成过程.

散度和熵

信息熵的定义

生活经验告诉我们, 如果发生了一个几乎不可能发生的事件, 它给我们的信息绝对是比那些容易出发的事件来得大的. 也就说信息量与事件的概率$p(x)$具有联系, 因此信息量可以用$p(x)$的单调函数$h(x)$来表达. 通过观察我们发现, 如果有两个互不相关的事件发生, 那么我们得到的信息应该是两个事件的信息量的总和, 即$h(x,y) = h(x) + h(y)$. 而两个事件同时发生的概率则表示为$p(x, y) = p(x) * p(y)$. 由此我们得出信息函数应该是概率函数的对数关系:

$$h(x) = -\mathrm{log}_2p(x) \tag{1}$$

其中的负号使得, 信息永远非负. 并且概率越小, 信息量越大. 也就是说, 概率越小的时间发生, 能给我们更多的信息量.

平均的信息量则可以表达为期望形式:

$$H[x] = - \sum_x{p(x)\mathrm{log}_2p(x)} \tag{2}$$

参见PRML的推导, 最终我们会有熵的最终形式:

$$H[x] = - \sum_x{p(x)\mathrm{ln}p(x)} \label{entropy}\tag{3}$$

KL散度的定义

KL散度(Kullback-Leibler Divergence, KLD), 又称相对熵(relative entropy), 信息散度(information divergence), 信息增益(information gain)

KL散度是两个概率分布P和Q差别的非对称度量. 对于两个概率分布函数$p(x)$, $q(x)$的KL散度为:

$$
\begin{align}
KL(p||q) & = - \int{p(x)\mathrm{ln}q(x)\mathrm{d}x} - (-\int{p(x)\mathrm{ln}p(x)\mathrm{d}x}) \\
& = - \int{p(x)\mathrm{ln}{\frac{q(x)}{p(x)}}\mathrm{d}x}
\label{kl-entropy}
\tag{4}
\end{align}
$$

参考链接

此处应有打赏