想象你是一位厨师,立志做出一道惊艳客人的沙拉酱。你有个配方:糖、醋、盐、油各放多少。但有个麻烦——你每次倒盐时都会“手抖”,手一抖,盐量就随机飘忽不定。客人尝完说“太咸了”,你想改进配方,却傻眼了:这次咸,到底是配方里盐本身放多了,还是刚才那一下手抖倒多了?你没法判断,自然也没法准确调整。你每天做一百次沙拉,反复试错,累得半死,配方却始终改进不了。 这就是变分自编码器(VAE)里最棘手的难题:神经网络想生成的图像、声音,本质上都带有“随机性”——就像厨师的手抖。要让网络从客人的反馈(损失函数的梯度)中学习,偏偏差在“随机手抖”这一步,梯度这条路断了。VAE 的重参数化技巧,就是给厨师的手抖装上一个“可观测的刻度装置”:把随机性从操作本身剥离出去,变成一颗可控的标准骰子 ε。从此,调配方(更新参数)时,你清清楚楚知道该动哪根弦。这篇文章,就用这个“厨房里的一勺盐”的故事,带你彻底看懂这个让现代生成模型能够稳定训练的核心技巧。

岗位关联

对 AI 从业者来说,重参数化是理解 VAE、扩散模型等一切“随机生成 + 梯度训练”体系的基石。读懂它,你就能真正看懂生成模型的训练代码,亲手调试训练过程,而不是对着报错干瞪眼。

目录
  1. 可视化演示
  2. 采样不可微:断了的调味清单
  3. 重参数化思想:给手抖装刻度
  4. 公式推导:数学上依然咸淡适宜
  5. 代码实现:三行代码落地
  6. VAE训练:训练一枚会做饭的厨神
  7. 收益与局限:这把勺子的边界
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示VAE中直接采样的梯度阻断问题与重参数化技巧如何让梯度穿越采样操作,包含完整VAE训练流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

直接采样:梯度被阻断 z~N(mu,sig^2)采样不可微 编码器输出mu和sig参数 z ~ N(mu, sig^2) 梯度无法穿越 梯度在采样节点处中断,无法反向传播至编码器。

采样不可微:断了的调味清单

厨师面对的最大困扰,是他手里没有一张“调味清单”。客人说太咸,他前后做了十次,每次都因为手抖而咸淡不一。他想通过反馈调整配方——糖少一点、盐少一点——但根本不知道刚才那次到底算不算数。因为“手抖”是随机的、不可预测的,他没法把“反馈”翻译成“参数修正量”。在 VAE 里,这个场景一模一样:网络想生成一张图像,需要先从潜在分布中随机采样一个隐变量 z,再让解码器把 z 变成图像。这个“随机采样”动作,就是厨师的手抖。

问题在于,神经网络是靠梯度信号学习的。梯度像是一条从成品倒推到配方的“质检流水线”:成品坏了,就顺着流水线把责任分摊给每个环节。可随机采样这一步,没有固定的流水线可走——第一次采样落在 3.2,第二次落在 -1.7,完全由随机数决定。数学上,z 是个随机变量,它和参数 θ 之间没有一条确定性的因果链,所以“z 对 θ 的导数”根本不存在。

到这里,厨师和 VAE 都卡在了同一个地方:想让客人反馈指导配方调整,却被随机性拦腰截断。形式化地看,VAE 要优化的目标长这样:

L(θ)=Ez∼qθ(z)[f(z)]\mathcal{L}(\theta) = \mathbb{E}_{z \sim q_{\theta}(z)} \left[ f(z) \right]

1. 分布记号:$q_{\theta}(z)$ 表示由参数 θ 决定的概率分布,例如正态分布 $\mathcal{N}(\mu_{\theta}, \sigma_{\theta}^{2})$,采样出的 z 就是“手抖后的盐量”。

2. 期望损失:$\mathbb{E}_{z \sim q_{\theta}(z)}[f(z)]$ 表示对海量随机样本 z 求评价函数 $f(z)$ 的平均值,也就是客人反复品尝后的平均打分。

3. 梯度阻塞:$\frac{\partial z}{\partial \theta}$ 未定义——因为 z 是随机抽取的样本,而不是 θ 的确定性函数,所以“从成品到配方”的梯度链在这里断掉了。

没有梯度,优化就无从谈起。厨师看着反馈,只能盲目地一次一次试,效率极低。这正是 VAE 最初训练不稳定、生成效果差的根源。但别急,给手抖装上刻度装置,就是重参数化的主意。

