讲解稿 · 第 10 章 第 03 节 · 视觉与视频分词 (VQ-VAE / VQ-GAN / VAR)¶
口播时长: 约 13 分钟|建议语速: 中速, 公式处停两拍|字数: 约 2900 字
承 Ch10 §02 视觉语言模型 / VLM → Ch10 §03 视觉与视频分词 → Ch10 §04 跨模态生成 (下游章节预告)
导语 (约 80 秒)¶
Transformer 当年火起来是因为它能处理文本 token 序列——一段文字切成 token, 自回归预测下一个。能不能把图像也切成 token, 让 transformer 像写文章一样写图像?这就是视觉分词 (Visual Tokenisation)。这一节讲 3 件事: ① 怎么把图像变成离散 token (VQ-VAE/VQ-GAN 原理);② 这个 token 序列怎么用 (DALL-E 故事);③ 视觉自回归 (VAR) 怎么挑战扩散模型。听 13 分钟。
一 · 为什么图像需要 token (约 1.5 分钟)¶
图像是 256×256×3 = 196608 个像素值。直接喂给 LLM 类模型, 序列太长、太难。离散化 (discretisation) 把连续像素变成有限的"视觉字典"中的索引, 就像把中文文本切成 30000 个 BPE 词表中的 token。
好处: 1. 序列长度大幅缩短 (256×256 → 32×32 = 1024 个 token) 2. 与文本 token 统一, 可用同一个 transformer 3. 自回归、扩散等手法直接迁移
二 · VQ-VAE 三大组件 (约 5 分钟)¶
2017 年 DeepMind 的 van den Oord 提出 VQ-VAE, 是离散化图像的奠基工作。
2.1 三大组件¶
编码器 \(E\): 图像 \(x\) → 连续特征 \(z_e \in \mathbb{R}^{h \times w \times d}\) - 通常用卷积网络下采样 8 倍, 例 256→32
量化器 + Codebook \(\mathcal{C}\): 把 \(z_e\) 在 codebook 中找最近邻 - 公式: \(z_q = \arg\min_{z_k \in \mathcal{C}} \|z_e - z_k\|_2\) - Codebook: \(\{z_1, z_2, ..., z_K\}\), \(K=8192\) 是经典值 - 每个 entry 是 \(d\) 维向量 (如 256), learnable - 把 \(z_e\) 量化成 codebook 中最近邻向量 \(z_q\)
解码器 \(D\): 把 \(z_q\) 重建成 \(\hat x\) - 镜像编码器, 通常用转置卷积上采样 8 倍
2.2 直通估计 (STE) 解决不可微¶
量化是 \(\arg\min\), 不可微, 梯度被截断。 - STE 技巧: 前向用 \(z_q\) (离散), 反向时把梯度原样代理给 \(z_e\) - 公式: \(\partial L / \partial z_e \approx \partial L / \partial z_q\) - 简单粗暴但有效
2.3 VQ-VAE 损失¶
$\(L = \underbrace{\|x - \hat x\|_1}_{\text{重建}} + \underbrace{\|sg[z_e] - z_q\|_2^2}_{\text{commit}} + \beta \underbrace{\|z_e - sg[z_q]\|_2^2}_{\text{codebook 更新}}\)$ - \(sg\)=stop gradient, 当作常数 - commit 损失: 编码器输出趋向 \(z_q\) - 第二项: codebook 趋向编码器输出 (但梯度不让直接传)
2.4 Codebook Collapse — VQ 最大坑¶
症状: 部分 codebook entry 永远不被选中, 实际有效 capacity 远小于 K=8192。
根因: Adam 优化器 + softmax-style 更新会让某些 entry "训死"——一旦概率低, 永远低概率, 永远得不到更新。
缓解策略: 1. EMA 更新: codebook 不接受梯度, 由编码器输出的滑动平均更新。OpenAI 的 DALL-E 1 用这个。 2. Code 重启: 训练 N 步都没被选中的 entry, 重置为当前 batch 的随机 \(z_e\)。 3. Gumbel-Softmax: 加温度 noise 做 softmax 近似 argmin, 保持一定随机性。 4. commit 系数 β 增大: 强制 \(z_e\) 往最近的 \(z_q\) 靠, 增加 entry 利用率。
三 · VQ-GAN 把质量拉上去 (约 3 分钟)¶
VQ-VAE 重建质量不够好, 用像素 L1 损失与感知差距大。VQ-GAN (Esser 2021) 加了判别器:
$\(L_{\text{total}} = \underbrace{\|x - \hat x\|_1}_{L_1} + \lambda_1 \underbrace{\|F(x) - F(\hat x)\|_1}_{\text{perceptual}} + \lambda_2 \underbrace{\|z_e - sg[z_q]\|_2^2}_{\text{commit}} + \underbrace{L_{\text{GAN}}(x, \hat x)}_{\text{对抗}}\)$ - PatchGAN 判别器: 输出每个 patch 是否真实 - perceptual 损失: 用 VGG 中间特征对比, 提升感知相似度 - commit 损失: 同 VQ-VAE
效果: ImageNet 256×256 重建 PSNR 从 18 拉到 22, FID 从 30 拉到 5。
四 · DALL-E (1 代) 用视觉分词做生成 (约 2.5 分钟)¶
OpenAI 2021 年初的 DALL-E 1: 1. 用 dVAE (VQ-VAE 改进版) 把 256×256×3 图编码成 32×32=1024 个 token 2. Codebook size 8192, 每个 token ∈ {0, 1, ..., 8191} 3. 用一个 GPT-style transformer 在"文本 + 图像 token"混合序列上自回归 4. 输入: "a cat sat on a chair" → 输出: 1024 个图像 token 5. 用 dVAE 解码器还原像素图像
结果: 当时令人震惊——能生成 "an armchair in the shape of an avocado" 这种抽象概念组合。但质量粗糙, 远不如后来的 SD。
DALL-E 2 没用自回归路线, 改走 CLIP 文本嵌入 + 扩散。DALL-E 3 又回到自回归 + GPT-4V 重写 prompt。
五 · 视觉自回归 VAR (≈1 分钟)¶
传统扩散 vs 自回归, 哪个更强?
VAR (Visual AutoRegressive Modeling, NeurIPS 2024, 字节 + 北大): - 借鉴 LLM 自回归, 但在尺度上自回归 - 第一步预测 1×1 全图"基线"; 第二步 2×2 大图; ... 16×16 满分辨率 - next-scale prediction, 类比文字 next-token prediction - ImageNet 256 FID ≈ 1.0, 比 Stable Diffusion 强 8 倍
意味着视觉生成可能走向"统一 LLM 路线", 不是扩散专属。
跨章衔接 (60 秒)¶
§03 解决了"图像变 token"——把图像变成一段离散序列。接下来的问题是:token 序列怎么生成/复原。两条主流路: ① 扩散 (隐空间加噪去噪, §04 跨模态生成讲 SD/DALL-E 3/Imagen); ② 自回归 (像 LLM 一样 next-token 预测, 本节 VAR 走通)。最终目标都是把"文本"和"图像 token"拼成一段序列, 任意模型处理, 这就是 GPT-4o / Gemini 的统一架构基础。