美文网首页机器学习
变分自编码器(一)——基本原理简介

变分自编码器(一)——基本原理简介

作者: 长安逸魂 | 来源:发表于2019-05-30 22:34 被阅读0次

自编码器

常用于数据压缩算法和特征提取算法

  • 包含Encoder and Decoder, 若用\phi\psi表示对应的映射为
    \phi: X \longrightarrow h
    \psi: h \longrightarrow \hat X
    目标函数是为了拟合一个恒等函数
    argmin_{\phi,\psi}L(X, (\psi .\phi)X)

变分自编码器

如何将其变化成为自编码器的形式
如何理解\mu\sigma
如何保证采样出的Z能够对应还原到原来的X
变分下界的推导,SGVB估计的原理

基本概念

  • KL散度(相对熵):用于衡量两个概率分布p(x)和q(x)之间的差异性,定义为
    KL(p(x)|q(x))=\int p(x)\log \frac{p(x)}{q(x)}dx=E_{x \sim p(x)}\log\frac{p(x)}{q(x)}
    具有非负性,仅当p(x)=q(x)时,KL散度为0
  • Monte Carlo采样: 期望可以表示为
    s=\sum_xp(x)f(x)
    s=\int p(x)f(x)dx
    如果通过从p中随机抽取n个样本来近似s,并得到一个经验平均值,那么根据大数定律,样本均值会收敛到真实的均值。
    \hat s_n = \frac{1}{n}\sum^n_{i=1}f(x^{(i)})
    E(\hat s_n)=\frac{1}{n}\sum^n_{i=1}E[f(x^{(i)})]=s

基本假设

  • 假设有一批数据样本\{X_1,X_2,...,X_n\},用X来表示,如果想得到X的分布p(X),但是数据量不足够大时,估计的是不够准确的 ,那么可以将分布形式改一改,引入隐变量Z,这样可以得到:
    p(X)=\sum_Zp(X|Z) P(Z) \tag{1}
    此处是离散形式,引入一个隐变量Z之后,比如P(Z)\sim N(0,I),然后得到X相对于随机变量Z的条件分布。如果可以实现,则是从标准正态分布中进行采样一个z,然后基于z去计算产生一个X,从而可以得到X的分布。

理论推导

基于上述假设,亟需解决的问题是如何估计隐变量z以及各分布中的参数

  • 估计参数最自然的想法是采用极大似然估计,但是目前存在两个问题:
    • 通过等式 p_{\theta}(x)=\int p_{\theta}(x|z)p_{\theta}(z)dz估计无法做到
    • 真实的后验分布p_{\theta}(z|x)=\frac{p(x|z)p(z)}{p(x)}也没办法计算

改变策略:既然我估计不了计算不出来,那我自己生成一个!
引入概率分布q_{\phi}(z|x)来逼近真实的后验分布,那么如何逼近呢? 对的!KL散度
\begin{eqnarray*} D_{KL}[q(z|x)||p(z|x)] &= &\int_{q(z|x)}q(z|x)\log \frac{q(z|x)}{p(z|x)}\\ &=&E_{q(z|x)}[log q(z|x)-\log p(z|x)]\\ &=&E_{q(z|x)}[log q(z|x)-\log p(x,z)]+\log p(x) \tag{2}\\ \end{eqnarray*}

