VAE变分推导依赖数学公式

(1)贝叶斯公式:\(p(z|x) = \frac{p(x|z)p(z)}{p(x)}\)

(2)边缘概率公式:\(p(x) =\int{p(x,z)}dz\)

(3)KL 散度公式:\(D_{KL}(p||q)=\int{p(x)log\frac{p(x)}{q(x)}}dx\)

推导方式一

注:一般随机变量是用大写字母表示,随机变量的取值用小写字母表示,随机变量的概率密度函数是用小写字母,而随机变量的分布函数是用大写字母,此处忽略字母的大小区别统一用小写字母表示。

贝叶斯变分自编码器,参考【1】中描述,公式推导是用一个分布q(z|x)去近似p(z|x),即从\(D_{KL}(q(z|x)||p(z|x))\)出发推导

\(D_{KL}(q(z|x)||p(z|x))\) = \(\int{q(z|x)·log \frac{q(z|x)}{p(z|x)}}dz\) = \(\int{q(z|x)· log \frac{q(z|x)}{\frac{p(z,x)}{p(x)}}}dz\) = \(\int{q(z|x)·log \frac{q(z|x)}
{\frac{p(x|z)·p(z)}{p(x)}}}dz\) = \(\int {q(z|x)·log\frac{q(z|x)·p(x)}{p(x|z)·p(z)}}dz\)

=\(\int{q(z|x)·logq(z|x)}dz + \int{q(z|x)·logp(x)}dz - \int{q(z|x)·logp(x|z)}dz - \int{q(z|x)·logp(z)}dz\)

=\(logp(x) + \int{q(z|x)·logq(z|x)}dz - \int{q(z|x)·logp(z)}dz - \int{q(z|x)·logp(x|z)}dz\)

=\(logp(x) + \int{q(z|x) · log \frac{ q(z|x)}{p(z)}}dz - \int{q(z|x)·logp(x|z)}dz\)

=\(logp(x) + KL(q(z|x)||p(z)) - E_{z \sim q(z|x)} [logp(x|z)]\)

==>

\(logp(x) = D_{KL}(q(z|x)||p(z|x)) - KL(q(z|x)||p(z)) + E_{z \sim q(z|x)} [logp(x|z)]\)

令\(L(q)=- KL(q(z|x)||p(z)) + E_{z \sim q(z|x)} [logp(x|z)]\),对应给定的x, log(x)是一个常量,最小化$D_{KL}(q(z|x)||p(z|x)) $, 也就最大化L(q)。又由于KL散度 \(D_{KL}(q(z|x)||p(z|x))\) 是非负的,因此 \(logp(x) \geq L(q)\) ,把L(q)称之为变分下界 Evidence Lower Bound。

推导方式二

$logp(x) = logp(x) · \int q(z|x)dz = \int q(z|x)· logp(x) dz $

\(logp(x) = log \frac{p(x,z)}{p(z|x)} = log p(x,z) - log p(z|x) = log \frac{p(x,z)}{q(z|x)} - log \frac{p(z|x)}{q(z|x)}\)

同时对上述公式两侧乘以q(z|x)并取积分得:

\(log p(x) = \int q(z|x)·log \frac{p(x,z)}{q(z|x)} dz - \int q(z|x)·log \frac{p(z|x)}{q(z|x)}dz\)

= \(D_{KL}(q(z|x)||p(z|x)) + \int q(z|x) ·log \frac{p(x|z)p(z)}{q(z|x)}dz\)

=\(D_{KL}(q(z|x)||p(z|x)) + \int q(z|x)·log p(x|z)dz + \int q(z|x)·log \frac{p(z)}{q(z|x)} dz\)

=\(D_{KL}(q(z|x)||p(z|x)) + E_{z \sim q(z|x)} [logp(x|z)] - D_{KL}(q(z|x)||p(z))\)

这里就得到和上述推导一样的公式。令\(L(q)=- KL(q(z|x)||p(z)) + E_{z \sim q(z|x)} [logp(x|z)]\)

由于后验概率\(p(z|x)\)无法求解,于是希望找到一个\(q(z|x)\)近似\(p(z|x)\)

