Emu3:用下一 token 预测做图像与视频生成 本节摘要:BAAI 的 Emu3(Wang 等人,2024 年 9 月)是那个本该终结「扩散 vs 自回归」之争的 2024 年结果。一个 Llama 式的纯解码器 Transformer,只在「文本 + VQ 图像 token + 三维 VQ 视频 token」的统一词表上训练下一 token 预测,在图像生成上击败 SDXL,在感知上击败 LLaVA-1.6。没有 CLIP 损失,没有扩散调度;推理时用无分类器引导(CFG)提质量,但核心训练目标就是带教师强制的下一 token 预测。发表于 Nature。本节读 Emu3 的论点——为什么更好的分词器加规模就够了——并与扩散路线对比。
本节摘要:BAAI 的 Emu3(Wang 等人,2024 年 9 月)是那个本该终结「扩散 vs 自回归」之争的 2024 年结果。一个 Llama 式的纯解码器 Transformer,只在「文本 + VQ 图像 token + 三维 VQ 视频 token」的统一词表上训练下一 token 预测,在图像生成上击败 SDXL,在感知上击败 LLaVA-1.6。没有 CLIP 损失,没有扩散调度;推理时用无分类器引导(CFG)提质量,但核心训练目标就是带教师强制的下一 token 预测。发表于 Nature。本节读 Emu3 的论点——为什么更好的分词器加规模就够了——并与扩散路线对比。
阅读完本节,你应当能够:
到 2024 年的共识是:图像生成需要扩散。论据是:离散图像 token 信息损失太大,无法重建细节;自回归采样在数千 token 上累积误差。Stable Diffusion、DALL-E 3、Imagen、Midjourney 都用某种扩散。Chameleon(第 11 节)在小规模上部分证伪了这点,但质量没追上 SDXL。
Emu3 正面回击这个论据。声称:更好的视觉分词器 + 足够规模 + 下一 token 损失 = 在同一个也能做感知的模型里,生成质量超越扩散。
发表时这个押注有争议。两年后,开源统一生成家族(Emu3、Show-o、Janus-Pro、Transfusion)成了研究的默认路径;生产前沿模型也似乎用了某种变体。
关键成分是视觉分词器。Emu3 训了一个定制的 IBQ 类分词器(逆瓶颈量化器,SBER-MoVQGAN 家族),每 token 做约 8×8 的分辨率缩减。512×512 的图变成 64×64 = 4096 个 token,码本大小 32768。
这比 Chameleon 的「512×512 配 K=8192 出 1024 token」更大,但每 token 更便宜(更小的码本查询、更简单的编解码)。关键指标:重建 PSNR 30.5 dB,与 Stable Diffusion 连续潜空间的 32 dB 竞争力相当。
视频:三维 VQ 分词器把时空 patch(4×4×4 像素)编成一个整数。4 秒片段、8 FPS 共 32 帧;256×256 配 4× 空间与 4× 时间缩减,token 数是 (256/4) × (256/4) × (32/4) = 64 × 64 × 8 = 32768 token。
分词器质量就是天花板。Emu3 的贡献之一就是「我们训了一个非常好的分词器」。
Emu3 用一个目标:在跨文本 token、二维图像 token、三维视频 token 的共享词表上做下一 token 预测。训练时按模态因子加权以平衡贡献,但损失函数完全相同。
在以下混合上训练:
<文本 caption> <image> 图像 token </image><image> 图像 token </image> <问题> 文本 token<文本 caption> <video> 视频 token </video>模型从数据分布学会何时发图像 token、何时发文本 token。生成,就是模型在 <image> 标签后预测图像 token 而涌现的。
自回归图像生成在推理时用无分类器引导(CFG)会好得多。Emu3 用了它:生成两次,一次用完整 caption,一次用空 caption,用引导权重(典型 3.0~7.0)混合 logits。这与扩散用的 CFG 是同一个技巧,借到自回归场景。
温度也重要:太高出伪影,太低模式塌缩。Emu3 推荐感知用温度 1.0、图像生成用 0.8。
Emu3 以三个功能不同的 API 发布,但底层是同一套权重:
没有任务专属头,只是不同 prompt 模板,同一个 checkpoint。
来自 Emu3 论文(2024 年 9 月):
数字不总是赢——Emu3 在这处换一分、那处换一分——但「下一 token 预测就够了」这个声称,跨模态站得住。
Emu3 在约 3000 亿多模态 token 上、用 70 亿参数模型训练,GPU 小时大致与 Llama-2-7B 预训练相当(A100 级硅上 2k~4k GPU 年)。Stable Diffusion 3 这类扩散模型在类似预算下训练,但需要独立的文本编码器与更复杂流水线。
推理时 Emu3 每张图比 SDXL 慢:4096 个图像 token 按 30 token/秒约 2 分钟一张 512×512,SDXL 仅 2~5 秒。投机解码与 KV 缓存优化缩小差距但不闭合。自回归图像生成本质算力重,这是长期权衡。
Emu3 的深层贡献是概念性的。如果下一 token 预测能扩展到在图像生成上追平扩散,那么统一模型路径(一个损失、一个主干、任意模态)就可行。未来模型不需要独立的文本编码器、独立的扩散调度器、独立的 VAE。一个 Transformer、每模态一个分词器、上规模。
Show-o、Janus-Pro、InternVL-U 都建立在这个论点之上或挑战它。2025 年中国实验室(BAAI、DeepSeek)在这个方向上比美国实验室发表更激进。
code/main.py 搭两个玩具部件:
def video_token_count(H, W, T_frames, spatial_patch, temporal_patch): # 3D VQ: 每 (spatial_patch x spatial_patch x temporal_patch) 像素一个 token th = H // spatial_patch tw = W // spatial_patch tt = T_frames // temporal_patch return th * tw * tt # 例如 256x256, 32帧, 4x4x4 → 64*64*8=32768
def ar_generate_with_cfg(prompt, model, guidance=5.0, temp=0.8, n_img_tokens=4096): out = prompt cond_logits = model(out + caption) # 条件: 带完整 caption uncond_logits = model(out + "") # 无条件: 空 caption logits = uncond_logits + guidance * (cond_logits - uncond_logits) logits = logits / temp next_id = sample(softmax(logits)) out.append(next_id) # 重复直到收集 n_img_tokens 个图像 token return out
💡 CFG 借鉴扩散:同一个无分类器引导技巧——「条件 logits 与无条件 logits 按权重混合」——从扩散借到自回归,大幅提升图像生成质量。引导权重越大,越贴合 prompt 但越牺牲多样性。
工程取舍:要统一理解+生成用 Emu3/Show-o 系;要推理快、生产图像质量稳定用扩散;要研究统一模型前沿追 Emu3/Transfusion。
本节产出 outputs/skill-token-gen-cost-analyzer.md。给定生成产品规格(图像或视频、目标分辨率、质量档、延迟预算),它算 token 数、推理成本,并在 Emu3 系与扩散间选择。
分辨率扩展:Emu3 在 8×8 缩减下每张 512×512 出 4096 token。算 1024×1024 与 2048×2048 的等价 token 数,推理延迟会怎样?
读论文:读 Emu3 第 3.3 节关于视频分词器,描述三维 VQ patch 形状,为什么是 4×4×4 而非 8×8×1。
CFG 权重:引导权重 5.0 vs 3.0 的视觉效果是什么?在 code/main.py 里追踪数学。
训练 FLOPs:算 Emu3-7B 在 3000 亿 token 下的训练 FLOPs,与 Stable Diffusion 3 对比,哪个更贵?
统一 vs 专家:Emu3 在 FID 上胜 SDXL,但在 VQAv2 上不如专门 VLM。解释为什么统一损失路线在不同基准上展现不同强弱。
下一节,我们将进入 Transfusion——它进一步挑战「单一损失」的边界,主张同一个模型里同时用自回归损失预测文本 token、用扩散损失预测图像 patch,两者共享注意力,是统一模型的另一条主流路线。