ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

VAE:变分自编码器

VAE:变分自编码器 过去虽然没有细看,但印象里一直觉得变分自编码器(Variational Auto-Encoder,VAE)是个好东西。于是趁着最近看概率图模型的三分钟热度,我决定也争取把VAE搞懂。于是乎照样翻了网上很多资料,无一例外发现都很含糊,主要的感觉是公式写了一大通,还是迷迷糊糊的,最后好不容易觉得看懂了,再去看看实现的代码,又感觉实现代码跟理论完全不是一回事啊。终于,东拼西凑再加上我这段时间对概率模型的一些积累,并反复对比原论文《Auto-Encoding Variational Bayes》,最后我觉得我应该是想明白了。其实真正的VAE,跟很多教程说的还真不大一样,很多教程写了一大通,都没有把模型的要点写出来~于是写了这篇东西,希望通过下面的文字,能把VAE初步讲清楚。分布变换通常我们会拿VAE跟GAN比较,的确,它们两个的目标基本是一致的——希望构建一个从隐变量ZZZ生成目标数据XXX的模型,但是实现上有所不同。更准确地讲,它们是假设了ZZZ服从某些常见的分布(比如正态分布或均匀分布),然后希望训练一个模型X=g(Z)X=g(Z)X=g(Z),这个模型能够将原来的概率分布映射到训练集的概率分布,也就是说,它们的目的都是进行分布之间的变换。生成模型的难题就是判断生成分布与真实分布的相似度,因为我们只知道两者的采样结果,不知道它们的分布表达式那现在假设ZZZ服从标准的正态分布,那么我就可以从中采样得到若干个Z1,Z2,…,ZnZ_1,Z_2,\ldots,Z_nZ1​,Z2​,…,Zn​,然后对它做变换得到X^1=g(Z1),X^2=g(Z2),…,X^n=g(Zn),\hat{X}_1=g(Z_1),\hat{X}_2=g(Z_2),\ldots,\hat{X}_n=g(Z_n),X^1​=g(Z1​),X^2​=g(Z2​),…,X^n​=g(Zn​),我们怎么判断这个通过ggg构造出来的数据集,它的分布跟我们目标的数据集分布是不是一样的呢?有读者说不是有KL散度吗?当然不行,因为KL散度是根据两个概率分布的表达式来算它们的相似度的,然而目前我们并不知道它们的概率分布的表达式,我们只有一批从构造的分布采样而来的数据{ X^1,X^2,…,X^n},\{\hat{X}_1,\hat{X}_2,\ldots,\hat{X}_n\},{X^1​,X^2​,…,X^n​},还有一批从真实的分布采样而来的数据{ X1,X2,…,Xn}\{X_1,X_2,\ldots,X_n\}{X1​,X2​,…,Xn​}(也就是我们希望生成的训练集)。我们只有样本本身,没有分布表达式,当然也就没有方法算KL散度。虽然遇到困难,但还是要想办法解决的。GAN的思路很直接粗犷:既然没有合适的度量,那我干脆把这个度量也用神经网络训练出来吧。就这样,WGAN就诞生了,详细过程请参考《互怼的艺术:从零直达WGAN-GP》。而VAE则使用了一个精致迂回的技巧。VAE漫谈这一部分我们先回顾一般教程是怎么介绍VAE的,然后再探究有什么问题,接着就自然地发现了VAE真正的面目。经典回顾首先我们有一批数据样本{ X1,…,Xn}\{X_1,\ldots,X_n\}{X1​,…,Xn​},其整体用XXX来描述,我们本想根据{ X1,…,Xn}\{X_1,\ldots,X_n\}{X1​,…,Xn​}得到XXX的分布p(X)p(X)p(X),如果能得到的话,那我直接根据p(X)p(X)p(X)来采样,就可以得到所有可能的XXX了(包括{ X1,…,Xn}\{X_1,\ldots,X_n\}{X1​,…,Xn​}以外的),这是一个终极理想的生成模型了。当然,这个理想很难实现,于是我们将分布改一改p(X)=∑Zp(X∣Z)p(Z)(1)p(X)=\sum_Z p(X\mid Z)p(Z)\tag{1}p(X)=Z∑​p(X∣Z)p(Z)(1)这里我们就不区分求和还是求积分了,意思对了就行。此时p(X∣Z)p(X\mid Z)p(X∣Z)就描述了一个由ZZZ来生成XXX的模型,而我们假设ZZZ服从标准正态分布,也就是p(Z)=N(0,I)。p(Z)=\mathcal{N}(0,I)。p(Z)=N(0,I)。如果这个理想能实现,那么我们就可以先从标准正态分布中采样一个ZZZ,然后根据ZZZ来算一个XXX,也是一个很棒的生成模型。接下来就是结合自编码器来实现重构,保证有效信息没有丢失,再加上一系列的推导,最后把模型实现。框架的示意图如下:vae的传统理解看出了什么问题了吗?如果像这个图的话,我们其实完全不清楚:究竟经过重新采样出来的ZkZ_kZk​,是不是还对应着原来的XkX_kXk​,所以我们如果直接最小化D(X^k,Xk)2\mathcal{D}(\hat X_k,X_k)^2D(X^k​,Xk​)2(这里D\mathcal{D}D代表某种距离函数)是很不科学的,而事实上你看代码也会发现根本不是这样实现的。也就是说,很多教程说了一大通头头是道的话,然后写代码时却不是按照所写的文字来写,可是他们也不觉得这样会有矛盾~VAE初现其实,在整个VAE模型中,我们并没有去使用p(Z)p(Z)p(Z)(隐变量空间的分布)是正态分布的假设,我们用的是假设p(Z∣X)p(Z\mid X)p(Z∣X)(后验分布)是正态分布!!具体来说,给定一个真实样本XkX_kXk​,我们假设存在一个专属于XkX_kXk​的分布p(Z∣Xk)p(Z\mid X_k)p(Z∣Xk​)(学名叫后验分布),并进一步假设这个分布是(独立的、多元的)正态分布。为什么要强调“专属”呢?因为我们后面要训练一个生成器X=g(Z)X=g(Z)X=g(Z),希望能够把从分布p(Z∣Xk)p(Z\mid X_k)p(Z∣Xk​)采样出来的一个ZkZ_kZk​还原为XkX_kXk​。如果假设p(Z)p(Z)p(
返回列表