常见的五种神经网络(5)-生成对抗网络(上)之变分自动编码器

概率生成模型简称生成模型(Generative Model),是概率统计和机器学习中的一类重要模型,指一系列用于随机生成可观测数据的模型。生成模型的思路是根据可观测的样本学习一个参数化的模型pθ(x)p_{\theta}(x)来近似未知分布pr(x)p_r(x),使得生成的样本和真实的样本尽可能的相似。

深度生成模型就是利用深层神经网络可以近似任意函数的能力来建模一个复杂的分布pr(x)p_r(x)。常见的两种深度生成模型包括变分自动编码器(Variational Autoencoder, VAE)生成对抗网络(Generative Adversarial Networks, GAN)(因为他们的目标基本是一致的)。本篇内容主要介绍生成模型的基本功能和变分自动编码器。

生成模型的基本功能

生成模型的两个基本功能为:

  • 密度估计
  • 生成样本

密度估计

给定一组数据D={xi},1iND=\{x^i\}, 1 \leq i \leq N,假设他们都是独立地从相同的概率密度函数为pr(x)p_r(x)的未知分布中产生的,密度估计是根据数据集DD来估计其概率密度函数pθ(x)p_{\theta}(x)

生成模型也可以应用于监督学习,监督学习的目标是建模输出标签的条件概率密度函数p(yx)p(y|x)。根据贝叶斯公式:
p(yx)=p(xy)yp(x,y) p(y|x) = \frac{p(x|y)}{ \sum_{y}p(x,y)}
可以将监督学习问题转化为联合概率密度函数p(x,y)的密度估计问题。在监督学习中比较典型的生成模型有朴素贝叶斯分类器隐马尔可夫模型

和生成模型相对应的另一类监督学习模型是判别模型(Discriminative Model),判别式模型直接建模条件概率密度函数p(yx)p(y|x),并不建模其联合概率密度函数p(x,y)p(x,y),常见的判别模型有logistic 回归、支持向量机、神经网络等。由生成模型可以得到判别模型,但由判别模型得不到生成模型。

生成样本

生成样本就是给定一个概率密度函数为pθ(x)p_{\theta}(x)的分布,生成一些服从这个样本的分布,也称为采样。

对于带隐变量的生成模型,在得到p(z,θ)p(z,\theta)p(xz,θ)p(x|z,\theta)之后,就可以生成数据xx,具体可以分为两步执行:

  • 根据隐变量的先验分布p(z,θ)p(z,\theta)进行采样,得到样本zz
  • 根据条件分布p(xz,θ)p(x|z,\theta)进行采样,得到样本xx

变分自动编码器

以下内容来自于:https://spaces.ac.cn/archives/5253

从分布变换看VAE

VAE和GAN的目标都是:希望构建一个从隐变量ZZ生成目标数据XX的模型,但是实现上有所不同。它们假设ZZ服从某些常见的数据分布(正态分布,均匀分布等),然后希望训练得到一个模型X=g(Z)X=g(Z),这个模型能够将原来的概率分布映射到训练集的概率分布,即,他们的目的都是进行分布之间的变换。
分布变换
生成模型的难题就是判断生成分布与真实分布的相似度,因为我们只知道两者的采样结果,不知道它们的分布表达式。

VAE的通常理解

首先我们有一批样本{X1,X2,...,Xn}\{X_1,X_2,...,X_n\},其整体使用XX描述,我们本想根据{X1,...,xn}\{X_1,...,x_n\}得到XX的分布P(X)P(X),如果能得到的话,我们直接根据P(X)P(X)来采样,就可以得到所有可能的XX了。这是一个理想的终极模型,但很难实现,于是将分布改为:
p(X)=Zp(XZ)p(Z) p(X)=\sum_{Z}p(X|Z)p(Z)
这里不区分求和还是求积分,意思差不多就行。此时p(XZ)p(X|Z)就描述了一个由ZZ来生成XX的模型,而我们假设ZZ服从标准的正态分布,即:p(Z)=N(0,1)p(Z)=N(0,1),如果这个理想能实现,我们就可以先从标准的正态分布中采样一个ZZ,然后根据ZZ来计算XX,这也是一个很棒的生成模型。接下来就是结合自编码器来实现重构,保证有效信息没有丢失,再加上一系列的推导,最后把模型实现,框架结构如下所示:

