Files
Notes/机器学习/深度学习模型/03-生成模型/1-VAE-变分自编码器.md
2026-05-16 17:16:51 +08:00

12 KiB
Raw Permalink Blame History

title, draft, tags
title draft tags
1-VAE-变分自编码器 false
VAE
变分自编码器
生成模型
深度学习

变分自编码器 (VAE) 深度推导

1. 引言与问题背景

变分推断Variational Inference, VI 是一种近似贝叶斯后验的方法。在生成模型中,我们假设观测数据 x 是由某些隐变量 z 生成的。

  • 核心目标:最大化边缘似然的对数 $\log p(x)$即证据Evidence从而学习数据的分布。

  • 核心困难:由全概率公式知 $p(x) = \int p(x|z)p(z)dz$。在复杂模型中这个积分往往是不可积的Intractable导致真实后验 p(z|x) = \frac{p(x,z)}{p(x)} 无法直接求解。

  • 变分策略:引入一个参数化的简单分布 $q(z)$(通常假设为高斯分布)来逼近复杂的真实后验 $p(z|x)$。

基本假设

  • 观测数据:x

  • 潜在变量(隐变量):z

  • 联合分布:p(x,z) = p(x|z)p(z)

  • 变分分布:q(z) 满足 \int q(z) dz = 1 且 $q(z) > 0$(在 p(x,z)>0 的支撑集上)。


2. 证据下界 (ELBO) 的积分推导

我们从全概率公式出发,严格使用积分形式进行推导,避免使用期望符号 $\mathbb{E}$,以展现其解析结构。

2.1 引入变分分布

利用恒等式 \frac{q(z)}{q(z)}=1 重写边缘似然:

p(x) = \int p(x, z) dz = \int \frac{p(x, z)}{q(z)} q(z) dz

对两边取对数(注意 \log 是单调递增函数):

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

2.2 利用 Jensen 不等式

引理Jensen 不等式的积分形式

对于凹函数(如 $\log$)以及在支撑集内积分为 1 的非负概率密度函数 $q(z)$,有:

\log \int f(z) q(z) dz \geq \int \log(f(z)) q(z) dz

设定 $f(z) = \frac{p(x, z)}{q(z)}$,代入上式得到:

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

我们定义不等式右侧的积分为 证据下界ELBO, Evidence Lower Bound,记作 $\mathcal{L}(q; x)$

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

3. ELBO 的分解与物理含义

为了理解优化目标,我们将 ELBO 进行项拆解:

3.1 三项展开式

利用对数运算规则和 $p(x,z) = p(x|z)p(z)$,可以将 ELBO 展开为:

\mathcal{L}(q; x) = \int q(z) \log p(x|z) dz + \int q(z) \log p(z) dz - \int q(z) \log q(z) dz
  • 第一项:期望重构似然 \int q(z) \log p(x|z) dz

    • 含义:衡量在给定从变分分布抽取的隐变量 z 时,重构原始数据 x 的准确度。在深度学习中对应重构损失。
  • 第二项:期望对数先验 \int q(z) \log p(z) dz

    • 含义:鼓励变分分布 q(z) 产生的隐变量符合预设的先验分布 $p(z)$(通常是标准正态分布)。
  • 第三项:变分熵 H(q) = -\int q(z) \log q(z) dz

    • 含义:增加分布的不确定性,防止 q(z) 坍缩为单点Delta分布起到正则化作用。

3.2 紧凑形式(重构 + KL 散度)

在实际模型中,通常将后两项合并:

\mathcal{L}(q; x) = \int q(z) \log p(x|z) dz - \int q(z) \log \frac{q(z)}{p(z)} dz \mathcal{L}(q; x) = \text{Reconstruction} - KL(q(z) || p(z))

这种写法直观地展示了 VAE 的权衡:最大化似然的同时,最小化变分分布与先验分布之间的距离。


