[解读] 浅析变分自编码器 (VAE)

变分自编码器 (VAE)

VAE 开篇论文:

(1312) Auto-Encoding Variational Bayes

(1401)Stochastic Backpropagation and Approximate Inference in Deep Generative Models

VAE 教程 (1606) Tutorial on Variational Autoencoders

VAE 综述 (1906) An Introduction to Variational Autoencoders

变分推理 Variational Inference

博文解读: https://blog.csdn.net/jackytintin/article/details/53641885

https://blog.csdn.net/weixin_40255337/article/details/83088786

研究背景

在机器学习领域, 我们对学习数据的概率模型非常感兴趣, 概率模型对于未知预测和各种形式的辅助和自动决策有很大帮助.

假设观察变量 x\mathbf{x} 服从于一个未知的真实分布 p(x)p^{\star}(\mathbf{x}), 我们希望学习分布 pθ(x)p_{\theta}(\mathbf{x}) 的参数 θ\theta 来逼近真实分布 p(x)p^{\star}(\mathbf{x}).

这个逼近方法有很多, 本文考虑深度隐变量模型 (DLVM).

首先使用 z\mathbf{z} 来代表隐变量, 有向图模型表示为一种建立于 x\mathbf{x}z\mathbf{z} 上的联合分布 pθ(x,z)p_{\theta}(\mathbf{x}, \mathbf{z}), 计算它的边际分布即可得到
pθ(x)=pθ(x,z)dz p_{\theta}(\mathbf{x})=\int p_{\theta}(\mathbf{x},\mathbf{z})d \mathbf{z}
如果 z\mathbf{z} 是连续型变量, 则 pθ(x)p_{\theta}(\mathbf{x}) 可以看成一个无限的混合模型, 由此可见它可以表示任意的真实分布. 如果使用神经网络来参数化 pθ(x,z)p_{\theta}(\mathbf{x}, \mathbf{z}), 则这个网络称为 DLVM.

DLVM 的一个重要优点是即使有向图中的每个因子(先验或条件分布) 是相对简单的分布, pθ(x)p_{\theta}(\mathbf{x}) 可以是非常复杂的. 因此我们使用 DLVM 来逼近真实分布 p(x)p^{\star}(\mathbf{x}).

DLVM 作为一种最简单最常见的方法, 它的分解具有以下结构:
pθ(x,z)=pθ(z)pθ(xz) p_{\theta}(\mathbf{x}, \mathbf{z})=p_{\theta}(\mathbf{z}) p_{\theta}(\mathbf{x}|\mathbf{z})
其中 pθ(z)p_{\theta}(\mathbf{z}) 和 $ p_{\theta}(\mathbf{x}|\mathbf{z})$ 至少一个是被指定的, pθ(z)p_{\theta}(\mathbf{z})z\mathbf{z} 的先验分布.

DLVM 可以通过最大似然来学习, 但由于计算 pθ(x,z)p_{\theta}(\mathbf{x},\mathbf{z}) 的积分没有分析解或者有效的估计, 所以无法通过求微分的方式来优化它.

计算 pθ(x)p_{\theta}(x) 的难易程度与 pθ(zx)p_{\theta}(\mathbf{z} |\mathbf{x}) 难易程度是相关联的, 换句话说, 如果 pθ(x)p_{\theta}(x) 好算,则后者也好算, 注意到联合分布 pθ(x,z)p_{\theta}(\mathbf{x}, \mathbf{z}) 是容易计算的, 这些密度分布有以下关系:
pθ(zx)=pθ(x,z)pθ(x) p_{\boldsymbol{\theta}}(\mathbf{z} | \mathbf{x})=\frac{p_{\boldsymbol{\theta}}(\mathbf{x}, \mathbf{z})}{p_{\boldsymbol{\theta}}(\mathbf{x})}
近似推理方法能够估计后验分布 pθ(zx)p_{\boldsymbol{\theta}}(\mathbf{z} | \mathbf{x}) 和边际分布 pθ(x){p_{\boldsymbol{\theta}}(\mathbf{x})}. 然而传统的计算方法是比较复杂的, 例如这需要逐个样本的循环, 或者产生不好的后验近似, 我们的目的是避免这种高代价的处理过程.

