变分自编码器(VAE)代表了与前几章讨论的自编码器架构相比的显著进展。标准自编码器擅长降维和学习用于重建的压缩表示,而 VAE 则引入了一个概率框架,使其具备强大的生成能力。它们不仅旨在重建输入,而且旨在学习一个平滑、连续且有结构的潜在空间,从中可以生成新的数据样本。本节将解释定义 VAE 的构成要点。从确定性映射到概率性映射的转变标准自编码器学习一个确定性编码器函数。这意味着对于给定的输入 $x$,编码器将其直接映射到潜在空间中的一个单一固定点 $z$。同样,解码器确定性地将该点 $z$ 映射回重建的 $\hat{x}$。然而,VAE 通过引入概率以不同方式运作。VAE 编码器不为输入 $x$ 输出一个单一的潜在向量。相反,它输出描述潜在空间中一个概率分布的参数。通常,这是一个由均值向量 $\mu_x$ 和方差向量 $\sigma_x^2$(或更常见的是其对数 $\log(\sigma_x^2)$,以获得数值稳定性)表征的高斯分布。因此,对于每个输入 $x$,编码器定义了一个分布 $q(z|x)$,我们可以从中采样一个潜在向量 $z$。可以这样理解:一个标准自编码器可能会说:“这个输入图像映射到我的潜在特征图中的这个精确坐标。” 相比之下,VAE 编码器则说:“这个输入图像很可能来自我的潜在特征图中的这个大致区域,一个由这个特定高斯分布描述的区域。”作为分布学习器的编码器VAE 中的编码器网络(通常是一个神经网络)负责学习从输入 $x$ 到概率分布参数的这种映射。对于每个输入,它会生成:一个 均值向量 $\mu$:该向量代表了输入 $x$ 在潜在空间中分布的中心。一个 对数方差向量 $\log(\sigma^2)$:该向量代表了潜在空间每个维度的方差的对数。使用对数方差有助于确保方差 $\sigma^2$ 保持正值。这两个向量 $\mu$ 和 $\log(\sigma^2)$ 完全参数化了该输入在潜在空间中的一个对角高斯分布。这意味着我们可以从输入 $x$ 采样一个潜在向量 $z$,表示为 $z \sim \mathcal{N}(\mu, \text{diag}(\sigma^2))$,其中 $\text{diag}(\sigma^2)$ 是一个对角协方差矩阵,其对角线上是 $\sigma^2$。术语 $q(z|x)$ 是给定输入 $x$ 时潜在变量 $z$ 的这种所学条件概率分布的正式记法。作为生成网络的解码器VAE 中的解码器网络接收一个潜在向量 $z$,旨在重建原始输入 $x$ 或生成新的样本 $\hat{x}$。在训练期间,$z$ 通常从编码器为特定输入 $x$ 定义的分布 $q(z|x)$ 中采样。为了在训练后生成全新的数据,$z$ 从选定的先验分布 $p(z)$ 中采样(通常是标准正态分布)。解码器本身也可以是概率性的,定义一个分布 $p(x|z)$,它对给定潜在向量 $z$ 时观测到数据 $x$ 的概率进行建模。例如:如果输入数据是二元的(例如,黑白图像),$p(x|z)$ 可能是每个像素的伯努利分布。解码器将输出这个伯努利分布的参数(即为白色的概率),重建损失将是二元交叉熵。如果输入数据是连续的(例如,灰度图像中像素强度归一化到 [0,1],或实值特征),$p(x|z)$ 可能是一个高斯分布。解码器将输出这个高斯分布的均值,重建损失将是均方误差 (MSE)。因为解码器可以处理从潜在空间中采样的任何点 $z$(无论是从 $q(z|x)$ 还是 $p(z)$)以生成数据样本,它有效地充当了生成模型。digraph G { rankdir=TB; splines=true; nodesep=0.6; ranksep=0.5; node [shape=box, style="rounded,filled", fillcolor="#e9ecef", color="#495057", fontname="Arial"]; edge [fontname="Arial", color="#495057"]; subgraph cluster_encoder { label = "概率编码器 q(z|x)"; style="rounded,filled"; fillcolor="#a5d8ff"; color="#1c7ed6"; node [fillcolor="#d0bfff"]; X [label="输入 x", shape=ellipse, fillcolor="#b2f2bb"]; EncoderNet [label="神经网络"]; Mu [label="均值 μ"]; LogVar [label="对数方差 log(σ²)"]; X -> EncoderNet; EncoderNet -> Mu; EncoderNet -> LogVar; } subgraph cluster_latent_space { label = "潜在空间"; style="rounded"; color="#adb5bd"; Z_dist [label="潜在分布\n z ~ N(μ, σ²)", shape=ellipse, fillcolor="#ffec99"]; } subgraph cluster_decoder { label = "概率解码器 p(x|z)"; style="rounded,filled"; fillcolor="#ffc9c9"; color="#f03e3e"; node [fillcolor="#fcc2d7"]; DecoderNet [label="神经网络"]; X_hat [label="重建的 x̂\n 或生成的样本", shape=ellipse, fillcolor="#b2f2bb"]; DecoderNet -> X_hat; } Mu -> Z_dist [style=dashed, arrowhead=none, color="#495057"]; LogVar -> Z_dist [style=dashed, arrowhead=none, color="#495057"]; Z_dist -> DecoderNet [label="采样 z", color="#495057"]; graph [label = "变分自编码器架构", fontsize=16, fontcolor="#343a40"]; }变分自编码器中的信息流,显示了概率编码器和解码器组件以及潜在空间中的采样步骤。学习结构化且连续的潜在空间VAE 的一个主要目标是学习一个不仅是压缩的,而且是连续的和有明确结构的潜在空间。连续性意味着如果你取两个在潜在空间中彼此靠近的点 $z_1$ 和 $z_2$,它们对应的解码样本 $\hat{x}_1 = \text{decoder}(z_1)$ 和 $\hat{x}_2 = \text{decoder}(z_2)$ 也应该相似。有明确结构表示沿着潜在空间中的特定方向或路径移动,可能对应于生成数据属性中平滑且可解释的变化(例如,改变面部表情,或调整数字的风格)。为了实现这种理想的结构,VAE 的损失函数(我们将在后续章节详细查看)包含一个重要正则化项。这个正则化项是 Kullback-Leibler (KL) 散度,记作 $D_{KL}(q(z|x) || p(z))$。它衡量编码器为给定输入 $x$ 学习到的分布 $q(z|x)$ 与潜在空间上预定义的先验分布 $p(z)$ 之间的差异。这个先验 $p(z)$ 通常被选择为标准正态分布,即 $\mathcal{N}(0, I)$(在所有维度上均值为零、方差为一的高斯分布)。通过惩罚 $q(z|x)$ 偏离 $p(z)$ 的情况,这个 KL 散度项促使编码器:将输入映射到均值接近零的潜在分布。确保其方差接近一。迫使不同输入的所学分布在原点周围的潜在空间中重叠并填充,而不是聚集成稀疏、孤立的区域。这可以避免 VAE 简单地通过将每个输入分配到一个极小、精确且方差很小的区域来“记忆”输入。这种正则化有助于创建平滑、密集的潜在空间,适合采样和有意义的插值。如果编码器试图使每个输入的 $\sigma^2$ 非常小,以完美地确定其潜在位置(本质上表现得像一个标准自编码器),KL 散度项将施加高额惩罚。VAE 的生成过程一旦 VAE 训练成功,其生成能力可以用来创建新的数据样本,这些样本与训练数据相似但并非直接复制。这个过程很简单:采样潜在向量:从先验分布 $p(z)$ 中抽取一个随机向量 $z_{new}$(例如,从 $\mathcal{N}(0, I)$)。解码潜在向量:将这个 $z_{new}$ 通过训练好的解码器网络。获得新样本:解码器的输出,$\hat{x}{new} = \text{decoder}(z{new})$,是一个新颖的数据样本。这种从表现良好的潜在空间采样并生成新颖、一致数据的能力是 VAE 的一个显著特点,使其与较简单的自编码器变体区分开来。概率编码和 KL 正则化是支持这一能力的双重支柱。然而,在训练期间从 $q(z|x)$ 采样的行为引入了一个随机步骤,这通常会阻止梯度流回编码器。一种称为“重参数化技巧”的巧妙方法,很快就会讲到,优雅地解决了这个难题,从而实现使用标准反向传播对 VAE 进行端到端训练。