4. KL 散度与紧致性证明

我们要证明 \log p(x)\mathcal{L}(q; x) 之间的差距正是变分分布与真实后验之间的 KL 散度。

\log p(x) - \mathcal{L}(q; x) = \log p(x) - \int q(z) \log \frac{p(x, z)}{q(z)} dz

由于 $\int q(z) dz = 1$,常数 \log p(x) 可以移入积分:

= \int q(z) \log p(x) dz - \int q(z) \log \frac{p(x, z)}{q(z)} dz = \int q(z) \left( \log p(x) - \log \frac{p(x, z)}{q(z)} \right) dz = \int q(z) \log \frac{p(x) q(z)}{p(x, z)} dz

代入贝叶斯公式 $p(x, z) = p(z|x) p(x)$

= \int q(z) \log \frac{p(x) q(z)}{p(z|x) p(x)} dz = \int q(z) \log \frac{q(z)}{p(z|x)} dz = KL(q(z) || p(z|x))

结论:

\log p(x) = \mathcal{L}(q; x) + KL(q(z) || p(z|x))

因为 $KL \geq 0$,所以 \log p(x) \geq \mathcal{L}(q; x) 始终成立。当且仅当 q(z) = p(z|x)KL 散度为 0下界等号成立。由于 \log p(x) 由数据决定且相对于参数 \phi 为常数,最大化 ELBO 等价于最小化变分分布与真实后验的 KL 散度。


5. VAE 模型实现:重参数化与架构

为了将上述推导转化为可训练的网络,需要解决采样过程中的梯度传播问题。

5.1 重参数化技巧 (Reparameterization Trick)

在 VAE 中,q(z|x) 通常被参数化为高斯分布 $\mathcal{N}(\mu, \sigma^2)$,其中 \mu\sigma 是编码器的输出。

直接从 \mathcal{N}(\mu, \sigma^2) 采样 z 是不可微的。我们引入噪声变量 $\epsilon \sim \mathcal{N}(0, I)$,令:

z = \mu + \sigma \odot \epsilon

这样,z 的随机性转移到了 \epsilon 上,而对于参数 \mu\sigma 则是确定性的线性变换,梯度可以通过 z 回传给编码器。

5.2 损失函数构造

在深度学习中,我们通常最小化损失函数 $\text{Loss} = -\mathcal{L}$。

对于单个样本,损失函数为:

\text{Loss}(x) = ||x - \hat{x}||^2 + KL(\mathcal{N}(\mu, \sigma^2) || \mathcal{N}(0, I))
  • 重构误差:常用 MSE 或交叉熵。

  • KL 正则项:对于高斯分布有解析解(每个维度 i 独立求和):

    KL = -\frac{1}{2} \sum_{i=1}^D \left( 1 + \log \sigma_i^2 - \mu_i^2 - \sigma_i^2 \right)

    其中 D 是隐变量的维度,\mu_i\sigma_i^2 分别是第 i 维的均值和方差。

5.3 架构流程

  1. Encoder (q_\phi(z|x)):输入 $x$,映射到均值 \mu 和方差对数 $\log \sigma^2$。

  2. Sampling:使用重参数化得到隐码 $z$。

  3. Decoder (p_\theta(x|z)):从 z 重构出 $\hat{x}$。

  4. Optimization:通过反向传播同时更新 \phi 和 $\theta$。


6. KL 散度的解析推导(高斯分布情形)

我们给出 VAE 中最常见情形下的 KL 闭式解:高斯先验 $p(z) = \mathcal{N}(0, I)$,高斯变分 $q_\phi(z|x) = \mathcal{N}(\mu, \text{diag}(\sigma^2))$。

6.1 推导过程

设 $z \in \mathbb{R}^D$,记 $q(z) = \mathcal{N}(\mu, \text{diag}(\sigma^2))$$p(z) = \mathcal{N}(0, I)$。