由于任意KL散度$ D_{KL}(q(z|x)||p(z|x)) $ 都是非负的,所以\(logp(x) \geq L(q)\),L(q)是关于分布函数q的泛函。从似然函数观点出发,最大化L(q)可以导出最大化logp(x)。

理解公式含义

上面介绍了公式推导,按照【1】中描述。

(1)Encoder-Decoder模型中中间的隐变量是具体的某个值,而VAE不是研究隐变量具体某个值,而是学习隐变量的某个分布,使得在这个分布上取样时,Decoder仍可以得到相似的输出。

(2)贝叶斯公式:\(p(z|x) = \frac{p(x|z)p(z)}{p(x)}\),其中p(z)可以假定服从某个分布如高斯分布,p(x|z) decoder可以是用神经网络来表示,但是要求后验概率还需要求解p(x),由于\(p(x)=\int p(x|z)p(z)dz\),z一般是维度很高的变量,求上述积分是很困难的,所以求后验概率是很困难。

(3)求上述积分大致有两种解法:蒙特卡罗和变分推断

变分推断:

既然p(z|x)求解很困难,那么尝试用一个方便求解的分布q(z|x)去近似p(z|x),于是就想到最小化二者的KL散度即\(min{KL(q(z|x)||p(z|x))}\),这也是上述推导,从\(D_{KL}(q(z|x)||p(z|x))\)开始的原因。通过公式推导变换,最小化\(D_{KL}(q(z|x)||p(z|x))\)等价于最大化L。

现在来看最大化L对应的含义:随机变量z, 其分布是q(z|x),\(E_{z \sim q(z|x)} [logp(x|z)]\)最大化表明,在这个分布上不断对随机变量z进行取样,使得重建出x的几率最大;对于 $- KL(q(z|x)||p(z)) $ 最大化即最小化 $ KL(q(z|x)||p(z)) $,使得求解的后验概率q(z|x)和先验分布p(z)尽量接近。

变分下界求导求解

依赖数学公式:

(1)期望定义:设离散随机变量X的分布列为\(p(x_i)=P(X=x_i),i=1,2,...,n,...\), 如果级数\(\sum_{i=1}^{+\infty}|x_i|p(x_i)\)收敛,则称

      \(E(X)=\sum_{i=1}^{+\infty}x_ip(x_i)\)

期望定义: 设连续随机变量X的密度函数为p(x),如果无穷积分\(\int_{-\infty}^{+\infty} |x|p(x)dx\) 存在,则称

      \(E(X)=\int_{-\infty}^{+\infty}xp(x)dx\)

(2)方差定义: 如随机变量\(X^2\)的数学期望\(E[X^2]\)存在,则称偏差平方\((X-E[X])^2\)的数学期望 \(E[(X-E[X])^2]\)为随机变量X的方差,记为

\(Var(X)=E[(X-E[X])^2]\)=\(\begin{cases}\sum_i{[x_i-E(x)]^2p(x_i)}, & \text{在离散场合} \\ \int_{-\infty}^{+\infty}[x-E(X)]^2p(x)dx, & \text{在连续场合} \end{cases}\)

(3)方差性质: \(Var(X)=E(X^2)-[E(X)]^2\)

(4)正态分布: 若随机变量X的密度函数为

       \(p(x)=\frac{1}{\sqrt{2\pi\sigma^2}}e^{-\frac{1}{2\sigma^2}(x-u)^2}, -\infty < x < + \infty\)

则称X服从正态分布,称X为正态变量,记作\(X \sim N(\mu, \sigma^2)\)

其期望:\(E[X] =\mu\),方差:$Var(X) = \sigma^2 $

现在就开始L(q)的求导

\(L(q)=- KL(q(z|x)||p(z)) + E_{z \sim q(z|x)} [logp(x|z)]\)

变分下界公式第一项记为\(L_{1st}(q)=-KL(q(z|x)||p(z))\),前期为了推导过程简洁,省去了概率密度函数涉及的参数\(\phi,\theta\),接下来推导中添加上这些。即

