12 KiB
title, draft, tags
| title | draft | tags | ||||
|---|---|---|---|---|---|---|
| 1-VAE-变分自编码器 | false |
|
变分自编码器 (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 架构流程
-
Encoder (
q_\phi(z|x)):输入 $x$,映射到均值\mu和方差对数 $\log \sigma^2$。 -
Sampling:使用重参数化得到隐码 $z$。
-
Decoder (
p_\theta(x|z)):从z重构出 $\hat{x}$。 -
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 与 EM(Expectation-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. 理论严谨性补充
-
支撑(Support)一致性:Jensen 不等式的应用前提是
q(z)在p(x,z) > 0的区域内不为 0。如果变分分布的支撑集小于真实分布,\frac{p}{q}可能会发散。 -
期望符号的回归:虽然推导过程中使用积分以显其严谨,但在实现时,积分
\int q(z) [...] dz通过蒙特卡洛采样(Monte Carlo Sampling)来近似,这正是为什么在深度学习代码中我们会看到对样本取平均(期望)的原因。 -
等号成立条件:
\text{ELBO} = \log p(x)意味着我们完美找到了后验分布。但在实际中,受限于q(z)的函数族(如只能是高斯),KL 散度通常不为 0,这个残差被称为 变分间隙(Variational Gap)。 -
KL 散度的非对称性:注意 $KL(q | p) \neq KL(p | q)$。在 VAE 中我们使用的是 $KL(q(z|x) | p(z))$,这意味着我们是在最小化从近似后验到先验的距离,而非相反。这个方向的选择是出于计算便利性(高斯到高斯的 KL 有解析解),但也可能导致其他问题(如后验坍缩)。