证据下界(ELBO)是训练变分自编码器时最大化的目标函数。它包含两个主要组成部分:重建似然和库尔巴克-莱布勒(KL)散度项。$$ \mathcal{L}{ELBO}(\theta, \phi; x) = \mathbb{E}{z \sim q_\phi(z|x)}[\log p_\theta(x|z)] - D_{KL}(q_\phi(z|x) || p(z)) $$我们在此分析的项是 $D_{KL}(q_\phi(z|x) || p(z))$。这个KL散度衡量了编码器产生的分布 $q_\phi(z|x)$ 偏离潜在变量的选定先验分布 $p(z)$ 的程度。KL散度的作用:规范化潜在空间可以将KL散度项视为一个规范项。它的主要作用是为潜在空间赋予一种结构。如果没有它,编码器 $q_\phi(z|x)$ 可能会学会将不同输入 $x$ 的编码放置在潜在空间中任意、不重叠的区域。虽然这可能使重建更容易(因为每个 $x$ 得到一个独有、易于解码的代码 $z$),但这会给生成带来严重问题。如果我们要从先验 $p(z)$ 中采样一个 $z$ 来生成一个新的数据点,它可能会落入编码集群之间的“空白”区域,从而导致解码器 $p_\theta(x|z)$ 产生无意义的输出。KL散度项迫使所有输入数据点 $x$ 的分布 $q_\phi(z|x)$ 保持“接近”先验分布 $p(z)$。通常,先验 $p(z)$ 会选为具有零均值和单位方差的简单、标准多变量高斯分布,常表示为 $N(0, I)$。通过最小化 $D_{KL}(q_\phi(z|x) || p(z))$,我们促使编码器进行如下操作:使编码居中:编码分布 $q_\phi(z|x)$ 的均值被推向原点(先验的均值)。控制方差:编码分布的方差被推向1(先验的方差)。促成重叠:确保不同输入的编码分布存在一些重叠,从而创建一个更平滑、更连续的潜在空间,没有大的间隙。这种规范化使得潜在空间更适合生成。当我们从 $p(z)$ 中采样 $z$(即从标准高斯分布中采样)时,采样的 $z$ 很可能位于解码器在训练期间遇到过的潜在空间区域中(因为编码的 $q_\phi(z|x)$ 分布被推向了 $p(z)$)。因此,解码器可以生成更连贯和有意义的数据点。KL规范化的效果可视化设想将两个不同的输入数据点 $x_1$ 和 $x_2$ 编码为潜在分布 $q_\phi(z|x_1)$ 和 $q_\phi(z|x_2)$。如果没有KL规范化(或权重很低),这些分布可能会尖锐集中,并且彼此以及原点相距较远。通过KL规范化,它们被拉向标准高斯先验 $p(z)$。digraph G { rankdir=LR; node [shape=plaintext, fontsize=10]; subgraph cluster_0 { label = "低KL规范化"; bgcolor="#fff0f6"; // Light pink style=filled; node [shape=ellipse, style=filled]; q1 [label="q(z|x₁)", fillcolor="#ffa8a8"]; // red q2 [label="q(z|x₂)", fillcolor="#a5d8ff"]; // blue p [label="p(z)\n(先验)", shape=doublecircle, fillcolor="#dee2e6"]; q1 -> p [style=dashed, color="#ced4da", arrowhead=none, label=" 远"]; q2 -> p [style=dashed, color="#ced4da", arrowhead=none, label=" 远"]; } subgraph cluster_1 { label = "高KL规范化"; bgcolor="#e6fcf5"; // Light teal style=filled; node [shape=ellipse, style=filled]; q1_reg [label="q(z|x₁)", fillcolor="#ffa8a8", pos="1,0!"]; // red q2_reg [label="q(z|x₂)", fillcolor="#a5d8ff", pos="1.5,0.5!"]; // blue p_reg [label="p(z)\n(先验)", shape=doublecircle, fillcolor="#dee2e6", pos="1.25,0.25!"]; q1_reg -> p_reg [style=solid, color="#495057", arrowhead=open, label=" 拉近"]; q2_reg -> p_reg [style=solid, color="#495057", arrowhead=open, label=" 拉近"]; } edge [style=invis]; q1 -> q1_reg; // Ensure spacing between clusters }图示说明KL散度规范化如何将编码分布(不同输入的 $q(z|x)$)拉近先验分布 $p(z)$,从而促成潜在空间中的重叠和平滑性。高斯分布的解析形式实际中,编码器 $q_\phi(z|x)$ 通常设计为输出对角高斯分布的参数:一个均值向量 $\mu_\phi(x)$ 和一个由方差向量 $\sigma^2_\phi(x)$ 表示的对角协方差矩阵。因此,$q_\phi(z|x) = N(z; \mu_\phi(x), \text{diag}(\sigma^2_\phi(x)))$。如果先验 $p(z)$ 是标准高斯分布 $N(z; 0, I)$,那么 $q_\phi(z|x)$ 和 $p(z)$ 之间的KL散度可以解析计算。对于一个 $d$ 维潜在空间,公式为:$$ D_{KL}(N(\mu, \text{diag}(\sigma^2)) || N(0, I)) = \frac{1}{2} \sum_{j=1}^{d} (\sigma_j^2 + \mu_j^2 - 1 - \log \sigma_j^2) $$此处,$\mu_j$ 和 $\sigma_j^2$ 是对于给定输入 $x$,由编码器产生的均值向量 $\mu_\phi(x)$ 和方差向量 $\sigma^2_\phi(x)$ 的第 $j$ 个分量。这个解析公式很方便,因为它使我们能够直接使用编码器的输出来计算损失的这部分,而无需对KL项本身进行蒙特卡罗估计。平衡之道:重建与规范化优化ELBO涉及增益重建似然,同时最小化KL散度(注意ELBO公式中KL项前的负号,尽管有时目标函数写为最小化负ELBO,此时KL项带有正号)。这两个目标常常相互制衡:高重建似然:有利于精确重建,可能导致编码器使用复杂、分离的 $q_\phi(z|x)$ 分布(增加KL散度)。低KL散度:有利于迫使 $q_\phi(z|x)$ 靠近简单的先验 $p(z)$,可能牺牲一些重建保真度,因为潜在代码对输入 $x$ 的特异性会降低。训练过程在这两个目标之间找到平衡。如果KL散度项过度主导损失(例如,如果其权重过高),它可能导致一种称为“后验坍塌”的现象,即编码器有效地忽略输入 $x$,并且总是输出先验 $p(z)$。在这种情况下,$q_\phi(z|x)$ 变得独立于 $x$,潜在代码 $z$ 包含关于输入的很少信息,解码器本质上学会了平均输出,导致重建和生成质量下降。理解KL散度项的作用和行为对于理解VAE如何学习适合生成任务的结构化潜在空间是根本的。它充当了数据编码与从学习到的概率模型生成新样本之间的桥梁。