视觉自回归VAR 本节摘要:扩散模型在时间上迭代采样(去噪步),VAR(Visual AutoRegressive)在尺度上迭代采样——它先预测一个 1×1 的 token(整图的「摘要」),再 2×2、4×4,直到最终分辨率,每个尺度以上一个为条件。2024 年的论文证明:VAR 在图像生成上匹配了 GPT 式的扩展律,并在同等算力预算下击败 DiT。本节讲透 VAR 的两大支柱:多尺度 VQ 分词器(用残差 VQ 把图像压成 K 个逐级增分辨率的 token 网格,解码器把所有尺度的嵌入求和还原)与下一尺度预测(Transformer 跨尺度因果、尺度内并行,把「逐 token 自回归」换成「逐尺度自回归」)。
本节摘要:扩散模型在时间上迭代采样(去噪步),VAR(Visual AutoRegressive)在尺度上迭代采样——它先预测一个 1×1 的 token(整图的「摘要」),再 2×2、4×4,直到最终分辨率,每个尺度以上一个为条件。2024 年的论文证明:VAR 在图像生成上匹配了 GPT 式的扩展律,并在同等算力预算下击败 DiT。本节讲透 VAR 的两大支柱:多尺度 VQ 分词器(用残差 VQ 把图像压成 K 个逐级增分辨率的 token 网格,解码器把所有尺度的嵌入求和还原)与下一尺度预测(Transformer 跨尺度因果、尺度内并行,把「逐 token 自回归」换成「逐尺度自回归」)。我们会推导为什么「下一尺度」在结构上胜过「下一 token」(粗到细契合自然图像统计、尺度内并行把生成长度从线性降到对数、无生成顺序偏置),以及 VAR 与扩散如何从不同轴切入同一个「把生成拆成一串较简单的子问题」的故事。这是桶 5(离散 token 自回归)在 2024 年的重大复活。
对应原课程:Phase 08 · Lesson 19 ·
visual-autoregressive-var(原英文phases/08-generative-ai/19-visual-autoregressive-var/docs/en.md)。本章按中文连续编号为第 15 节。
阅读完本节,你应当能够:
f ≈ Σ upsample(embed(z_k)),解码器求和还原。自回归生成主导语言建模,因为它可预测地扩展:更多算力、更多参数、更低困惑度、更好输出。图像生成在 2024 年前有两次主要 AR 尝试:PixelRNN/PixelCNN(逐像素)和 DALL-E 1 / Parti / MuseGAN(在 VQ-VAE 码上逐 token)。
两者都受困于一个生成顺序问题。像素和 token 排在 2D 网格,但 AR 模型必须按 1D 光栅顺序访问它们。一个早期角像素完全不知道这张图最终会变成什么样。生成质量的扩展性比 GPT-on-text 差,在匹配算力下从未达到扩散模型的质量。
VAR 通过改变「生成什么」来修复生成顺序问题。它不再在空间上逐个预测图像 token,而是在递增的分辨率上预测整张图:第 1 步预测 1×1 token(整图「摘要」),第 2 步预测 2×2 token 网格(粗特征),第 3 步预测 4×4,第 K 步预测最终的 (H/8)×(W/8) 网格。
每个尺度(按「尺度顺序」因果地)注意所有先前尺度,且在自身尺度内并行。顺序问题消失了:尺度 k 的整张图在一次 Transformer 前向里产出。
VAR 需要一个多尺度离散分词器。对图像 x,它产出一串逐级增分辨率的 token 网格:
x → 编码器 → 潜变量 f f → 在 1×1 上分词:token 网格 z_1,形状 (1, 1) f → 在 2×2 上分词:token 网格 z_2,形状 (2, 2) ... f → 在 (H/p)×(W/p) 上分词:token 网格 z_K,形状 (H/p, W/p)
每个 z_k 用同一个码本(典型大小 4096-16384)。每个尺度的分词不是独立的——它被训练成「在各尺度求和残差能重建 f」:
f ≈ upsample(embed(z_1), 目标尺寸) + ... + upsample(embed(z_K), 目标尺寸)
这是一个残差 VQ 变体。尺度 k 捕捉尺度 1..k-1 漏掉的东西。解码器取所有尺度嵌入的和,产出图像。
💡 残差 VQ 与「粗到细」:这与第 11 节音频的 RVQ、第 02 节的 VQ-VAE 是同一种思想——第 1 层(最粗)捕捉「是什么」,后续层捕捉「上一层的残差」。差别在于:音频 RVQ 在时间维度上做残差(同一时间步的多层码本),VAR 的多尺度 VQ 在空间维度上做残差(不同分辨率的 token 网格)。两者都把「一个难问题」拆成「一串粗到细的简单问题」。
多尺度 VQ 分词器像 VQGAN 一样训练一次后冻结。所有生成工作由其上的自回归模型完成。
生成模型是一个 Transformer,看到所有先前尺度的 token,预测下一尺度的 token。
输入序列结构:
[START, z_1 的 token, z_2 的 token, z_3 的 token, ..., z_K 的 token]
位置嵌入同时编码尺度索引和尺度内的空间位置。注意力在尺度顺序上因果:尺度 k、位置 (i, j) 的 token 可以注意尺度 1..k 的所有 token,以及尺度 k 自身中按所用尺度内顺序更早的 token(VAR 用固定位置注意力,尺度内无因果——尺度内所有位置并行预测)。
训练损失:在每个尺度 k,给定所有先前尺度 token,预测 token z_k。对离散 VQ 码的交叉熵。结构与 GPT 相同,只是「序列」现在是尺度结构化的。
推理时:
生成 z_1 = 从 p(z_1) 采样 # 1 个 token 生成 z_2 = 从 p(z_2 | z_1) 采样 # 4 个 token 并行 生成 z_3 = 从 p(z_3 | z_1, z_2) 采样 # 16 个 token 并行 ... 解码: f = 尺度 1..K 的 embed-and-upsample 之和 图像 = VAE_decoder(f)
对 K = 10 个尺度,生成是 10 次 Transformer 前向。每次前向并行产出整个尺度——尺度内无逐 token 自回归。对 256×256 图像,这大致是 10 次前向 vs DiT 的 28-50 次。
三个结构性优势:
粗到细契合自然图像统计。人类视觉感知与图像数据集都展现尺度依赖的规律性:低频结构稳定可预测;高频细节以低频内容为条件。下一尺度预测正好利用了这一点。
尺度内并行生成。不像 GPT 式 token AR,VAR 在一步内产出某尺度的所有 token。有效生成长度是对数尺度而非线性。
无生成顺序偏置。尺度 k 的 token 看得到尺度 k-1 的全部;没有「左边」或「上方」的偏置,不会强迫早期 token 在晚期上下文可用前就承诺。
💡 「生成长度从线性降到对数」的分量:逐 token AR 要
H×W步(对 256×256 是 65536 步);VAR 只要K ≈ log(H)步(对 256×256 约 8-10 步)。这就是 VAR 在推理速度上能匹敌甚至超过扩散的根本原因——它把「空间上的串行」换成了「分辨率上的串行」,而后者的步数是对数级的。
Tian 等证明,VAR 在 ImageNet 上的 FID 遵循幂律扩展曲线——就像 GPT 对困惑度那样。参数或算力翻倍,误差可靠地减半。这是第一个像语言模型那样干净展现这种扩展行为的图像生成模型。结果是:VAR 尺度的预测可以从算力推算,而不是按架构做经验猜测。
VAR 和扩散共享同一个「数据压缩」故事:两者都把生成问题拆成一串更简单的子问题。
它们是穿过问题的不同轴。两者都产出可处理的条件分布。经验上 VAR 推理更快(更少轮次、尺度内全并行),并在类条件 ImageNet 上匹敌或击败 DiT。文本条件 VAR(VARclip、HART)是活跃研究方向。
在 code/main.py 里你将:
这是玩具实现。重点是让你亲眼看到尺度结构化的注意力掩码与尺度内并行生成真的在工作。
def multiscale_tokenize(f, codebook, scales): # f: 编码器输出的潜变量;scales: [1, 2, 4, ..., K] residual = f token_grids = [] for s in scales: # 在 s×s 分辨率上量化当前残差 z_s = vq_quantize(downsample(residual, s), codebook) token_grids.append(z_s) # 减去这一尺度重建出的部分,留下残差给下一尺度 residual = residual - upsample(embed(z_s), f.shape) return token_grids # [z_1, z_2, ..., z_K]
def var_forward(token_grids, transformer): # 拼成尺度结构化序列,带 (scale, row, col) 三元位置嵌入 seq = pack_with_scale_position(token_grids) # 注意力掩码:跨尺度因果(尺度 k 可看 1..k),尺度内全可见(并行) mask = build_cross_scale_causal_mask(seq) logits = transformer(seq, attention_mask=mask) return logits # 每个位置预测其 token 的下一尺度? 不,预测自身尺度的 token
def sample(transformer, decoder, num_scales): grids = [] for k in range(num_scales): logits = transformer.forward_next(grids) # 看已有尺度,预测下一尺度 z_k = sample_tokens(logits) # 整尺度并行采样 grids.append(z_k) f = sum(upsample(embed(z)) for z in grids) return decoder(f)
码本崩塌:多尺度 VQ 里,某些码本条目可能从不被用(尤其高分辨率尺度)。用 EMA 更新码本、重启死码、commitment loss 缓解(同第 02 节 VQ-VAE)。
尺度数选择:更多尺度 = 更细残差 = 更好重建质量,但更多自回归轮次。K=10 对 256² 是常见甜点。
码本大小权衡:大码本(16384)重建好但预测难;小码本(512)反之。找「拐点」。
尺度内并行验证:训练后显式检查注意力模式——尺度 k 内是否真的「跨尺度可见、尺度内全可见」。掩码实现错了会退化成逐 token AR。
文本条件:HART 用 adaLN 注入 CLIP 池化文本嵌入;VARclip 用 CLIP 文本 token 做交叉注意力。这是把 VAR 推向开放领域文生图的关键。
⚠️ VAR 与扩散的胜负未定:VAR 在类条件 ImageNet 上的扩展律干净、推理快,但在开放领域文生图上,2026 年扩散+流匹配(SD3、Flux)仍是主流——因为文本条件化、ControlNet、LoRA 等生态都围绕扩散建立。VAR 的研究线(VARclip、HART、Slate)正在追赶,但「生成质量」与「生态成熟度」是两件事。
| 维度 | 逐 token AR(PixelRNN/DALL-E) | VAR(下一尺度) | 扩散/DiT |
|---|---|---|---|
| 生成顺序 | 1D 光栅,有偏置 | 粗到细,无偏置 | 时间去噪,无空间偏置 |
| 生成长度(256²) | ~65536 步 | ~10 步(对数) | 28-50 步 |
| 扩展律 | 差 | 幂律(像 GPT) | 幂律(DiT 证明) |
| 尺度内并行 | 否 | 是 | 是(整图一次前向) |
| 文本条件生态 | 弱 | 追赶中(VARclip/HART) | 成熟(ControlNet/LoRA) |
| 2026 开放领域地位 | 退役 | 研究/追赶 | 主流 |
VAR 的核心贡献是证明了图像生成也能有 GPT 式的干净扩展律——这是「桶 5」(离散 token 自回归)的重大复活,也让人重新审视「扩散是否是唯一答案」。
本节产出一个分词器设计技能文件(位于原课程 outputs/skill-var-tokenizer-designer.md)。
skill-var-tokenizer-designer.md:设计多尺度分词器的技能——尺度数、尺度比例、码本大小、残差共享、解码器架构。尺度数消融。用 4、6、8、10 个尺度训 VAR。测量重建质量 vs 自回归轮次。更多尺度 = 更细残差 = 更好质量但更多轮次。
码本大小。用码本大小 512、4096、16384 训分词器。大码本重建好但预测难。找拐点。
尺度内并行验证。对训练好的 VAR,显式测量注意力模式。尺度 k 内,模型是否注意跨尺度位置但不注意尺度内?验证掩码实现。
VAR vs DiT 扩展。对同一 ImageNet 类条件任务,在匹配参数预算(如 33M、130M、458M)下训 VAR 和 DiT。画 FID vs 算力。VAR 应在每个尺寸上都领先于 DiT——在小规模上复现论文结果。
文本条件。扩展 VAR 接受文本嵌入(CLIIP 池化)作为额外条件输入,通过 adaLN 注入。这是 HART 配方。在文本对齐采样上 FID 提升多少?
f ≈ Σ upsample(embed(z_k)),解码器求和还原;训练一次冻结。至此,本章 15 节已全部走完。从第 01 节的五大家族地图,到 VAE/GAN/扩散/流匹配的数学地基,再到 ControlNet/LoRA、视频/音频/3D 生成、评估方法,最后回到 VAR 这一「桶 5」的复活。生成式 AI 的核心张力——显式 vs 隐式密度、一步 vs 迭代、空间串行 vs 分辨率串行——贯穿全章,是你判断任何新模型归属的永恒坐标。