系统学习深度学习(四十二)--从AE到VAE

转自:https://www.atyun.com/17976.html

AE

自编码器是一种无监督学习技术,利用神经网络进行表征学习。也就是说,我们设计一个在网络中施加“瓶颈”,迫使原始输入压缩知识表示的神经网络架构。如果输入特征彼此独立,则该压缩和随后的重构将是非常困难的任务。但是,如果数据中存在某种结构(即输入特征之间存在相关性),则可以学习这种结构,并在强制输入通过网络的瓶颈时使用。

从自编码器到变分自编码器(其一)

如上图所示,我们可以采取的未标记数据集和框架作为任务监督学习问题,负责输出x帽(原始输入x的重构)。这个网络可以通过最小化重构误差从自编码器到变分自编码器(其一)(原始输入和重构之间差异的度量)训练。瓶颈是我们网络设计的关键属性;如果没有信息瓶颈,我们的网络就会将这些值通过网络传递,并且只学会记住输入值。

从自编码器到变分自编码器(其一)

瓶颈限制了完整网络可以传递的信息量,从而迫使网络学习压缩输入数据。

注意:事实上,如果我们要构造一个线性网络(即,每层都不使用非线性激活函数),我们会观察到类似PCA中所观察到的降维。

理想的自编码器模型平衡以下几点:

  • 对输入敏感足以准确建立重构。
  • 这种敏感不能过度,导致模型简单的记住甚至过拟合训练数据。

这种取舍迫使模型在只保留重构输入所需的数据的变化,不保留输入的冗余。一般来说,这涉及构建一个损失函数,其中一项鼓励我们的模型对输入敏感(比如,重构损失从自编码器到变分自编码器(其一)),而第二项防止出现直接记住或过度拟合(如,加个正则化)。

从自编码器到变分自编码器(其一)

我们通常会在正则化项前面添加一个缩放参数,以便我们可以调整两个目标之间的平衡。

欠完备的自编码器

构建自编码器最简单的架构是限制网络隐藏层中存在的节点数量,进而限制可以通过网络传输的信息量。通过根据重构误差惩罚网络,我们的模型可以学习输入数据的最重要属性,以及从“编码”状态如何最好的重构原始输入。理想情况下,这种编码将学习和描述输入数据的潜在属性。

从自编码器到变分自编码器(其一)

由于神经网络能够学习非线性关系,因此可以认为这是PCA更有力(非线性)的泛化。而PCA试图发现描述原始数据的低维超平面,自编码器则能够学习非线性流形(流形为连续的非交叉的曲面)。这两种方法之间的区别如下图所示。

从自编码器到变分自编码器(其一)

对于更高维数据,自编码器能够学习数据(流形)的复杂表示,可用于描述低维度的观测数据,并可以对应地解码成原始输入空间。

从自编码器到变分自编码器(其一)

欠完备自编码器没有明确的正则化项,只是根据重构损失来训练我们的模型。因此,确保模型不记忆输入数据的唯一方法就是确保我们已经充分限制了隐藏层中的节点数量。

为了深入了解自编码器,我们还必须了解我们的编码器和解码器模型的容量(capacity )。即使“瓶颈层”只有一个隐藏节点,只要编码器和解码器模型有足够的容量来学习一些可以将数据映射到索引的任意函数,我们的模型仍然可以记住训练数据。

因此,我们希望我们的模型能够发现我们数据中的潜在属性,重要的是要确保自编码器模型不仅是学习有效记忆训练数据的方法。像监督学习问题,我们可以对网络采用各种形式的正则化,以鼓励更好的泛化属性。

稀疏自编码器

稀疏自编码器为我们提供了一种不需要减少我们隐藏层的节点数量,就可以引入信息瓶颈的的方法。相反,我们将构造我们的损失函数,以惩罚层中的激活。对于任何给定的观察,我们都会鼓励我们的网络学习只依赖激活少量神经元进行编码和解码。值得注意的是,这是一种比较特殊的正则化实现方法,因为我们通常调整网络的权重,而不是激活。

通用稀疏自编码器的可视化如下,节点的不透明度与激活级别对应。请注意,激活的训练模型的各个节点是数据相关的,不同的输入将导致通过网络不同节点的激活。

从自编码器到变分自编码器(其一)