KL(q \| p) = \int q(z) \log \frac{q(z)}{p(z)} dz = \mathbb{E}_{q(z)}[\log q(z) - \log p(z)]

对两项分别计算。

第一项:$\mathbb{E}_{q(z)}[\log q(z)]$

= \mathbb{E}_{q(z)}\left[ -\frac{D}{2}\log(2\pi) - \frac{1}{2}\sum_{i=1}^D \log \sigma_i^2 - \frac{1}{2}\sum_{i=1}^D \frac{(z_i - \mu_i)^2}{\sigma_i^2} \right]

由于 $\mathbb{E}_{q(z)}[(z_i - \mu_i)^2] = \sigma_i^2$,代入得:

\mathbb{E}_{q(z)}[\log q(z)] = -\frac{D}{2}\log(2\pi) - \frac{1}{2}\sum_{i=1}^D \log \sigma_i^2 - \frac{D}{2}

第二项:$\mathbb{E}_{q(z)}[\log p(z)]$

由于 $z_i \sim \mathcal{N}(\mu_i, \sigma_i^2)$,有 $\mathbb{E}_{q(z)}[z_i^2] = \mu_i^2 + \sigma_i^2$

\mathbb{E}_{q(z)}[\log p(z)] = \mathbb{E}_{q(z)}\left[ -\frac{D}{2}\log(2\pi) - \frac{1}{2}\sum_{i=1}^D z_i^2 \right] = -\frac{D}{2}\log(2\pi) - \frac{1}{2}\sum_{i=1}^D (\mu_i^2 + \sigma_i^2)

合并两项

KL = \left[ -\frac{D}{2}\log(2\pi) - \frac{1}{2}\sum_{i=1}^D \log \sigma_i^2 - \frac{D}{2} \right] - \left[ -\frac{D}{2}\log(2\pi) - \frac{1}{2}\sum_{i=1}^D (\mu_i^2 + \sigma_i^2) \right] = -\frac{1}{2}\sum_{i=1}^D \log \sigma_i^2 - \frac{D}{2} + \frac{1}{2}\sum_{i=1}^D (\mu_i^2 + \sigma_i^2) = \frac{1}{2}\sum_{i=1}^D \left( \mu_i^2 + \sigma_i^2 - \log \sigma_i^2 - 1 \right)

直觉解释:第一项 \mu_i^2 鼓励均值接近 0与先验对齐第二项 \sigma_i^2 - \log \sigma_i^2 - 1 惩罚方差偏离 1\sigma_i^2 = 1 时最小)。


7. 与 EM 算法的关系

VAE 与 EMExpectation-Maximization算法有深刻的联系但存在关键区别。

7.1 EM 算法回顾

EM 算法用于求解存在隐变量的最大似然估计,通过交替优化逼近对数似然:

E步:给定当前参数 $\theta^{(t)}$,计算隐变量 z 的后验分布:

q(z) = p(z|x; \theta^{(t)})

M步:最大化关于 \theta 的期望对数似然:

\theta^{(t+1)} = \arg\max_\theta \int q(z) \log \frac{p(x, z; \theta)}{q(z)} dz

7.2 VAE 与 EM 的对应关系

