小林在云端出版社实习,负责把作者的灵感画成绘本页。最开始,他学的是 VA 老师的“无限色库”方法——理论上能调出任何颜色,但每调一个色要摆弄十几个参数,色库大得吓人,颜色还经常偏得离谱。直到老编辑递给他一本《标准色卡》,书里只有 512 种经过市场验证的好颜色。小林的工作一下子变成三步:看到目标色,翻色卡找最接近的一格,抽出那张色卡贴到画布上。省时、稳定、还省墨水。这个“翻卡—取卡—贴卡”的过程,就是离散量化;那本《标准色卡》,就是码本;后来为了解决“选完色不知道往哪调”的问题而发明的“直通便签”,就是直通估计器。这套系统最终成长为出版社的王牌——VQ-VAE,把生成任务从“在无限空间里盲调”变成了“在有限选项里选最优”。
掌握 VQ-VAE,你将看懂 VQGAN、EnCodec 等前沿生成模型的离散化设计逻辑,为训练稳定可控的图像与音频生成模型打下坚实基础。
可视化演示
展示 LSTM 单元中遗忘门、输入门、输出门的门控过程,逐步更新细胞状态和隐藏状态,支持序列步进和自动播放。
本节配有交互动效(进入视口后自动加载,约 3KB)。
LSTM 门控机制 遗忘门:控制保留信息 输入门:控制写入信息 C_t = f_t*C_{t-1} + i_t*C̃_t 点击单步执行
离散量化动机
小林最初的调色方式,来自 VA 老师的“无限色库”。这个色库理论上包含所有颜色,编码器每张画都会输出一个连续的颜色向量,比如色相、饱和度、明度各一个连续数值,再在附近随机抖动一下采样。听起来很自由,可问题就出在“自由”上——连续空间太大了,采样点经常落在毫无美感的区域。小林画了十张晚霞,七张糊成一片灰紫,因为解码器面对连续空间里千奇百怪的中间色,根本不知道它们该对应什么样的笔触。
VAE 就是这套“无限色库”的数学版本。它假设潜变量 $z$ 服从标准正态分布,编码器输出的是均值和方差。生成一张图时,先从 $z \sim \mathcal{N}(0, I)$ 采一个点,再让解码器把它映射成图像。问题在于,高斯分布的大部分区域对应的是无意义的中间地带——就像把一百万个调色参数随机组合,绝大多数组合调出的颜色都是脏的。解码器被逼着“和稀泥”,于是生成结果总是带着一层挥之不去的模糊。
离散码本则完全不同。码本里有 $K$ 个已经学好的“标准色”,每个颜色都是被验证过有明确语义的。生成时,模型只需要选一个索引,而不需要在连续空间里乱逛。这种表达方式像语言:一个 token 一个意思,信息密度高,而且可以像写句子一样组合出复杂内容。连续的潜变量像音频波形,细节多但结构弱;离散的 token 像文字,紧凑且语义明确。
回到小林的工位:他后来总结,无限色库的问题不是“颜色不够”,而是“没得选”。当选项多到没有边界时,模型反而不知道什么是好。标准色卡虽然只有 512 格,但每一格都经过了市场的检验——有限,反而让生成稳定了下来。
- 重构项第一项衡量解码器能不能从潜变量 $z$ 还原出原始图像 $x$,这是“成品像不像”的分数。
- 正则项第二项是 KL 散度,强迫编码器输出的分布靠近标准正态先验,相当于“调色参数别太野”。
后验坍缩问题
调色师 Tomas 是个摸鱼高手。他发现打印车间(解码器)手艺很强,不管给他什么纸都能印出像样的东西。于是他找到了偷懒诀窍:每次作画都直接输出固定灰色,理由是“反正打印车间有自己的想法”。最气人的是,这样印出来的画居然还过得去——因为车间学会了训练集里的平均图案。小林一开始很困惑,为什么 Tomas 的灰色画还能通过验收?后来才明白,这就是后验坍缩:解码器学会了忽略潜变量,自己硬扛。
在 VAE 里,后验坍缩是出了名的顽疾。解码器如果足够强,它可以直接拟合训练样本的边缘分布 $p(x)$,根本不需要读条件信息 $z$。于是 KL 项被快速压到接近零,潜变量变成纯摆设——每一张图的 $z$ 都是同一个高斯噪声,毫无区分度。生成的图像虽然“正常”,但千篇一律,没有任何可控性。
那 VQ-VAE 是怎么治住这个偷懒毛病的?关键在于它根本不给模型“忽略 $z$ 走捷径”的机会。VQ-VAE 的潜变量不是连续采样值,而是从码本里真金白银取出的向量 $e_k$。解码器要重建图像,就必须真的读取这个向量里携带的信息。偷懒的路走不通了——你递给打印车间的是一张实打实的色卡,车间没法假装没看见。同时,离散先验是均匀分布,不会像高斯先验那样与真实后验产生结构性失配,天然绕开了“后验分布学不对”的问题。
小林的反思笔记里写着:色卡系统最妙的地方,是它让流程里每个人都没法假装——“调色师不能蒙混,因为他端出来的必须是一张具体的卡;打印车间也不能蒙混,因为它手里真的拿着那张卡。”机制上堵死了摸鱼,后验坍缩自然失去了温床。
- 后验与先验重合KL 散度趋近零,意味着编码器输出的条件分布和先验分布完全一样,$z$ 与 $x$ 相互独立。
- 条件信息丢失当 $z$ 与输入 $x$ 独立时,解码器的输入不携带任何图像信息,只能输出平均结果。
向量量化机制
小林每天的工作流程逐渐固定:接到一个目标色,比如“晚霞紫”,他先盯住它,然后手指划过色卡的索引条,找到最接近的那一格,抽出来,贴到画布上。这个动作在 VQ-VAE 里被精确地翻译成了三步。编码器先把一整幅图像压成一个特征网格,网格里每个位置都站着一个连续向量 $z_e$——这就是小林盯住的那个“目标色”。接着,特征的每个向量都要和码本里的 $K$ 个码本向量逐一计算欧氏距离,找出距离最小的那个下标 $k$——这就是手指划过索引条找最接近的格子。
这三个步骤在数学上写出来非常干净。码本 $\{e_1, e_2, \dots, e_K\}$ 可以理解成一本由 $K$ 个 $d$ 维向量组成的字典,每个向量就是一个“标准色”。编码器输出的连续向量 $z_e(x) \in \mathbb{R}^d$,会被替换成码本中离它最近的向量 $e_k$,替换结果记作 $z_q(x)$。量化后的特征图和原来形状完全一致,只是每个位置的值都被“标准化”了——换句话说,画布上的每个点都被贴上了一张标准色卡,但构图没变。
小林后来在培训笔记里写道:“翻卡这个动作快得让人觉得理所当然,但它藏着整个系统的命门——$k$ 是由 $\arg\min$ 决定的。这个操作像一道关卡,前向是通的,可梯度想穿过去?门都没有。”这个伏笔,为后面直通估计器的登场埋下了逻辑必然。
- 编码器输出图像 $x$ 经过编码器得到特征网格,每个格点上的向量就是要量化的“目标色”。
- 最近邻查找拿 $z_e(x)$ 与码本中全部 $K$ 个向量算平方欧氏距离,取距离最小者对应的下标 $k$。
- 量化输出用第 $k$ 个码本向量替换原来的连续向量,得到离散化的表示 $z_q(x)$。
码本学习规则
出版社每个月都要开一次色卡复盘会。统计显示,有些热门色被借了上千次,有些冷门色一年都没人碰。更新规则很简单:被频繁使用的颜色,就往“借阅者真正想要的颜色方向”微微挪一点;长期无人问津的颜色,直接挪到一个新的常用区域去。小林发现,这套规则和 VQ-VAE 的码本更新如出一辙。
码本里的向量 $e_j$ 也是“靠业绩说话”,靠着使用统计来进化。为什么不用梯度更新?因为 $\arg\min$ 选中的下标对码本向量的梯度无从定义——你没法说清楚“这张色卡该往哪调才能让下次选中它的人更多”。于是 VQ-VAE 采用了一种聚类式的更新:每个码本向量向“使用它的编码器输出”的平均值靠拢。这就是在线 k-means,用指数移动平均(EMA)实现。
具体做法是:给每个码本向量配两个计数器,一个是“人气值” $N_j$,一个是“特征累积值” $m_j$。每次前向计算时,统计有多少个特征向量使用了码本 $j$,记作 $n_j$,并把这些特征向量求和得到 $\text{sum}_j$。然后平滑更新:人气值和累积值都按 $\gamma$ 保留历史、按 $1-\gamma$ 吸收新数据。最后,码本向量就是累积值除以人气值的商。
这套规则还顺手解决了一个隐患——死码本。如果一个码本长期没被使用,它的“人气值”在 EMA 衰减下会越来越低,最后几乎不占权重。有些实现会直接把低人气码本重置到随机位置,相当于把积灰的冷门色卡换成当下需要的热门色。小林最欣赏这点:色卡系统不只是被使用,它自己也在持续进化,越用越趁手。
- 衰减合并旧的人气值 $m_j, N_j$ 按 $\gamma$ 保留,新统计量按 $1-\gamma$ 加入,$\gamma$ 通常取 0.99。
- 归一化用累积特征和除以总人气值,得到码本向量的新位置。
直通估计器
小林发现了一个新的麻烦。当他抽出某张色卡贴上画布后,总监跑来说:“这张晚霞紫太暗了,往亮的地方调一格。”小林愣住了——他手里只是一张印好的色卡,色卡本身没法“部分变亮”,更关键的是,调色师(编码器)那边完全没收到这个反馈,因为选卡这个动作是不可微的,反馈信号在这里断了。小林坐在工位上想了半天,灵机一动:在色卡背面贴一张便签,把“太暗了往亮调”这句话原样写在最初想调的目标色旁边。这样,调色师虽然看不到色卡,但能看到便签,照着反馈调整下次调色的方向。
这个“便签”就是直通估计器(Straight-Through Estimator)。前向传播时,老老实实走量化路径——输出就是码本里的那个向量,该是什么就是什么;反向传播时,把量化输出 $z_q$ 收到的梯度“原封不动”抄送给编码器输出 $z_e$,就像便签绕过检查站直接送到调色师手里。数学上,这相当于做了一个大胆的近似:假装量化没有发生过。
用 stop-gradient 算子来表达会非常简洁。$\text{sg}[\cdot]$ 表示“这个张量在反向传播时被冻结”。前向计算时,$z_q$ 的取值完全由码本决定;反向时,梯度却可以直接流经 $z_e$ 这一支。一前一后,两条路,各走各的。
但是,小林很快发现便签有时也会“失真”。如果调色师的目标色离色卡太远,便签上写的“往亮调”就没什么参考价值。为了让便签信息可靠,需要配套约束:调色时别离色卡太远。这个配套约束,就是下一节要讲的承诺损失。便签能解决梯度通路,但要让通路上的信号可靠,还得靠“别飘太远”的约定。
- 前向取码本第一项 $z_e$ 加上被冻结的差值,实际计算结果就是 $e_k$,即前向走量化路径。
- 反向复制梯度因为 $\text{sg}$ 部分梯度为零,梯度只沿 $z_e$ 这一支传递,近似认为 $\partial L / \partial z_e \approx \partial L / \partial z_q$。
整体损失函数
到了月末对账,小林把整个系统拆成了三张单子。第一张是“成品对照单”:把每幅绘本成稿和原稿放在一起,比一比像不像,差异越大扣分越多——这是重构损失。第二张是“色卡匹配单”:检查出版社的色卡是不是贴在了正确的目标色附近,如果中间偏差太大,就说明色卡本身该调了——这是码本损失。第三张是“调色承诺单”:检查调色师有没有老实干活——调出的目标色有没有离最终选用的色卡十万八千里,有的话说明他偷懒了——这是承诺损失。
三张单子在数学里对应三个损失项。重构损失衡量生成图与输入图的像素差异;码本损失携带 $\text{sg}[z_e]$,梯度只流向码本,作用是“让色卡朝目标色靠”;承诺损失携带 $\text{sg}[e]$,梯度只流向编码器,作用是“让目标色别飘离色卡”。两个 $\text{sg}$ 借位,把一张总账分得清清楚楚。
小林把三张单子贴在工位上方的墙壁上,配了一行注释:“一张盯质量,一张盯色卡,一张盯态度。”整个系统从此不再是各管各的零件,而是一个责任到人、账目清晰的完整流程。色卡、编码器、解码器各归其位,生成任务第一次有了清晰的“问责机制”。
- 重构损失第一项中 $\hat{x}$ 是解码器重建的图像,$\| x - \hat{x} \|_2^2$ 是逐像素的平方误差,管“画得像不像”。
- 码本损失第二项的 $\text{sg}$ 冻结了 $z_e$,梯度只能更新码本向量 $e$,让色卡主动贴近目标色。
- 承诺损失第三项的 $\text{sg}$ 冻结了 $e$,梯度只更新编码器参数,让目标色承诺不游离太远,$\beta$ 通常取 0.25。
实际应用场景
色卡系统在出版社内部试运行半年后,被推向三条流水线:绘本组、音乐组、配音组。每一条流水线都有自己独特的挑战,但共享同一个内核——把无限信息流压成有限选项,再从中做选择。小林开始以技术顾问的身份,看这套逻辑在不同战场上开花结果。
图像流水线交出了 VQGAN。思路是把图像先通过 VQ-VAE 压成一张“离散 token 地图”——每个 token 就是色卡上的一个编号。接下来,这个 token 序列被交给自回归的 Transformer,像写文章一样逐个预测下一个 token。因为表示是离散的,预测任务就变成了分类任务,稳定且可控。这套范式后来在很多文生图系统里都能看到影子:先用离散化压缩空间,再用大模型生成 token,最后解码回高清图。
音频流水线拿出了 SoundStream。声音本来是一串连续的波形采样点,直接传输带宽压力大。SoundStream 用 VQ-VAE 把音频流量化为紧凑的离散码流,用极低的比特率完成实时编码解码。通话的另一端收到码流后,解码器把色卡序列还原成波形。量化带来的损失被码本的“最优代表色”补了回来——人类听感上几乎无差别,但带宽省下了一大截。
语音流水线则让 VQ-VAE 服务语音合成。中间表示被约束成离散音素级别的 token,模型的发音更稳定,少了很多滑音和吞音。三条流水线跑通后,小林在季度总结会上写下了最后一页 PPT:“所谓生成,很多时候不是创造新颜色,而是从好颜色里做选择。”台下掌声响起,坐在第一排的 VA 老师也轻轻点了点头——无限色库的旧时代,正式翻篇了。
AI 应用场景
图像生成:离散 token 让大模型学会画画
阶段:数据压缩与生成建模
解决的问题:传统连续潜变量生成模型容易输出模糊图像,且难以对大模型输入进行结构化建模。VQ-VAE 把图像压成离散 token 序列,让自回归模型像写文章一样“写画”,训练更稳定。
具体案例:VQGAN 以 VQ-VAE 作为第一阶段,把高分辨率图像编码为 16×16 的离散 token 图;第二阶段用 Transformer 基于文本提示生成 token 序列,解码后得到高清图像。许多文生图系统沿用这一“离散化 + 自回归”的经典管线。
音频实时编解码:低码率语音传输
阶段:模型部署与推理优化
解决的问题:传统音频编码器在低比特率下音质严重下降,而连续神经网络编解码器难以与终端链路无缝配合。VQ-VAE 的离散码流天然适合传输协议,支持极低比特率下的高保真重建。
具体案例:SoundStream 将音频编码成离散码本索引,配合对抗训练与感知损失,在 3kbps 的极低码率下仍保持清晰听感,支持实时双向通信,目前已被用于语音通话降噪和压缩场景。
语音合成:让中间表示更像“音素”
阶段:特征表示学习
解决的问题:语音合成中连续中间表示经常含糊不清,导致发音抖动。VQ-VAE 把中间表示约束到有限离散码本上,使每个 token 更接近音素级的语义单位,提升发音稳定性。
具体案例:VITS 等端到端语音合成系统引入 VQ-VAE 风格的离散化约束后,合成语音的韵律和发音都更加自然,训练过程也更稳定,显著减少了漏读和吞音现象。
Python 演示
import torchimport torch.nn as nnimport torch.nn.functional as F class CodebookLayer(nn.Module): """离散码本层. 把连续向量 z_e 量化到最近的码本向量.""" def __init__(self, dim, size): super().__init__() self.table = nn.Embedding(size, dim) self.table.weight.data.uniform_(-1.0 / size, 1.0 / size) def forward(self, z_e): flat = z_e.permute(0, 2, 3, 1).reshape(-1, z_e.shape[1]) # 欧氏距离展开: ||a-b||^2 = ||a||^2 - 2ab + ||b||^2 dists = (flat.pow(2).sum(1, keepdim=True) - 2.0 * flat @ self.table.weight.t() + self.table.weight.pow(2).sum(1).unsqueeze(0)) indices = dists.argmin(1) # 最近邻查找 z_q = self.table(indices).view(z_e.shape) # 取码本向量 # 码本损失: 让码本接近编码器输出 codebook_loss = F.mse_loss(z_e.detach(), z_q) # 承诺损失: 让编码器输出接近码本 commitment_loss = F.mse_loss(z_e, z_q.detach()) # 直通估计器: 前向用 z_q, 反向梯度直通到 z_e z_q = z_e + (z_q - z_e).detach() return z_q, codebook_loss, commitment_loss class MiniVQVAE(nn.Module): """极简 VQ-VAE: 编码器-量化器-解码器.""" def __init__(self, dim=8, size=64): super().__init__() self.encoder = nn.Sequential( nn.Conv2d(3, 16, 4, stride=2, padding=1), nn.ReLU(), nn.Conv2d(16, dim, 4, stride=2, padding=1)) self.decoder = nn.Sequential( nn.ConvTranspose2d(dim, 16, 4, stride=2, padding=1), nn.ReLU(), nn.ConvTranspose2d(16, 3, 4, stride=2, padding=1)) self.quantizer = CodebookLayer(dim, size) def forward(self, x): z_e = self.encoder(x) z_q, cb_loss, cm_loss = self.quantizer(z_e) x_hat = self.decoder(z_q) return x_hat, cb_loss, cm_loss model = MiniVQVAE()optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)for step in range(100): x = torch.randn(8, 3, 32, 32) # 随机数据模拟输入 x_hat, cb_loss, cm_loss = model(x) recon_loss = F.mse_loss(x_hat, x) # 重构损失 loss = recon_loss + 1.0 * cb_loss + 0.25 * cm_loss optimizer.zero_grad() loss.backward() optimizer.step() if step % 20 == 0: print(f"step {step}: loss={loss.item():.4f}")
flat = z_e.permute(0, 2, 3, 1).reshape(-1, z_e.shape[1])把特征图展平成向量列表,方便批量计算距离。dists = (flat.pow(2).sum(1, keepdim=True) - 2.0 * flat @ self.table.weight.t() + ...)用展开式一次性算完所有向量对所有码本的距离,避免写循环。indices = dists.argmin(1)每个特征向量选出最近码本的下标,这就是“翻色卡最接近的一格”。z_q = self.table(indices).view(z_e.shape)按下标取回码本向量,保持原图的空间结构。codebook_loss = F.mse_loss(z_e.detach(), z_q)只更新码本,让码本向量向编码器输出靠拢。commitment_loss = F.mse_loss(z_e, z_q.detach())只更新编码器,让编码器输出别飘离码本太远。z_q = z_e + (z_q - z_e).detach()直通估计器的一行式实现:前向取码本值,反向梯度直通。loss = recon_loss + 1.0 * cb_loss + 0.25 * cm_loss三个损失各配权重,正好对应“成品、色卡、承诺”三张对账单。
常见误区
误区VQ-VAE 名字里带 VAE,肯定是和 VAE 一样在损失函数里加一个 KL 项,让潜变量接近正态分布,防止过拟合。
正解VQ-VAE 的先验是离散码本上的均匀分布,默认每个码本等概率使用。损失函数里没有 KL 项对潜变量做连续化约束。相反,如果硬加高斯 KL 项,会把离散表示往连续空间方向拉扯,破坏 token 的语义清晰度。VQ-VAE 靠的是重构损失、码本损失和承诺损失,三足鼎立。
为何常见:模型名带“VAE”,很多入门资料又习惯性地展示 KL 公式,读者很容易默认它与标准 VAE 共用同一套训练目标。
误区整个网络是端到端训练的,所以码本向量也应该和其他参数一样,由优化器负责更新梯度。
正解$\arg\min$ 的下标选择不可导,码本向量收不到常规梯度。实际更新方式是 EMA——把每个码本向量拉向“最近使用它的编码器输出的平均值”。实现里可能有一个看似梯度的项,但它是借助 stop-gradient 的近似手段,本质上不是对码本的梯度更新。
为何常见:现代自动微分库让参数更新看起来“一视同仁”,容易让人忽略不可导操作的特殊处理。
误区直通估计器直接把量化部分的梯度整体忽略,如此粗暴的近似肯定会让训练质量大打折扣。
正解STE 屏蔽的是量化噪声的梯度,保留的是“码本不变时编码器该如何调整”的语义梯度。配合承诺损失,编码器输出被约束在码本附近,让这个近似误差很小。它在众多离散生成模型里被反复验证有效,不是权宜之计。
为何常见:从数学上看 $\arg\min$ 的导数不存在,直觉上认为“跳过不可导点”不严谨,但工程实践表明该方向的信号主导了训练收益。
误区码本容量越大,能表达的离散模式越多,生成效果自然越好,所以直接把 K 拉到几万。
正解码本变大后大量码本可能长期不被使用,形成死码本,有效容量反而下降。需要配合 EMA 衰减、重启机制或困惑度惩罚来维持码本的均衡使用。更大的码本也要求更高的码本维度,否则每个向量承载的信息不足,重建模糊。
为何常见:“选择空间更大更好”这个直觉在参数化模型里很自然,但训练动力学决定了没有梯度信号的冷门码本会彻底失活。
误区量化以后每个位置只能从 K 个值里选一个,肯定损失了很多细节,重建效果一定不如连续潜变量。
正解单个离散 token 的信息量确实有限,但码本是学出来的最优“代表色”,且整幅图有大量 token 组合起来表达。量化不是简单地压缩,而是把信息整理成更结构化的形态。VQ-VAE 的实际重建质量常常优于普通 VAE,同时获得可控性。
为何常见:人脑直觉“离散 = 丢信息”,却没意识到码本本身是可学习的、token 之间可以组合表达复杂内容。
面试题
Q1. VQ-VAE 中把连续向量映射到离散码本的核心操作是?
- A.线性投影矩阵
- B.最近邻索引查询← 正确答案
- C.高斯随机采样
- D.残差卷积操作
答案:B。VQ-VAE 的核心操作是向量量化:编码器输出的连续向量与码本中所有向量计算欧氏距离,选择距离最近的那个码本下标。线性投影、随机采样和残差卷积都不是 VQ-VAE 的量化步骤。
Q2. VQ-VAE 相对于原始 VAE 的核心改进是什么?
- A.网络结构的深度
- B.离散码本潜变量← 正确答案
- C.引入注意力机制
- D.扩大训练数据量
答案:B。原始 VAE 使用连续高斯分布作为潜变量先验,容易出现后验坍缩和生成模糊。VQ-VAE 将潜变量改成离散的码本索引,让表示更紧凑、生成更稳定。网络深度、注意力和数据量都不是它的标志性改进。
Q3. 直通估计器(STE)在 VQ-VAE 中解决什么问题?
- A.让码本更新更快
- B.绕过量化不可导← 正确答案
- C.降低重构误差
- D.提升码本利用率
答案:B。$\arg\min$ 操作不可导,梯度无法从量化输出传到编码器。STE 在前向保持量化路径,反向把 $z_q$ 的梯度直接复制给 $z_e$,绕过了不可导的关卡。它本身不直接优化重构误差或码本利用率。
Q4. VQ-VAE 中码本向量通过 EMA 更新,最终趋向于什么?
- A.编码器输出的均值← 正确答案
- B.解码器输入的均值
- C.原始像素的均值
- D.高斯噪声的均值
答案:A。EMA 更新把每个码本向量拉向“最近使用它的编码器输出的平均值”,相当于在线 k-means。解码器输入和像素数据都不是码本更新的目标,高斯噪声更与码本无关。
Q5. 承诺损失(commitment loss)的主要作用是什么?
- A.拉近码本与输入
- B.拉近输入与码本← 正确答案
- C.加快训练收敛
- D.提升重建清晰度
答案:B。承诺损失 $\beta\|z_e - \text{sg}[e]\|^2$ 冻结码本、只更新编码器,让编码器输出 $z_e$ 别飘离选中的码本向量太远。而“拉近码本与输入”是码本损失的工作。它保证 STE 的近似梯度方向可靠。
Q6. 关于后验坍缩,以下说法正确的是?
- A.解码器忽略潜变量← 正确答案
- B.KL 项趋近于零← 正确答案
- C.生成结果失去多样性← 正确答案
- D.码本利用率系统性上升
答案:ABC。后验坍缩时 KL 项被压到接近零,$q(z|x)$ 与先验重合,解码器只学了个边缘分布,潜变量不再携带输入信息,生成结果千篇一律。码本利用率上升是死码本缓解的表现,与后验坍缩无直接关系。
Q7. 以下哪个应用直接使用了 VQ-VAE 的离散化思想?
- A.VQGAN 图像生成← 正确答案
- B.ResNet 图像分类
- C.YOLO 目标检测
- D.BERT 文本分类
答案:A。VQGAN 使用 VQ-VAE 把图像编码为离散 token,再由 Transformer 生成新 token 序列。ResNet、YOLO、BERT 分别是分类、检测和文本任务的经典架构,不涉及图像离散潜变量建模。
Q8. 下列关于 VQ-VAE 损失项作用的说法,正确的是?
- A.重构损失评估重建质量← 正确答案
- B.码本损失拉近码本与输入← 正确答案
- C.承诺损失拉近码本与输入
- D.承诺损失抑制编码器漂移← 正确答案
答案:ABD。重构损失衡量重建图与输入的差异;码本损失 $\|\text{sg}[z_e]-e\|^2$ 让码本向量靠近编码器输出;承诺损失 $\|z_e-\text{sg}[e]\|^2$ 让编码器输出靠近码本、抑制漂移。“承诺损失拉近码本与输入”把两个损失的方向搞反了。
Q9. 关于死码本问题,以下说法正确的是?
- A.部分码本从未被使用← 正确答案
- B.有效表示容量会下降← 正确答案
- C.与初始化方式有关联← 正确答案
- D.只能靠扩大码本解决
答案:ABC。死码本指某些码本长期不被任何输入激活,造成表示容量浪费;不良初始化会让部分码本一开始就离数据很远,加剧该问题。解决办法包括 EMA 衰减、随机重启、困惑度惩罚,而不是简单增加码本数量。
Q10. 设编码器输出为 $z_e$,量化输出为 $z_q = e_k$,直通估计器反向传播时 $\partial L / \partial z_e$ 近似等于?
- A.让 $z_q$ 的梯度复制到 $z_e$← 正确答案
- B.让 $z_q$ 的梯度变为零
- C.让 $z_e$ 的梯度复制到 $z_q$
- D.让损失绕过编码器
答案:A。STE 的核心是把量化输出收到的梯度原样复制给编码器输出,即 $\partial L/\partial z_e \approx \partial L/\partial z_q$,让梯度绕过不可导的 $\arg\min$ 关卡。若梯度为零,编码器将得不到任何学习信号,路径就断了。