变分自编码器

前面说到 DLVM 模型的训练问题, 变分自编码器则是一种非常高效的计算框架. 首先引入一个参数化的推理模型 qϕ(zx)q_{\phi}(\mathbf{z}|\mathbf{x}), 也被称为编码器或识别模型. 称 ϕ\phi 为变分参数. 我们优化这个参数来使得
qϕ(zx)pθ(zx) q_{\phi}(\mathbf{z} | \mathbf{x}) \approx p_{\boldsymbol{\theta}}(\mathbf{z} | \mathbf{x})
对任意一个推理模型 qq 和参数 ϕ\phi
KaTeX parse error: \cr valid only within a tabular/array environment
其中第二项是 ppqq 之间的 KL 散度, 这是一个非负值, 当分布相同时值为0. 第一项是一个变分下界, 也被称为 evidence lower bound (ELBO), 记为
Lθ,ϕ(x)=Eqϕ(zx)[logpθ(x,z)logqϕ(zx)] \mathcal{L}_{\boldsymbol{\theta}, \phi}(\mathbf{x})=\mathbb{E}_{q_{\phi}(\mathbf{z} | \mathbf{x})}\left[\log p_{\boldsymbol{\theta}}(\mathbf{x}, \mathbf{z})-\log q_{\phi}(\mathbf{z} | \mathbf{x})\right]

已知 KL 散度值是非负的, 由
Lθ,ϕ(x)=logpθ(x)DKL(qϕ(zx)pθ(zx))logpθ(x) \begin{aligned} \mathcal{L}_{\boldsymbol{\theta}, \phi}(\mathbf{x}) &=\log p_{\boldsymbol{\theta}}(\mathbf{x})-D_{K L}\left(q_{\phi}(\mathbf{z} | \mathbf{x}) \| p_{\boldsymbol{\theta}}(\mathbf{z} | \mathbf{x})\right) \\ & \leq \log p_{\boldsymbol{\theta}}(\mathbf{x}) \end{aligned}
可知 ELBO 是 logpθ(x)\log p_{\boldsymbol{\theta}}(\mathbf{x}) 的下界. 从上式可以看出, 最大化 ELBO (优化参数为 θ,ϕ\theta, \phi) 将会带来两个结果: 首先这能够同时最大化似然 logpθ(x)\log p_{\boldsymbol{\theta}}(\mathbf{x}), 使得模型变得更好, 其次能够最小化 KL 散度.

现在我们的目标是最大化 ELBO, 它有一个重要的特性是可以使用随机梯度下降方法来联合优化所有参数.

ELBO 关于 θ\theta 的无偏梯度为
θLθ,ϕ(x)=θEqϕ(zx)[logpθ(x,z)logqϕ(zx)]=Eqϕ(zx)[θ(logpθ(x,z)logqϕ(zx))]θ(logpθ(x,z)logqϕ(zx))=θ(logpθ(x,z)) \begin{aligned} \nabla_{\boldsymbol{\theta}} \mathcal{L}_{\boldsymbol{\theta}, \boldsymbol{\phi}}(\mathbf{x}) &=\nabla_{\boldsymbol{\theta}} \mathbb{E}_{q_{\phi}(\mathbf{z} | \mathbf{x})}\left[\log p_{\boldsymbol{\theta}}(\mathbf{x}, \mathbf{z})-\log q_{\phi}(\mathbf{z} | \mathbf{x})\right] \\ &=\mathbb{E}_{q_{\phi}(\mathbf{z} | \mathbf{x})}\left[\nabla_{\boldsymbol{\theta}}\left(\log p_{\boldsymbol{\theta}}(\mathbf{x}, \mathbf{z})-\log q_{\phi}(\mathbf{z} | \mathbf{x})\right)\right] \\ & \simeq \nabla_{\boldsymbol{\theta}}\left(\log p_{\boldsymbol{\theta}}(\mathbf{x}, \mathbf{z})-\log q_{\phi}(\mathbf{z} | \mathbf{x})\right) \\ &=\nabla_{\boldsymbol{\theta}}\left(\log p_{\boldsymbol{\theta}}(\mathbf{x}, \mathbf{z})\right) \end{aligned}
其中第四行是第二行的简单的蒙特卡罗估计, 最后两行的 z\mathbf{z} 随机采样于 qϕ(zx)q_{\phi}(\mathbf{z} | \mathbf{x}).

