深度生成模型(三)——变分自编码器 VAE

生成式模型的基础模型主要有两种:变分自编码器(Variational Auto-Encoder, VAE)和生成对抗网络(Generative Adversari Network, GAN)

VAE 通过引入隐变量 z 来捕捉数据的潜在结构,并利用变分推断方法来近似计算数据的似然。其目标是最大化变分下界(Evidence Lower Bound, ELBO)

GAN 由生成器 G 和判别器 D 组成,其目标是通过博弈论的方式达到如下目标:

  • 生成器:生成尽可能逼真的样本,使得判别器无法区分生成样本与真实样本
  • 判别器:区分真实样本和生成样本

其训练过程通常采用交替优化的方式

在之前的笔记文章中,已经介绍了 Transformer,从训练方式上看,其主要采用有监督学习。对于 GPT 预留一个坑位后面再填,也可以直接参考这些文章,其主要利用自监督学习实现大规模预训练。而自编码器(Auto Encoder, AE)、变分自编码器(Variational Auto Encoder, VAE)以及条件变分自编码器(Conditional Variational Auto Encoder, CVAE)这些模型,均通过无监督的方式从数据中提取潜在特征,学习数据的内在分布

目录

1 自编码器 Auto Encoder

1.1 编码器与解码器

1.2 训练目标与重构损失

1.3 潜在特征与数据降维

1.4 最简单的自编码器网络结构

2 变分自编码器(Variational Auto Encoder, VAE)

2.1 从确定性编码到概率分布建模

2.2 重参数化技巧

2.3 模型结构与损失函数

2.3.1 重构损失

2.3.2 KL 散度损失

2.3.3 联合损失函数

2.4 模型生成过程

2.5 小结

3 利用高斯混合模型构建数据分布与 VAE 损失函数推导

3.1 数据分布的高斯叠加表示

3.2 从离散编码到连续编码

3.3 利用 Jensen 不等式构造变分下界

3.4 VAE 损失函数的推导与优化


1 自编码器 Auto Encoder

自编码器(Auto Encoder, AE)的主要作用在于提取数据的关键特征,这些关键特征也被称为潜在特征(Latent Feature)或特征向量(Feature Vector)

假设有一组 D 维的样本

x^{(n)} \in \mathbb{R}^D,\quad 1\leq n\leq N

自编码器的目标是将这些样本映射到一个低维特征空间,从而得到每个样本的编码

z^{(n)} \in \mathbb{R}^M,\quad 1\leq n\leq N

并利用这些编码能够重构出原始样本

自编码器的模型结构整体可以分为两个部分:编码器解码器

1.1 编码器与解码器

编码器(Encoder)
定义为 f: \mathbb{R}^D \to \mathbb{R}^M,将输入 x 映射为低维表示 z

解码器(Decoder)
定义为 g: \mathbb{R}^M \to \mathbb{R}^D,根据编码 z 重构出原始输入 x

1.2 训练目标与重构损失

自编码器的学习目标是最小化重构误差(Reconstruction Error),即使得重构数据 \hat{x} 与原始数据 x 尽可能接近。通常用均方误差(Mean Squared Error, MSE)衡量重构误差:

\mathcal{L}_{\text{AE}} = \sum_{n=1}^{N} \| x^{(n)} - \hat{x}^{(n)} \|^2

其中 \hat{x}^{(n)} = g(f(x^{(n)}))

在训练过程中,通过最小化该损失函数,模型能够学习到一种低维表示,该表示不仅压缩了数据,而且保留了数据中的关键信息

1.3 潜在特征与数据降维

通过自编码器的编码过程,我们可以得到数据的低维特征向量 z,这些向量捕捉了数据中的主要变化和结构信息。潜在特征具有以下几个优点:

  • 数据压缩:将高维数据压缩到低维空间,减少存储和传输的需求
  • 降维与可视化:低维表示可以用于数据可视化和聚类等任务,帮助更好地理解数据的内在结构
  • 去噪:在训练过程中,自编码器能够自动剔除数据中的冗余信息和噪声,提取出有用的特征

