直观理解 VAE(译文)

与上一篇译文 “直观理解 GAN” 一样,这篇文章的英文原文也出自 Joseph Rocca 之手。文章既包括对 VAE(Variational Autoencoders,变分自编码器) 的直观理解,也有详细的数学推导。很佩服作者用这种平实亲和的语言写科技博客的能力。

本文依然是对原始文章的意译,力求用符合中文的语言风格还原作者的本意。

原文链接:
https://towardsdatascience.com/understanding-variational-autoencoders-vaes-f70510919f73

=====================================

0. 引言

在过去几年中,基于深度学习的生成模型(generative models)获得越来越多的关注。依赖于大量训练数据、巧妙设计的网络结构以及高效的训练方法,深度生成模型展现出不可思议的新内容/新数据生成能力,包括生成图片、文字和声音等。在各种深度生成模型中,有两类受到格外关注:GANs (Generative Adversarial Networks, 生成对抗模型)和 VAEs (Variational Autoencoders, 变分自编码器).

在之前的文章中(英文原文中文翻译),我们介绍了 GANs。本文将继续介绍另一种深度生成模型 —— VAE。简单来说,VAE 是一种特殊的自编码器(Autoencoder),编码之后得到的隐空间(latent space)具有良好的规则,可以生成有意义的新数据。VAE 名字中的“变分”(variational)一词来源于其编码方式与统计学中的变分推断(variational inference)之间的密切关联。

上边一段话中对 VAE 的概括可能会带来一些系列的疑问:什么是自编码器?什么是隐空间以及为什么需要让它规则化?如何让 VAE 生成新数据?变分自编码器与变分推断之间有什么的关系?为了尽量清晰的介绍 VAE,我们需要回答上面所有的问题(以及很多其他问题)。本文的目的是从基础概念出发,逐步推导出 VAE ,并逐一回答上述问题。

废话不多少,让我们开始 VAE 的(重)发现之旅吧!

文章结构:
第 1 节介绍有关特征降维和自编码器的重要概念。
第 2 节阐述为什么自编码器无法生成有意义的新数据,并且介绍 VAE 这个规则化版本的自编码器。
第 3 节介绍 VAE 的数学细节,尤其是变分推断。这一节将在 VAE 的直观理解与数学推导之间架设一座桥梁。对于数学细节不感兴趣的读者可以忽略这一节,并不会影响对 VAE 的直观理解。

1. 特征降维,主成分分析(PCA)以及自编码器

这一节主要介绍与特征降维相关的概念,尤其是主成分分析(Principal Component Analysis, PCA),自编码器,以及它们之间的关联。

1.1. 什么是特征降维?

在机器学习中,特征降维就是减少用来描述数据的特征数量,包括特征筛选(挑选部分现有特征)和特征提取(由现有特征构造数量更少的新特征)。特征降维主要用在需要低维数据的场景中,例如数据可视化、数据存储、降低计算复杂度等。特征降维的具体实现方法有很多,这里我们介绍一个统一的框架,可以包含几乎所有的降维方法。

我们把从原始特征集合中获得新特征集合的过程(通过筛选或者提取)称为编码过程,或者直接叫作编码器,而相应的逆过程称为解码器。从这个角度来看,特征降维的过程可以理解成编码器将数据从原始空间压缩到维度较低的编码空间(或者称为隐空间 latent space)中,解码器则是相应的解压缩过程。这种压缩可以是无损的(lossless),即从编码的数据可以完美重构原始数据;也可以是有损的(lossy),即在编码过程中,部分原始信息丢失,数据无法被完美的解码还原。

从上述编码器+解码器的角度来看,特征降维的一个主要目的是找到一对编码器和解码器,使得编码过程中保留尽量多的重要信息,这样解码之后的重构误差较小。如果用 ED 分别表示编码器集合和解码器集合,那么特征降维问题可以写成如下的优化问题:
(e^*, d^*) = \underset{_{(e,d)\in E\times D}}{\arg\min} ~~\epsilon(x, d(e(x)))

其中 \epsilon(x, d(e(x))) 定义了原始数据 x 与经过编码+解码之后的重构数据 d(e(x)) 之间的误差。在下面的介绍中,我们设定数据的数量为 N, 原始空间(也是解码之后的空间)维度为 n_d,编码空间为 n_e.

1.2. 主成分分析

当谈到特征降维时,一个很容易想到的方法就是主成分分析(Principal Component Analysis, PCA)。下边,我们将 PCA 套用到上述编码器+解码器的统一框架中,以便与后续的自编码器相比较。

首先看一下 PCA 的基本思想:对原始特征(n_d 维)进行线性组合,构造出相互独立的新特征(n_e 维),而构造目标是,原始数据在新特征构成的降维空间中的投影与原始数据尽量靠近(以欧几里得距离为度量指标)。也就是说,PCA 要寻找原始特征空间中的一个子空间(该子空间的正交基对应新特征)使得原始数据在该子空间中的投影与原始数据误差最小。