然而关于 ϕ\phi 的无偏梯度比较难以获得, 这是因为与 qϕ(zx)q_{\phi}(\mathbf{z} | \mathbf{x}) 有关, 微分算子无法穿过期望算子:
ϕLθ,ϕ(x)=ϕEqϕ(zx)[logpθ(x,z)logqϕ(zx)]Eqϕ(zx)[ϕ(logpθ(x,z)logqϕ(zx))] \begin{aligned} \nabla_{\phi} \mathcal{L}_{\boldsymbol{\theta}, \boldsymbol{\phi}}(\mathbf{x}) &=\nabla_{\boldsymbol{\phi}} \mathbb{E}_{q_{\phi}(\mathbf{z} | \mathbf{x})}\left[\log p_{\boldsymbol{\theta}}(\mathbf{x}, \mathbf{z})-\log q_{\boldsymbol{\phi}}(\mathbf{z} | \mathbf{x})\right] \\ & \neq \mathbb{E}_{q_{\phi}(\mathbf{z} | \mathbf{x})}\left[\nabla_{\boldsymbol{\phi}}\left(\log p_{\boldsymbol{\theta}}(\mathbf{x}, \mathbf{z})-\log q_{\boldsymbol{\phi}}(\mathbf{z} | \mathbf{x})\right)\right] \end{aligned}

重参数技巧

对于连续型的隐变量 z\mathbf{z}, 我们可以用重参数的技巧来计算无偏梯度 ϕLθ,ϕ(x)\nabla_{\phi} \mathcal{L}_{\boldsymbol{\theta}, \boldsymbol{\phi}}(\mathbf{x}). 把随机变量变量 z\mathbf{z} 表示为另一个随机变量 ϵp(ϵ)\boldsymbol{\epsilon} \sim p(\boldsymbol{\epsilon}) 的可微并且可逆的变换, 即
z=g(ϵ,ϕ,x) \mathbf{z}=\mathbf{g}(\boldsymbol{\epsilon}, \boldsymbol{\phi}, \mathbf{x})
其中三个随机变量都是互相独立的. 给定这个变换后, ELBO 可以重写为
Lθ,ϕ(x)=Eqϕ(zx)[logpθ(x,z)logqϕ(zx)]=Ep(ϵ)[logpθ(x,z)logqϕ(zx)] \begin{aligned} \mathcal{L}_{\boldsymbol{\theta}, \boldsymbol{\phi}}(\mathbf{x}) &=\mathbb{E}_{q_{\phi}(\mathbf{z} | \mathbf{x})}\left[\log p_{\boldsymbol{\theta}}(\mathbf{x}, \mathbf{z})-\log q_{\boldsymbol{\phi}}(\mathbf{z} | \mathbf{x})\right] \\ &=\mathbb{E}_{p(\boldsymbol{\epsilon})}\left[\log p_{\boldsymbol{\theta}}(\mathbf{x}, \mathbf{z})-\log q_{\boldsymbol{\phi}}(\mathbf{z} | \mathbf{x})\right] \end{aligned}
然后便可以采用简单的蒙特卡洛模拟来估计出关于单点的 ELBO, 整理如下
ϵp(ϵ)z=g(ϕ,x,ϵ)L~θ,ϕ(x)=logpθ(x,z)logqϕ(zx) \begin{aligned} \epsilon & \sim p(\epsilon) \\ \mathbf{z} &=\mathbf{g}(\boldsymbol{\phi}, \mathbf{x}, \boldsymbol{\epsilon}) \\ \tilde{\mathcal{L}}_{\boldsymbol{\theta}, \phi}(\mathbf{x}) &=\log p_{\boldsymbol{\theta}}(\mathbf{x}, \mathbf{z})-\log q_{\phi}(\mathbf{z} | \mathbf{x}) \end{aligned}

