Vector-Quantization
VQ-VAE
VQ-VAE[1] 是 Google DeepMind 在 2017 年提出的一个类 VAE 生成模型,相比普通的 VAE,它有两点不同:
- 隐空间是离散的,通过 VQ (Vector Quantization) 操作实现;
- 先验分布是学习出来的。
为什么要用离散的隐空间呢?首先,离散的表征更符合一些模态的自然属性,比如语言、语音,而图像也能用语言描述;其次,离散表征更适合推理、规划等复杂任务。后来 OpenAI 的 DALL·E 正是使用了 VQ-VAE (discrete VAE),证明了它强大的能力。
Vector Quantization
神经网络的输出一般是连续值,如何得到离散的表征呢?这就是 VQ (Vector Quantization) 技术。如上图所示,我们设置一个 codebook (embedding space)
在 VQ-VAE 中,codebook 里的 codes 是可学习的,随着训练过程自适应地调整。所以可学习的参数一共包含编码器、解码器和 codebook 三个部分。如果我们简单地取先验分布 detach()
操作实现。vq 项(或称作 embedding 项、codebook 项)让 codebook 里的 codes 接近编码器的输出,以此来训练 codebook;commitment 项反过来,让编码器的输出接近对应的 codes,避免输出波动太大在 codes 之间乱跳,影响训练。
至此事情还没完,由于 VQ 操作引入了不可导的 argmin 算子,梯度无法从解码器流向编码器,所以现在编码器根本得不到训练。为此,作者引入了 Straight-Through Estimator——直接把
关于损失函数的一点理解
初读 VQ-VAE 论文的时候难免会对损失函数的后两项产生疑惑——一个对
话还得从 VAE 中的 KL 正则项说起。回想一下 KL 正则项的作用是什么——把后验拉向一个预定义的分布,防止 VAE 退化成 AE. 但是现在,由于
我们现在来回答这个问题——为什么 vq 项中要对
如此说来,commitment 项的存在就有点违背我们的解释了。的确,这一项更多地是经验性的举措,有人实验发现即使
所以,就轻重缓急而言,重构项最重要,它直接决定了
然而,论文称
VAE 名不副实?
假设我们现在完成了训练,考察用 VQ-VAE 重构输入的过程——
EMA Codebook
上一节我们介绍了,VQ 操作是一个最近邻查找的过程,产生的效果是把编码器输出的特征向量替换为距离它最近的 code,这不就是在做聚类嘛,聚类中心就是 codebook 里面的 codes. 所以我们其实不必使用 vq 项来训练 codebook,而是直接像 K-Means 那样更新聚类中心:
怎么理解?
虽然论文的主要实验都是用 vq 项来更新 codebook 的,但我复现发现用 K-Means + EMA 的方式更新 codebook 效果更好。事实上,后续的 VQ-VAE-2 和很多其他工作都是用 EMA 方式更新 codebook 的。
Prior Learning
VQ-VAE 训练结束后,我们就可以用它重构输入图像了。但是怎么直接生成新图像呢?
在说明这一点之前,我们必须要对 VQ-VAE 的隐空间有充分的理解。设输入图像
因此,为了生成新图像,我们必须学习一个新的生成模型,对索引之间的分布做建模。鉴于索引是离散的,一个自然的选择就是 PixelCNN. 如果是音频数据,那么就用 WaveNet. 当然,有兴趣也可以尝试其他生成模型。
Index Collapse & Perplexity
虽然作者声称 VQ-VAE 不会遭遇 VAE 的 posterior collapse 问题,但我在实践中发现,它很容易遭遇 index collapse——编码器输出的所有特征向量全部被量化到一个或少数几个 codes 上。从某种意义上说,这也算是一种 posterior collapse 吧。起初我以为自己的实现有误,但一番搜索发现连 Andrej Karpathy 也受其困扰。一个常见的解决方案是用 K-Means 初始化 codebook,但我实测发现用处不大😅,而调小学习率会有帮助。
在代码实现中有一个 trick 是输出 perplexity 来监视是否发生了 index collapse. 当发生 index collapse 时,所有特征向量被量化到一个或少数几个 codes 上,这意味着熵很低;而理想情况是各个索引被均匀地选到,意味着熵很高。因此,索引的熵是能够监视训练是否发生了 index collapse 的指标,而 perplexity 就定义为这个熵的指数。Perplexity 的值域是
VQ-VAE-2
VQ-VAE-2[2] 依旧是 DeepMind 提出的,作者团队只换了一个人。也许他们也意识到了 VQ-VAE 更像是一个 AE 而不是 VAE,论文全程没有用 VAE 的那套概率术语,而是从信息压缩的角度做了更自然的描述。我们知道自回归模型的一大缺点是生成速度慢,这是因为一张高清图像的像素成千上万,而自回归模型只能串行生成一个个像素。为了解决这个问题,我们可以把自回归模型放到隐空间去,这样不仅速度成倍加快,信息密度也更高——像素空间中冗余繁杂的细节信息被压缩掉了,模型只需要考虑真正重要的语义信息。在这个视角下,VQ-VAE 训练 Encoder + VQ + Decoder 其实就是在寻找隐空间,找到隐空间之后,在隐空间上训练 PixelCNN 自回归模型做生成。这样梳理 VQ-VAE 的思路就显得顺畅直观了很多。事实上,这个思路后来被用到了 Stable Diffusion (Latent Diffusion) 上——在隐空间学习扩散模型,就像 VQ-VAE 在隐空间学习自回归模型一样(注意:这两个隐空间其实并不相同,一个是量化后的,一个是量化前的,只是说它们的思路与动机一样)。
VQ-VAE-2 相比 VQ-VAE 没有太多理论上的创新,主要的改变是以下三点:
层次化地堆叠多层 VQ-VAE,使得 top-level 关注更多的高层语义,而 bottom-level 关注低层细节,如下图所示:
用了更强大的 prior——top-level 的 prior 用带有 self-attention layer 的 Gated PixelCNN 建模。
使用一个 classifier 对生成的图像做拒绝采样。
VQ-VAE-2 能够达到和 BigGAN comparable 的水平,算是在 GANs 风头十足的时候给 VAEs 争了一口气吧。
VQGAN
由于我是 2023 年才来读 VQGAN[3] 的,所以看到作者和单位的时候愣了一下——这不就是 Latent Diffusion 的作者吗!怪不得 Latent Diffusion 用的是 VQGAN 来得到隐空间呢!这说明一个优秀的工作真得能催生下一个优秀的工作,形成良性循环。
话说回来,从上面这个概览图可以看出,VQGAN 和 VQ-VAE 的流程完全一致——先学习 codebook、再学习 prior. 学习 codebook 的部分与 VQ-VAE 大同小异,不同之处在于:加了一个 Patch Discriminator 做对抗训练,以及把重构损失的 L2 loss 换成了 perceptual loss. 实验证明 VQ-VAE 的重构非常模糊,而 VQGAN 能保留很多细节。为了实现无条件生成, VQ-VAE 使用 PixelCNN 学习 latent prior,能力比较弱,而 VQGAN 采用了 Transformer (GPT-2 架构),依旧用自回归的方式训练和推断。
除了无条件生成之外,VQGAN 也可以做有条件的生成。如果条件是类别标签,只需要把它融入 Transformer 的架构之中即可;如果条件是语义分割图、深度图、图像填充掩膜这种 2D 图像式的,那么作者对这些条件训练一个新的 VQGAN,把条件的隐变量表示同原图像的隐变量表示一并给到 Transformer 即可(因为 Transformer 是对 token 集合进行操作,所以直接给过去就行)。
使用 Transformer 的一个缺点是非常吃显存,单卡 12GB 最大只能支持
依靠这些改进,VQGAN 能够生成百万像素的高清图像。论文开头第一页就放了一个风景全景图,十分惊艳。
VQ-Diffusion
2022 是扩散模型井喷的一年,我盲猜有人会拿扩散模型做 prior learning,一搜果然有—— VQ-Diffusion[4][5].
如上图所示,Step 1 毫不意外的就是训一个 VQ-VAE,所以本篇工作的重点在于 Step 2——怎么在离散的隐空间中训练扩散模型来学习 prior.
由于本文的主题是 Vector Quantization,而 VQ-Diffusion 的主要贡献是在离散扩散模型方面,VQ 只是获取离散隐空间的手段,所以接下来的部分只稍微阐述一下离散扩散模型的设计思路,至于训练细节和模型改进(Improved VQ-Diffusion)就暂且略过,以免喧宾夺主。
扩散模型的加噪、去噪过程都是针对连续情形而言的,所以我们必须为离散情形重新定义新的前向过程。之前的一些工作采用随机修改的方式作为前向过程:
然而,这种随机修改的破坏程度太大了,模型的训练难度很大。为此,作者受到 MLM (masked language modeling) 的启发,采用掩码+随机修改的方式转移:
如本节开头所言,为避免喧宾夺主,本文对 VQ-Diffusion 的介绍到此做个截断。如果以后有机会,我再去专门调研一下离散扩散模型的方法(挖坑😂)。
Latent Diffusion (Stable Diffusion)
既然前面已经提到了 Latent Diffusion[6],那就简单说一下,并与 VQ Diffusion 做个对比。
顾名思义,Latent Diffusion 就是在隐空间上建立扩散模型,而这个隐空间正是通过训练 VAE 或 VQGAN 得到的——前者被作者称为 KL-reg,因为 VAE 可视为用 KL 作为正则项的 autoencoder;后者被称为 VQ-reg,即通过 VQ 操作做正则的 autoencoder.
值得注意的是,对于 VQ-reg,VQ 操作被算进了 Decoder 之中,即扩散模型之后,所以扩散模型仍然是在连续(而非量化后)的特征空间上执行的。这也是 Latent Diffusion 和 VQ-Diffusion 的不同之处。
Model | Stage-1 (latent space learning) |
Latent Space | Stage-2 (prior learning) |
---|---|---|---|
VQ-VAE | VQ-VAE | Discrete (after quantization) |
Autoregressive PixelCNN |
VQGAN | VQGAN (VQ-VAE + GAN + Perceptual Loss) |
Discrete (after quantization) |
Autoregressive GPT-2 (Transformer) |
VQ-Diffusion | VQ-VAE | Discrete (after quantization) |
Discrete Diffusion |
Latent Diffusion (VQ-reg) |
VAE or VQGAN | Continuous (before quantization) |
Continuous Diffusion |
References
- Van Den Oord, Aaron, and Oriol Vinyals. Neural discrete representation learning. Advances in neural information processing systems 30 (2017). ↩︎
- Razavi, Ali, Aaron Van den Oord, and Oriol Vinyals. Generating diverse high-fidelity images with vq-vae-2. Advances in neural information processing systems 32 (2019). ↩︎
- Esser, Patrick, Robin Rombach, and Bjorn Ommer. Taming transformers for high-resolution image synthesis. In Proceedings of the IEEE/CVF conference on computer vision and pattern recognition, pp. 12873-12883. 2021. ↩︎
- Gu, Shuyang, Dong Chen, Jianmin Bao, Fang Wen, Bo Zhang, Dongdong Chen, Lu Yuan, and Baining Guo. Vector quantized diffusion model for text-to-image synthesis. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition, pp. 10696-10706. 2022. ↩︎
- Tang, Zhicong, Shuyang Gu, Jianmin Bao, Dong Chen, and Fang Wen. Improved vector quantized diffusion models. arXiv preprint arXiv:2205.16007 (2022). ↩︎
- Rombach, Robin, Andreas Blattmann, Dominik Lorenz, Patrick Esser, and Björn Ommer. High-resolution image synthesis with latent diffusion models. In Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition, pp. 10684-10695. 2022. ↩︎