VAE 编码器不直接输出潜在向量 $z$。相反,它生成潜在空间中概率分布的参数,通常是高斯分布 $q(z|x)$ 的均值 $\mu$ 和对数方差 $\log(\sigma^2)$。为了获取一个实际的潜在向量 $z$ (解码器需要它来重建输入),我们必须从这个分布中采样:$z \sim q(z|x)$。这给训练带来了困难。采样操作是随机的。如果将 VAE 视为计算图,这个采样步骤引入了一个随机节点。标准反向传播是我们训练神经网络所依赖的算法,它要求计算图是确定性的才能计算梯度。梯度不能通过纯粹的随机采样过程反向流动,因为这与定义分布的参数 ($\mu$ 和 $\sigma$) 相关。如果样本 $z$ 是随机获得的,编码器如何学习调整其权重以生成“更好”的 $\mu$ 和 $\sigma$ 值呢?梯度下降的路径在采样阶段被有效阻断了。这就是重参数化技巧发挥作用的地方。这是一种巧妙的方法,用于重构采样过程,从而将随机性分离出来,使得梯度能够流经我们需要训练的网络部分。核心思想是将随机变量 $z$ 表示为分布参数 ($\mu, \sigma$) 的确定性函数,以及从固定标准分布 (通常是标准正态分布 $\mathcal{N}(0, I)$) 中抽取的独立噪声变量 $\epsilon$。对于高斯潜在变量,重参数化表示为: $$z = \mu + \sigma \cdot \epsilon$$ 其中:$\mu$ 是编码器对于给定输入 $x$ 输出的均值向量。$\sigma$ 是标准差向量。通常,编码器输出 $\log(\sigma^2)$ (对数方差)。然后我们计算 $\sigma = \exp(0.5 \cdot \log(\sigma^2))$ 以确保 $\sigma$ 始终为正,并提高训练期间的数值稳定性。$\epsilon$ 是从标准正态分布 $\epsilon \sim \mathcal{N}(0, I)$ 中采样的噪声向量。此采样与输入 $x$ 或编码器的参数无关。这如何解决梯度问题?通过重参数化 $z$,我们改变了随机性的来源。编码器网络根据输入 $x$ 确定性地计算 $\mu(x)$ 和 $\sigma(x)$。从固定分布 $\mathcal{N}(0, I)$ 中抽取一个随机样本 $\epsilon$。这个 $\epsilon$ 是外部输入,不是我们进行微分所需路径中任何已学习参数的结果。然后使用确定性变换 $z = \mu(x) + \sigma(x) \cdot \epsilon$ 计算潜在向量 $z$。现在,从 $z$ 回到 $\mu(x)$ 和 $\sigma(x)$ 的路径完全是确定性的。当我们计算 VAE 的总损失并需要求其相对于编码器权重的梯度时,这些梯度可以流动:从损失函数流回 $z$。通过确定性计算 $z = \mu + \sigma \cdot \epsilon$ 流回 $\mu$ 和 $\sigma$。由于 $\mu$ 和 $\sigma$ 是编码器的直接输出(或从其输出如 $\log(\sigma^2)$ 确定性地推导而来),梯度可以继续流回编码器网络,从而使其权重能够通过标准反向传播进行更新。下图说明了应用重参数化技巧前后计算图,显示了它如何实现梯度流动。digraph G { rankdir=TB; node [shape=box, style="filled,rounded", fontname="Arial", fontsize=10, margin="0.2,0.1"]; edge [fontname="Arial", fontsize=9]; graph [fontsize=10, fontname="Arial"]; subgraph cluster_before { label="重参数化前 (梯度被阻断)"; bgcolor="#ffc9c9"; rankdir=TB; X_before [label="输入 x", fillcolor="#e9ecef"]; Encoder_before [label="编码器", fillcolor="#a5d8ff"]; mu_sigma_before [label="μ(x), σ(x)", fillcolor="#bac8ff"]; Sampler_before [label="采样 z ~ N(μ, σ²)\n(随机节点)", style="filled,rounded", fillcolor="#ff8787"]; z_before [label="潜在 z", fillcolor="#b2f2bb"]; Decoder_before [label="解码器", fillcolor="#a5d8ff"]; Recon_before [label="重建 x̂", fillcolor="#e9ecef"]; X_before -> Encoder_before; Encoder_before -> mu_sigma_before; mu_sigma_before -> Sampler_before [label=" 定义分布", fontsize=8]; Sampler_before -> z_before; z_before -> Decoder_before; Decoder_before -> Recon_before; // Loss and gradient path (simplified) Recon_before -> z_before [dir=back, style=dotted, color="#868e96", label=" ∂损失/∂z (来自解码器)", taillabel="损失", labelfontsize=8]; z_before -> Sampler_before [dir=back, style=dashed, color="#f03e3e", label=" 梯度在此处被阻断", penwidth=1.5]; } subgraph cluster_after { label="重参数化后 (梯度流动)"; bgcolor="#b2f2bb"; rankdir=TB; X_after [label="输入 x", fillcolor="#e9ecef"]; Encoder_after [label="编码器", fillcolor="#a5d8ff"]; mu_sigma_after [label="μ(x), σ(x)", fillcolor="#bac8ff"]; epsilon_source [label="采样 ε ~ N(0,I)\n(固定噪声源)", style="filled,rounded", fillcolor="#ced4da"]; Deterministic_z [label="z = μ + σ ⋅ ε\n(确定性函数)", style="filled,rounded", fillcolor="#96f2d7"]; z_after [label="潜在 z", fillcolor="#b2f2bb"]; Decoder_after [label="解码器", fillcolor="#a5d8ff"]; Recon_after [label="重建 x̂", fillcolor="#e9ecef"]; X_after -> Encoder_after; Encoder_after -> mu_sigma_after; epsilon_source -> Deterministic_z [label=" 噪声输入", fontsize=8]; mu_sigma_after -> Deterministic_z [label=" 参数", fontsize=8]; Deterministic_z -> z_after; z_after -> Decoder_after; Decoder_after -> Recon_after; // Loss and gradient path (simplified) Recon_after -> z_after [dir=back, style=dotted, color="#495057", label=" ∂损失/∂z (来自解码器)", taillabel="损失", labelfontsize=8]; z_after -> Deterministic_z [dir=back, style=dotted, color="#495057"]; Deterministic_z -> mu_sigma_after [dir=back, style=dotted, color="#37b24d", label=" ∂损失/∂μ, ∂损失/∂σ", penwidth=1.5]; mu_sigma_after -> Encoder_after [dir=back, style=dotted, color="#37b24d", label=" 至编码器权重", penwidth=1.5]; } }此图对比了重参数化之前的情况,其中随机采样器阻断了梯度流向编码器参数,以及重参数化之后的情况,其中确定性变换使得梯度可以从损失函数、经过潜在变量 $z$、回传至 $\mu$ 和 $\sigma$,并最终抵达编码器的权重。关于对数方差的说明如前所述,编码器通常会输出每个潜在维度 $j$ 的方差对数 $\log(\sigma^2_j)$,而不是直接输出 $\sigma_j$ 或 $\sigma^2_j$。这有以下几个原因:范围: 对数方差可以取任意实数值,而 $\sigma^2_j$ 必须为正($\sigma_j$ 为非负)。这种无约束的输出范围可以使神经网络的学习变得更容易。正性: 当我们计算 $\sigma^2_j = \exp(\log(\sigma^2_j))$ 时,方差 $\sigma^2_j$ 保证为正。标准差 $\sigma_j$ 然后计算为 $\sigma_j = \sqrt{\exp(\log(\sigma^2_j))}$,这简化为 $\sigma_j = \exp(0.5 \cdot \log(\sigma^2_j))$。这即是方程 $z_j = \mu_j + \sigma_j \cdot \epsilon_j$ 中使用的 $\sigma_j$。从根本上说,重参数化技巧是一种数学上的重新表述,它将随机性与我们希望学习的参数分离。这使我们能够使用标准基于梯度的优化方法来端到端地训练 VAE,有效地使得编码器能够学习如何生成有用的潜在分布。如果没有这项技术,训练 VAE 将需要更复杂的方案,例如强化学习或针对随机网络的专用梯度估计器,这些方法通常方差更高,且样本效率较低。因此,重参数化技巧是变分自编码器实用和广泛应用的一个基本组成部分。