当自编码器能够完美地重构原始数据时,我们可以认为所提取的低维特征 z 已经充分捕捉到了原始数据的核心信息

自编码器的训练目标在于得到一种有效的数据表示。经过训练后,通常会去掉解码器部分,只保留编码器 f 作为数据的特征提取器。得到的低维特征向量 z 可以直接作为后续机器学习任务(如聚类、降维、数据可视化或作为其他模型的输入)的输入

1.4 最简单的自编码器网络结构

最简单的自编码器可以采用两层神经网络结构。其基本流程为:

1. 编码过程

输入层到隐藏层用于编码,将样本 x 映射到隐藏层获得编码 z

z = f\big(W^{(1)}x + b^{(1)}\big)

其中 W^{(1)} 和 b^{(1)} 分别为编码器的权重矩阵和偏置,f(\cdot) 是激活函数(例如 ReLU 或 sigmoid)

2. 解码过程

隐藏层到输出层用于解码,通过重构函数 g 将编码 z 映射回原始数据空间,得到重构样本 x′

x' = f\big(W^{(2)}z + b^{(2)}\big)

其中 W^{(2)} 和 b^{(2)} 为解码器的参数

一种常见的策略是采用捆绑权重(Tied Weight),即令

W^{(2)} = \big(W^{(1)}\big)^\top

这种方式可以减少模型参数的数量,同时起到一定的正则化作用,有助于提高模型的泛化能力

对于输入样本 x^{(n)} \in [0,1]^D(例如图像像素值归一化到 [0,1]),通常会在重构误差中加入正则化项,其目标函数可表示为:

\mathcal{L}_{\text{AE}} = \sum_{n=1}^{N} \| x^{(n)} - x'^{(n)} \|^2 + \lambda \, \Omega(\theta)

其中 λ 为正则化项系数,Ω(θ) 表示对网络参数的约束(例如权重衰减或稀疏性约束)

2 变分自编码器(Variational Auto Encoder, VAE)

在传统自编码器中,利用编码器将原始数据转换为特征向量,再通过解码器重构出原始数据。然而,普通自编码器仅能重现训练样本,其生成的关键特征均依赖于已有数据,因此难以生成不在训练数据中的新样本。为了解决这一问题,变分自编码器(Variational Auto Encoder, VAE)引入了对特征向量分布的假设,使得可以通过学习参数化的分布,从中采样生成全新数据

2.1 从确定性编码到概率分布建模

在 VAE 中,编码器不再直接输出确定性的特征向量 z,而是输出描述 z 分布的参数。通常假设 z 服从正态分布,即

q_\phi(z \mid x) = \mathcal{N}(z; \mu(x), \operatorname{diag}(\sigma^2(x)))

其中:μ(x) 表示均值向量;\sigma^2(x)表示方差向量(通常对每一维独立建模)

通过这种方式,将原始数据 x 映射到一个概率分布参数空间中,从而允许我们从该分布中采样新的特征向量 z′,再由解码器生成新的数据 x′

2.2 重参数化技巧

由于采样操作本身是一个非线性、不可导的过程,直接对 z 进行采样无法进行梯度计算和反向传播优化。为了解决这一问题,VAE 引入了 重参数化技巧(Reparameterization Trick),其基本思想是将随机采样操作转换为一个确定性操作和随机噪声的组合。具体来说可以表示为:

z = \mu(x) + \sigma(x) \odot \epsilon, \quad \epsilon \sim \mathcal{N}(0, I)

其中:⊙ 表示逐元素相乘;ϵ 来自标准正态分布 N(0,I)

通过这种方式,随机性被隔离在 ϵ 中,而 μ(x)σ(x) 均为网络输出,可直接进行梯度传播,从而使整个采样过程可微分

2.3 模型结构与损失函数