重参数化思想:给手抖装刻度

厨师想通了:既然控制不住手抖,不如把“手抖”量化。他规定:倒盐之前,先掷一颗标准骰子 ε,然后按照公式“实际盐量 = 配方盐量 μ + 手抖幅度 σ × 骰子读数 ε”来操作。骰子读数随机,但这套计算流程是完全确定的。这样一来,客人说太咸时,厨师看一眼当天的 ε,就能反推:是配方盐量 μ 该调,还是手抖幅度 σ 太大。反馈信号顺着一根清晰的链条传了回来。

这个思路翻译成数学语言,就是重参数化(reparameterization trick)。原本我们要从分布 $q_{\theta}(z)$ 中直接采样一个 z,现在改成两步:先从标准正态分布里抽一个噪声 ε,再用确定性函数把 ε 变换成 z。而 μ 和 σ 恰好是神经网络输出的可微参数:

z=μθ+σθ⊙ε,ε∼N(0,I)\displaystyle z = \mu_{\theta} + \sigma_{\theta} \odot \varepsilon, \quad \varepsilon \sim \mathcal{N}(0, \mathbf{I})

1. 均值路径:$\mu_{\theta}$ 是网络输出的确定性值,表示“配方里盐的标准量”,它的梯度可以直接计算。

2. 尺度路径:$\sigma_{\theta}$ 是网络输出的标准差,表示“手抖的最大幅度”,同样可以微分。

3. 随机性外置:$\varepsilon \sim \mathcal{N}(0, \mathbf{I})$ 是唯一保留随机的部分——一颗完全外部的标准骰子,与 θ 无关。

4. 逐元素组合:$\odot$ 表示逐元素相乘,让每个维度的 z 独立地由对应的 μ、σ、ε 组合而成。

关键在于:随机性没有消失,只是搬家了——从“采样 z 这个动作”搬到了“采样 ε 这个动作”上。而 z 的构造过程变成了纯确定性运算,梯度就可以顺着 μ 和 σ 的路畅通无阻地流回网络。厨师的手抖依然存在,但终于变得可观测、可归因。

公式推导:数学上依然咸淡适宜

厨师有点担心:换了操作方式之后,客人会不会觉得味道变了?毕竟原来是从一个分布里“凭感觉”撒盐,现在变成了“标准量 + 骰子 × 幅度”。他决定用数学验证一遍:新方式的期望、方差是否和原来一致。

验证过程很简单。先看均值:骰子 ε 的期望是 0,所以 z 的期望完全由 μ 决定;再看方差:ε 的方差是 1,独立噪声经过缩放后,方差按系数平方放大。两步一算,结果和原来完全相同——z 依然服从 $\mathcal{N}(\mu, \sigma^{2})$。风味没变,只是流程变得可追踪了。

E[z]=μ+σ E[ε]=μ,Var[z]=σ2 Var[ε]=σ2\mathbb{E}[z] = \mu + \sigma \, \mathbb{E}[\varepsilon] = \mu, \qquad \mathrm{Var}[z] = \sigma^{2} \, \mathrm{Var}[\varepsilon] = \sigma^{2}

1. 均值不变:$\mathbb{E}[z] = \mu + \sigma \mathbb{E}[\varepsilon]$,因为 $\mathbb{E}[\varepsilon] = 0$,所以 z 的期望恰为 μ,与原分布一致。

2. 方差传递:$\mathrm{Var}[z] = \sigma^{2} \mathrm{Var}[\varepsilon]$,因为独立变量的方差按系数平方缩放,而 $\mathrm{Var}[\varepsilon] = 1$,所以结果为 σ²。

3. 分布等价:$z \sim \mathcal{N}(\mu, \sigma^{2})$,与原本“直接从 $q_{\theta}(z)$ 采样”得到的分布完全一致,客人的味觉体验没有变化。

还有个工程细节:网络输出的是对数方差 logvar 而不是 σ 本身。因为 σ 必须为正,直接让网络输出一个正数很别扭;而 logvar 可正可负,没有约束,恰好适合作为神经网络的原始输出。换算公式是 $\sigma = \exp(0.5 \times \mathrm{logvar})$,取个指数再开根号,顺手完成。厨师把“手抖幅度”换算成刻度单位的最后一公里,也打通了。

代码实现:三行代码落地

现在厨师把刻度装置写进了菜谱。在 PyTorch 里,实现重参数化只需要一个短短的函数:从标准正态分布中采出 ε,然后按公式组合。这套代码在 VAE 的训练脚本里几乎人人都会写,核心就三行:

z=μ+exp⁡(0.5×logvar)⊙ε\displaystyle z = \mu + \exp(0.5 \times \mathrm{logvar}) \odot \varepsilon

1. 采样噪声:$\varepsilon \sim \mathcal{N}(0, \mathbf{I})$ 用 torch.randn_like(mu) 一次搞定,它和 μ 形状相同,承担全部随机性。

2. 恢复标准差:$\exp(0.5 \times \mathrm{logvar})$ 把网络输出的对数方差还原成标准差 σ,数值上等价于 $\sqrt{e^{\mathrm{logvar}}}$。

3. 组合采样:$z = \mu + \sigma \odot \varepsilon$ 逐元素相加相乘,得到最终的隐变量 z,喂给解码器。

前向传播时,z 的值依赖于 ε 的随机结果,所以每次前向都有变化——这正是随机生成该有的样子。反向传播时,梯度兵分两路:一路沿着“μ 直接加到 z”的路径传回,另一路沿着“σ 乘 ε 加到 z”的路径传回。两条路径都是纯粹的加法和乘法,导数闭着眼睛都能算。这就是“让梯度穿越采样”的全部秘密:采样还在,但参数只走确定的门。

代码写起来轻盈,背后却躲开了一个大坑:如果直接用 z = torch.normal(mu, sigma),PyTorch 的自动求导会因为“normal 的采样结果对参数不可微”而直接断链——所有梯度都变成 None,模型彻底罢工。重参数化用 randn_like 把随机性隔离在 ε 上,恰好避开了这个雷区。

VAE训练:训练一枚会做饭的厨神

有了重参数化,厨师终于可以正式收徒,训练 AI 学徒批量学习做沙拉了。训练时,网络拿到一张真实图像 x,先由编码器把它压缩成潜在分布的参数——也就是 μ 和 logvar——然后通过重参数化采样出隐变量 z,再由解码器把 z 还原成图像 x'。整个流程像流水线一样跑通,最终目标只有一个:让还原出来的图像尽量像原图。

为了让学徒学得稳,VAE 的损失函数里有两个人严格把关:一个是“还原监督员”,负责检查输出与输入像不像,督促解码器把 z 里的信息充分用起来;另一个是“正则教练”,负责把编码器输出的分布往标准正态分布方向拽,避免学徒偷懒把特征空间撑得乱七八糟。加上重参数化之后,这两项损失对参数的梯度都能顺畅传回,整个网络可以端到端训练。

L=Ex[∥x−D(z)∥2]⏟重建损失+KL(N(μ,σ2) ∥ N(0,I))⏟先验正则\mathcal{L} = \underbrace{\mathbb{E}_{x}\left[ \| x - D(z) \|^{2} \right]}_{\text{重建损失}} + \underbrace{\mathrm{KL}\left( \mathcal{N}(\mu, \sigma^{2}) \,\|\, \mathcal{N}(0, \mathbf{I}) \right)}_{\text{先验正则}}

1. 重建项:$\mathbb{E}_{x}[\| x - D(z) \|^2]$ 度量解码器输出与原图的像素差异,训练中通过采样 z 来估计,而 z 由重参数化产生,梯度可穿透。

2. KL 项:$\mathrm{KL}(\mathcal{N}(\mu,\sigma^2) \| \mathcal{N}(0,\mathbf{I}))$ 衡量编码器给出的分布与标准正态先验的差距,它有解析解,不需要采样,直接代入 μ 和 logvar 就能算出。

3. 端到端联合:两层损失相加后,对编码器和解码器的所有参数求梯度,通过重参数化的“确定性门”一路回传,完成一次更新。

训练若干轮后,学徒就出师了:给它一个随机采样的 z,它就能生成一张崭新的、从没出现过的图像。这时的“手抖”反而成了优点——正是随机性让每次生成的图像都不重样,而重参数化确保了这份随机是可控的、可学的。生成模型的迷人之处,正在于此。

收益与局限:这把勺子的边界

重参数化给 VAE 带来的收益是决定性的。最直接的一点是端到端可训练,梯度真正流回了编码器,模型不再“瘫痪”;其次,相比早先的 REINFORCE 等蒙特卡洛梯度估计,重参数化的估计方差小得多——厨师不用反复做一百次沙拉才能摸清规律,凭一次反馈就能精准调整配方。训练稳定了,生成质量自然提升,这也是 VAE 能成为图像生成、表示学习主流工具的根本原因。