这样做的结果是,我们使网络的各个隐藏层节点对输入数据的特定属性敏感。欠完备自编码器使用整个网络进行每次观察,而稀疏自编码器将被迫根据输入数据选择性地激活网络区域。因此,我们限制了网络记忆输入数据的容量,而不限制网络从数据中提取特征的能力。这让我们单独考虑网络的潜在状态的表征和正则化分开,这样我们就可以根据给定数据上下文的意义选择潜在状态表征(即编码维度),同时通过稀疏性约束施加正则化。

我们可以通过两种主要的方式来强加这种稀疏性约束;都涉及到测量每个训练批次的隐藏层激活,并为损失函数添加一些惩罚过度的激活的项。这些条款是:

  • L1正则化:我们可以添加一个对损失函数的正则化项,在h层中为观察i惩罚激活a的向量值的绝对值,使用微调参数λ进行缩放。

从自编码器到变分自编码器(其一)

  • KL -散度(相对熵):本质上,KL散度是两个概率分布差异的度量。我们可以定义一个参数ρ稀疏,它表示一个神经元在样本集合上的平均激活。这种期望可以计算为

    从自编码器到变分自编码器(其一)

    ,下标j表示表示层h中特定的神经元,对m个训练观察的表征x的激活求和。本质上,通过限制一个神经元在样本集合上的平均激活,我们鼓励神经元只对观测的一个子集进行激活。我们可以将ρ描述为一个伯努利随机变量分布,我们可以利用KL散度(下展开)来比较理想的分布在所有隐藏层节点上的观察分布。

从自编码器到变分自编码器(其一)

注意:伯努利分布是“一个随机变量的概率分布,p为概率值1,q = 1−p为概率值0”。这与建立神经元激活的概率吻合。

两个伯内利分布的KL散度可写成

从自编码器到变分自编码器(其一)

。下面是理想分布p=0.2的损失项可视化,对应于此处的最小(零)惩罚。

从自编码器到变分自编码器(其一)

降噪自编码器

我们的模型通过某种信息瓶颈,尽可能重构输入。回想一下,前面我提到我们希望我们的自编码器足够敏感以重构原始观察的结果,但又要对训练数据不够敏感,以至于模型学习通用的编码和解码。还有一种开发通用化模型的方法,我们可以略微破坏输入数据,但仍维持未损坏的数据维作为目标输出。

从自编码器到变分自编码器(其一)

采用这种方法,我们的模型不能简单地开发一个记忆训练数据的映射,因为我们的输入和目标输出不再相同。更确切的说,该模型学习矢量场以将输入数据映射到较低维流形;如果这个流形精确地描述了自然数据,我们就有效地“消除”了多余的噪声。

从自编码器到变分自编码器(其一)

上图是,对矢量场x与原始值x的可视化描述。黄点表示在添加噪声之前的训练样本。你可以看到,模型已经学会了调整损坏的输入到已学习的流形。

值得注意的是,这个矢量场通常只在模型在训练过程中观察到的区域中表现良好。在远离自然数据分布的区域,重构误差既大又不总是指向真实分布的方向。

从自编码器到变分自编码器(其一)

压缩自编码器

人们会期望对于非常相似的输入,学习的编码也会非常相似。我们可以为此训练我们的模型,以便通过要求隐藏层激活的导数相对于输入而言很小。换句话说,对于输入比较小的改动,我们仍然应该保持一个非常类似的编码状态。这与降噪自编码器相似,因为输入的小扰动本质上被认为是噪声,并且我们希望我们的模型对噪声具有很强的鲁棒性。“降噪自编码器使重构函数(解码器)抵抗输入有限小的扰动,而压缩自编码器使特征提取函数(编码器)抵抗输入无限小的扰动。“

因为我们明确地鼓励我们的模型学习一种编码,在这种编码中,类似的输入有类似的编码。我们基本上是迫使模型学习如何将输入的临近区域收缩到较小的输出临近区域。注意重构数据的斜率(即微分)对于输入数据的局部邻域来说基本为零。

从自编码器到变分自编码器(其一)

我们可以通过构造一个损失项来实现这一点,该项对输入训练样例中的大量的衍生进行惩罚,本质上是惩罚那些在输入中有微小变化导致编码空间发生巨大变化的实例。

在更高级的数学术语中,我们可以将我们的正则化损失项设置为雅可比矩阵J的Frobenius范数的平方||A||F,用于对输入观测的隐含层激活。Frobenius范数本质上是矩阵的L2范数,而雅可比矩阵仅仅代表了一个向量值函数的所有一阶偏导数。

