<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>变分自编码器 on WhateverZ</title><link>https://whateverzpy.github.io/Zlog/tags/%E5%8F%98%E5%88%86%E8%87%AA%E7%BC%96%E7%A0%81%E5%99%A8/</link><description>Recent content in 变分自编码器 on WhateverZ</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 01 Apr 2026 13:00:08 +0800</lastBuildDate><atom:link href="https://whateverzpy.github.io/Zlog/tags/%E5%8F%98%E5%88%86%E8%87%AA%E7%BC%96%E7%A0%81%E5%99%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>图像生成（一）——变分自编码器（VAE）</title><link>https://whateverzpy.github.io/Zlog/post/9-vae/</link><pubDate>Wed, 01 Apr 2026 12:07:08 +0800</pubDate><guid>https://whateverzpy.github.io/Zlog/post/9-vae/</guid><description>&lt;h2 id="1-引言从自编码器ae说起ae是如何工作的"&gt;1. 引言：从自编码器（AE）说起，AE是如何工作的？
&lt;/h2&gt;&lt;p&gt;要理解 VAE，我们必须先理解它的前身——&lt;strong&gt;自编码器（Autoencoder, AE）&lt;/strong&gt;。自编码器是一种无监督学习模型，其核心目标是&lt;strong&gt;数据压缩与重建&lt;/strong&gt;。它的架构由两部分组成：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;编码器（Encoder）：&lt;/strong&gt; 接收高维的输入数据 $x$（比如一张图片），将其压缩映射到一个低维的潜在空间（Latent Space），得到一个潜在向量（Latent Vector）$z$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解码器（Decoder）：&lt;/strong&gt; 接收这个低维向量 $z$，尝试将其还原回原始的高维数据 $\tilde{x}$。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;AE 是如何做到的？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AE 的训练目标非常简单：最小化输入 $x$ 和输出 $\tilde{x}$ 之间的&lt;strong&gt;重构误差（Reconstruction Error）&lt;/strong&gt;。它通常使用均方误差（MSE）或交叉熵作为损失函数。当训练完成后，AE 的编码器就学会了如何提取数据中最重要的特征，而解码器则学会了如何从这些特征中重构数据。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="2-传统-ae-的致命缺陷为什么-ae-不能用来生成"&gt;2. 传统 AE 的致命缺陷：为什么 AE 不能用来“生成”？
&lt;/h2&gt;&lt;p&gt;虽然 AE 在数据压缩和特征提取上表现出色，但如果你想用它来&lt;strong&gt;生成全新的图像&lt;/strong&gt;（例如从潜在空间中随机抽取一个向量 $z$，让解码器生成一张没见过的逼真人脸），AE 会彻底失败。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么 AE 做不到？它有什么问题？&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;死记硬背的确定性映射：&lt;/strong&gt; 传统 AE 的编码器是一个&lt;strong&gt;确定性&lt;/strong&gt;（Deterministic）的函数。它将训练集里的每一张图片死死地映射到潜在空间中的一个固定点。模型只是在“记住”这些点如何还原，而不是在学习数据的内在生成规律。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;潜空间缺乏正则化（离散与空洞）：&lt;/strong&gt; 传统 AE 的训练准则仅仅是最大化重构能力，这不足以让模型学习到有用的生成表示。如果缺乏正则化，AE 很容易“作弊”：它会构造一个尺度任意放大、方差极高的潜在空间。在这个空间里，训练数据映射的点彼此之间离得非常远，点与点之间充满了巨大的“空洞”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;随机采样得到无意义的乱码：&lt;/strong&gt; 如果你试图从 AE 的潜在空间中随机抽取一个点 $z$ 送入解码器，由于这个点极大概率落在了“空洞”里（即模型在训练时从未见过的区域），解码器根本不知道该如何处理它，最终只能输出毫无意义的乱码或模糊的噪声。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;简而言之：&lt;strong&gt;传统 AE 没有对潜在空间的概率分布进行任何约束，导致其潜在空间是不连续的，无法用于随机采样和插值生成。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="3-破局之道vae-相对于-ae-的优点与核心思想"&gt;3. 破局之道：VAE 相对于 AE 的优点与核心思想
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;为什么 VAE 可以做到生成？它比 AE 强在哪里？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;变分自编码器（VAE）巧妙地将深度学习（神经网络）与贝叶斯概率图模型结合在了一起。它解决 AE 缺陷的核心思想是：&lt;strong&gt;不再将输入映射为潜空间中的一个“固定的点”，而是将其映射为一个“概率分布”（通常是高斯分布）。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;VAE 相对于 AE 的核心优点：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;引入连续的概率分布：&lt;/strong&gt; VAE 的编码器输出的不再是固定的向量 $z$，而是高斯分布的参数（均值 $\mu$ 和方差 $\sigma^2$）。这意味着每一张图片被映射成了潜空间中的一个“势力范围”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;强大的正则化（KL散度）：&lt;/strong&gt; VAE 强制要求这些后验分布去逼近一个标准的先验分布（通常是标准正态分布 $\mathcal{N}(0, I)$）。这种约束迫使不同的数据点在潜空间中紧密且平滑地排列在一起，消除了“空洞”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;完美的插值与采样能力：&lt;/strong&gt; 由于潜空间被标准正态分布平滑地填满，我们可以直接从 $\mathcal{N}(0, I)$ 中随机采样 $z$，解码器也能将其映射为一张有意义且逼真的全新图像。此外，在两个潜向量之间进行线性插值，还能生成语义上平滑过渡的图像。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="4-vae-的硬核推导原始论文中的关键点与公式"&gt;4. VAE 的硬核推导：原始论文中的关键点与公式
&lt;/h2&gt;&lt;p&gt;让我们深入 VAE 原始论文&lt;a class="link" href="https://arxiv.org/abs/1312.6114" target="_blank" rel="noopener"
&gt;《Auto-Encoding Variational Bayes》&lt;/a&gt;，看看这一过程是如何通过严谨的数学推导实现的。&lt;/p&gt;
&lt;h3 id="41-问题的设定与不可解的真实后验"&gt;4.1 问题的设定与不可解的真实后验
&lt;/h3&gt;&lt;p&gt;假设我们的数据 $x$ 是由一些连续的、未观测到的潜在变量 $z$ 生成的。生成过程分为两步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;从先验分布 $p_{\theta^*}(z)$ 中生成 $z$；&lt;/li&gt;
&lt;li&gt;从条件分布 $p_{\theta^*}(x|z)$ 中生成 $x$。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我们希望最大化数据的边际似然 $p_\theta(x)$。但这里遇到了一个致命问题：为了计算 $p_\theta(x) = \int p_\theta(z)p_\theta(x|z)dz$，我们需要积分掉所有可能的 $z$，这个积分在面对复杂的非线性神经网络时是&lt;strong&gt;完全不可解（Intractable）的&lt;/strong&gt;。同时，真实的后验分布 $p_\theta(z|x) = \frac{p_\theta(x|z)p_\theta(z)}{p_\theta(x)}$ 也是不可解的，导致传统的 EM 算法无法使用。&lt;/p&gt;
&lt;h3 id="42-引入变分推理与变分下界elbo"&gt;4.2 引入变分推理与变分下界（ELBO）
&lt;/h3&gt;&lt;p&gt;为了解决不可解的问题，VAE 引入了一个参数化的&lt;strong&gt;推断模型（识别模型/编码器）&lt;/strong&gt; $q_\phi(z|x)$，用它来近似那个不可解的真实后验 $p_\theta(z|x)$。&lt;/p&gt;
&lt;p&gt;现在，我们可以对单个数据点 $x^{(i)}$ 的对数似然进行分解：
&lt;/p&gt;
$$ \log p_\theta(x^{(i)}) = D_{KL}(q_\phi(z|x^{(i)}) || p_\theta(z|x^{(i)})) + \mathcal{L}(\theta, \phi; x^{(i)}) $$&lt;p&gt;公式右侧的第一项是近似后验与真实后验之间的 KL 散度（Kullback-Leibler Divergence）。因为 KL 散度永远大于等于 0，所以第二项 $\mathcal{L}(\theta, \phi; x^{(i)})$ 就构成了数据对数似然的一个&lt;strong&gt;严格下界（Lower Bound）&lt;/strong&gt;，在 VAE 中我们称之为 &lt;strong&gt;ELBO (Evidence Lower Bound)&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;由于我们无法直接最大化似然函数，VAE 的目标转为：&lt;strong&gt;最大化这个变分下界（ELBO） $\mathcal{L}$&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;ELBO的公式可以写为：
&lt;/p&gt;
$$ \mathcal{L}(\theta, \phi; x^{(i)}) = -D_{KL}(q_\phi(z|x^{(i)}) || p_\theta(z)) + \mathbb{E}_{q_\phi(z|x^{(i)})}[\log p_\theta(x^{(i)}|z)] $$&lt;p&gt;仔细观察这个公式，它完美地解释了 VAE 的双重目标：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;重构误差（Reconstruction Error）：&lt;/strong&gt; $\mathbb{E}_{q_\phi(z|x^{(i)})}[\log p_\theta(x^{(i)}|z)]$。这要求解码器 $p_\theta(x|z)$ 能够尽可能好地从潜变量 $z$ 中复原出数据 $x$（与传统 AE 的目标一致）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正则化项（Regularization）：&lt;/strong&gt; $-D_{KL}(q_\phi(z|x^{(i)}) || p_\theta(z))$。这要求编码器输出的近似后验 $q_\phi(z|x)$ 必须尽可能接近先验分布 $p_\theta(z)$（通常是 $\mathcal{N}(0, I)$）。正是这个项，彻底解决了传统 AE 潜空间随意发散、存在空洞的致命缺陷。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id="5-vae的绝对核心魔法重参数化技巧-reparameterization-trick"&gt;5. VAE的绝对核心魔法：重参数化技巧 (Reparameterization Trick)
&lt;/h2&gt;&lt;p&gt;到目前为止，理论很完美，但在工程实现时我们遇到了一个巨大的障碍：我们需要通过反向传播（Backpropagation）来同时优化编码器参数 $\phi$ 和解码器参数 $\theta$。然而，在计算重构误差期望时，潜变量 $z$ 是从分布 $q_\phi(z|x)$ 中&lt;strong&gt;随机采样&lt;/strong&gt;出来的（即 $z \sim q_\phi(z|x)$）。然而&lt;strong&gt;随机采样这个操作是不可导的&lt;/strong&gt;，我们无法将梯度 $∇_\phi$ 穿过这个随机采样的节点传递给编码器神经网络。&lt;/p&gt;
&lt;p&gt;如果用朴素的蒙特卡洛梯度估计器（如 Score Function Estimator / REINFORCE），会导致方差极大，模型根本无法训练。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;重参数化技巧（Reparameterization Trick）的引入&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;为了让梯度能够顺利反向传播，Kingma 等人提出了极其巧妙的转换：&lt;strong&gt;我们将随机性剥离出来，作为一个独立的输入。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 VAE 中，我们假设 $q_\phi(z|x)$ 是一个对角协方差的多变量高斯分布。
我们不再直接从 $\mathcal{N}(\mu, \sigma^2)$ 中采样 $z$。相反，我们先从一个标准正态分布中采样一个&lt;strong&gt;辅助噪声变量 $\epsilon \sim \mathcal{N}(0, I)$&lt;/strong&gt;，然后再通过一个确定性的连续函数对其进行变换：
&lt;/p&gt;
$$ z = g_\phi(x, \epsilon) = \mu + \sigma \odot \epsilon $$&lt;p&gt;&lt;em&gt;注：这里的 $\mu$ 和 $\sigma$ 都是由编码器神经网络根据 $x$ 计算出的确定性输出，$\odot$ 表示逐元素相乘。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;通过这个等价替换，随机性被完全转移到了与参数 $\phi$ 无关的辅助变量 $\epsilon$ 上。现在的 $z$ 成为了关于 $\mu$ 和 $\sigma$ 的&lt;strong&gt;确定性且可导的函数&lt;/strong&gt;。梯度现在可以像走高速公路一样，无障碍地穿过 $\mu$ 和 $\sigma$，一直反向传播到编码器神经网络的权重上，这彻底移除了梯度计算的信息瓶颈。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="6-sgvb-估计器与最终优化的目标函数"&gt;6. SGVB 估计器与最终优化的目标函数
&lt;/h2&gt;&lt;p&gt;有了重参数化技巧，原始论文提出了&lt;strong&gt;随机梯度变分贝叶斯估计器（Stochastic Gradient Variational Bayes, SGVB）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我们用重参数化的单次蒙特卡洛采样来近似期望，ELBO 的估计器可以写为：
&lt;/p&gt;
$$ \tilde{\mathcal{L}}_B(\theta, \phi; x^{(i)}) = -D_{KL}(q_\phi(z|x^{(i)}) || p_\theta(z)) + \frac{1}{L} \sum_{l=1}^L \log p_\theta(x^{(i)}|z^{(i,l)}) $$&lt;p&gt;
其中，$z^{(i,l)} = \mu^{(i)} + \sigma^{(i)} \odot \epsilon^{(l)}$，且 $\epsilon^{(l)} \sim \mathcal{N}(0, I)$。在实际训练的每一个 Minibatch 中，对于每个样本通常只采一次样（$L=1$）就足够让 SGD 收敛了。&lt;/p&gt;
&lt;p&gt;最后，由于先验 $p_\theta(z)$ 和后验 $q_\phi(z|x)$ 都是高斯分布，那个一直困扰我们的 KL 散度项可以直接求出&lt;strong&gt;解析解（Closed-form analytical solution）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;对于特征维度为 $J$ 的潜空间，KL 散度的解析解公式为：
&lt;/p&gt;
$$ -D_{KL}(q_\phi(z) || p_\theta(z)) = \frac{1}{2} \sum_{j=1}^J \left( 1 + \log((\sigma_j)^2) - (\mu_j)^2 - (\sigma_j)^2 \right) $$&lt;p&gt;将解析解和重构误差结合，我们就得到了 VAE &lt;strong&gt;最终实际用于代码训练的损失函数（单样本）&lt;/strong&gt;：
&lt;/p&gt;
$$ \mathcal{L}(\theta, \phi; x^{(i)}) \simeq \frac{1}{2} \sum_{j=1}^J \left( 1 + \log((\sigma_j^{(i)})^2) - (\mu_j^{(i)})^2 - (\sigma_j^{(i)})^2 \right) + \log p_\theta(x^{(i)} | z^{(i)}) $$&lt;p&gt;
&lt;em&gt;（其中 $z^{(i)} = \mu^{(i)} + \sigma^{(i)} \odot \epsilon$， 这是一个可导的重构误差项）&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="7-结语"&gt;7. 结语
&lt;/h2&gt;&lt;p&gt;从传统 AE 的确定性压缩，到 VAE 的概率性推断，变分自编码器完成了一次生成模型的伟大跨越。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AE 失败于：&lt;/strong&gt; 缺乏对潜空间分布的宏观约束，任由模型死记硬背，导致潜空间充满不可解的空洞。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VAE 成功于：&lt;/strong&gt; 引入&lt;strong&gt;变分下界（ELBO）&lt;strong&gt;将生成目标严谨地转化为可优化的数学问题；使用 &lt;strong&gt;KL散度&lt;/strong&gt; 强迫潜空间紧凑排列形成平滑的连续空间；最重要的是，发明了&lt;/strong&gt;重参数化技巧（Reparameterization Trick）&lt;/strong&gt;，打通了随机采样节点的反向传播血脉。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;正是这些数学设计，使得 VAE 具备了极其强大的数据表示学习和生成能力，也为后来更为强大的扩散模型（如 LDM，实际上也是将 Diffusion 过程应用于 VAE 提取的潜空间中）奠定了坚实的基础。&lt;/p&gt;</description></item></channel></rss>