$L_{1st}(q)=-KL(q_\phi(z|x)||p_\theta(z))=-\int q_\phi(z|x)·log \frac{q_\phi(z|x)}{q_\theta(z)}dz = - \int q_\phi(z|x)·log q_\phi(z|x)dz + \int q_\phi(z|x)·log p_\theta(z)dz $

:上文为了简化推导过程,尤其方便手写推导过程,上述公式中的变量z是高维的,应该用黑体 \(\mathbf{z}\) 表示。后续推导过程仍延续小写字母,但是最终结论中要将变量z看做是高维的,或最后展示时采取黑体加粗表示。

为了后续求导解决方便做出如下几点假设:

(1)其变量\(\mathbf{z}\)各个分量/维度相互独立,此处仅将z是一维进行推导,高维的最终由于独立性可以拆分

(2)\(p_\theta(z)\)是一个正态分布的概率密度函数,即 \(p_\theta(z) = N(z; 0, 1)\)

(3)\(q_\phi(z|x)\)也是一个正态分布的概率密度函数,即 \(q_\phi(z|x) = N(z; u(x, \phi), \sigma^2(x, \phi))\)

由期望的定义得

$ \int q_\phi(z|x)·log p_\theta(z)dz $

$ = E_{z \sim q_\phi(z|x)}[logp_\theta(z)] $

$ = E_{z \sim q_\phi(z|x)}[log N(z; 0, 1)] $

$ = E_{z \sim q_\phi(z|x)}[log \frac{1}{\sqrt(2\pi)}e^{-\frac{1}{2} z^2 }] $

$ = E_{z \sim q_\phi(z|x)}[log \frac{1}{\sqrt(2\pi)} -\frac{1}{2}z^2] $

$ = log \frac{1}{\sqrt(2\pi)} -\frac{1}{2} E_{z \sim q_\phi(z|x)}[z^2] $

$ = -\frac{1}{2}log2\pi - \frac{1}{2} (\mu ^2 + \sigma ^2)$

注:最后一步推导可以由方差性质得到

同样地:

$ \int q_\phi(z|x)·log q_\phi(z|x)dz $

$ = E_{z \sim q_\phi(z|x)}[log N(z; u, \sigma^2)] $

$ = E_{z \sim q_\phi(z|x)} [log \frac{1}{\sqrt(2\pi \sigma^2 )}e^{-\frac{1}{2 \sigma^2} (z-\mu)^2 }] $

$ = E_{z \sim q_\phi(z|x)} [log \frac{1}{\sqrt(2\pi \sigma^2 )} -\frac{1}{2 \sigma^2} (z-\mu)^2 ]$

$ = log \frac{1}{\sqrt(2\pi \sigma^2 )} - \frac{1}{2 \sigma^2} E_{z \sim q_\phi(z|x)} [(z-\mu)^2]$

$ = -\frac{1}{2}log2\pi - log \sigma - \frac{1}{2 \sigma^2} Var(z) $

$ = -\frac{1}{2}log2\pi - log \sigma - \frac{1}{2 \sigma^2} \sigma^2 $

$ = -\frac{1}{2}log2\pi - log \sigma - \frac{1}{2} $

下面将变量z使用黑体\(\mathbf z\)表示来推导多维变量情况下公式,假设\(\mathbf z\)的维度是J,由于各个维度独立无关

$ \int q_\phi(\mathbf z|x)·log p_\theta(\mathbf z)d\mathbf z $

$= E_{\mathbf z \sim q_\phi(\mathbf z|x)}[logp_\theta(\mathbf z)] $

$= E_{\mathbf z \sim N(\mathbf z; \mathbf u, \Sigma)}[logN(\mathbf z; \mathbf 0, \mathbf I)] $

$= E_{z_1 \sim N(z_1;u_1,\sigma_1^2), z_2 \sim N(z_2;u_2,\sigma_2^2), ..., z_J \sim N(z_J;u_J,\sigma_J^2)}[logN(\mathbf z; \mathbf 0, \mathbf I)] $

简写为:

$= E_{z_1 \sim N(z_1), z_2 \sim N(z_2), ..., z_J \sim N(z_J)}[logN(\mathbf z; \mathbf 0, \mathbf I)] $

