VAE(1)——从KL说起

VAE(1)——从KL说起

本文收录在 无痛的机器学习第一季

前面我们介绍了GAN——Generative Adversarial Network,这个网络组是站在对抗博弈的角度去展现生成模型和判别模型各自的威力的,下面我们来看看这种生成模型和判别模型组合的另一个套路——Variational autoencoder,简称VAE。

突然想起来,他也叫VAE,我觉得他还是有点音乐才华的。不过我们今天不去讨论他。

Variational autoencoder的概念相对复杂一些,它涉及到一些比较复杂的公式推导。在开始正式的推导之前,我们先来看看一个基础概念——KL divergence,翻译过来叫做KL散度。

什么是KL散度

无论从概率论的角度,还是从信息论的角度,我们都可以很好地给出KL散度测量的意义。这里不是基础的概念介绍,所以有关KL的概念就不介绍了。在Variational Inference中,我们希望能够找到一个相对简单好算的概率分布q,使它尽可能地近似我们待分析的后验概率p(z|x),其中z是隐变量,x是显变量。在这里我们的“loss函数”就是KL散度,他可以很好地测量两个概率分布之间的距离。如果两个分布越接近,那么KL散度越小,如果越远,KL散度就会越大。

KL散度的公式为:

KL(p||q)=\sum{p(x)log\frac{p(x)}{q(x)}},这个是离散概率分布的公式,

KL(p||q)=\int{p(x)log{\frac{p(x)}{q(x)}}dx},这个是连续概率分布的公式。

关于其他KL散度的性质,这里就不赘述了。

KL散度的实战——1维高斯分布

我们先来一个相对简单的例子。假设我们有两个随机变量x1,x2,各自服从一个高斯分布N_1(\mu_1,\sigma_1^2),N_2(\mu_2,\sigma_2^2),那么这两个分布的KL散度该怎么计算呢?

我们知道

N(\mu,\sigma)=\frac{1}{\sqrt{2\pi\sigma^2}}e^{\frac{(x-\mu)^2}{2\sigma^2}}

那么KL(p1,p2)就等于

\int{p_1(x)log\frac{p_1(x)}{p_2(x)}}dx
=\int{p_1(x)(log{p_1(x)}}dx-log{p_2(x)})dx =\int{p_1(x)}*(log{\frac{1}{\sqrt{2\pi\sigma_1^2}}e^{\frac{(x-\mu_1)^2}{2\sigma_1^2}}}-log{\frac{1}{\sqrt{2\pi\sigma_2^2}}e^{\frac{(x-\mu_2)^2}{2\sigma_2^2}}})dx
=\int{p_1(x)*(-\frac{1}{2}log2\pi-log{\sigma_1}-\frac{(x-\mu_1)^2}{2\sigma_1^2}}+\frac{1}{2}log{2\pi}+log{\sigma_2}+\frac{(x-\mu_2)^2}{2\sigma_2^2})dx
=\int{p_1(x)(log\frac{\sigma_2}{\sigma_1}+[\frac{(x-\mu_2)^2}{2\sigma_2^2}-\frac{(x-\mu_1)^2}{2\sigma_1^2}])dx}
=\int(log\frac{\sigma_2}{\sigma_1})p_1(x)dx+\int(\frac{(x-\mu_2)^2}{2\sigma_2^2})p_1(x)dx-\int(\frac{(x-\mu_1)^2}{2\sigma_1^2})p_1(x)dx
=log\frac{\sigma_2}{\sigma_1}+\frac{1}{2\sigma_2^2}\int((x-\mu_2)^2)p_1(x)dx-\frac{1}{2\sigma_1^2}\int((x-\mu_1)^2)p_1(x)dx

(更新)到这里停一下,有童鞋问这里右边最后一项的化简,这时候积分符号里面的东西是不看着很熟悉?没错,就是我们常见的方差嘛,于是括号内外一约分,就得到了最终的结果——\frac{1}{2}

好,继续。
=log\frac{\sigma_2}{\sigma_1}+\frac{1}{2\sigma_2^2}\int((x-\mu_2)^2)p_1(x)dx-\frac{1}{2}
=log\frac{\sigma_2}{\sigma_1}+\frac{1}{2\sigma_2^2}\int((x-\mu_1+\mu_1-\mu_2)^2)p_1(x)dx-\frac{1}{2}
=log\frac{\sigma_2}{\sigma_1}+\frac{1}{2\sigma_2^2}[\int{(x-\mu_1)^2}p_1(x)dx+\int{(\mu_1-\mu_2)^2}p_1(x)dx+2\int{(x-\mu_1)(\mu_1-\mu_2)]}p_1(x)dx-\frac{1}{2}
=log\frac{\sigma_2}{\sigma_1}+\frac{1}{2\sigma_2^2}[\int{(x-\mu_1)^2}p_1(x)dx+(\mu_1-\mu_2)^2]-\frac{1}{2}

=log\frac{\sigma_2}{\sigma_1}+\frac{\sigma_1^2+(\mu_1-\mu_2)^2}{2\sigma_2^2}-\frac{1}{2}

说实话一直以来我不是很喜欢写这种大段推导公式的文章,一来原创性比较差(都是前人推过的,我就是大自然的搬运工),二来其中的逻辑性太强,容易让人看蒙。不过最终的结论还是得出来了,我们假设N2是一个正态分布,也就是说\mu_2=0,\sigma_2^2=1那么N1长成什么样子能够让KL散度尽可能地小呢?

也就是说KL(\mu_1,\sigma_1)=-log\sigma_1+\frac{\sigma_1^2+\mu_1^2}{2}-\frac{1}{2}

我们用“肉眼”看一下就能猜测到当\mu_1=0,\sigma_1=1时,KL散度最小。从公式中可以看出,如果\mu_1偏离了0,那么KL散度一定会变大。而方差的变化则有些不同:

\sigma_1大于1时,\frac{1}{2}\sigma_1^2将越变越大,而-log\sigma_1越变越小;

\sigma_1小于1时,\frac{1}{2}\sigma_1^2将越变越小,而-log\sigma_1越变越大;

那么哪边的力量更强大呢?我们可以作图出来:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0.5,2,100)
y = -np.log(x)+x*x/2-0.5
plt.plot(x,y)
plt.show()

从图中可以看出

二次项的威力更大,函数一直保持为非负,这和我们前面提到的关于非负的定义是完全一致的。

好了,看完了这个简单的例子,下面让我们再看一个复杂的例子。

一个更为复杂的例子:多维高斯分布的KL散度

上一回我们看过了1维高斯分布间的KL散度计算,下面我们来看看多维高斯分布的KL散度是什么样子?说实话,这一次的公式将在后面介绍VAE时发挥很重要的作用!

首先给出多维高斯分布的公式:

p(x_1,x_2,...x_n)=\frac{1}{\sqrt{2\pi*det(\Sigma)}}e^{(-\frac{1}{2}(x-\mu)^T\Sigma^{-1}(x-\mu))}

由于这次是多维变量,里面的大多数计算都变成了向量、矩阵之间的计算。我们常用的是各维间相互独立的分布,因此协方差矩阵实际上是个对角阵。

考虑到篇幅以及实际情况,下面直接给出结果,让我们忽略哪些恶心的推导过程:

KL(p1||p2)=\frac{1}{2}[log \frac{det(\Sigma_2)}{det(\Sigma_1)} - d + tr(\Sigma_2^{-1}\Sigma_1)+(\mu_2-\mu_1)^T \Sigma_2^{-1}(\mu_2-\mu_1)]

其实这一次我们并没有介绍关于KL的意义和作用,只是生硬地、莫名其妙地推导一堆公式,不过别着急,下一回,我们展示VAE效果的时候,就会让大家看到KL散度的作用。

坚持看到这里的童鞋是有福的,来展示一下VAE的解码器在MNIST数据库上产生的字符生成效果:

从这个效果上来看,它的功能和GAN是有点像的,那么让我们来进一步揭开它的庐山真面目吧!

转载自https://zhuanlan.zhihu.com/p/22464760

### 回答1: KL散度是一种用来衡量两个概率分布之间差异的方法,也称为相对熵或信息散度。对于多元正态分布,其KL散度可以通过计算两个多元正态分布的协方差矩阵和均值向量的差异来得到。 具体来说,假设有两个多元正态分布$p$和$q$,其均值向量分别为$\boldsymbol{\mu}_p$和$\boldsymbol{\mu}_q$,协方差矩阵分别为$\boldsymbol{\Sigma}_p$和$\boldsymbol{\Sigma}_q$。则其KL散度可以表示为: $$ D_{\mathrm{KL}}(p\|q)=\frac{1}{2}\left[\ln\frac{\det(\boldsymbol{\Sigma}_q)}{\det(\boldsymbol{\Sigma}_p)}-\mathrm{tr}(\boldsymbol{\Sigma}_q^{-1}\boldsymbol{\Sigma}_p)+(\boldsymbol{\mu}_q-\boldsymbol{\mu}_p)^\top\boldsymbol{\Sigma}_q^{-1}(\boldsymbol{\mu}_q-\boldsymbol{\mu}_p)-k\right] $$ 其中,$k$是多元正态分布的维数(即随机变量的个数),$\det(\cdot)$表示矩阵的行列式,$\mathrm{tr}(\cdot)$表示矩阵的迹运算。可以看出,KL散度是对概率分布差异的量化,其值越小表示两个分布越相似,值越大则表示两个分布差异越大。 在实际应用中,KL散度常常被用于衡量模型分布与真实分布之间的距离,或者不同模型之间的差异,以便进行模型选择或优化。 ### 回答2: 多元正态分布的KL散度是用来评估两个多元正态分布之间距离的一种度量方法。KL散度,也称随机变量间KL散度或信息散度,是信息论中广泛使用的一种度量方法。 在多元正态分布中,KL散度是由两个分布的期望值和协方差矩阵计算出来的。它的计算公式为: D_KL(P||Q) = 1/2 [ tr(S^(-1) U) + ln(det(S)) - k + (V - mu)^T S^(-1) (V - mu)] 其中,P和Q表示两个多元正态分布,S和U分别是它们的协方差矩阵和期望值向量,k是向量的维度,V是一个多元正态分布中的样本向量。 KL散度的值越小表示两个分布之间越接近,值越大则表示它们之间的距离越远。当KL散度为0时,两个分布是完全相同的。在机器学习和数据分析领域中,KL散度广泛用于评估和比较多元分布模型之间的差别,或者是将多个分布合并为一个更准确的模型。 ### 回答3: KL散度是用于衡量两个概率分布之间差异性的指标,多元正态分布的KL散度也是如此。在多元正态分布中,KL散度是用于比较两个多维正态分布之间的差异。 多元正态分布是高维数据分析中常用的模型之一,它可以描述多变量之间的关系,具有较为广泛的应用。在计算KL散度时,需要首先计算两个多元正态分布的期望向量和协方差矩阵,然后利用这些参数计算KL散度值。KL散度值可以反映两个多元正态分布之间的差异程度。 KL散度值越大,表明两个多元正态分布之间的差异越大。在高维数据分析中,KL散度可以用于刻画不同类别或不同时间点的多元正态分布之间的差异,进而用于分类、聚类、降维等数据分析任务中。 总之,多元正态分布的KL散度是用于比较两个多维正态分布之间差异的指标。在高维数据分析中具有较为广泛的应用。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值