变分自编码器的整体结构与传统自编码器类似,包含编码器和解码器两个部分,但中间通过概率分布进行连接。VAE 的训练过程中需要同时优化两个方面的损失函数:

2.3.1 重构损失

重构损失用于衡量重构数据 \hat{x} 与原始数据 x 之间的差异,常用的度量包括 L2 损失或 L1 损失。例如,使用均方误差(MSE)表示为:

\mathcal{L}_{\text{rec}} = \mathbb{E}_{q_\phi(z \mid x)}\left[\| x - \hat{x} \|^2\right]

其中: \hat{x} = g_\theta(z)是通过解码器生成的重构数据

2.3.2 KL 散度损失

KL 散度用于衡量编码器输出的后验分布 q_\phi(z \mid x) 与预设先验分布 p(z)(通常设为标准正态分布 N(0,I))之间的差异。KL 散度项可写为:

\mathcal{L}_{\text{KL}} = \operatorname{KL}\Big(q_\phi(z \mid x) \,\Big\|\, p(z)\Big)

对于多维正态分布,KL 散度有解析解:

\operatorname{KL}\Big(\mathcal{N}(\mu, \operatorname{diag}(\sigma^2)) \,\Big\|\, \mathcal{N}(0, I)\Big) = \frac{1}{2} \sum_{i=1}^{M} \left(\mu_i^2 + \sigma_i^2 - \log \sigma_i^2 - 1\right)

2.3.3 联合损失函数

VAE 的最终目标是同时使重构数据与原始数据尽可能一致,并保证隐变量 z 的分布接近先验分布。因此,总的损失函数为重构损失和 KL 散度损失的加权和:

\mathcal{L}_{\text{VAE}} = \mathcal{L}_{\text{rec}} + \beta \, \mathcal{L}_{\text{KL}}

其中 β 是一个超参数,用于平衡重构损失与 KL 散度之间的权重

2.4 模型生成过程

训练完成后,我们可以利用解码器 g_\theta​ 来生成全新的数据。具体过程如下:

1. 采样隐变量

从标准正态分布 N(0,I) 中采样隐变量 z′

z' \sim \mathcal{N}(0, I)

2. 生成数据

通过解码器将采样得到的 z′ 映射到数据空间,生成新数据 x′

x' = g_\theta(z')

这种方法使得 VAE 不仅能够重构训练数据,还可以生成多样化的新样本,实现从有限训练数据到无限数据生成的转化

2.5 小结

  1. 核心思想:VAE 在传统自编码器的基础上引入了概率分布的概念,通过学习隐变量的分布参数(均值和方差),使得模型具备生成新样本的能力
  2. 重参数化技巧:通过将隐变量 z 表示为 \mu(x) + \sigma(x) \odot \epsilon,使得采样过程可导,从而支持反向传播和梯度优化
  3. 联合损失函数:由重构损失和 KL 散度损失组成,既确保数据的高质量重构,又约束隐变量分布接近先验分布
  4. 生成新样本:训练后从标准正态分布中采样 z′,通过解码器生成全新数据,实现了数据生成与变换的能力

VAE 的这种设计解决了普通自编码器无法生成新数据的问题,逻辑架构如下图所示

3 利用高斯混合模型构建数据分布与 VAE 损失函数推导

在概率建模中,一个重要的理论基础是:任何数据分布都可以看作若干高斯分布的叠加。这种思想可以通过高斯混合模型(Gaussian Mixture Model, GMM)来直观描述

3.1 数据分布的高斯叠加表示

假设样本数据 x 的分布为 p(x;θ),其中参数 θ 包括各个高斯分布的均值 μ 和标准差(或方差) σ 等。理论证明,当将足够数量的高斯分布(例如 512 个)进行叠加时,其合成的分布可以非常精确地近似原始分布 p(x;θ)(见下图)。图中展示了若干浅色曲线对应的各个高斯分布,其叠加效果几乎完美再现了 p(x;θ)

