--- title: 1-VAE-变分自编码器 draft: false tags: - 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 与 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|x)$ | EM 中精确求解;VAE 中用神经网络近似 | | M步:更新 $\theta$ | Decoder $p_\theta(x|z)$ | EM 中精确优化;VAE 中用梯度下降 | | 目标:$\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 有解析解),但也可能导致其他问题(如后验坍缩)。