但任何工具都有边界。重参数化的巧妙建立在“噪声 ε 经过线性变换后仍保持目标分布”这一前提上,这对正态分布成立,对很多连续分布也能设计出类似套路。可一旦 z 是离散的——比如生成文字时每个词是一个类别,或者做二值决策——麻烦就来了:连续噪声再怎么变换,得到的仍然是连续值,没法等价于离散分布。

若 z∈{0,1}, 则 μ+σε∉{0,1}\text{若 } z \in \{0, 1\}, \text{ 则 } \mu + \sigma \varepsilon \notin \{0, 1\}

1. 离散约束:$z \in \{0, 1\}$ 表示隐变量只能取两个离散值,类似“掷硬币”而不是“倒盐”,不存在连续的手抖幅度。

2. 连续噪声:$\varepsilon$ 是连续随机变量,$\mu + \sigma\varepsilon$ 的取值布满整个实数区间,无法恰好落回 $\{0, 1\}$ 两个点上。

3. 替代方案:对离散情况需要用 Gumbel-Softmax 等技巧“软化”离散采样,那是另一篇文章的主角,但理解了重参数化的思路,你已拿到理解它的钥匙。

理解重参数化的收益与局限,就像厨师了解自己那把勺子的刻度范围:在连续调味的世界里它精准高效,但面对“放葱还是放蒜”这种二选一,还得换一把刀。看清工具的形状,才知道何时用它、何时换它。

AI 应用场景

可控人脸生成模型的稳定训练

阶段:模型训练(生成模型)

解决的问题:早期生成模型训练时,采样不可微导致梯度断链,训练发散甚至直接崩溃。传统做法只能靠大量采样粗略估计梯度,效率极低。重参数化让梯度稳定穿透采样层,训练过程平滑收敛。

具体案例:某团队训练一个可控人脸生成 VAE。编码器把人脸图像编码为 μ(五官轮廓)和 logvar(细节丰富度),重参数化采样出隐含身份信息的 z,解码器重建人脸。训练时梯度顺畅回传,模型收敛速度提升约 3 倍,生成的人脸在“身份保持”和“细节多样性”两个指标上同时明显改善。

推荐系统用户兴趣的贝叶斯建模

阶段:召回与表示学习

解决的问题:用户行为数据稀疏且有大量噪声,直接把用户嵌入为固定向量会丢失随机性和不确定性。用 VAE 将用户兴趣建模为分布,再通过重参数化采样出用户向量,既保留了探索性,又让推荐模型能端到端训练。

具体案例:某音乐平台用 VAE 对用户播放历史建模,编码器输出用户兴趣的 μ 与 logvar(logvar 大表示兴趣不确定),重参数化采样出用户向量用于召回候选歌曲。上线后召回多样性与离线 AUC 均有提升,冷启动用户(探索阈值增大)的切歌率明显下降。

Python 演示

python46 行
import torchimport torch.nn as nn class VAE(nn.Module):    """变分自编码器: 通过重参数化让采样可微"""     def __init__(self, in_dim=784, h_dim=128, z_dim=8):        super().__init__()        self.fc_enc = nn.Linear(in_dim, h_dim)        self.fc_mu = nn.Linear(h_dim, z_dim)        self.fc_logvar = nn.Linear(h_dim, z_dim)        self.fc_dec = nn.Linear(z_dim, h_dim)        self.fc_out = nn.Linear(h_dim, in_dim)     def encode(self, x):        h = torch.relu(self.fc_enc(x))        return self.fc_mu(h), self.fc_logvar(h)     def reparameterize(self, mu, logvar):        sigma = torch.exp(0.5 * logvar)        eps = torch.randn_like(sigma)        return mu + sigma * eps     def decode(self, z):        h = torch.relu(self.fc_dec(z))        return torch.sigmoid(self.fc_out(h))     def forward(self, x):        mu, logvar = self.encode(x)        z = self.reparameterize(mu, logvar)        return self.decode(z), mu, logvar def vae_loss(x, recon, mu, logvar):    recon_loss = nn.functional.binary_cross_entropy(recon, x, reduction='sum')    kl_loss = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())    return recon_loss + kl_loss if __name__ == '__main__':    torch.manual_seed(42)    model = VAE()    x = torch.randn(32, 784)    recon, mu, logvar = model(x)    loss = vae_loss(x, recon, mu, logvar)    print('loss =', loss.item())    z = model.reparameterize(mu, logvar)    print('z shape =', z.shape, 'z mean =', z.mean().item(), 'z std =', z.std().item())
目的:用 PyTorch 实现一个极简 VAE,完整展示编码器输出 μ/logvar、重参数化采样、解码器重建和损失计算的闭环,核心是 reparameterize 方法的三行逻辑。
  1. sigma = torch.exp(0.5 * logvar)把网络输出的对数方差还原成正的标准差 σ,这是“手抖幅度”的数学表达。
  2. eps = torch.randn_like(sigma)从标准正态分布中抽取与 σ 同形状的随机噪声,充当“外部骰子”。
  3. return mu + sigma * eps用确定性加法与乘法组合出 z,随机性全部来自 ε,梯度可沿 μ、σ 路径安全回传。
  4. recon_loss = nn.functional.binary_cross_entropy(recon, x, reduction='sum')重建损失,监督解码器还原输入。
  5. kl_loss = -0.5 * torch.sum(1 + logvar - mu.pow(2) - logvar.exp())KL 散度的解析解,直接把分布拉向标准正态先验。
  6. z = self.reparameterize(mu, logvar)在 forward 中调用重参数化采样,让随机性出现在前向路径的中间。

