当前位置: 代码迷 >> 综合 >> VAE(2)——基本思想
  详细解决方案

VAE(2)——基本思想

热度:46   发布时间:2024-01-10 00:42:23.0

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

上一回我们花了很大的篇幅介绍了KL散度,这一回我们来看看VAE,尤其是深度模型下的VAE。

前面我们已经见过了许多优秀的深度学习模型,它们达到了非常好的精度和效果。众人曾十分认真地分析过为什么这些模型的效果这么好,结论是深度模型的非线性拟合能力确实很强。不管曾经多么复杂的问题,一个深度模型出马,立刻把问题解决的八九不离十。VAE也是利用了这个特点,我们用深度模型去拟合一些复杂的函数,从而解决实际问题。

让我们先记住这个trick,后面我们会用到它。接下来我们要上场的是生成模型。前面我们看过的很多模型从原理上来说都是判别式模型。我们有一个等待判别的事物X,这个事物有一个类别y,我们来建立一个模型f(x;w),使得p(y|X)的概率尽可能地大,换种方法说就是让f(x;w)尽可能地接近y。

如果我们想用生成式的模型去解决这个问题,就需要利用贝叶斯公式把这个问题转换过来:

p(z|X)=\frac{p(X|z)p(z)}{p(X)}

为了遵从大多数教科书上的变量用法,这里将y变成了z。当然,这个时候的z可能比上面提到的“类别”y要复杂一些。在很多的生成模型中,我们把z称作隐含变量,把X称作观测变量。一般来说,我们可以比较容易地观察到X,但是X背后的z却不那么容易见到,而很多时候X是由z构造出来的,比方说一天的天气好与坏是由很多不易观察的因素决定的。于是我们自然而然就有了一个需求,当我们拿到这些X之后,我们想知道背后的z是什么,于是乎就有了上面那个公式。

对于一些简单的问题,上面的公式还是比较容易解出的,比方说朴素贝叶斯模型,但是还是有很多模型是不易解出的,尤其当隐含变量处于一个高维度的连续空间中:

p(z|X)=\frac{p(X|z)p(z)}{\int_z{p(X|z)p(z)dz}}

这里的积分就没那么容易搞定了。于是乎,各路大神开始想尽一切办法让上面的式子变得好解些。

这时候我们难免会冒出一个问题,既然有了判别式模型可以直接求解式子左边的那个东西,为什么非要把它变成右边那一大堆东西,搞得自己不方便解呢?其实谁都不想给自己找麻烦,可问题是右边的这一堆除了能够解这个问题,它还有一个更加高级的功能,就是根据模型随机生成X。

我们可以想想看,如果我们只拥有式子左边的p(z|X),我们想要生成一个符合某种z的X该怎么办?

  • 第一步,随机一个X;
  • 第二步,用p(z|X)计算概率,如果概率满足,则结束,如果不满足,返回第一步;

于是乎,用判别式模型生成X变成了人品游戏,谁也不知道自己什么时候能在第二步通过。而生成式模型就不同了,我们可以按需定制,首先确定好z,然后根据p(X|z)进行随机采样就行了,生成X的过程安全可控。

说了这么多,下面我们正式进入公式推导的部分。

Variational Inference

虽然我们鼓吹了很多生成模型的好处,但是面对等号右边那一堆东西,该束手无策还是束手无策。但是,前辈们还是想到了一些精妙的解法。既然用概率论的方法很难求出右边的东西,我们能不能做一些变换,比方说——(略显生硬地)我们用一个variational的函数q(z)去代替p(z|X)?别着急,后面我们会看到它带来的好处的。

这里的variational inference介绍的有点简单,有机会我们再详细介绍下。

既然要用q(z)这个新东西去代替p(z|X),那么我们当然希望两个东西尽可能地相近,于是乎我们选择了KL散度这个指标用来衡量两者的相近程度。由于两边都是可以看作针对z的概率分布,因此用KL散度这个指标实际上非常合适。

所以就有了:

KL(q(z)||p(z|X))=\int{q(z)log \frac{q(z)}{p(z|X)}}dz
=\int{q(z)[log q(z) - log p(z|X)]}dz

我们做一下贝叶斯公式的变换,就得到了:

=\int{q(z)[log q(z) - log p(X|z) - log p(z) + logp(X)]}dz

再将和z无关的项目从积分符号中拿出来,就得到了:

=\int{q(z)[log q(z) - log p(X|z) - log p(z)]}dz + log p(X)

左右整理一下,就得到了:

log p(X) - KL(q(z)||p(z|X))=\int{q(z) log p(X|z)}dz-KL(q(z)||p(z))

好吧,其实整理了一圈,这个公式还是很乱,不过因为KL散度的特殊关系,我们还是从这个公式中看到了一丝曙光:

我们虽然不大容易求出p(X),但我们知道当X给定的情况下,p(X)是个固定值。那么如果我们希望KL(q(z)||p(z|X))尽可能地小,也就相当于让等号右边的那部分尽可能地大。其中等号右边的第一项实际上是基于q(z)的似然期望,第二项又是一个负的KL散度,所以我们可以认为,为了找到一个好的q(z),使得它和p(z|X)尽可能地相近,我们需要:

  • 右边第一项的log似然的期望最大化
  • 右边第二项的KL散度最小化

对于VAE之前的variation inference(中文可以翻译成变分推断),到这里我们就要开始一段全新的公式推导了。比方说我们做一个mean-field assumption(说实话我不太知道mean-field怎么翻译更直观,于是就把英文放在这里了),于是乎对于多个隐含变量组成的z,分量相互之间是独立的,于是根据这个特性,我们又可以进行进一步地公式化简。由于我们今天的主题是VAE,所以关于这部分我们就不再赘述了。这时候我们又想起了文章开头我们提到的一句话:

“VAE也是利用了这个特点,我们用深度模型去拟合一些复杂的函数”

那么是时候让这句话发挥作用了,不过关于它发挥的方法我们下回再说。

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