\mathcal{L}(\theta, \phi;x)=E_{q(z|x)}[-log q(z|x)+\log p(x,z)] \tag{3}
因此
\log p(x)=\mathcal{L}(\theta, \phi;x) + D_{KL}[q(z|x)||p(z|x)]
根据KL散度的非负性,可以知道
\log p(x)\geq \mathcal{L}(\theta, \phi;x)
\mathcal{L}(\theta, \phi;x)称为变分下界(variational lower bound),因此求边际似然函数的最大值转化成为求变分下界的最大值
根据极大似然法,得到
\log p(X)=\sum^N_{i=1}\log p(x^{(i)})
其中
\log p(x^{(i)})=\mathcal{L}(\theta, \phi; x^{(i)}) + D_{KL}[q(z|x^{(i)})||p(z|x^{(i)}) ]
下面对变分下界进行推导
\begin{eqnarray*} \mathcal{L}(\theta, \phi;x) &=& E_{q(z|x)}[-\log q(z|x)+\log p(x,z)] \\ &=& E_{q(z|x)}[-\log q(z|x)+\log (p(x|z)p(z))]\\ &=& -E_{q(z|x)}[\log q(z|x)+p(z)] + E_{q(z|x)}[\log p(x|z)]\\ &=& -D_{KL}[q(z|x)||p(z)] + E_{q(z|x)} [log p(x|z)] \tag{4} \\ \end{eqnarray*}
下一部分将推导如何估计变分下界

重参数化技巧(reparameterization)

由于q(z|x)是后验分布,如果采用Monto Carlo方法进行采样估计真实分布,由于采样这个操作是不可导的,也不好在模型中进行描述,因此此处采用一个重参数化的技巧,已知 z \sim q_\phi(z|x),那么可以引入一个新的分布z = g_{\phi}(\epsilon, x), \epsilon称为辅助变量,这样在采用Monto Carlo估计的时候,就能保证他是可导的。(有疑问没关系,下面拿高斯分布的重参数技巧举例大家就会更明白一些)

随机梯度变分贝叶斯(SGVB)估计

对于上述的变分下界,我们采用重参数化技巧及Monto Carlo估计得到
E_{q(z|x^{i})}[f(z)]=E_{p(\epsilon)}[f(g_\phi(\epsilon, x^{(i)}))]\simeq\frac{1}{L}\sum^L_{l=1}f(g_\phi(\epsilon^{(l)},x^{(i)}))
其中 \epsilon^{(l)} \sim p(\epsilon)
因此,我们可以根据式(3)得到第一个版本的随机梯度变分贝叶斯估计\tilde{ \mathcal{L}}^A(\theta, \phi, x^{(i)}),即
\tilde{ \mathcal{L}}^A(\theta, \phi, x^{(i)})=\frac{1}{L}\sum^L_{l=1}\log p(x^{(i)},z^{(i,l)})-\log q(z^{(i,l)}| x^{(i)})
其中 z^{(i,l)}=g_\phi(\epsilon^{(i.l)},x^{(i)}),~~\epsilon^{(l)}\sim p(\epsilon)
但实际上,变分下界(4)中的第一项往往是可以直接求出来的,因此可以只对第二项进行Monto Carlo估计,从而得到第二个版本的SGVB估计.
\tilde{ \mathcal{L}}^B(\theta, \phi, x^{(i)})=-D_{KL}(q(z|x^{(i)})||p(z))+\frac{1}{L}\sum^L_{i=1}(\log p(x^{(i)}|z^{(i,l)}))

本部分确定了变分下界的计算方式,也就是说,\mathcal{L}可进行计算,而最大似然估计进行求解转化为对变分下界去求最大值即可,此时保证了我们生成的后验分布q(z|x)能够尽可能地接近真实分布p(z|x)

具体形式

