序言
- VAE学习笔记,综合网上的一些文章加之自己的理解
1. VAE概述
- VAE = Variational Auto Encoder,变分自编码器。是一种常见的生成模型,属于无监督学习的范畴。它能够学习一个函数/模型,使得输出数据的分布尽可能的逼近原始数据分布,其基本思路是:把一堆真实样本通过编码器网络变换成一个理想的数据分布,然后这个数据分布再传递给一个解码器网络,得到一堆生成样本,生成样本与真实样本足够接近的话,就训练出了一个VAE模型
- VAE的设计思路很巧妙,它结合了泛函/变分推断/概率统计/深度学习等诸多理论,最后落地到一个具体的模型中,道路曲折但前途光明,下面我们就来仔细研究一下
2. VAE的直观理解
- Variational:变分是指求泛函的极值,泛函简单理解就是函数的函数,那么变分就是找到一个最能描述原始数据分布的分布;相比AE,VAE不再把分布映射到固定值/变量上,而是映射到一个分布上,网络模型中的bottle neck被分解成了两个向量:均值向量+方差向量。VAE的变分是基于KL散度性质推导的,我们将在VAE公式推导部分进行介绍。VAE模型编解码示意图

- VAE的Encoder用来计算均值和方差,均值和方差是用来描述正态分布的数字特征 x ∼ N ( μ , σ 2 ) x\sim N(\mu ,\sigma ^{2} ) x∼N(μ,σ2),不同的 μ μ μ和 σ σ σ取值对应不同位置、不同形状的正态分布。这里的均值和方差并不是确定的统计量而是两个函数,是由神经网络训练得到的,这个也会在VAE公式推导部分进行介绍。VAE的框架图如下