一种最直接的思路是:将每组高斯分布的参数作为一个编码值实现编码。在离散的情形下,我们设编码变量为 i(例如在 512 维编码中,i=1,2,…,512),并且 i 服从一个多项式分布 p(i)。每采样一个 i,就对应一个“小的”高斯分布,从而得到:

p(x;\theta) = \sum_{i} p(i) \, \mathcal{N}(x;\mu_i,\sigma_i^2)

如下图所示,这种离散编码方式将整个数据分布视为多个高斯分布的叠加。然而,这种编码方式存在缺陷:离散编码往往会出现大量失真区域,无法连续地表达数据的变化

3.2 从离散编码到连续编码

为改进上述方法,将离散变量 i 变为连续的编码 z。此时,假设隐变量 z 本身服从某种分布(通常假设为高斯分布,但也可以是其他分布)。对于每个采样的 z,我们引入两个函数分别确定该 z 对应的高斯分布的均值和方差,然后在积分域上对所有高斯分布进行累加,就能得到原始分布 p(x;θ)

p(x;\theta) = \int p(x \mid z;\theta) \, p(z) \, dz

通常,为了求得 p(x;θ) 的极值,我们对其取对数,得到似然函数 logp(x;θ)。然而,由于隐变量 z 通常是高维向量,直接计算积分 ∫p(x,z;θ)dz 是非常困难的,即使利用数值积分方法处理高维积分也极为不便

解决这一问题的一种思路是采用似然函数的下界进行优化,通过不断提升下界来间接增大似然函数的值,直至收敛到局部或全局最优解

3.3 利用 Jensen 不等式构造变分下界

根据 Jensen 不等式,我们可以证明:

\log p(x;\theta) = \log \int q(z) \frac{p(x,z;\theta)}{q(z)} dz \geq \int q(z) \log \frac{p(x,z;\theta)}{q(z)} dz

其中 q(z) 是任意的概率分布。为使下界最紧,我们通常取 q(z) = q(z|x)(即使用编码器输出的近似后验分布)。整个训练过程如下图所示

经过这一转换,最大化边缘对数似然就等价于最大化下界函数(即 ELBO, Evidence Lower Bound):

\mathcal{L}_{\text{ELBO}} = \mathbb{E}_{q(z|x)}\left[\log p(x|z;\theta)\right] - \operatorname{KL}\Big(q(z|x) \,\Big\|\, p(z)\Big)

其中:

  • 第一项 \mathbb{E}_{q(z|x)}\left[\log p(x|z;\theta)\right] 类似于自编码器的重构损失(希望重构数据尽可能接近原始数据)
  • 第二项 \operatorname{KL}\Big(q(z|x) \,\|\, p(z)\Big) 用于衡量编码器输出的隐变量分布与先验 p(z)(通常为标准正态分布)之间的差异,起到正则化作用

3.4 VAE 损失函数的推导与优化

因此,VAE 的最终优化目标是联合最大化重构项和最小化 KL 散度项。具体来说,其损失函数可以写为:

\mathcal{L}_{\text{VAE}} = \underbrace{-\mathbb{E}_{q(z|x)}\left[\log p(x|z;\theta)\right]}_{\text{Reconstruction Loss}} + \underbrace{\operatorname{KL}\Big(q(z|x) \,\Big\|\, p(z)\Big)}_{\text{KL Divergence Loss}}

最小化这个损失函数相当于:

  • 使得在给定编码器输出的情况下,解码器能生成尽可能接近真实数据的样本(重构损失最小化)
  • 同时,使编码器输出的隐变量分布 q(z|x) 与设定的先验 p(z) 之间的差异最小(KL 散度最小化)

其核心思想是:最小化 KL 散度能使编码器输出的 μi​σi 接近 0 与 1,从而保证潜在空间的多样性和可控性

这种通过对隐变量施加正态分布约束,并利用重参数化技巧将求解边缘似然问题转化为优化下界函数的方式,正是 VAE 的核心创新