套用到编码+解码的统一框架内:我们希望选择一个 n_e\times n_d 维的矩阵(各行正交)作为编码器,以及一个 n_d \times n_e 维的矩阵作为解码器,使得数据在编码之后的降维子空间上的投影与原数据误差最小。实际上可以证明(参考 Bishop. PRML. p561),样本数据集合的协方差矩阵最大的 n_e 个特征根对应的特征向量(单位正交化之后)可以组成上述编码器矩阵。这样,PCA 特征降维问题最后就转化成了矩阵的特征分解问题。还可以证明,对应的解码器矩阵就是编码器矩阵的转置。

1.3. 自编码器

下边我们转向自编码器,看一下如何用神经网络实现特征降维。自编码器的思想很简单:用神经网络构造编码器和解码器(编码器网络后边跟着解码器网络),通过迭代优化的方法学习到最佳的参数配置。具体地,每一步迭代中,将数据送入自编码器中,对比编码+解码之后的输出与原始数据,然后通过误差反向传播算法更新两个网络的权重。

直观地看,整个自编码器架构内部具有一种类似瓶颈的作用,只有原始数据中关键特征会被保留,穿过瓶颈,最终用于数据重构,而那些不重要的特征由于瓶颈维度限制被剔除掉了。

如果设定我们的编码器和解码器网络都是单层的,并且没有非线性激活函数,那么它们都是简单的线性变换,可以用矩阵表示。在这种情况下,可以看到自编码器与 PCA 之间的联系。PCA 中设计的编码器和解码器矩阵,在自编码器中有可能通过神经网络的迭代学习最终习得。但是自编码器网络没有如 PCA 一样的新特征之间独立的限制,因此有可能学习到更多样的编码+解码矩阵/网络。

现在我们看看具有深度网络结构以及非线性激活函数的更复杂的自编码器。理论上来说,网络结构越复杂,对应的(训练之后)自编码器效果越好,即在降低维度的同时,提高重构精度。一种极端情况是,如果自编码器有足够多的自由度(独立参数),它可以将任意维度的原始数据压缩到一维空间中。例如,将 N 个数据编码为 1,2,3,... 一直到 N,然后解码器执行逆过程,可以没有任何重构误差.

但是我们需要注意两件事:第一,过分的追求无重构误差可能导致编码之后的隐空间没有任何规律性,可解释性差(lack of regularity);第二, 在很多时候特征降维的最终目的并不仅仅是降低维度,还希望保留关键特征的结构信息。在这两个额外要求下,隐空间的维度和自编码器的深度需要谨慎选择。

2. 变分自编码器 VAE

到目前为止,我们讨论了特征降维问题,介绍了基于神经网络的自编码器。接下来讨论数据生成的问题。首先看一下自编码器在数据生成方面的缺陷,然后引入 VAE.

2.1. 自编码器在数据生成方面的缺陷

训练好的自编码器包括编码器和解码器。一个很直观的想法是,我们可以从编码之后的隐空间中采样一个点送入解码器,产生新的数据。这样解码器就扮演了生成器的角色。

图中上部对应训练自编码器的过程,下部对应数据生成的过程

但是正如前边所讨论的,我们并不能保证自编码器的隐空间具有规则性,从中随机选取的一个点不一定能生成有意义的新数据。为了说明这个问题,我们继续使用前边的例子:假设我们已经有了一个功能强大的自编码器,可以把 N 个原始数据编码到一维空间中(例如实数轴上的 N 个点),并且可以无损解码还原。这种极限无损压缩有可能意味着严重的过拟合,也就是说在一维隐空间中只有这几个点能够还原出有意义的数据。

之所以产生这种不规则的隐空间也是很容易理解的。在训练自编码器的过程中,我们只是要求重构误差尽量的小,没有对隐空间施加任何规则化限制。自编码器为了实现优化目标可以用任意的方式构造隐空间,在这个过程中就有可能出现上述过拟合问题。

2.2. VAE 的定义

为了把解码器当作生成器使用,隐空间应该具有某种规则性,使得随机采样的一个点可以产生有意义的新数据。一种解决方案是在训练自编码器的过程中明确施加规则性限制。VAE 就是采用了这种解决方案。

与普通的自编码器类似,VAE 的架构也包括编码器和解码器,训练的目标(之一)也是最小化重构误差。不同的是,VAE 不是将输入数据编码成隐空间中的一个点,而是编码成隐空间中的一个分布. 具体的训练步骤如下:

  • 输入数据被编码成隐空间上的一个分布
  • 从该分布中采样一个点
  • 采样点被解码,计算重构误差
  • 重构误差反向传播,更新网络参数