常见误区

误区我觉得重参数化之后,用了 μ + σ×ε,那么输出的 z 就是确定的了,随机性被“消除”了。

正解随机性并没有消失,只是从“采样 z 的动作”转移到了“采样 ε”上。ε 每次都是随机抽的,所以 z 每次依然不同——这正是生成多样性的来源。真正变化的是:z 与参数 μ、σ 之间的关系从“不可微的随机跳变”变成了“可微的确定性变换”。厨师的手抖还在,只是你能看到骰子的读数了。

为何常见:公式里 μ 和 σ 是网络输出的固定值,容易让人误以为整个式子都是确定的,忽略了 ε 才是随机性的宿主。

误区PyTorch 里 `torch.normal(mu, sigma)` 就能采样,为什么还要费劲写 `mu + sigma * eps`?效果不都一样吗?

正解二者的分布完全一样,但 torch.normal 的采样过程是“从分布里抽一个样本”,这个动作的导数没有被定义,梯度传到 μ 和 σ 处会变成 None,模型直接瘫痪。而 mu + sigma * eps 把随机性隔离在独立噪声 ε 上,μ 和 σ 参与的运算是纯粹的加法和乘法,自动求导畅通无阻。

为何常见:从结果看,两种方式生成的样本分布相同,初学者容易只盯着“生成结果”,忽略了背后梯度链路的差异。

误区编码器输出 logvar,那 logvar 应该就是方差 σ² 吧?直接用就行。

正解logvar 是方差的对数,即 log(σ²)。网络输出 logvar 而不是方差 σ²,是因为方差必须为正,而神经网络的输出可正可负,直接输出方差会引入额外约束。用 logvar 无约束、数值稳定,使用时通过 σ = exp(0.5 × logvar) 还原为标准差。

为何常见:名字里带着 var,加上很多教程没有强调换算关系,让人误以为它就是方差本身。

误区既然正态分布可以用 z = μ + σε,那伯努利分布、类别分布是不是也能照葫芦画瓢写个公式?

正解重参数化的适用前提是“能找到基础分布 + 确定性变换来等价生成目标分布”。正态分布恰好满足 z = μ + σε;但对伯努利分布,连续噪声线性变换后仍是连续值,无法表示离散的 0/1 结果,需改用 Gumbel-Softmax 这类“软化”技巧。

为何常见:看到重参数化公式简洁优美,容易产生“万物皆可重参数化”的错觉,忽略了离散分布的结构差异。

误区重参数化之后所有损失项的梯度都能算了?那重参数化就是 VAE 能训练的唯一功臣。

正解重参数化只解决了重建项里“对采样求梯度”的问题。KL 散度项有解析解,直接用 μ 和 logvar 代入公式就能算梯度,根本不涉及采样。重参数化是为“采样路径”补上了最后一段可微的桥,但整座桥还有解析推导的桥墩。

为何常见:训练脚本里重参数化代码醒目,而 KL 项的解析公式悄然藏在损失函数里,容易让人忽略它的存在。

面试题

Q1. 重参数化技巧的核心目的是?

单选题 · easy

  • A.加快采样速度
  • B.梯度穿过采样← 正确答案
  • C.消除随机性
  • D.减少参数量

答案:B。重参数化的核心是把“采样 z”分解为“采样 ε + 确定性变换”,使梯度能沿 μ、σ 的确定路径反向传播。选项 A 是附带效应,C 是完全错误(随机性仍在 ε 中),D 与实际无关。

