Reading

Vector Quantized-Variational Autoencoder (VQ-VAE)


Fanyi Pu

文章:(van den Oord et al., 2017);苏神博客:(苏剑林, 2019)。

先把 x∈RH×W×3 降采样成 z∈Rh×w×d。然后维护 embedding codebook e∈RK×d。找到每个 zij 的最近邻 z^ij 进入 decoder。

我们希望的 loss 是 ‖x−Decoder(z^)‖22,但是需要解决两个问题:

  1. 取最近邻这个步骤不可导;
  2. 如何更新 e。

对于第一个问题,文章提出了一种叫 Straight-Through Estimator 的方法,参考的是 (Bengio et al., 2013)。本质上其实是在求导的时候,将离散操作看成某个平滑的连续函数。具体操作上,我们令 sg[x] 表示 stop gradient,相当于 python 里的 detach。那么我们其实算的是:

‖x−Decoder(z+sg[z^−z])‖22

而写代码的时候,我们只需要在 forward 的时候写

python
z_q = z + (z_q - z).detach()

就可以了。其中 z_q 指的是 z^。

对于第二个问题,首先我们希望 z^ 和 z 能够尽量接近,所以我们理论上讲可以加一个 β‖z−z^‖22 的项。但是其实我们更希望是 z^ 去接近 z 而不是 z 去接近 z^,所以我们将这个项分解为

β‖sg[z]−z^‖22+γ‖z−sg[z^]‖22

一般情况下 β>γ,论文中是 γ=14β。

所以最终 loss 是

‖x−Decoder(z+sg[z^−z])‖22+β‖sg[z]−z^‖22+γ‖z−sg[z^]‖22

References

Bengio, Y., Léonard, N., & Courville, A. (2013). Estimating or Propagating Gradients Through Stochastic Neurons for Conditional Computation. arxiv.org
van den Oord, A., Vinyals, O., & Kavukcuoglu, K. (2017). Neural Discrete Representation Learning. Advances in Neural Information Processing Systems, 30, 6306–6315. proceedings.neurips.cc
苏剑林. (2019, June). VQ-VAE的简明介绍:量子化自编码器. spaces.ac.cn

Cite this post

@misc{pu2026mlmlrevisitaemlrevisitvqvae,
  author = {Pu, Fanyi},
  title  = {Vector Quantized-Variational Autoencoder (VQ-VAE)},
  year   = {2026},
  month  = {8},
  url    = {https://pufanyi.com/blog/ml/ml-revisit/ae/ml-revisit-vq-vae}
}