标准变分自编码器 (VAE) 擅长学习数据的压缩表示,并从这种已学习的分布中生成新的样本。然而,一个常见要求是对生成过程施加更细致的控制。例如,您可能不只希望生成一张手写数字图像,而是想要指定生成哪个数字,或者在更普遍的图像生成任务中控制样式、颜色或方向等属性。此时,条件变分自编码器 (CVAE) 就发挥作用了。它们通过将条件信息融入编码和解码过程来扩展 VAE 框架,从而实现目标数据生成。条件作用的原理CVAE 的核心思路是让 VAE 的操作依赖于一个额外输入变量,通常表示为 $c$。这个条件变量 $c$ 可以表示您希望用来引导生成过程的任何信息,例如类别标签、文本描述或其他数据属性。在 CVAE 中:编码器 学习近似后验分布 $q_\phi(z | x, c)$,这意味着潜在表示 $z$ 现在是根据输入数据 $x$ 和条件 $c$ 来推断的。解码器 学习重建数据 $p_\theta(x | z, c)$,在条件 $c$ 的影响下从潜在变量 $z$ 生成数据 $x$。这种条件作用使模型能够学习 $c$ 的变化如何影响数据 $x$,无论是在其潜在表示中还是在生成的形态中。当需要生成新样本时,您可以提供一个所需的条件 $c$ 并采样一个 $z$ (通常来自先验分布,该先验分布也可以基于 $c$ 进行条件化),然后将两者传递给解码器以获得符合 $c$ 的样本 $x$。CVAE 的数学公式CVAE 的目标函数是我们在第 2 章中遇到的证据下界 (ELBO) 的条件版本。我们的目标是在给定条件 $c$ 的情况下最大化数据 $x$ 的对数似然,即 $\log p_\theta(x|c)$。CVAE ELBO 如下:$$ L_{CVAE}(x, c; \theta, \phi) = \mathbb{E}{q\phi(z|x,c)}[\log p_\theta(x|z,c)] - D_{KL}(q_\phi(z|x,c) || p_\theta(z|c)) $$让我们逐项分析:重建项:$\mathbb{E}{q\phi(z|x,c)}[\log p_\theta(x|z,c)]$ 促使解码器 $p_\theta(x|z,c)$ 在给定 $z$ 和特定条件 $c$ 的情况下准确重建 $x$。期望是针对从编码器近似分布 $q_\phi(z|x,c)$ 中采样的 $z$ 计算的。KL 散度项:$D_{KL}(q_\phi(z|x,c) || p_\theta(z|c))$ 对学习到的潜在空间进行正则化。它促使编码器近似的分布 $q_\phi(z|x,c)$ (对于给定的 $x$ 和 $c$) 接近潜在变量的先验分布 $p_\theta(z|c)$,该先验分布也依赖于 $c$。先验分布的一个常见简化是假设 $p_\theta(z|c) = p(z)$,其中 $p(z)$ 是标准高斯分布 $N(0, I)$。在这种情况下,KL 散度项变为 $D_{KL}(q_\phi(z|x,c) || p(z))$。这表示虽然编码和解码过程使用了 $c$,但潜在空间中 $z$ 的目标分布是固定的。更精巧的模型可能会将 $p_\theta(z|c)$ 定义为一个分布,其参数(例如均值和方差)本身是 $c$ 的函数,可能由另一个神经网络学习得到。重参数化技巧与标准 VAE 中一样,用于从 $q_\phi(z|x,c)$ (通常输出 $\mu(x,c)$ 和 $\sigma(x,c)$) 中采样 $z$,以支持反向传播。CVAE 架构条件变量 $c$ 通常与主要输入(编码器的 $x$、解码器的 $z$)一起输入到编码器和解码器网络中。digraph CVAE { rankdir="TB"; splines="true"; node [shape="box", style="filled", fillcolor="#e9ecef", fontname="sans-serif"]; edge [fontname="sans-serif"]; subgraph cluster_encoder { label="编码器 q_φ(z | x, c)"; style="filled"; color="#dee2e6"; encoder_nn [label="编码器神经网络", shape="oval", fillcolor="#a5d8ff"]; mu [label="μ", shape="ellipse", fillcolor="#b2f2bb"]; log_sigma_sq [label="log(σ²)", shape="ellipse", fillcolor="#b2f2bb"]; } subgraph cluster_decoder { label="解码器 p_θ(x | z, c)"; style="filled"; color="#dee2e6"; decoder_nn [label="解码器神经网络", shape="oval", fillcolor="#ffc9c9"]; } subgraph cluster_latent { label="潜在空间"; style="filled"; color="#dee2e6"; z [label="z (采样)", fillcolor="#ffe066"]; reparam [label="重参数化\nz = μ + ε ⋅ σ", shape="invhouse", fillcolor="#ffd8a8"]; } x [label="输入数据 x", fillcolor="#ced4da"]; c [label="条件 c", fillcolor="#ced4da"]; x_hat [label="重建的 x̂", fillcolor="#ced4da"]; x -> encoder_nn [label=" 数据"]; c -> encoder_nn [label=" 条件", style="dashed"]; encoder_nn -> mu; encoder_nn -> log_sigma_sq; mu -> reparam; log_sigma_sq -> reparam; reparam -> z; z -> decoder_nn [label=" 潜在"]; c -> decoder_nn [label=" 条件", style="dashed"]; decoder_nn -> x_hat; label="条件变分自编码器 (CVAE) 架构"; fontsize=12; fontname="sans-serif"; }CVAE 架构图。条件 $c$ 作为额外输入提供给编码器和解码器网络。条件作用的实现将 $c$ 融入神经网络的方式取决于其性质:类别条件:如果 $c$ 是类别标签(例如,数字 '0' 到 '9'),它通常会被进行独热编码。这个独热向量可以:在适当的层直接与 $x$(对于编码器)或 $z$(对于解码器)进行拼接。通过一个嵌入层,获取一个稠密的向量表示,然后进行拼接或以其他方式组合。连续条件:如果 $c$ 是连续值或向量(例如,期望的角度、物理属性),它通常可以直接进行拼接。对这些值进行归一化可能会有益。复杂条件(例如文本、图像):如果 $c$ 本身是复杂数据,如文本描述或另一张图像,它通常会由其自身的嵌入网络(例如,用于文本的 RNN/Transformer,用于图像的 CNN)进行处理,以生成一个固定大小的条件向量。然后该向量按上述方式使用。选择将 $c$ 整合到编码器和解码器架构的何处以及如何整合(例如,通过拼接至输入进行早期融合,或通过注入到更深层进行晚期融合)会影响性能,并且是模型设计的一个方面。CVAE 的应用CVAE 带来了许多需要可控生成的应用:带属性的图像生成:生成具有特定发型或表情的面部图像,或特定类别的 MNIST 数字。可控文本生成:生成具有指定主题、情感或风格的句子或段落。语音转换:在保留内容的同时,修改说话者的声音,使其听起来像另一个说话者。药物发现:生成具有所需化学性质的分子结构。交互式艺术与设计:允许用户通过指定高层属性来引导生成模型。优点与考量优点:可控生成:主要益处是能够根据指定的属性指导生成过程。学习条件表示:模型学习数据如何随条件变化,如果条件映射到具有语义意义的因素,这可能带来更易于理解或更有用的潜在空间。样本质量的提升(可能):通过提供更多信息,CVAE 有时可以生成比非条件 VAE 更高质量或更连贯的样本,尤其是在非条件任务非常复杂时。考量:条件信息的质量:CVAE 的有效性在很大程度上取决于条件变量 $c$ 的相关性和质量。如果 $c$ 包含噪声或与 $x$ 不相关,它可能无法改善生成,甚至可能阻碍生成。模式崩溃(条件):尽管 CVAE 可以帮助引导生成,但它们并非对模式崩溃等问题免疫。例如,在给定某个条件下,CVAE 可能会总是生成非常相似的样本,从而忽略该条件下可能存在的样本多样性。先验分布 $p_\theta(z|c)$ 的确定:为条件先验分布 $p_\theta(z|c)$ 选择合适的形态可能具有挑战性。虽然 $p(z) = N(0,I)$ 是一个常见的默认设置,但对于 $z$ 和 $c$ 之间复杂的依赖关系,可能需要一个表达能力更强的条件先验分布。数据要求:训练 CVAE 需要配对数据 $(x, c)$。如果某些条件下的此类配对数据稀缺,模型可能无法很好地泛化。CVAE 通过引入显式控制机制,相对于基本 VAE 而言是一个显著的进步。它们是许多其他高级架构和应用的根基,使得与生成模型进行更具针对性的交互成为可能。随着我们继续学习,您将看到条件作用原理是如何在提升生成模型能力方面反复出现的主题。