对于m观察和n隐藏层节点,我们可以计算如下的值。

从自编码器到变分自编码器(其一)

为了写得更简洁,我们可以将我们的完整损失函数定义为:

从自编码器到变分自编码器(其一)

在这里

从自编码器到变分自编码器(其一)

定义了我们的隐层激活输入x的梯度场,所有的i训练示例求和。

总结

自编码器是一种神经网络架构,能够发现数据中的结构,以便开发输入的压缩表示。一般自编码器架构的许多不同变种,其目标是确保压缩表征表示原始数据输入的有意义的属性;通常使用自编码器工作时遇到的最大挑战,是让你的模型实际学习一种有意义且可泛化的潜在空间表征。

因为自编码器学习如何根据训练期间从数据中发现的属性(即,输入特征向量之间的相关性)来压缩数据,所以这些模型通常仅能够重构与训练中观察到的模型相似的数据。

自编码器的应用包括:

  • 异常检测
  • 数据去噪(例如图像,音频)
  • 图像修复
  • 信息检索

VAE

变分自编码器(VAE)以概率的方式描述潜在空间观察。因此,我们不会构建一个输出单个值来描述每个潜在状态属性的编码器,而是用编码器来描述每个潜在属性的概率分布。

直觉

举一个例子,假设我们在编码维数为6的大型人脸数据集上训练了一个自编码器模型。理想的自编码器将学习人脸的描述性属性,如肤色、是否戴眼镜等,以试图用一些压缩的表示来描述观察。

从自编码器到变分自编码器(其二)

在上面的示例中,我们使用单个值来描述输入图像的潜在属性,以描述每个属性。但我们可能更倾向于将每个潜在属性表示为可能值的范围。例如,如果输入蒙娜丽莎的照片,你会为微笑属性分配什么样的单值?使用变分自编码器,我们可以用概率术语来描述潜在属性。

从自编码器到变分自编码器(其二)

通过这种方法,我们现在将给定输入的每个潜在属性表示为概率分布。当从潜在状态解码时,我们将从每个潜在状态分布中随机采样,生成一个向量作为解码器模型的输入。

从自编码器到变分自编码器(其二)

注意:对于变分自编码器,编码器模型有时被称为识别模型(recognition model ),而解码器模型有时被称为生成模型。

通过构造我们的编码器模型来输出可能值的范围(统计分布),我们将随机采样这些值以供给我们的解码器模型,我们实质上实施了连续,平滑的潜在空间表示。对于潜在分布的所有采样,我们期望我们的解码器模型能够准确重构输入。因此,在潜在空间中彼此相邻的值应该与非常类似的重构相对应。

从自编码器到变分自编码器(其二)

统计动机

假设存在一些隐藏变量z,生成一个观察x。

从自编码器到变分自编码器(其二)

我们只能看到x,但是想推断出z的特征,换句话说,我们想计算p(z|x)

从自编码器到变分自编码器(其二)

然而,计算p(x)是相当困难的。

从自编码器到变分自编码器(其二)

它通常是一个复杂的分布。但是,我们可以应用变分推断( varitational inference)来估计这个值。

让我们用另一个分布q(z|x)来近似p(z|x),我们将定义它具有可伸缩的分布。如果我们可以定义q(z|x)的参数,使其与p(z|x)十分相似,就可以用它来对复杂的分布进行近似的推理。

回想一下,KL散度是两个概率分布的差值。因此,如果我们想要确保q(z|x)与p(z|x)相似,我们可以最小化两个分布之间的KL散度。

从自编码器到变分自编码器(其二)

推导出的结果让我们可以通过最大化下面式子的方式最小化上述表达式:

从自编码器到变分自编码器(其二)

在这里,第一个式子代表重构的可能性,第二个则确保我们学习的分布q类似于真实的先验分布p。

为了重新访问我们的图形模型,我们可以使用q来推断可能隐藏的变量(潜在状态),这些变量可以用于生成观察。我们可以进一步将这个模型构造成神经网络结构,其中编码器模型学习从x到z的映射,解码器模型学习从z到x的映射。

从自编码器到变分自编码器(其二)

我们网络的损失函数包括两项,第一个惩罚重构误差(可以认为是正如前面所讨论的最大化重构的可能性),第二个鼓励我们学习分布q(z | x)类似于真实的先验分布p(z),我们假设单元高斯分布,每个维度j的潜在空间。