- 其中后验分布 q ( z ∣ x ) q(z|x) q(z∣x)是先验分布 p ( z ) p(z) p(z)的近似; ε ε ε是服从标准多元高斯分布 N ( 0 , I ) N(0, I) N(0,I)的标准化随机变量, z z z是服从高斯分布的随机变量,称为潜在变量或隐变量; p ( x ∣ z ) p(x|z) p(x∣z)是似然分布,即知道变量 z z z的分布后根据 z z z来估计 x ′ x^{'} x′的分布
3. VAE的设计思路-VAE是如何产生的
- 普通AE以确定性方式(单值)编码输入的潜在属性,而VAE以概率方式(分布)编码,如下图:我们将照片中"Smile"的潜在属性进行编码,普通AE为潜在属性提供一个值、而VAE则表达为属性的概率分布

- 从实际情况来看,将潜在属性编码为可能值的范围也是更合理的方式,例如,如果将蒙娜丽莎的微笑特征设置为特定单值显然不如将微笑特征设定为某个取值范围更合适。VAE就是用取值的”概率分布”代替普通AE的单值来描述对特征的观察。通过这种方式,我们将输入的每个潜在属性都表示为概率分布,如下图对各种特征的概率表达

- 当解码时,我们将从每个潜在分布中随机采样,生成一个向量作为解码器模型的输入。由于有了每个属性的概率分布,我们可以简单地从分布中抽取任何值来生成一个新的输出,而且自带过渡效果

另一个能够表达VAE设计思想的例子:
- 如图,有两张训练图片一张全月图一张半月图,经过训练AE已经能无损地还原出两张图片,当我们在code空间两个图片编码点中间取一个点给解码器,预期能得到一张介于全月和半月之间的图片,但却得到了模糊无法辨认的乱码图,因为是单值编码,AE模型并没有找到code空间点与点之间迁移时的规律

- 重构输入的过程是否有噪声,是VAE和普通AE的区别之一。当我们引入噪声,如图:给两张图片编码的时候加上噪声,使得每张图片的编码点出现在绿色箭头所示范围内,模型训练时,绿色范围内的点都可能被采样到,解码器在训练时就能将绿色范围内的点尽可能还原成和原图相似的图片。从code中间取的介于全月和半月编码空间的点,就能得到两种图的过渡结果如3/4全月图

- 编码器加了噪声之后可以有效覆盖失真区域,但仍然不充分,如上图中黄色点仍未被覆盖,当把噪声无限拉长,对每一个样本来说,它的编码会覆盖整个编码空间,同时要保证在原编码附近编码的概率最高,离原编码点越远编码概率越低,如下图

- 这其实就是一个从离散到连续的过程,高斯分布能够描述这种编码特征,当然也可以用其他的分布类型来描述
4. VAE的原理及公式推导
4.1 原理
- VAE是一种无监督的生成模型,其理论基础是建立在GMM高斯混合模型之上。GMM认为任何一个数据的分布,都可以看作是若干高斯分布的叠加。如下图,如果 P ( x ) P(x) P(x)是一种分布的话,存在一种拆分方法能让它表示成图中若干浅蓝色曲线对应的高斯分布的叠加

- 上图是样本 x x x的分布的离散和连续表达,我们关注能够完整覆盖编码范围的连续分布。如右图, z z z是由一个标准正态分布所产生的向量, z z z的每一维度都代表了一种属性,且 z z z的每一个属性的分布都服从高维高斯分布,通过 z z z每一个属性的高维高斯分布来拟合输入样本的真实分布,这部分对应到"Smile"照片的各种属性理解。对于每个采样 x ∣ z x|z x∣z,会有两个函数 u ( z ) u(z) u(z)和 σ ( z ) \sigma(z) σ(z),分别对应到高斯分布的均值和方差,然后在积分域上所有的高斯分布的累加就得到原始分布 p ( x ) p(x) p(x)的近似,即 p ( x ) = ∫ z p ( z ) p ( x ∣ z ) d z p(x)=\int\limits_{z}^{} p(z)p(x|z)dz p(x)=z∫p(z)p(x∣z)dz ,整个网络就是把样本 x x x经过降维表达成 z z z,再由 z z z根据低维特征重构原始输入,对应了一个完整的Encoder-Decoder过程

- 如上介绍,我们的目的就是求解 x x x的分布 p ( x ) p(x) p(x)。由于 p ( z ) p(z) p(z)是已知的, p ( x ∣ z ) p(x|z) p(x∣z)未知而 x ∣ z ∼ N ( μ ( z ) , σ ( z ) ) x|z\sim N(\mu(z),\sigma(z)) x∣z∼N(μ(z),σ(z)),于是我们真正要求解的是 μ ( z ) μ(z) μ(z)和 σ ( z ) σ(z) σ(z)两个函数的表达式。 p ( x ) p(x) p(x)通常非常复杂,导致 μ ( z ) μ(z) μ(z)和 σ ( z ) σ(z) σ(z)难以计算,因此引入两个神经网络进行求解:
- 第一个神经网络是Decoder,用于求解 μ ( z ) μ(z) μ(z)和 σ ( z ) σ(z) σ(z)两个函数,等价于求解 p ( x ∣ z ) p(x|z) p(x∣z)
对应 z z z的每个属性,对应于GMM中每个浅蓝色的子分布 - 第二个神经网络是Encoder,用于求解 q ( z ∣ x ) q(z|x) q(z∣x), q ( z ∣ x ) q(z|x) q(z∣x)可以表示任何的分布
对应数据 x x x的分布,对应于GMM中黑色的总体分布
- 第一个神经网络是Decoder,用于求解 μ ( z ) μ(z) μ(z)和 σ ( z ) σ(z) σ(z)两个函数,等价于求解 p ( x ∣ z ) p(x|z) p(x∣z)
- 引入Encoder神经网络的目的是为了辅助Decoder神经网络的求解,这里用到了变分推断的方法,简单解释变分推断:对难处理的概率密度函数进行估计的方法,假设一个分布 q ( z ; λ ) q(z; λ) q(z;λ)-当参数是 λ λ λ时 z z z的分布,该分布是易表达和求解的,通过改变分布的参数 λ λ λ,使 q ( z ; λ ) q(z; λ) q(z;λ)靠近 p ( z ∣ x ) p(z|x) p(z∣x),这种策略将计算 p ( z ∣ x ) p(z|x) p(z∣x)的问题转化成了缩小距离的优化问题 λ ∗ = a r g min λ d i v e r g e n c e ( p ( z ∣ x ) , q ( z ; λ ) ) \lambda ^{*} =arg\min_{\lambda } divergence(p(z|x),q(z;\lambda )) λ∗=argminλdivergence(p(z∣x),q(z;λ)),收敛后就可以用 q ( z ; λ ) q(z; λ) q(z;λ)来代替 p ( z ∣ x ) p(z|x) p(z∣x)了。 p p p和 q q q之间的距离用KL散度来衡量,也可以选择其他可衡量两个概率分布差异性的指标。KL散度是两个分布之间差异的度量,计算公式
K L ( p ( x ) ∣ ∣ q ( x ) ) = ∫ p ( x ) l n p ( x ) q ( x ) d x KL(p(x)||q(x))=\int p(x)ln\frac{p(x)}{q(x)}dx KL(p(x)∣∣q(x))=∫p(x)lnq(x)p(x)dx
KL散度满足非负性但不满足对称性,即 K L ( p ∣ ∣ q ) ≥ 0 , K L ( p ∣ ∣ q ) ≠ K L ( q ∣ ∣ p ) KL(p||q)\ge 0, KL(p||q) \ne KL(q||p) KL(p∣∣q)≥0,KL(p∣∣q)=KL(q∣∣p). KL散度其实就是一个泛函,要对泛函求极值就需要用到变分法,VAE的变分下界就是基于KL散度得到的。通过最小化KL散度,使两个分布尽可能地相似
4.2 公式推导
- 我们的目的:最大化观测 x x x的可能性,即最大化 ∑ x log p ( x ) \sum_{x}^{} \log_{}{p(x)} ∑xlogp(x),同时要减小 q ( z ∣ x ) q(z|x) q(z∣x)和 p ( z ∣ x ) p(z|x) p(z∣x)的距离
- 为了求解 p ( x ) p(x) p(x),我们进行如下变换
log p ( x ) = ∫ z q ( z ∣ x ) log p ( x ) d z = ∫ z q ( z ∣ x ) log p ( z , x ) p ( z ∣ x ) d z = ∫ z q ( z ∣ x ) log p ( z , x ) q ( z ∣ x ) q ( z ∣ x ) p ( z ∣ x ) d z = ∫ z q ( z ∣ x ) log p ( z , x ) q ( z ∣ x ) d z + ∫ z q ( z ∣ x ) log q ( z ∣ x ) p ( z ∣ x ) d z = ∫ z q ( z ∣ x ) log p ( z , x ) q ( z ∣ x ) d z + K L ( q ( z ∣ x ) ∣ ∣ p ( z ∣ x ) ) \begin{aligned} \log_{}{p(x)} &= \int\limits_{z}^{} q(z|x)\log_{}{p(x)}dz\\ &= \int\limits_{z}^{} q(z|x)\log_{}{\frac{p(z,x)}{p(z|x)}}dz\\ &=\int\limits_{z}^{} q(z|x)\log_{}{\frac{p(z,x)q(z|x)}{q(z|x)p(z|x)} } dz\\ &=\int\limits_{z}^{} q(z|x)\log_{}{\frac{p(z,x)}{q(z|x)} } dz + \int\limits_{z}^{} q(z|x)\log_{}{\frac{q(z|x)}{p(z|x)} } dz\\ &=\int\limits_{z}^{} q(z|x)\log_{}{\frac{p(z,x)}{q(z|x)} } dz + KL(q(z|x)||p(z|x)) \end{aligned} logp(x)=z∫q(z∣x