Q2. 重参数化公式 z = μ + σ×ε 中,ε 通常服从什么分布?

单选题 · easy

  • A.均匀分布 U(0,1)
  • B.标准正态 N(0,1)← 正确答案
  • C.伯努利 B(p)
  • D.指数分布 Exp(λ)

答案:B。标准正态分布的均值为 0、方差为 1,才能保证 z 的期望恰好是 μ、方差恰好是 σ²,即 z 仍服从 N(μ, σ²)。其他分布的均值或方差不为 0/1,会破坏分布等价性。

Q3. VAE 的编码器通常输出哪两个参数?

单选题 · easy

  • A.均值和标准差
  • B.均值和方差对数← 正确答案
  • C.方差和采样点
  • D.均值和采样点

答案:B。输出的是 μ 和 logvar(方差的对数)。logvar 可正可负、无约束,适合作为网络输出;标准差 σ 通过 exp(0.5×logvar) 还原。直接输出标准差 σ 或方差 σ² 需强制为正,不利于无约束优化。

Q4. 为什么用 logvar 而不是直接输出方差 σ²?

单选题 · mid

  • A.降低参数量
  • B.无约束利于优化← 正确答案
  • C.避免梯度消失
  • D.增大模型容量

答案:B。方差必须为正,若网络直接输出 σ² 需加 softplus 等约束,限制表达且数值不稳。logvar 取值范围为全体实数,网络可以自由输出,训练更顺畅。这与参数总量、梯度消失或模型容量无关。

Q5. 重参数化之后,梯度是沿哪条路径传到 μ 的?

单选题 · mid

  • A.z = μ + σε 的加法路径← 正确答案
  • B.ε 的采样路径
  • C.解码器的重建路径
  • D.KL 散度的解析路径

答案:A。在 z = μ + σε 中,μ 通过加法直接参与 z 的构成,梯度沿这条加法路径回传。ε 是随机采样,不含参数信息;解码器路径是 z 之后的延伸,KL 路径则是另一项独立损失。

Q6. 关于重参数化说法正确的是?

单选题 · mid

  • A.随机性完全消除
  • B.随机性转移至 ε← 正确答案
  • C.只能用于正态分布
  • D.会让输出变固定

答案:B。重参数化把随机性从“采样 z”转移到“采样 ε”,z 本身仍是随机变量,每次输出不同,保持了生成多样性。它虽常用于正态分布,但原理可推广到其他连续分布族,并非只能用于正态。

Q7. 若 z 是伯努利分布,直接用 z = μ + σε 重参数化会怎样?

单选题 · hard

  • A.梯度无法计算
  • B.输出变为连续值← 正确答案
  • C.采样速度变慢
  • D.参数数量膨胀

答案:B。ε 是连续噪声,μ + σε 得到连续实数,无法落在 {0,1} 两个离散点上,也就不能等价表示伯努利分布。此时需 Gumbel-Softmax 等技巧;梯度计算、采样速度、参数量都不是主要问题。

Q8. 重参数化带来的收益有哪些?

多选题 · mid

  • A.端到端反向传播← 正确答案
  • B.训练方差降低← 正确答案
  • C.收敛更加稳定← 正确答案
  • D.采样结果无随机

答案:ABC。重参数化打通了采样路径的梯度,实现端到端训练;相比蒙特卡洛估计,方差大幅降低,训练更稳定。但它并不会消除随机性——D 恰恰是常见误解。

Q9. 关于 VAE 损失的两项,说法正确的有?

多选题 · hard

  • A.KL 项有解析解← 正确答案
  • B.重建项需要采样← 正确答案
  • C.KL 项需要采样估计
  • D.重建项可以解析算

答案:AB。KL 散度在“编码分布为正态、先验为标准正态”的假设下可解析计算,不需要采样;重建项通过重参数化采样 z 后计算重建误差,本质上仍是采样估计。C、D 正好颠倒了二者的性质。

Q10. σ = exp(0.5×logvar) 的推导依据是?

单选题 · extreme

  • A.中心极限定理
  • B.logvar=log(σ²) 变形← 正确答案
  • C.最大似然估计
  • D.贝叶斯公式

答案:B。由定义 logvar = log(σ²),两边取指数得 σ² = e^{logvar},再开平方得 σ = e^{0.5×logvar}。这是纯代数变形,与中心极限定理、最大似然或贝叶斯公式均无关系。