从自编码器到变分自编码器(其二)

实现

在前面,我建立了变分自编码器结构的统计动机。在本节中,我将提供自己构建这种模型的实际实现细节。

与在标准自编码器中直接输出潜在状态值不同,VAE的编码器模型将输出描述潜在空间中每个维度分布的参数。既然我们假设我们的先验符合正态分布,我们会输出两个向量来描述潜在状态分布的均值和方差。如果我们要构建一个真正的多元高斯模型,我们需要定义一个协方差矩阵来描述每个维度是如何相关的。然而,我们将做一个简化的假设,即我们的协方差矩阵在对角线上只有非零值,允许我们用简单的向量来描述这些信息。

然后,我们的解码器模型将通过从这些已定义的分布中采样,以生成一个潜在矢量,并开始重构原始输入。

从自编码器到变分自编码器(其二)

但是,这个采样的过程需要额外注意。在训练模型时,我们需要能够使用反向传播来计算网络中每个参数与最终输出损失之间的关系。但是,我们无法为随机抽样过程做到这一点。幸运的是,我们可以利用一种称为“reparameterization trick”(再参数化)的办法,它暗示我们从单位高斯随机采样ε,然后通过潜在分布的均值μ改变随机采样的ε,最后通过潜在分布的方差σ对其进行缩放。

从自编码器到变分自编码器(其二)

通过这种再参数化,我们现在可以优化分布的参数,同时仍然保持从该分布随机抽样的能力。

从自编码器到变分自编码器(其二)

注意:为了应对这一事实网络可以学习σ的负值,我们通常会有网络学习logσ并指数化这个值得到潜在分布的方差。

潜在空间的可视化

为了理解变分自编码器模型的含义及它与标准自编码器架构的差异,检查潜在空间很有必要。

变分自编码器的主要优点是我们能够学习输入数据的平滑潜在状态表示。对于标准的自编码器,我们只需要学习一个编码,它允许我们重现输入。如左图所示,只关注重构损失允许我们分离出类(在这种情况下是MNIST数字),这使我们的解码器模型能够重现原始手写数字,但是它的潜在空间内的数据分布不均匀。换句话说,潜在空间中有一些区域不代表我们观测到的任何数据。

从自编码器到变分自编码器(其二)

另一方面,如果我们只关注于保持潜在分布与先验分布类似(通过KL散度损失项),我们最终将使用相同的单位高斯描述每个观测值,我们随后从中抽样来描述可视化的潜在维度。这有效地把每一个观察都视为具有相同的特征;换句话说,我们没有描述原始数据。

然而,当这两项同时优化时,我们被鼓励描述一个观察的潜在状态,其分布接近于先验,在必要时偏离,以描述输入的显著特征。

从自编码器到变分自编码器(其二)

当我构建一个变分自编码器时,我喜欢从数据中检查一些样本的潜在维度,以了解分布的特征。我鼓励你也这样做。

从自编码器到变分自编码器(其二)

如果我们观察到潜在分布似乎非常密,我们可能需要给参数β> 1的KL散度项赋予更高的权重,鼓励网络学习更广泛的分布。这一简单的见解导致了一种新型的模型 — 解离变分型自动编码器(disentangled variational autoencoders)的增长。事实证明,通过更多的强调KL散度项,我们还隐含地强调学习的潜在维度是不相关的(通过我们对对角协方差矩阵的简化假设)。

从自编码器到变分自编码器(其二)

变分自编码器作为生成模型

通过从潜在空间采样,我们可以使用解码器网络形成一个生成模型,能够创建与训练过程观察类似的新数据。也就是说,我们将从先验分布p(z)中取样,我们假设它遵循单位高斯分布。

下图显示了训练在MNIST手写数字数据集上的变分自编码器的解码器网络所生成的数据。在这里,我们从二维高斯采样了一个值的网格,并显示解码器网络的输出。

从自编码器到变分自编码器(其二)

正如你所看到的,每个独立的数字都存在于潜在空间的不同区域,并平滑地从一个数字转换到另一个数字。当你希望在两个观察之间进行插值时,这种平滑的转换非常有用。

发布了292 篇原创文章 · 获赞 1239 · 访问量 564万+

猜你喜欢

转载自blog.csdn.net/App_12062011/article/details/93622153