在实际应用中,编码分布采用正态分布,因此编码器的输出实际上是正态分布的均值和协方差矩阵。

2.3. 规则化的直观理解

规则化的隐空间应该具备两个性质:

  • 完备性:隐空间中随机采样的点应该解码出有意义的新数据。
  • 连续性:隐空间中相邻的两个点解码之后的数据内容不能相差太大

需要注意的是,单纯的将普通自编码器中的“编码成点”修改为 VAE 中的“编码成分布”并不能保证上述隐空间的两个性质。VAE 为了实现重构误差最小的目标,可能表现的与普通自编码器类似,训练出方差很小的分布,相当于编码成一个点。而且由输入数据编码出的各个分布的均值之间间距可能很大。上述问题都会导致隐空间既没有完备性,也没有连续性。

为了解决上述问题,我们需要对编码分布的均值和方差施加限制。在 VAE 中,要求编码分布逼近标准正态分布,即协方差矩阵尽量逼近单位矩阵,避免了过小的方差,而且均值靠近 0 点,避免了输入数据编码后的各个分布之间过于分散。

从上图中可以看出,施加限制之后,编码器产生的分布靠的更近,有部分重叠,而且各个分布的方差(覆盖面)增大,保证了连续性和完备性。

为了施加这一限制,可以采用如下的 loss function:

其中编码成的分布与标准正态分布之间的差距通过 KL 散度(Kulback-Leibler divergence)来衡量。KL 散度有一个很好的特性:两个正态分布的 KL 散度可以通过这两个分布的均值和协方差矩阵显式地写出来,因此计算很方便。

施加规则化限制的代价是带来更大的重构误差,因为 loss function 需要兼顾 重构误差两个分布的 KL 散度

总结本小节内容:结合下图我们可以看到,施加规则化限制之后,隐空间上的分布呈现某种“梯度”渐变现象,如果采样点在两个分布的均值之间的位置,那么该采样点解码之后得到的新数据也会表现出两个原始数据的中间态形式。

3. VAE 背后的数学

本节将从更加理论化的角度分析 VAE 。不过,在此之前我们首先要介绍清楚相关的概率框架以及变分推断方法。

3.1. 概率框架和假设

首先定义一个概率图模型。令 x 变量表示生成的数据,并假设 x 的分布依赖于隐变量 z

注意,此处我们假设生成数据与隐变量之间是概率性的,实际中我们是用确定性的神经网络描述生成数据与隐变量之间的关系,前者包含了后者。我们先从比较广义的角度进行理论分析,然后再具体化。

在概率框架下,数据生成的步骤如下:

  • 首先依分布 p(z) 采样一个隐变量 z
  • 然后再依分布 p(x|z) 采样出新数据 x

在此基础上,我们重新定义概率化的编码器和解码器:概率化的解码器就是前边定义的 p(x|z),描述了在给定 隐变量 z 的条件下生成(或解码)数据 x 的分布;概率化编码器定义为 p(z|x),描述了在给定数据 x 的条件下,隐变量 z 的分布。

上述定义的都是条件概率,假设隐空间自身还有先验分布 p(z)。我们可以用贝叶斯定理建立以上各分布之间的关系:
p(z|x) = \frac{p(x|z)p(z)}{p(x)} = \frac{p(x|z)p(z)}{\int p(x|u)p(u)du}

假设 p(z) 服从标准正态分布,p(x|z) 也是一个高斯分布,其均值是关于 z 的确定性函数 f(\cdot),协方差矩阵形如 cI,即
p(z) \sim \mathcal{N}(0, I) \\ p(x|z) \sim \mathcal{N}(f(z), cI), ~~ c>0

我们先假设 f(\cdot) 是已知的。理论上来说,我们已知了 p(z)p(x|z), 可以通过贝叶斯定理计算 p(z|x),这是典型的贝叶斯推断问题。但是,这个问题中计算分母上的积分比较困难,我们只能采用近似方法计算 p(z|x),比如变分推断 (variational inference).

3.2. 变分推断

在统计学中,变分推断可以用来近似比较复杂的分布。基本思想是,从一类参数化的分布中(例如高斯分布,参数为均值和协方差)选出对目标分布的最佳近似。这里的优化目标一般是待求分布与目标分布的 KL 散度。

这里我们是希望用高斯分布 q_x(z) (这种表示方法意味着这个关于 z 的分布是依赖于 x 的,一旦 x 确定了,这个分布也是确定的)逼近 p(z|x),其中高斯分布的均值和方差分别设定为 g(x), h(x),即
q_x(z) \sim \mathcal{N}(g(x), h(x))

接下来就是通过调节 g, h (也就是调节 q_x(z))来寻找对 p(z|x) 的最佳近似。可以写成如下优化问题:

其中第三个等式最后一项与 g,h 选择无关,被省略掉;最后一行就是将 p(x|z) 的高斯分布表达式代入。

通过倒数第二行我们可以看到 “基于采样数据的最大似然” 与 “靠近先验分布”(即最小 KL) 之间的权衡。这种权衡在贝叶斯推理问题中是普遍存在的,反映了对采样数据和对先验知识的信心。

到目前为止,我们一直假设概率解码器 p(x|z) \sim \mathcal{N}(f(z), cI) 中的函数 f 是已知的,并由此对概率编码器 p(z|x) 进行变分推断。但在实际中这个 f 函数是未知的。不同的 f 可以定义不同的 p(x|z),进而有相应的对 p(z|x) 的最佳近似,记作 q^*_x(z)。从编码+解码整体的有效性出发,我们希望找到一个 f 满足:对于给定的输入 x, 编码+解码之后得到 \hat{x}=x 的概率最大,其中 z 服从 q^*_x(z) 分布,\hat{x} 服从 p(x|z) 分布。 可以写成如下的优化问题:
f^* = \underset{f\in F}{\arg\max} ~E_{z\sim q^*_x}(\log p(x|z)) = \underset{f\in F}{\arg\max} ~E_{z\sim q^*_x}\left( -\frac{\|x-f(z)\|^2}{2c} \right)

再结合前边的变分推断问题,最终的优化问题如下:
(f^*, g^*, h^*) = \underset{(f,g,h)\in F\times G\times H}{\arg\max}\left( E_{z\sim q_x} \left(-\frac{\|x-f(z)\|^2}{2c}\right) - KL(q_x(z), p(z)) \right)

上式中的 c 可以用来调节两个优化项的权重,c 越大,第二项,即规则化那一项权重越大。

3.3. 将神经网络引进来

至此,我们已经定义好了概率优化问题,包含 3 个待寻优的函数 f,g,h。下边我们用神经网络对这 3 个函数进行建模,然后我们需要优化的就是神经网络的参数。

先看编码器部分。在实际中,gh 可以共享部分网络结构,即
g(x) = g_2(g_1(x)), ~~~~ h(x) = h_2(h_1(x)), ~~~~ g_1(x) = h_1(x)

另外,h 输出的是 q_x(z) 的协方差矩阵。为了简化计算,减少参数,我们可以将 q_x(z) 的协方差矩阵限定为对角矩阵。此时,h 的输出就是一个向量(对应矩阵的对角元素),与 g 的输出同维度。当然,这种简化也会降低对 p(z|x) 的近似精度。

再看解码器部分。这里 f(z) (原本为分布的均值) 就直接作为解码器的输出,省掉了概率采样的过程:

需要注意的是,整个编码+解码中存在采样过程(从隐变量空间采样得到 z),因此在训练过程中需要保证采样不影响误差反向传播过程。这里可以采用重参数化的技巧(reparametrisation trick)。它的基本思想是:如果正态分布随机变量 z 具有均值 \mu_x 和标准差 \sigma_x,则可以借助标准正态分布表示成如下形式:
z = \sigma_x\zeta + \mu_x, ~~~~ \zeta\sim \mathcal{N}(0,I)

在误差反向传播过程中,不考虑标准正态分布 \zeta 的采样,只考虑 \mu_x\sigma_x

对于优化目标函数中的期望,在实际计算中通过蒙特卡洛方法近似计算,只需要一次采样即可。另外,令优化目标函数中 C = 1/(2c)。最后的优化目标函数重现了第 2 节中的样式,包括重构误差项和规则化项,并且由常数 C 调节两项的权重。

4. 总结

  • 特征降维的过程就是减少数据特征的过程,也可以理解成编码的过程。
  • 自编码器包含编码器和解码器两部分,都是由神经网络构造的。通过瓶颈作用,编码只保留关键信息。
  • 自编码器的隐空间是不规则的,因此无法生成有意义的新数据。
  • VAE 中编码器输出的是隐空间中的分布而不是一个点,通过在 loss function 中增加规则化约束保证隐空间的规则化。
  • VAE 可以通过概率模型框架推导出来,其中采用了变分推断,这也是“变分”自编码器名字的由来。

在过去的几年中,GANs 的发展势头超过了 VAE,一个原因是 VAE 的理论稍微难一些,而 GANs 的对抗训练的思想则比较容易理解。通过这篇文章,我们分享了关于 VAE 的直观理解以及理论基础,希望 VAE 更容易被接受。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,698评论 5 463
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,711评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,795评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,699评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,567评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,423评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,822评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,467评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,755评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,789评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,577评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,418评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,837评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,054评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,355评论 1 254
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,820评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,027评论 2 338

推荐阅读更多精彩内容