VAE的通常理解

但是上图存在一个问题:我们不清楚经过重新采样生成的ZkZ_k是否还对应着原来的XkX_k,所以直接最小化D(Xk^,Xk)2D(\hat{X_k},X_k)^2是很不科学的。而实际上,你看代码,也会发现根本不是这样实现的。

VAE应该是什么样的

其实在整个VAE模型中,并没有使用p(Z)p(Z)(隐变量空间的分布)是正态分布的假设,我们用的是假设p(XZ)p(X|Z)(后验分布)是正态分布。

具体来说,给定一个真实样本XkX_k,我们假设存在一个专属于XkX_k的分布p(ZXk)p(Z|X_k)(学名叫后验分布),并进一步假设这个分布是(独立的、多元的)正态分布,这里强调专属因为:后面要训练一个生成器X=g(Z)X=g(Z),希望能够把从分布p(ZXk)p(Z|X_k)采样出来的ZkZ_k还原为XKX_K。如果假设p(Z)p(Z)是正态分布,然后从p(Z)p(Z)中采样一个ZZ,那么我们怎么知道这个ZZ是对应哪个真实的XX呢?现在p(ZXk)p(Z|X_k)专属于XkX_k,我们有理由说从这个分布采样出来的ZZ应该要还原到XkX_k中去。

事实上,在论文《Auto-Encoding Variational Bayes》的应用部分,也特别强调了这一点。


In this case, we can let the
variational approximate posterior be a multivariate Gaussian with a diagonal covariance structure:
logqϕ(zx(i))=logN(z;μ(i),σ2(i)I)(9) \log q_{\phi}(\boldsymbol{z}|\boldsymbol{x}^{(i)}) = \log \mathcal{N}(\boldsymbol{z} ;\boldsymbol{\mu}^{(i)},\boldsymbol{\sigma}^{2(i)}\boldsymbol{I})\tag{9}
(注:这里是直接摘录原论文,本文所用的符号跟原论文不尽一致,望读者不会混淆。)


上面介绍到了,每一个XkX_k都配上了一个专属的正态分布,才方便后续的生成器做还原,但这样有多少个XX就有多少个正态分布了。我们知道正态分布分布有两组参数μ\muσ2\sigma^2,那怎么找出专属XkX_k的正态分布P(ZXk)P(Z|X_k)的均值和方差呢?并没有什么直接的思路,那么就用神经网络来拟合吧。

于是我们就可以构建两个神经网络μk=f1(Xk),logσ2=f2(Xk)\mu_k=f_1(X_k), log\sigma^2 = f_2(X_k)来计算均值和方差了。这里之所以选择logσ2log \sigma^2是因为σ2\sigma^2总是非负的,需要加激活函数处理,而拟合logσ2log\sigma^2不需要加激活函数处理,因为可正可负。到这里,能知道专属于XkX_k的均值和方差了,也知道他的正态分布长什么样子了,然后从一个专属分布中采样一个ZkZ_k出来,然后经过一个生成器得到Xk^=g(Zk)\hat{X_k}=g(Z_k),现在可以放心的最小化D(Xk^,Xk)2D(\hat{X_k},X_k)^2,因为ZkZ_k是从专属的XkX_k的分布中采样出来的,这个生成器要把开始的XkX_k还原回来,于是可以画出VAE的示意图为:
VAE的示意图

分布标准化

首先,我们希望重构XX,也就是最小化D(Xk^,Xk)2D(\hat{X_k},X_k)^2,但这个过程容易收到噪声的影响,因为ZkZ_k是经过重新采样生成的,不是直接由encoder算出来的。显然噪声会增加重构的难度,不过好在这个噪声强度(也就是方差)通过一个神经网络算出来的,所以最终模型为了重构的更好,肯定会想尽办法让方差变为0,而方差为0的话,也就没有随机性了,所以不管怎么样采样都只是得到确定的结果(也就是均值),只拟合一个当然比拟合多个要容易,而均值是通过另外一个神经网络算出来的。

