VQ-VAE的核心结构可以用encoder、codebook和decoder三部分概括。Encoder先把输入变成连续特征图z_e。对特征图的每个位置,在K个可学习码本向量里找欧氏距离最近的一个,记录它的离散索引,并用对应embedding作为量化表示z_q。Decoder再从z_q重建图像、语音或其他输入。
这个最近邻选择是离散操作,不能直接求导。原论文使用straight-through estimator:前向真正送给decoder的是量化后的码本向量,反向时把decoder一侧关于z_q的梯度近似复制给encoder输出。它是梯度估计方法,不代表最近邻操作本身变成可导。
损失可以顺着梯度流向来讲。重建损失要求decoder恢复输入;codebook loss把embedding拉向分配给它的encoder输出,并用stop-gradient避免更新错一侧;commitment loss约束encoder输出靠近选中的embedding,避免表示幅值不断漂移。这里尤其要说明,commitment loss主要约束encoder,不是用来更新码本,也不能保证不发生codebook collapse。
码本还有EMA更新方案,根据分配到每个code的encoder输出做移动平均。如果使用EMA,就要按该方案更新码本,不能又把梯度式codebook更新和EMA不加区分地叠在一起。实际还要监控code使用率、perplexity和dead codes,必要时做重置或其他利用率约束。
和传统连续VAE相比,连续VAE通常学习q(z|x)的分布参数,通过重参数化采样连续z,并用KL把后验约束到先验。VQ-VAE的编码结果是有限码本中的离散索引,量化处使用straight-through,原始目标没有同形式的连续KL项。要生成新样本,通常还要另外训练PixelCNN或Transformer等先验,学习离散索引序列。
应用上,离散token很适合接自回归先验,原始DALL·E的dVAE和VQGAN路线都与此相关,神经音频codec也会使用向量量化。但常见Stable Diffusion用的是KL正则的连续AutoencoderKL,不应列成VQ-VAE tokenizer;DALL·E 2也有不同的prior和diffusion decoder设计。
最后,离散表示不是无条件最优。码本大小、下采样率、重建误差和token序列长度相互制约,码本还可能出现dead codes。选型时要看后续是自回归建模、压缩还是连续生成,并用重建质量、码本利用率、bitrate和下游生成质量一起评估。
码本大小增加时,离散符号的取值范围会变大,但空间token序列不会自动变长;序列长度主要由encoder下采样率和latent网格决定。更大码本可能降低单位置量化误差,也会增加码本搜索、死码和先验建模难度。这个区分能避免把词表大小与序列长度混成一个量。
如果后续先验按离散索引自回归生成,还要把码本索引的使用分布和先验困惑度一起看。重建很好但大量code从不使用,会浪费容量;码本利用率高也不保证下游生成质量,因此两个阶段都需评测。