首先,对于开头的假设,隐变量服从 p(Z) \sim \mathcal{N}(z; 0,I),并且在此假设生成的后验分布q(z|x)为多元高斯分布,即
\log q_\phi(z|x^{(i)})=\log \mathcal{N}(z;\mu^{(i)},\sigma^{2(i)}I)
此时,(4)中的第一项可以先计算出来,假设z的维度为J,下面推导主要用到了E(X^2)= \mu^2 + \sigma^2
\begin{eqnarray*} -D_{KL}[q(z|x)||p(z)] &=& -\int q(z|x)\log \frac{q(z|x)}{p(z)}\\ &=& -\int q(z|x)\log q(z|x)dz +\int q(z|x)\log {p(z)}dz\\ &=& \int \mathcal{N}(z;\mu,\sigma^{2})\log \mathcal{N}(z;0,I)dz - \int \mathcal{N}(z;\mu,\sigma^{2})\log \mathcal{N}(z;\mu,\sigma^2)dz \\ &=& -\frac{J}{2}\log (2\pi) -\frac{1}{2}\sum^J_{j=1}(\mu_j^2+\sigma_j^2)-(-\frac {J}{2}\log (2\pi) - \frac{1}{2} \sum^J_{j=1}(1+\log \sigma_j^2))\\ &=& \frac{1}{2}\sum^J_{j=1}(1 + log ((\sigma_j^2))- (\mu_j^2)- (\sigma_j^2)) \tag{5} \end{eqnarray*}
现在变分下界中只剩下第二项生成模型需要计算,在原文中,作者假设生成模型p(x|z)是高斯分布(连续)或者伯努利分布(离散),首先考虑离散形式的分布伯努利分布,此时
p(x|z) = \Pi^D_{k=1}(\rho_{(k)}(z))^{x(k)}(1- \rho_{(k)})^{1-x(k)}
从而可以计算出
-\ln p(x|z) = \sum^D_{k=1}[-x_{(k)}\ln \rho_{(k)}(z)- (1-x_{(k)})\ln (1- \rho_{(k)}(z))]
对于高斯分布有
p(x|z) = \frac{1}{\Pi^D_{i=1}\sqrt{2\pi \sigma_{(k)}^2(z)}} e^{(-\frac{1}{2}||\frac{x-\mu(z)}{\sigma(z)}||^2)}
其中\mu(z),\sigma(z)是前述后验概率产生的均值和方差,从而可以计算出
-\ln p(x|z) =\frac{1}{2} ||\frac{x-\mu(z)}{\sigma(z)}||^2 + \frac{D}{2}\ln 2\pi + \frac{1}{2}\sum^D_{k=1}ln \sigma^2_{(k)}(z)
通常在使用的时候,会固定方差为一个常数 \sigma^2,此时
-\ln q(x|z) \sim \frac{1}{2}||\frac{x-\mu(z)}{\sigma}||^2
到这里是不是很眼熟?这不是均方差(MSE)吗?

总结,对于二值数据,采用伯努利分布,decoder采用sigmoid函数进行激活,交叉熵为损失函数;对于连续数据,则采用高斯分布,用MSE作为损失函数,注意此时对应的是方差固定的情况!!!

  • AEVB算法


    AEVB算法

总结及反思

变分自编码器架构

回到最初理论推导中的几个疑问

  • 为什么采样出的Z能够对应还原出X
    由于前面后验概率编码过程中,假设的是相对于每一个x都有对应的高斯分布,因此,数据集中每一个样本都有专有的高斯分布
  • 换个角度看变分下界\mathcal{L}
    变分自编码器从结构上是对每个样本生成对应的高斯分布,然后采样进行恢复,首先一般的编码器目标函数是想要重构的X和原来的X差别尽量小,但是由于Z_k是重新采样过的,也就是说方差可以看成是噪声的强度,我们肯定希望噪声越小越好,但是这样就会退化成普通的自编码器,而变分自编码器中(5)式只有当\mu趋近于0,\sigma趋近于1的时候会最小,此时保证了噪声强度趋近于1,保证了生成能力,此时后验分布 p(Z|X)趋近于N(0,I)
  • 为什么Mini-batch Version中采样一次就足够了?
    事实上会运行多个epoch,每次的隐变量都是随机生成的,因此当epoch足够多的时候,可以保证采样的充分性。

参考自
苏剑林. (2018, Mar 18). 《变分自编码器(一):原来是这么一回事 》及二三
《Auto-Encoding Variational Bayes》
https://blog.csdn.net/NeutronT/article/details/78086340

相关文章

网友评论

    本文标题:变分自编码器(一)——基本原理简介

    本文链接:https://www.haomeiwen.com/subject/pqautctx.html