0%

VQGAN

VQGAN:将图像压缩成离散Token,同时保留图像的绝大部分信息。将VQGAN作用到Mel谱中可以做到更极致压缩;帧率可以控制在 10 左右。LLM可以建模更长的音频。

VQ-VAE

比较详细的 VQVAE 的解读:轻松理解 VQ-VAE:首个提出 codebook 机制的生成模型

需要理解的有两点:

  • 由于 VQ 的存在导致了中间不可导,不能直接利用重构损失优化 Encoder。通过 preserve gradients 的技巧可以完成梯度的传递,具体:
1
z_q = z + (z_q - z).detach()
  • 优化 CodeBook 的损失有两部分,具体:

Le=sg(ze(x))zq(x)22+βze(x)sg(zq(x))22L_e=\left\|s g\left(z_e(x)\right)-z_q(x)\right\|_2^2+\beta\left\|z_e(x)-s g\left(z_q(x)\right)\right\|_2^2

其中,第一个损失仅用于优化 CodeBook,目标是使得所选的矢量尽可能接近编码器的输出。第二个损失用于优化编码器,目标是让编码器的输出尽可能接近矢量,beta参数控制重要性。在实际中算法对beta不敏感。实际算法实现有两种方式:

  1. 显示计算两个 loss:
1
2
loss = torch.mean((z_q.detach()-z)**2) + self.beta * \
torch.mean((z_q - z.detach()) ** 2)
  1. 利用 ema updates 方式,实际仅计算第二个损失:
1
diff = (quantize.detach() - input).pow(2).mean()

VQGAN

VQGAN 主要是在 VQ-VAE 的基础上引入了 GAN 的方式进行训练,使得解码出来的图像细节更丰富。除了对抗损失之外,还有一个特征匹配损失(利用预训练的VGG计算)。
代码一目了然

vqgan

SpecVQGAN

在 VQGAN 没出来多久就有人把它用在了语音领域,可以参考。
https://github.com/v-iashin/SpecVQGAN

在实际实现过程中可以把特征匹配损失利用whisper的encoder替换vgg。

还有一些最近的值得借鉴的工作,如 VQGAN-LCMusic2Latent

总结

核心的概念就是压缩,不管压缩到离散的矢量还是连续的latent。当压缩的足够才能更高效的训练、推理自回归模型。