说白了,模型会慢慢退化成普通的AutoEncoder,噪声不再起作用。那这样的话,就不是生成模型。

其实VAE还让所有的p(Zx)p(Z|x)都向标准正态分布看齐,这样就防止了噪声为零,同时保证了模型具有生成能力。如下图所示:

向标准正态分布看齐

那么如何让所有的p(ZX)p(Z|X)都向N(0,1)N(0,1)看齐呢?原论文直接算了一般(各分量独立的)正态分布与标准正态分布的KL散度KL(N(μ,σ2)N(0,1))KL(N(\mu, \sigma^2)|| N(0,1))作为这个额外的loss,计算结果为:
Lμ,σ2=12i=1d(μ(i)2+σ(i)2logσ(i)21)(4) \mathcal{L}_{\mu,\sigma^2}=\frac{1}{2} \sum_{i=1}^d \Big(\mu_{(i)}^2 + \sigma_{(i)}^2 - \log \sigma_{(i)}^2 - 1\Big)\tag{4}

这里的dd指的是隐变量ZZ的维度,而μi\mu_iσi2\sigma^2_i分别代表一般正态分布的均值向量和方差向量的第ii个分量。直接用这个公式做补充loss,就不用考虑均值损失和方差损失的相对比例问题了。

VAE的本质

VAE虽然也是AE(AutoEncoder)的一种,但他的做法是独特的,在VAE中,他的Encoder有两个,一个用来计算均值,一个用来计算方差。

VAE从让普通人望而生畏的变分和贝叶斯理论出发,最后落地到一个具体的模型中,虽然走了比较长的一段路,但最终的模型其实是很接地气的:他本质上就是在我们常规的自编码器的基础上,对encoder的结果加上了“高斯噪声”,使得结果decoder能够对噪声有鲁棒性,而那个额外的KL loss事实上就是相当于encoder的一个正则项,希望encoder出来的东西均有零均值。

那另外一个encoder的作用是用来动态调节噪声的强度的,直觉上想,当decoder还没有训练好的时候(重构误差远大于KL loss),就会适当降低噪声(KL loss增加),使得拟合起来更加容易一些(重构误差开始下降);反之,如果decoder训练得还不错时(重构误差小于KL loss),这时候噪声就会增加(KL loss减少),使得拟合更加困难了(重构误差又开始增加),这时候decoder就要想办法提高他的生成能力了。

VAE本质

说白了,重构的过程是希望没噪声的,而KL loss则希望有高斯噪声的,两者是对立的,所以VAE跟GAN一样,内部其实时包含了一个对抗的过程,只不过他们两者是混合起来,共同进化的。

VAE中的变分

VAE叫做“变分自编码器”,他跟变分法有什么联系?在VAE的论文和相关解读中,好像也没看到变分法的存在呀?

如果大家承认KL散度的话,那VAE好像真的跟变分没多大关系了~因为理论上对于KL散度要证明:

固定概率分布p(x)q(x)p(x)(或q(x))的情况下,对于任意的概率分布q(x)p(x)q(x)(或p(x)),都有KL(p(x)q(x))0KL(p(x) || q(x)) \geq 0,而且只有当p(x)=q(x)p(x)=q(x)时才等于零。

因为KL(p(x)q(x))KL(p(x) || q(x))实际上是一个泛函,要对泛函求极值就要用到变分法,当然,这里的变分法只是普通微积分的平行推广,还没涉及到真正复杂的变分法。而VAE的变分下界,是直接基于KL散度就得到的。所以直接承认了KL散度的话,就没变分什么事了。

所有VAE名字中的变分,是因为他的推导过程用到了KL散度及其性质。

至此已经把变分自编码的内容捋的差不多了,再下一篇将会更新GAN!


扫一扫 关注微信公众号!号主 专注于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,自然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!

发布了320 篇原创文章 · 获赞 480 · 访问量 185万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览