算法伪代码如下:

在这里插入图片描述

只要选择一个好的 g()g() 函数, 那么就是关于 logqϕ(zx)\log q_{\boldsymbol{\phi}}(\mathbf{z} | \mathbf{x}) 的计算就简单了. 当 g()g() 是一个可逆函数时, ϵ\boldsymbol{\epsilon}z\mathbf{z} 的密度的关系为
logqϕ(zx)=logp(ϵ)logdϕ(x,ϵ) \log q_{\phi}(\mathbf{z} | \mathbf{x})=\log p(\epsilon)-\log d_{\phi}(\mathbf{x}, \epsilon)
其中第二项为 logdϕ(x,ϵ)=logdet(zϵ)\log d_{\phi}(\mathrm{x}, \epsilon)=\log \left|\operatorname{det}\left(\frac{\partial \mathrm{z}}{\partial \epsilon}\right)\right|.

然后构造一个灵活的 g()g() 来使得 logdϕ(x,ϵ)\log d_{\phi}(\mathrm{x}, \epsilon) 计算更简单, 并且得到高度灵活的推理模型 qϕ(zx)q_{\boldsymbol{\phi}}(\mathbf{z} | \mathbf{x}). 常用的选择是一个简单的 factorized Gaussian encoder qϕ(zx)=N(z;μ,diag(σ2))q_{\phi}(\mathbf{z} | \mathbf{x})=\mathcal{N}\left(\mathbf{z} ; \boldsymbol{\mu}, \operatorname{diag}\left(\boldsymbol{\sigma}^{2}\right)\right):
(μ,logσ)= EncoderNeuralNet ϕ(x)qϕ(zx)=iqϕ(zix)=iN(zi;μi,σi2) \begin{aligned} (\boldsymbol{\mu}, \log \boldsymbol{\sigma}) &=\text { EncoderNeuralNet }_{\boldsymbol{\phi}}(\mathbf{x}) \\ q_{\phi}(\mathbf{z} | \mathbf{x}) &=\prod_{i} q_{\phi}\left(z_{i} | \mathbf{x}\right)=\prod_{i} \mathcal{N}\left(z_{i} ; \mu_{i}, \sigma_{i}^{2}\right) \end{aligned}
重参数后可以写为
ϵN(0,I)(μ,logσ)= EncoderNeuralNet ϕ(x)z=μ+σϵ \begin{aligned} \epsilon & \sim \mathcal{N}(0, \mathbf{I}) \\ (\boldsymbol{\mu}, \log \boldsymbol{\sigma}) &=\text { EncoderNeuralNet }_{\phi}(\mathbf{x}) \\ \mathbf{z} &=\boldsymbol{\mu}+\boldsymbol{\sigma} \odot \boldsymbol{\epsilon} \end{aligned}
并且有 logdϕ(x,ϵ)=logdet(zϵ)=ilogσi\log d_{\phi}(\mathbf{x}, \epsilon)=\log \left|\operatorname{det}\left(\frac{\partial \mathbf{z}}{\partial \epsilon}\right)\right|=\sum_{i} \log \sigma_{i}. 从而得到
logqϕ(zx)=logp(ϵ)logdϕ(x,ϵ)=ilogN(ϵi;0,1)logσi \begin{aligned} \log q_{\phi}(\mathbf{z} | \mathbf{x}) &=\log p(\boldsymbol{\epsilon})-\log d_{\phi}(\mathbf{x}, \boldsymbol{\epsilon}) \\ &=\sum_{i} \log \mathcal{N}\left(\epsilon_{i} ; 0,1\right)-\log \sigma_{i} \end{aligned}

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值