$= E_{z_1 \sim N(z_1)} · E_{z_2 \sim N(z_2)}, ..., · E_{z_J \sim N(z_J)}[logN(\mathbf z; \mathbf 0, \mathbf I)] $

$= E_{z_1 \sim N(z_1)} · E_{z_2 \sim N(z_2)}, ..., · E_{z_J \sim N(z_J)}[logN(z_J; 0, 1) + logN(z_{J-1}; 0, 1) + ... + logN(z_1; 0, 1)] $

$= E_{z_1 \sim N(z_1)} · E_{z_2 \sim N(z_2)}, ..., · E_{z_{J-1} \sim N(z_{J-1})} [E_{z_J \sim N(z_J)}[logN(z_J; 0, 1)] + logN(z_{J-1}; 0, 1) + ... + logN(z_1; 0, 1) ] $

\(E_{z_J \sim N(z_J)}[logN(z_J; 0, 1)]\) 对于其它变量求期望相当于是一个常量,可以移出到外面,于是有

$= E_{z_J \sim N(z_J)}[logN(z_J; 0, 1)] + E_{z_1 \sim N(z_1)} · E_{z_2 \sim N(z_2)}, ..., · E_{z_{J-1} \sim N(z_{J-1})} [ logN(z_{J-1}; 0, 1) + ... + logN(z_1; 0, 1) ] $

依次类推求得

\(= E_{z_J \sim N(z_J)}[logN(z_J; 0, 1)] + E_{z_{J-1} \sim N(z_{J-1})}[logN(z_{J-1}; 0, 1)] + ... + E_{z_1 \sim N(z_1)}[logN(z_1; 0, 1)]\)

$ = -\frac{J}{2}log2\pi - \frac{1}{2}\sum_{j=1}^J {(\mu_j ^2 + \sigma_j ^2)}$

即$ \int q_\phi(\mathbf z|x)·log p_\theta(\mathbf z)d\mathbf z $

$ = -\frac{J}{2}log2\pi - \frac{1}{2}\sum_{j=1}^J {(\mu_j ^2 + \sigma_j ^2)}$

同理可以得出

$ \int q_\phi(z|x)·log q_\phi(z|x)dz $

$ = -\frac{J}{2}log2\pi - \frac{1}{2}\sum_{j=1}^J {(1 + log\sigma_j ^2)}$

$L_{1st}(q)= \frac{1}{2}\sum_{j=1}^J {(1 + log\sigma_j ^2 - u_j^2 - \sigma_j^2)} $

【1】https://zhuanlan.zhihu.com/p/83865427

【2】https://www.cnblogs.com/hugh2006/p/9693891.html

【3】【机器学习】【白板推导系列】bilibili视频

【4】https://zhuanlan.zhihu.com/p/25429486

【5】https://blog.csdn.net/tsinghuahui/article/details/80530750

【6】Auto-Encoding Variational Variational Bayes | AISC Foundational

【7】An Introduction to Variational Autoencoders

