想象你走进一家没有菜单的餐厅,老板兼厨师对你说:“今天不点菜,我做什么你吃什么。”你只能忐忑地等菜上桌——有时惊艳,有时黑暗料理。这就是传统VAE(变分自编码器)的日常:它虽然学会了“做菜”(生成图片),但你没法告诉它“我想要辣子鸡”还是“糖醋排骨”。现在,这家餐厅终于有了菜单——条件VAE(CVAE)登场了。它让生成模型听懂你的指令:你报出菜名(条件标签),厨师(解码器)就按这个指令,结合自己的“风味偏好”(潜在变量)为你量身定做。这篇内容,我们就用“点菜”的故事,拆解CVAE如何把“随机生成”变成“指令生成”。
一句话价值:掌控“AI生成的方向盘”是生成模型工程师的核心竞争力,学会CVAE的条件注入与训练逻辑,你就能把“随机画画”升级为“按需求出图”,直接用在内容生产、数据增强等真实业务里。
可视化演示
动态演示条件VAE的核心机制,通过架构/数据/状态/性能四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
条件VAE:条件VA 条件VAE的基本概念与动机 条件信息的注入方式 核心机制可视化 条件VAE整体架构与关键组件
VAE回顾与生成困境
还是那家没有菜单的餐厅。普通VAE就是一位“随缘大厨”:你告诉他“随便做”,他自己在风味空间里随便选一个点(从潜在变量分布里采样),然后端出一盘菜。你无法提前说“少放辣”“多点甜”。在图像生成里,这意味着你输入一个随机噪声或潜在向量,VAE输出的图片完全不可控——今天是数字7,明天可能是数字3,你只能碰运气。
为什么会有这种“自由发挥”?因为VAE把两张图之间的关联压缩成一个低维潜在变量(latent variable)z。编码器负责观察一张图,把它压缩成z;解码器负责从z还原出图。问题在于,这个z只描述了“图上大概有什么”,并没有描述“我想要图上有什么”。学习时,模型只用一张图和对它的重建误差来调整自己,没有额外的“指令信号”告诉它:数字7应该长成什么样、数字3应该长成什么样。
于是CVAE(Conditional VAE,条件变分自编码器)出现。它给VAE加了一张“菜单”:额外输入一个条件y,告诉模型“我现在要生成的是第几类、什么风格、什么属性的数据”。从此,生成不再靠运气,而是“按单出菜”。原始VAE的优化目标如下:
随缘大厨也有苦恼:客人多了,众口难调。VAE的问题是“无法指定菜系”,于是点菜单(条件y)必须被设计出来,这就是下一节的事。
- 条件数学期望$\displaystyle \mathbb{E}_{q(z|x)}\left[\log p(x|z)\right]$ 表示:从编码器给出的潜在分布中取样,然后看解码器重建的图有多像原图。想象品鉴师从“风味分布”里随机猜一个口味,大厨照这个口味做菜,尝一口觉得像不像。
- 重建对数似然$\displaystyle \log p(x|z)$ 是“这盘菜还原得像不像”的打分。数值越大,说明重建越成功。在图像里,它通常由像素级的误差(如交叉熵)体现。
- KL散度正则项$\displaystyle \mathrm{KL}\big(q(z|x) \,\|\, p(z)\big)$ 衡量品鉴师推断的风味分布与“常规风味”(标准正态先验)的差距。如果推断的风味太怪异(比如辣度100倍),就要扣分。
- 总目标最大化两项相减,整体取最大值。前项高=重建逼真,后项低=潜在变量规整。二者平衡时,模型既会还原,又不至于把潜在空间撑得杂乱无章。
条件信息注入方式
现在餐厅要设计菜单了。客人怎么报菜名,厨师才听得懂?在CVAE里,条件y必须先变成模型能吃的“符号形式”——最常见的是独热编码(one-hot encoding)。比如有10类数字,我们用一个10维向量表示,数字3就是 [0,0,0,1,0,0,0,0,0,0],数字7就是 [0,0,0,0,0,0,0,1,0,0]。这就像给每道菜规定了一个编号,餐厅后厨一看编号就明白要做什么。
有了编号还不够,关键是“把菜单递给谁”。在VAE里有两位关键角色:品鉴师(编码器)和大厨(解码器)。CVAE的做法是:把条件y同时递给这两位。品鉴师看菜(图像x)时报菜名(y),推断风味;大厨拿到风味偏好(z)后,也看菜名(y),再动手做菜。技术上说,就是特征拼接(concatenation):编码器的输入变成 [x; y],解码器的输入变成 [z; y]。
从概率角度看,条件信息注入改变了两个核心分布:原来只建模 $q(z|x)$ 和 $p(x|z)$,现在变成在给定条件y下的条件分布:
菜单设计好了,接下来看品鉴师(编码器)怎么工作。
- 条件编码分布$\displaystyle q_\phi(z|x,y)$ 读作“给定图像x和条件y,潜在变量z服从的分布”。这是品鉴师在“看了菜、又看了菜单”之后的推测结果,称为条件后验。
- 均值与方差函数$\displaystyle \mu_\phi(x,y), \; \sigma_\phi^2(x,y)$ 分别是这个推测分布的均值和方差——口味中心大概在哪、波动大不大,都由编码器网络预测。
- 条件解码分布$\displaystyle p_\theta(x|z,y)$ 读作“给定风味和条件,生成图像x的分布”。这是大厨拿到菜单和风味偏好后,做出的菜品概率模型。
- 高斯形式$\displaystyle \mathcal{N}\big(x; \hat{x}_\theta(z,y), \sigma^2 I\big)$ 表示重建图像围绕某个均值 $\hat{x}$ 呈高斯分布,$\sigma^2 I$ 控制模糊程度,训练时通常固定或简化处理。
条件编码器网络
品鉴师上岗了。他的工作流程是:客人点了一道菜(条件y),菜端上来(图像x),他先尝一口,心里打鼓——“这道菜的风味坐标大概在风味空间的哪个位置?辣度几分、甜度几分?”在CVAE里,这个“打鼓”的过程就是编码器网络:输入图像和条件,输出一个风味分布。
注意品鉴师不是只输出一个固定答案,而是输出“一个范围”:均值和方差。均值告诉他“最可能的风味位置”,方差告诉他“我的把握有多大”。如果方差大,说明这菜的口味很飘忽,可能同一个菜每次做法差异很大。这正是概率生成模型的好处:不确定性被显式建模,模型知道自己在哪些地方没把握。
在MNIST手写数字场景里,编码器接收一张28×28的灰度图(784维)和一个10维独热向量,先通过几层全连接提取特征,然后在最后一层分成两个分支:一个输出8维均值,一个输出8维对数方差。这两个分支就是编码器的“两个输出头”:
品鉴师的专业能力决定了风味推断的准确度。但他的推测只是“计划”——真正把菜端上桌的,是后厨里那位大厨,也就是解码器。
- 输入拼接操作$\displaystyle [x;\, y]$ 表示把图像向量与条件向量拼成一个更长的向量。就像品鉴师左手拿菜、右手拿菜单,两个信息一起看。
- 共享特征提取$\displaystyle \mathrm{Enc}_\phi$ 是一组共享参数的神经网络层。先统一提取“图像+条件”融合后的特征,避免为每个条件单独建一套网络,大大节省参数量。
- 均值头输出$\displaystyle \mu_\phi(x,y)$ 输出潜在分布的中心位置,即“最可能的风味坐标”,维度通常远小于原始图片(如8维或32维)。
- 对数方差头输出$\displaystyle \log\sigma_\phi^2(x,y)$ 输出对数方差。取指数后就还原成方差,保证其为正数,相当于告诉模型“这个推测的置信区间有多大”。
条件解码器网络
大厨终于上场了。他的任务很明确:客人点了“宫保鸡丁”(条件y),品鉴师说“这菜风味偏辣偏甜”(潜在变量z),大厨就要真的炒出一盘宫保鸡丁来。在图像生成里,解码器接收拼接后的向量 [z; y],经过几层上采样(deconvolution或线性层),最终输出一张重建的图像。
解码器建模的是条件生成分布 $p_\theta(x|z,y)$:给定风味和菜单,生成图像的概率。训练时,它希望重建的图像既符合潜在变量描述的风格,又符合条件标签的类别。比如“风味坐标偏右上+标签是5”,生成结果就得是一个长得像"5"的手写数字。
解码器的输出通常经过Sigmoid激活函数,把每个像素压缩到0~1之间,表示该像素为黑色的概率。整个网络结构和VAE解码器类似,唯一区别是输入层多了一截“菜单拼接”,让条件信息参与每一层的信息流动:
大厨和品鉴师都培训好了,但怎么制定训练准则?这就是损失函数和重参数化的舞台。
- 拼接潜变量与条件$\displaystyle [z;\, y]$ 把采样得到的潜在变量与独热条件拼成一个向量,作为解码器的输入。大厨同时看“风味偏好”和“菜名”。
- 上采样重建$\displaystyle \mathrm{Dec}_\theta$ 由堆叠的全连接层或转置卷积层组成。低维向量被一层层放大,最终还原到图像尺寸,像揉面、擀皮、塑形一步步把面团变成菜品。
- 输出概率分布$\displaystyle \hat{x}$ 是重建图像的均值。配合Sigmoid把它限制在[0,1]范围,作为“每个像素为真的概率”。整个分布的目标是让真实像素值出现的概率最大。
损失函数与重参数化
怎么评判一家餐厅的水平?食客最直接的标准就两条:一、端上来的菜是不是我点的那道(重建逼真度);二、口味别太离谱(潜在变量别失控)。CVAE的损失函数正是这两条的量化表达。它的数学基础是条件ELBO(evidence lower bound,变分下界):
第一项是重建损失:品鉴师给出的风味分布里抽样,大厨按这个风味做出来的菜,必须像原菜。第二项是KL散度:品鉴师的风味推断不能太放飞,要尽量贴近“这类菜通常的风味范围”(条件先验 $p(z|y)$)。两项相减,最大化的过程就是“又还原、又克制”的平衡。
但训练时有个麻烦:品鉴师给出的不是确定风味,而是一个分布,从分布里“抽一个风味”这个动作本身不可导。就像你从一锅汤里舀一勺,这个“舀”的动作没法对锅里的火候参数求梯度。于是有了著名的重参数化技巧(reparameterization trick):
评分规则定好了,训练机制也理顺了。最后一步,就是看这套“点菜系统”如何在实际业务里端出客人想要的菜。
- 重建期望项$\displaystyle \mathbb{E}_{q_\phi(z|x,y)}\big[\log p_\theta(x|z,y)\big]$ 表示从条件后验中反复抽样、反复做菜,求“还原度”的平均分。这一步保证生成的x和原图x像素级接近。
- KL正则项$\displaystyle \mathrm{KL}\big(q_\phi(z|x,y) \,\|\, p(z|y)\big)$ 衡量条件后验与条件先验的差距。它惩罚“脱离菜单的风味推断”——比如点宫保鸡丁却推断出极苦的味道,就会扣分。
- 采样不可导问题直接从 $\displaystyle q_\phi(z|x,y)$ 这个分布里抽z,抽样的随机过程没有梯度,反向传播到编码器就断了。这是训练崩溃的根源。
- 重参数化公式$\displaystyle z = \mu_\phi(x,y) + \sigma_\phi(x,y) \odot \varepsilon$ 把随机性“外包”给ε。μ和σ变成确定性的仿射变换,梯度可以沿着它们畅通无阻地回流。
- 标准正态噪声$\displaystyle \varepsilon \sim \mathcal{N}(0, I)$ 表示ε从标准正态采样。宏观效果是:每次上菜都有微小温差(随机性),但整体范围由μ和σ控制。
可控生成应用
整套点菜系统终于开业了。训练阶段和学习阶段,餐厅是两个状态:训练时,客人点菜(条件y),后厨做菜(重建),品鉴师反馈(编码),三者反复磨合,让厨师记住“什么菜名配什么风味、出什么成品”。推理阶段,餐厅简化了:不再需要品鉴师,客人只报菜名(条件y),大厨直接从常规风味库 $p(z|y)$ 里采一个z,立刻出菜。也就是说,CVAE生成新样本时,不再依赖任何真实图像,只依赖条件标签和潜在变量采样。
从概率角度,给定菜名生成新菜的完整过程可以写成对潜在变量z的边缘化:
至此,餐厅完成了华丽蜕变:从“随缘上菜”到“照单点菜”。应用层面的想象力就此打开——下一节我们看看具体能做什么。
- 条件边缘概率$\displaystyle p_\theta(x|y)$ 是“给定菜名y,生成菜品x的概率”。它直接从条件出发,不关心具体风味z是啥。
- 积分边缘化$\displaystyle \int p_\theta(x|z,y) p(z|y) dz$ 用积分把所有可能风味z消掉。z是“隐变量”,我们不知道也不想指定它,就让模型自己综合所有风味。
- 条件先验$\displaystyle p(z|y)$ 表示每类菜的自然风味范围。宫保鸡丁偏甜辣,清蒸鱼偏清淡——条件是z的先验约束。
- 蒙特卡洛近似实际计算时用采样近似积分,比如只抽64个z取平均,大幅降低成本。推理时甚至只抽1个z,生成速度飞快。
AI 应用场景
电商按品类生成商品图
阶段:条件图像生成与数据增强
解决的问题:电商平台上新商品时,需要大量不同品类、不同风格的展示图。传统做法依赖摄影师实拍或设计师抠图,成本高、周期长。CVAE能按“品类+风格”条件直接生成候选图,让设计师在候选中微调,大幅压缩素材生产时间。
具体案例:某服装电商用CVAE,以“外套”“连衣裙”“运动服”等类别标签和“极简”“复古”等风格标签作为条件,批量生成服装白底模型图。设计师从生成结果里挑选、修图、上架,上新速度提升约3倍。
医疗影像按标签补全
阶段:条件生成与样本扩充
解决的问题:罕见病医学影像样本极其稀缺,模型训练容易过拟合。利用CVAE,以“器官区域+病灶类型”为条件,生成逼真的合成影像样本,补充训练集,提升下游诊断模型的泛化能力。
具体案例:某医学影像团队用CVAE生成带“早期肺结节”标签的CT切片,与真实数据混合训练检测模型,在保持假阳性率不变的前提下,结节检出率提升了约12%。
人脸属性编辑
阶段:属性条件控制生成
解决的问题:做人脸美颜或虚拟试妆时,希望“只加微笑不加皱纹,只加眼镜不换脸型”。CVAE把人脸照片作为x、期望属性作为y,学习到“属性条件”与“身份信息”解耦的潜在表示,从而在保持身份不变的同时编辑指定属性。
具体案例:某短视频平台的美颜特效模块,用CVAE实现“一键微笑”“一键换发型”效果:用户上传自拍,选择属性标签,模型在几毫秒内输出带该属性的肖像,且五官轮廓基本不变。
Python 演示
import torchimport torch.nn as nnimport torch.nn.functional as Ffrom torch.utils.data import DataLoaderfrom torchvision import datasets, transforms class CVAE(nn.Module): def __init__(self, zdim=8, ncls=10): super().__init__() self.enc = nn.Sequential( nn.Linear(784 + ncls, 512), nn.ReLU(), nn.Linear(512, 256), nn.ReLU()) self.mu_head = nn.Linear(256, zdim) self.logvar_head = nn.Linear(256, zdim) self.dec = nn.Sequential( nn.Linear(zdim + ncls, 256), nn.ReLU(), nn.Linear(256, 512), nn.ReLU(), nn.Linear(512, 784), nn.Sigmoid()) def forward(self, x, y): h = self.enc(torch.cat([x, y], dim=1)) mu = self.mu_head(h) logv = self.logvar_head(h) z = mu + torch.randn_like(mu) * torch.exp(0.5 * logv) recon = self.dec(torch.cat([z, y], dim=1)) return recon, mu, logv def main(): torch.manual_seed(0) device = 'cuda' if torch.cuda.is_available() else 'cpu' loader = DataLoader(datasets.MNIST('data', train=True, download=True, transform=transforms.ToTensor()), batch_size=256, shuffle=True) model = CVAE().to(device) opt = torch.optim.Adam(model.parameters(), lr=1e-3) for epoch in range(10): total, n = 0.0, 0 for xb, yb in loader: xb = xb.view(xb.size(0), -1).to(device) y_onehot = torch.zeros(xb.size(0), 10, device=device) y_onehot.scatter_(1, yb.view(-1, 1), 1) recon, mu, logv = model(xb, y_onehot) recon_loss = F.binary_cross_entropy(recon, xb, reduction='sum') kl = -0.5 * torch.sum(1 + logv - mu.pow(2) - logv.exp()) loss = (recon_loss + kl) / xb.size(0) opt.zero_grad() loss.backward() opt.step() total += loss.item() n += 1 print(f'epoch {epoch} loss {total / n:.3f}') if __name__ == '__main__': main()
dec(z, y) 按指定标签0~9生成新图像。class CVAE(nn.Module)定义条件变分自编码器,编码器、解码器各自由全连接层堆叠。nn.Linear(784 + ncls, 512)输入层把784维像素和10维独热标签拼在一起,这正是“菜单递给品鉴师”。self.mu_head` 与 `self.logvar_head两个输出头,分别预测风味中心(均值)和波动范围(对数方差)。z = mu + torch.randn_like(mu) * torch.exp(0.5 * logv)重参数化:把随机噪声ε缩放平移成z,梯度可回传。self.dec = nn.Sequential(nn.Linear(zdim + ncls, 256), ...)解码器第一层拼接潜在变量和条件,让大厨同时看到“风味”和“菜单”。y_onehot.scatter_(1, yb.view(-1, 1), 1)把整数标签转成独热向量,相当于把菜名翻译成后厨通用编号。F.binary_cross_entropy(recon, xb, reduction='sum')重建损失,逐像素比较输出图像与真实图像的差距。kl = -0.5 * torch.sum(1 + logv - mu.pow(2) - logv.exp())高斯分布间的KL散度闭式解,约束潜在分布贴近标准正态。loss = (recon_loss + kl) / xb.size(0)最终损失=重建损失+KL正则,除以batch数得到单样本平均损失。
常见误区
误区“生成图像的是解码器,所以只要把条件y拼到解码器输入里,编码器不用管。”很多人觉得编码器只是压缩过程,和控制生成无关。
正解编码器也必须看到条件y。因为训练时,编码器的任务是推断“在这个菜名下的风味”,而不是“泛泛的风味”。如果编码器不看菜单,它对潜在分布的推断就缺少类别约束,KL散度会逼迫所有类别的z挤在一起,解码器即使拿到y也难以区分不同类别的生成。这就像品鉴师不问菜名就评价口味,给出的风味坐标必然模糊。
为何常见:人们习惯把“生成”和“编码”看成两个独立阶段,忽略了它们在变分推断里是共同优化的整体。条件y是两个阶段的共有上下文。
误区“生成嘛,总得给我一张参考图,模型照着画吧?”初学者常以为推理时要输入一张真实图片x,再加条件y。
正解CVAE训练时确实需要成对的(x, y),但推理(生成新样本)时只从条件先验p(z|y)采样潜在变量z,再经解码器p(x|z,y)输出图像,完全不需要真实x。就像训练时厨师跟着老师傅学做菜,出师后客人点菜,厨师直接凭手艺做,不需要再参考老师傅的操作。
为何常见:因为VAE的训练流程里x始终出现在输入端,容易让人误以为x是生成的必要输入。这是把“训练依赖”和“推理依赖”混为一谈了。
误区“不就是把从分布里采样改成从标准正态采样再线性变换吗?不影响最终结果吧?”有些学员觉得这是实现细节,换种采样方式也行。
正解重参数化是CVAE能训练成功的核心。没有它,采样动作不可导,梯度无法从解码器回流到编码器的μ和σ参数,整个模型只能靠退化方式训练,几乎必然失败。它相当于把“随机摸奖”改成了“可控抽签”——随机性来自外部噪声,模型参数只参与可导的缩放和平移。
为何常见:表面上看这只是数学恒等变形(z的分布没变),但它改变了梯度的“运输路径”,这种微妙差异不实际训练很难体会。
误区“既然潜在变量z是风味向量,那把独热编码直接加到z向量上不就行了吗?”有人觉得拼接要“深度嵌入”才有效。
正解条件y不是潜在变量的一部分,它是独立的外部输入,在编码器和解码器的入口处做拼接。如果直接把y加进z,会污染潜在空间的几何结构:本来z中的每个维度代表独立的风味轴向,混入类别信息后,类内生成会不稳定、类间边界也会模糊。正确做法是让y全程作为“旁路指令”,指导而不占据z的语义空间。
为何常见:向量拼接看起来像简单加法,人们容易忽略输入层的拼接和潜在空间内部的融合是两回事,前者保留条件独立性,后者破坏它。
面试题
Q1. 条件VAE相对于普通VAE最核心的改动是什么?
- A.加深网络结构
- B.引入条件信息← 正确答案
- C.更换激活函数
- D.增大批量大小
答案:B。CVAE的灵魂是条件y——把类别/属性作为额外输入注入编码器和解码器,使生成过程可控。加深网络、换激活函数、调批量大小都是通用优化手段,不是CVAE特有的标志。就像餐厅装修改菜品,核心还是“有了点菜单”。
Q2. 在多类条件生成中,条件y最常用的向量表示方式是什么?
- A.独热编码向量← 正确答案
- B.图像尺寸缩放
- C.随机高斯噪声
- D.梯度裁剪策略
答案:A。类别条件通常用独热编码,比如10类数字就用10维向量,第i类在该位置置1。图像缩放是预处理,随机高斯噪声是潜在变量的采样来源,梯度裁剪是训练技巧,都与“表示条件”无关。独热编码相当于给每道菜编了个唯一编号。
Q3. 重参数化技巧主要解决了什么问题?
- A.缓解过拟合
- B.使采样可求导← 正确答案
- C.避免梯度爆炸
- D.降低特征维度
答案:B。直接从分布q(z|x,y)中采样,采样动作没有梯度,损失无法回传到编码器。重参数化把采样改写为z=μ+σ⊙ε,随机性由外部噪声ε承担,μ和σ可以正常求导。它本质是给梯度建了条“高速公路”,不是解决过拟合或梯度爆炸的问题。
Q4. “条件后验q(z|x,y)”的正确含义是什么?
- A.给定图像与标签推断潜在变量分布← 正确答案
- B.给定潜在变量生成原始图像
- C.直接预测图像的类别标签
- D.计算标签的先验频率
答案:A。q(z|x,y)中的条件变量是x和y,被推断的对象是z,含义是“看到菜和菜单后,推测风味的分布”。选项B是解码器p(x|z,y)的工作,选项C是分类器的任务,选项D只统计标签出现频率,都和条件后验无关。这个分布是编码器输出的核心。
Q5. KL散度项在CVAE损失函数中扮演什么角色?
- A.让重建输出更清晰
- B.约束潜在分布接近先验← 正确答案
- C.加快网络训练收敛
- D.让标签直接生成像素
答案:B。CVAE的损失是重建损失减KL散度。KL项把编码器推断的q(z|x,y)拉向条件先验p(z|y),防止潜在空间失控。它不直接参与像素生成,也不负责加速收敛,而是“风味不能太离谱”的规矩。重建清晰靠的是前面那一项。
Q6. 重参数化对梯度传播的具体影响是什么?
- A.让采样路径完全不可导
- B.让损失对均值方差可导← 正确答案
- C.直接禁用反向传播算法
- D.与梯度计算没有关系
答案:B。重参数化之后,z=μ+σε中只有ε是随机的,μ和σ通过确定性的线性变换参与计算,梯度可以沿着这条路径从损失传到编码器。选项A恰恰是不做重参数化的后果,选项C和D说法明显错误。这让编码器的两个输出头(均值、方差)都能被正常训练。
Q7. CVAE推理(生成新样本)时的输入包括哪些?
- A.输入真实图像和标签
- B.仅输入真实图像样本
- C.采样潜在变量并用条件标签← 正确答案
- D.直接复制训练集样本
答案:C。推理阶段不需要真实图像,只需从条件先验p(z|y)采样潜在变量z,再配合条件y输入解码器。选项A和B都错误地依赖了真实图像,选项D更是不做生成而是抄答案。CVAE的魅力正在于此:厨师出师后,客人报个菜名就能出菜。
Q8. 标准CVAE的损失函数包含以下哪些项?
- A.重建损失项← 正确答案
- B.KL散度正则项← 正确答案
- C.分类交叉熵损失
- D.对抗生成损失
答案:AB。标准CVAE的优化目标是条件ELBO,由重建期望项和KL散度项构成。分类交叉熵是分类器(如辅助分类器GAN)的损失,对抗损失则属于GAN家族,CVAE作为纯变分模型不包含这些。它靠“还原像不像”和“潜在分布规不规整”两项来完成训练。
Q9. CVAE中条件信息可以注入到哪些位置?
- A.编码器输入层← 正确答案
- B.解码器输入层← 正确答案
- C.潜在变量空间
- D.损失函数条件先验← 正确答案
答案:ABD。条件y要同时参与编码器和解码器的输入拼接,保证“推断”和“生成”都受指令约束;KL散度中也使用条件先验p(z|y),让潜在空间按类别分离。潜在变量空间本身是z的语义坐标,直接注入y会污染其几何结构,所以选项C是错误做法。
Q10. 关于CVAE,以下说法正确的是?
- A.条件能控制生成类别← 正确答案
- B.潜在维度越大越不可控
- C.训练时依赖图像和条件← 正确答案
- D.推理时依赖真实标签
答案:AC。A正确,条件y正是为了让生成类别可控;C正确,训练需要成对的(x,y)来学习条件分布;B错误,潜在维度大小与可控性没有必然关系,关键在于条件是否有效注入;D错误,推理时只依赖条件y和采样z,不依赖真实标签x。CVAE的本质是“训练时学关联,推理时凭指令创作”。