3.1 AE/VAE/VQ-VAE 与图像 tokenizer¶
所属章节:第 3 章 Latent Diffusion 与 Stable Diffusion
课时:90 分钟
前置:第 1 章(ELBO、重参数化)
对应面试题:A2、A3
一句话目标:学完能比较 AE/VAE/VQ-VAE,解释 SD 为什么用连续 VAE,并写清三者的训练目标。
1. 学习目标¶
学完本节,你应该能够:
- 解释 AE、VAE、VQ-VAE 的隐空间差异;
- 写出 VAE 的 ELBO 和重参数化;
- 写出 VQ-VAE 的三项损失;
- 解释 straight-through 与重参数化的区别;
- 比较 连续 VAE 与离散 VQ 在生成中的取舍;
- 解释 Stable Diffusion 为什么选连续 VAE;
- 用 90 秒回答 A2,并接住 A3 的追问。
2. 为什么先讲 tokenizer¶
Stable Diffusion 不是直接在像素上扩散,而是:
图像 x ──VAE Encoder──> latent z ──扩散/去噪──> latent z ──VAE Decoder──> 图像
所以必须先回答:
- 这个 VAE 是什么?
- 它和 VQ-VAE 有什么区别?
- 它为什么能把 512×512×3 压到 64×64×4?
- 压缩会不会损失细节?
这就是 A2/A3 的位置。
3. AE:确定性自编码器¶
3.1 结构¶
- 编码器 \(E\):\(x\to z\);
- 解码器 \(D\):\(z\to \hat x\);
- 损失:
3.2 特点¶
- 隐空间是确定性的;
- 没有先验,不能直接采样;
- 隐空间可能有“空洞”,插值效果差;
- 适合压缩、特征学习、去噪。
面试要点:AE 能重建,但不是生成模型。
4. VAE:概率隐空间¶
4.1 结构¶
编码器输出高斯参数:
先验:
解码器:
4.2 ELBO¶
- 第一项:重建;
- 第二项:让后验靠近先验;
- 最大化 ELBO = 重建好 + 隐空间规整。
4.3 重参数化¶
这样梯度可以对 \(\mu,\sigma\) 反传。
4.4 特点¶
- 隐空间连续、平滑;
- 可以从先验采样;
- 重建容易模糊;
- KL 太强会导致 posterior collapse(隐变量被忽略);
- \(\beta\)-VAE 通过调 KL 权重权衡重建/解耦。
面试要点:VAE 是显式密度(下界)模型;它的潜空间思想被 LDM 继承,但 SD 的 VAE 主要用来压缩。
5. VQ-VAE:离散 codebook¶
5.1 结构¶
编码器输出连续特征 \(z_e(x)\),然后查 codebook:
- codebook 有 \(K\) 个向量;
- 每个向量维度 \(D\);
- 输出是离散 token。
5.2 损失¶
三项分别:
- 重建:解码器要能还原;
- codebook:让 codebook 向量靠近编码器输出;
- commitment:让编码器输出不要离 codebook 太远。
\(\mathrm{sg}[\cdot]\) 是 stop-gradient。
5.3 Straight-through¶
最近邻选择不可导,VQ-VAE 用 straight-through:
- 前向用 \(z_q\);
- 反向把梯度直接传给 \(z_e\);
- 这是有偏梯度,不是严格重参数化。
5.4 生成¶
VQ-VAE 本身只是 tokenizer:
- 先把图像变成离散 token;
- 再训练一个先验(PixelCNN/Transformer)在 token 上生成;
- 采样时先生成 token,再解码。
5.5 特点¶
- 离散 token,适合 Transformer;
- 避免高斯 KL 的 posterior collapse;
- 但可能 codebook collapse(少数 code 被频繁使用);
- 量化会损失细节。
6. VQGAN¶
VQGAN = VQ-VAE + perceptual loss + adversarial loss。
- 判别器提升真实感;
- perceptual loss 改善纹理;
- 常用于高分辨率图像生成;
- DALL·E 1 使用 VQ-VAE 路线。
面试要点:VQGAN 不是“新的 VAE”,而是“VQ-VAE + GAN 训练”。
7. Stable Diffusion 为什么用连续 VAE¶
SD 使用:
- 连续 VAE;
- 4 通道 latent;
- 8 倍下采样;
- 重建 + perceptual + adversarial 训练;
- 缩放因子(如 0.18215)。
原因:
- 扩散更适合连续空间:高斯噪声、连续去噪;
- 避免量化误差:VQ 的离散化会丢细节;
- latent 更紧凑:64×64×4 比像素空间小很多;
- VAE 可冻结:训练扩散时不用联合训练 VAE。
对比:
| 维度 | 连续 VAE(SD) | VQ-VAE/VQGAN |
|---|---|---|
| 隐空间 | 连续 | 离散 |
| 扩散 | 自然 | 需要离散扩散/先验 |
| 细节 | 较好 | 量化损失 |
| 生成 | 扩散在 latent | 先 token 再解码 |
| 典型 | SD/SDXL/SD3 | DALL·E 1、VQGAN |
8. 压缩率计算¶
512×512×3:
64×64×4:
倍率:
所以 latent diffusion 的空间元素约少 48 倍,计算量大幅下降。
9. 90 秒回答:AE/VAE/VQ-VAE 的区别¶
面试官问:谈谈 AE、VAE 和 VQ-VAE 的区别。
参考回答:
“AE 是确定性自编码器,只学重建,隐空间没有先验,不能直接采样。VAE 把隐变量建模成高斯,用 ELBO 训练,重参数化让采样可导,隐空间连续平滑,但重建容易模糊、可能 posterior collapse。VQ-VAE 把连续特征量化到 codebook,得到离散 token,损失是重建 + codebook + commitment,用 straight-through 传梯度;它需要额外先验来生成。Stable Diffusion 用的是连续 VAE,不是 VQ-VAE,因为扩散更适合连续 latent,量化会丢细节。”
10. 90 秒回答:重参数技巧¶
面试官问:重参数技巧是什么?
参考回答:
“把随机采样写成确定性变换加外部噪声。比如 \(z\sim\mathcal N(\mu,\sigma^2)\),写成 \(z=\mu+\sigma\odot\epsilon\),\(\epsilon\sim\mathcal N(0,I)\),随机性只来自 \(\epsilon\),梯度可以对 \(\mu,\sigma\) 反传。VAE 用它训练编码器;Diffusion 的前向加噪也是同一个技巧,所以 \(x_t\) 可以直接从 \(x_0\) 采样。VQ-VAE 的离散选择不能用普通重参数化,通常用 straight-through。”
11. 常见误区¶
- “AE 能直接生成”:没有先验,不能直接采样。
- “VAE 的 latent 一定解耦”:不一定,\(\beta\)-VAE 只是鼓励解耦。
- “VQ-VAE 是 VAE 加量化但仍用 KL”:VQ-VAE 用 codebook 损失,不是高斯 KL。
- “SD 的 VAE 是 VQ-VAE”:SD 用连续 VAE。
- “VQ-VAE 不需要先验”:生成时需要先验模型。
- “重参数化和 straight-through 一样”:前者无偏,后者有偏。
12. 课堂练习¶
答案见 06 章节练习与答案。
- 写出 VAE ELBO。
- 写出 VQ-VAE 三项损失。
- 解释 straight-through 与重参数化的区别。
- 计算 512×512×3 → 64×64×4 的压缩倍率。
- 比较连续 VAE 与 VQ-VAE 的优缺点。
- 用 90 秒回答 A2。
13. 自测清单¶
- [ ] 能解释 AE 不能采样;
- [ ] 能写 VAE ELBO;
- [ ] 能写 VQ-VAE 损失;
- [ ] 能解释 straight-through;
- [ ] 能解释 SD 为什么用连续 VAE;
- [ ] 能算压缩倍率;
- [ ] 能 90 秒回答 A2/A3。
14. 本节材料为什么这样设计¶
- 先 AE 再 VAE 再 VQ:按“确定性 → 连续概率 → 离散”递进。
- 三项损失拆开:VQ-VAE 是 A2 的高频追问。
- SD 的选择单列:把 tokenizer 和 LDM 连起来。
- 压缩率计算:让“为什么快”有数字。
- 不写代码:本节是结构和公式,不是实现。
详细设计理由见 08 材料设计理由。