普通向量量化用一个码本向量近似 encoder 输出;RVQ 则先给出一个粗近似,再让第二个码本量化第一层留下的误差,第三层继续量化新的误差。最终重建向量是所有层向量之和。
这和逐位写一个小数很像:第一位解释最大尺度,后面的位只负责修正。区别是每一“位”不是标量数字,而是从一个可学习的向量码本中选出的向量。
一、逐层残差量化公式
设 encoder 将第 t 个音频帧映射为 z_t ∈ R^d,第 m 层码本为 C^(m)={e_1^(m),...,e_Km^(m)}。初始化残差就是原向量:
z_t = Eθ(x)_t
r_t^(0) = z_t第 m 层从自己的码本选择与当前残差最近的向量:
k_t^(m) = arg min_k || r_t^(m-1) - e_k^(m) ||²
q_t^(m) = e_(k_t^(m))^(m)选中后,从当前残差中减掉这一层已经解释的部分:
r_t^(m) = r_t^(m-1) - q_t^(m)经过 M 层后,量化结果是所有选中向量之和:
ẑ_t = Σ_(m=1)^M q_t^(m) = z_t - r_t^(M)如果后续码本有效,残差范数通常逐层减小。不过每层是独立有限码本,不能保证每个样本都严格单调改善;训练目标优化的是总体重建与感知质量。
二、RVQ 在神经音频 Codec 中的位置
三、离散最近邻不可导,为什么还能训练?
argmin 的输出是整数索引,微小改变输入通常不会改变索引,因此不能直接求有效梯度。VQ-VAE 系列方法使用直通估计器:前向传播仍使用量化向量,反向传播则近似把量化器当作恒等映射。
z̃ = z + sg(ẑ - z)sg 是 stop-gradient。前向数值为 ẑ,对 z 的反向导数近似为 1。常见的逐层量化损失还包含码本项与 commitment 项:
L_RVQ = Σ_t Σ_m [ ||sg(r_t^(m-1)) - q_t^(m)||²
+ β ||r_t^(m-1) - sg(q_t^(m))||² ]第一项把码本向 encoder 残差拉近,第二项约束 encoder 不要在码本间剧烈漂移。真正的音频 Codec 还会组合波形、频谱、对抗和 feature matching 损失;只优化均方误差往往会得到数值接近但听感发闷的输出。
四、码率由帧率、码本数和码本大小决定
若每秒有 f_r 帧,第 m 个码本有 K_m 个向量,不考虑熵编码时:
R = f_r Σ_m log₂(K_m) bit/s
若所有码本同为 K:R = M · f_r · log₂(K)例如每秒 12.5 帧、8 个码本、每个码本 2048 个向量:
R = 12.5 × 8 × log₂(2048)
= 12.5 × 8 × 11 = 1100 bit/s = 1.1 kbit/s如果训练时随机只启用前若干层,部署时就可通过截断码本数切换码率:前几层保证可懂,追加层逐步改善音色和细节。这是 SoundStream 与 EnCodec 里 quantizer dropout 的工程价值。
五、“第一层是语义,后几层是声学”不是 RVQ 的数学保证
第一层面对完整向量,通常解释能量最大的粗结构;后续层处理较小残差。但如果训练目标只有波形重建,第一层可能优先保存任何最有助于重建的信息,包括音色、基频或环境声,并不会自动变成音素 Token。
SpeechTokenizer 将 HuBERT 表示蒸馏到第一层,Mimi 也使用语义蒸馏,才更明确地把首码本推向语言内容。这个设计有利于 Speech LM 用较低序列宽度建模语义,同时让后续码本恢复声学细节;代价是语义与声学仍不可能完全解耦。
| 设计 | 首层倾向 | 适用目标 |
|---|---|---|
| 纯重建 RVQ | 最大化总体重建收益 | 压缩与高保真重建 |
| 语义蒸馏 RVQ | 对齐 SSL/文本相关表示 | Speech LM、语音对话 |
| 单码本语义 Tokenizer | 高度压缩内容信息 | 语言推理;需生成式 decoder 补声学 |
因此选型时先问清目标:如果需要编辑、生成和推理,Token 的可预测性可能比波形 SNR 更重要;如果只做透明压缩,则不必强迫首层承担语言语义。
评论加载中...