VAE变分自编码器公式推导的更多相关文章

  1. VAE变分自编码器实现

    变分自编码器(VAE)组合了神经网络和贝叶斯推理这两种最好的方法,是最酷的神经网络,已经成为无监督学习的流行方法之一. 变分自编码器是一个扭曲的自编码器.同自编码器的传统编码器和解码器网络一起,具有附 ...

  2. VAE变分自编码器

    我在学习VAE的时候遇到了很多问题,很多博客写的不太好理解,因此将很多内容重新进行了整合. 我自己的学习路线是先学EM算法再看的变分推断,最后学VAE,自我感觉这个线路比较好理解. 一.首先我们来宏观 ...

  3. Variational Auto-encoder(VAE)变分自编码器-Pytorch

    import os import torch import torch.nn as nn import torch.nn.functional as F import torchvision from ...

  4. (转) 变分自编码器(Variational Autoencoder, VAE)通俗教程

    变分自编码器(Variational Autoencoder, VAE)通俗教程 转载自: http://www.dengfanxin.cn/?p=334&sukey=72885186ae5c ...

  5. 变分自编码器(Variational Autoencoder, VAE)通俗教程

    原文地址:http://www.dengfanxin.cn/?p=334 1. 神秘变量与数据集 现在有一个数据集DX(dataset, 也可以叫datapoints),每个数据也称为数据点.我们假定 ...

  6. 4.keras实现-->生成式深度学习之用变分自编码器VAE生成图像(mnist数据集和名人头像数据集)

    变分自编码器(VAE,variatinal autoencoder)   VS    生成式对抗网络(GAN,generative adversarial network) 两者不仅适用于图像,还可以 ...

  7. 变分自编码器(Variational auto-encoder,VAE)

    参考: https://www.cnblogs.com/huangshiyu13/p/6209016.html https://zhuanlan.zhihu.com/p/25401928 https: ...

  8. 基于变分自编码器(VAE)利用重建概率的异常检测

    本文为博主翻译自:Jinwon的Variational Autoencoder based Anomaly Detection using Reconstruction Probability,如侵立 ...

  9. 变分推断到变分自编码器(VAE)

    EM算法 EM算法是含隐变量图模型的常用参数估计方法,通过迭代的方法来最大化边际似然. 带隐变量的贝叶斯网络 给定N 个训练样本D={x(n)},其对数似然函数为: 通过最大化整个训练集的对数边际似然 ...

  10. 基于图嵌入的高斯混合变分自编码器的深度聚类(Deep Clustering by Gaussian Mixture Variational Autoencoders with Graph Embedding, DGG)

    基于图嵌入的高斯混合变分自编码器的深度聚类 Deep Clustering by Gaussian Mixture Variational Autoencoders with Graph Embedd ...

随机推荐

  1. OpenStack 卷虚拟机跨租户迁移方案

    目标:迁移租户A的卷虚机到租户B 场景:使用卷虚拟机,租户a和b使用相同网络 租户A的操作: 1.记录虚拟机的ip地址,Mac信息, nova interface-list neutron port- ...

  2. JDK下载很慢

    方法1.直接百度jdk镜像,搜到华为镜像:https://repo.huaweicloud.com/java/jdk/ 方法2.到官网拷贝下载的url:https://download.oracle. ...

  3. 注意注意!!!!关于keil的问题,调试时候的bug

    1.keil变量不区分大小写: 2.KEIL调试debug时误报,未定义某变量 但是实际定义了的. 今天用keil写代码 感觉逻辑上没问题 但是始终不是那个效果 检查了半天错误问题.最后debug居然 ...

  4. bpmn的依赖注入

    主要对象 new BPMN对象时,流程及对象结构如下图 依赖注入 在初始化bpmn对象时有传入additionalModules进行自定义操作,具体是如何实现这种模块化的管理,主要是用到了依赖注入ht ...

  5. [前端js] 爬取亿图脑图大纲

    这段程序使看到了好的东西,又没有零钱的产物 还是老师让画思维导图我不想画还想白嫖的想法 用时20分钟 就拿这个来作为例子 https://mm.edrawsoft.cn/template/286842 ...

  6. http如何全站301重定向到https

    对于301重定向这一概念玩SEO的同志们都不陌生了,近些年来https协议越来越火,谷歌已经明确了使用https相对http来说会有更好的排名,再加上百度大大已经明确了对https的扶持政策,老威现在 ...

  7. LocalDateTime 使用记录

    1.LocalDateTime 获取指定日期的月初和月末 LocalDateTime firstDayTime = LocalDate.now().withMonth(12).withDayOfMon ...

  8. go - 泛型

    为什么要用泛型 在 go 1.18 前的版本中,如果对传入参数的值不确定时,就要使用空接口的方法传参,然后通过对参数进行断言的方式,取出原结构体. 对泛型切片进行遍历 func printSlice[ ...

  9. mysql去重保留1条记录

    delete from `wuye` where wuye_id in ( select * from ( select wuye_id from `wuye` where wuye_name in ...

  10. Unity Prefab(预制体)一次性循环10个会得到同样的

    IEnumerator Test1() { for(int i = 0;i < 5;i++) { GameObject gb = (GameObject)Resources.Load(" ...