EM 算法 VAE 核心区别
E步推断 $p(z x)$ Encoder $q_\phi(z
M步更新 \theta Decoder $p_\theta(x z)$
目标:\max \mathcal{L} \max \mathcal{L} 共享 ELBO 形式

7.3 关键区别:变分间隙

EM 算法中,q(z) = p(z|x; \theta) 是真实后验,此时 ELBO 等于对数似然 $\log p(x; \theta)$,通过迭代可以找到局部最优。

VAE 中,由于 q_\phi(z|x) 是参数化的近似分布(通常是高斯族),而非真实后验,因此存在变分间隙Variational Gap

\log p(x) - \mathcal{L}(q_\phi, \theta) = KL(q_\phi(z|x) \| p(z|x; \theta)) \geq 0

这意味着 VAE 只能找到似然的下界,而非真实值。这是变分推断的本质限制,也是 VAE 与 EM 的根本区别。


8. 重参数化技巧的深入理解

8.1 为何需要重参数化

假设直接从 q_\phi(z|x) = \mathcal{N}(\mu, \sigma^2) 采样:

z \sim \mathcal{N}(\mu, \sigma^2)

这个采样操作是不可导的。采样结果的期望 \mathbb{E}[z] = \mu 依赖于 $\phi$,但采样过程本身引入了随机性,无法计算反向梯度。

8.2 重参数化的数学保证

定理:设 $\epsilon \sim \mathcal{N}(0, I)$,定义 $z = \mu + \sigma \odot \epsilon$,则 $z \sim \mathcal{N}(\mu, \text{diag}(\sigma^2))$。

证明:令 $z = \mu + L\epsilon$,其中 L 是协方差矩阵 \Sigma = \text{diag}(\sigma^2) 的 Cholesky 分解(对于对角协方差,$L = \text{diag}(\sigma)$)。

对任意可测函数 $g(z)$,做变量替换 $z = \mu + L\epsilon$$dz = |\det(L)| d\epsilon$

\mathbb{E}_{z \sim \mathcal{N}(\mu, \Sigma)}[g(z)] = \int g(z) \frac{1}{(2\pi)^{D/2}|\Sigma|^{1/2}} \exp\left(-\frac{1}{2}(z-\mu)^T \Sigma^{-1}(z-\mu)\right) dz = \int g(\mu + L\epsilon) \frac{1}{(2\pi)^{D/2}} \exp\left(-\frac{1}{2}\epsilon^T \epsilon\right) d\epsilon = \mathbb{E}_{\epsilon \sim \mathcal{N}(0,I)}[g(\mu + L\epsilon)]

因此 z 的分布与 \mu + \sigma \odot \epsilon 相同。

8.3 梯度计算

重构损失为 $L = \mathbb{E}{q\phi(z|x)}[\log p_\theta(x|z)]$。由于重参数化,$z = \mu_\phi(x) + \sigma_\phi(x) \odot \epsilon$,对参数 \phi 的梯度可通过交换积分与微分顺序得到:

\nabla_\phi \mathbb{E}_{\epsilon \sim \mathcal{N}(0,I)}[\log p_\theta(x|\mu_\phi(x) + \sigma_\phi(x) \odot \epsilon)] = \mathbb{E}_{\epsilon \sim \mathcal{N}(0,I)}\left[\nabla_\phi \log p_\theta(x|z)\right]

这使得我们可以用蒙特卡洛估计来近似期望,并通过标准的反向传播计算梯度。


9. 理论严谨性补充

  1. 支撑Support一致性Jensen 不等式的应用前提是 q(z)p(x,z) > 0 的区域内不为 0。如果变分分布的支撑集小于真实分布\frac{p}{q} 可能会发散。

  2. 期望符号的回归:虽然推导过程中使用积分以显其严谨,但在实现时,积分 \int q(z) [...] dz 通过蒙特卡洛采样Monte Carlo Sampling来近似这正是为什么在深度学习代码中我们会看到对样本取平均期望的原因。

  3. 等号成立条件\text{ELBO} = \log p(x) 意味着我们完美找到了后验分布。但在实际中,受限于 q(z) 的函数族如只能是高斯KL 散度通常不为 0这个残差被称为 变分间隙Variational Gap

  4. KL 散度的非对称性:注意 $KL(q | p) \neq KL(p | q)$。在 VAE 中我们使用的是 $KL(q(z|x) | p(z))$,这意味着我们是在最小化从近似后验到先验的距离,而非相反。这个方向的选择是出于计算便利性(高斯到高斯的 KL 有解析解),但也可能导致其他问题(如后验坍缩)。