Chameleon 与早期融合:纯 token 多模态模型


文档摘要

Chameleon 与早期融合:纯 token 多模态模型 本节摘要:到目前为止我们见过的每个 VLM 都把图像与文本分开。视觉 token 来自视觉编码器,流进投影器,然后在 LLM 内部与文本相遇——视觉与文本词表从不重叠。Chameleon(Meta,2024 年 5 月)问:要是重叠了呢?训练一个 VQ-VAE,把图像变成来自共享词表的离散 token 序列。每个多模态文档现在都是一条序列——文本 token 与图像 token 交错,一个自回归损失。副作用:模型能在一次推理里生成混合模态输出——文本与图像 token 交替。本节读早期融合的论点,并端到端搭一个玩具版。 学习目标 阅读完本节,你应当能够: 解释为什么共享词表 + 单一损失会改变模型能做什么。

Chameleon 与早期融合:纯 token 多模态模型

本节摘要:到目前为止我们见过的每个 VLM 都把图像与文本分开。视觉 token 来自视觉编码器,流进投影器,然后在 LLM 内部与文本相遇——视觉与文本词表从不重叠。Chameleon(Meta,2024 年 5 月)问:要是重叠了呢?训练一个 VQ-VAE,把图像变成来自共享词表的离散 token 序列。每个多模态文档现在都是一条序列——文本 token 与图像 token 交错,一个自回归损失。副作用:模型能在一次推理里生成混合模态输出——文本与图像 token 交替。本节读早期融合的论点,并端到端搭一个玩具版。

学习目标

阅读完本节,你应当能够:

  1. 解释为什么共享词表 + 单一损失会改变模型能做什么。
  2. 描述 VQ-VAE 如何把图像分词成与 Transformer 下一 token 目标兼容的离散序列。
  3. 说出 Chameleon 的训练稳定性技巧:QK-Norm、dropout 放置、LayerNorm 顺序。
  4. 把 Chameleon 与 BLIP-2 的 Q-Former 路线对比,说明各自何时是正确选择。

一、问题与直觉

基于 adapter 的 VLM(LLaVA、BLIP-2、Qwen-VL)把文本与图像当作两件不同的事。文本 token 走 embed(text_token);图像走 visual_encoder(image) → projector → ... 伪 token。模型有两条输入路径,在中途合并。

三个后果:

  1. LLM 只能消费图像,不能产生。输出只有文本。
  2. 混合模态文档(段落与图像交替,如文章)很别扭——你要么在模型外解析多模态输入,要么链式生成。
  3. 分布失配。视觉 token 与文本 token 住在隐藏空间的不同区域,产生微妙的对齐问题。

Chameleon 拒绝这个前提:图像只是来自共享词表的离散 token 序列。在交错文档上训练,一个损失、一个自回归解码器,就免费解锁混合模态生成。

VQ-VAE 作图像分词器

分词器是一个向量量化变分自编码器。架构:

  • 编码器:CNN + ViT,把图像映射到空间特征图,比如 32×32、维度 256 的特征。
  • 码本:一个学出来的、含 K 个向量(Chameleon 用 8192)的词表,也是维度 256。
  • 量化:对每个空间特征,按 L2 距离查最近的码本项,把连续特征替换成整数索引。
  • 解码器:CNN,把量化特征还原成像素。

训练:VAE 重建损失 + 承诺损失 + 码本损失。码本索引构成图像的离散字母表。

对 Chameleon:一张图变成 32×32 = 1024 个 token,来自 8192 大小的词表。与文本 token(LLM 的 BPE 词表,比如 32000)拼接。最终词表 40192。Transformer 看一条序列、一个损失。

共享词表

Chameleon 的词表融合文本 token、图像 token、模态分隔符。每个 token 有单一 ID。输入嵌入层把每个 ID 映射到 D 维隐藏向量;输出投影把隐藏映射回词表 logits。softmax 选下一 token,无论模态。

分隔符很关键:<image></image> 标签把图像 token 序列括起来。生成时若模型发出 <image>,下游软件就知道接下来 1024 个 token 是要送给解码器渲染像素的 VQ 索引。

混合模态生成

推理就是在共享词表里做下一 token 预测。示例 prompt:「画一只猫并描述它。」Chameleon 发出:

<image> 4821 1029 2891 ... (1024 个图像 token) </image> The cat is orange, sitting on a windowsill...

模型自主决定顺序——可能先图后文、先文后图、或交错。同一解码器、同一损失。

对比 adapter VLM 的生成只有文本。Chameleon 重新打开了「模型输出模态」这个问题。

训练稳定性——QK-Norm、dropout、LayerNorm 顺序

早期融合训练在大规模上不稳定。Chameleon 论文记录了三个技巧:

  • QK-Norm:在注意力里、点积之前,对 query 与 key 投影施加 LayerNorm。防止深度下 logit 量级爆炸。被多个 2024 年后的大模型采用。
  • dropout 放置:在每个残差相加之后都加 dropout,而非仅在注意力与 MLP 之后。当图像 token 的梯度可能主导时,需要更多正则。
  • LayerNorm 顺序:残差分支上 Pre-LN(标准),加上最后一个块跳接上的额外 LN。稳定最后一层的梯度流。

没有这些技巧,340 亿参数的 Chameleon 训练在多个 checkpoint 上发散;有了它们才收敛。训练配方与架构一样是贡献。

分词器的重建天花板

VQ-VAE 有损。8192 码本项、每张 512×512 图 1024 token,重建 PSNR 封顶约 26~28 dB。对可识别的图像生成够用,但明显差于连续空间扩散(Stable Diffusion 3 达 32+ dB)。

分词器是瓶颈。更好的分词器(MAGVIT-v2、IBQ、SBER-MoVQGAN)抬升天花板。Emu3(第 12 节)仅靠更好的分词器就达到 SDXL 质量的生成。

Chameleon vs BLIP-2 / LLaVA

Chameleon(早期融合,共享词表):

  • 一个损失、一个解码器。
  • 生成混合模态输出。
  • 分词器是质量天花板。
  • 昂贵:推理路径上每张生成图都要 VQ-VAE 解码器。

BLIP-2 / LLaVA(晚期融合,分塔):

  • 视觉进、文本出。
  • 复用预训练 LLM。
  • 理解上无分词器瓶颈。
  • 便宜:单次前向。

按任务挑。需要图像生成选 Chameleon 系;只需理解选 adapter VLM,更简单且复用更多预训练算力。

Fuyu 与 AnyGPT

Fuyu(Adept,2023) 是相关思路:完全跳过独立视觉编码器,把原始图像 patch 当 token 一样过 LLM 的输入投影,不用分词器。比 Chameleon 简单,但丢了共享词表的输出生成。

AnyGPT(Zhan 等人,2024) 把 Chameleon 扩到四种模态:文本、图像、语音、音乐。每种都用 VQ-VAE 技巧,共享 Transformer,任意到任意生成。第 16 节详谈。

二、从零实现

code/main.py 搭一个玩具级端到端早期融合模型:

  • 一个微型 VQ-VAE 风格量化器,把 8×8 patch 映射到码本索引(K=16)。
  • 一个共享词表(文本 ID 0..31)+(图像 ID 32..47)+(分隔符 48、49)。
  • 一个玩具自回归解码器(二元表),在合成 caption + 图像 token 序列上训练。
  • 一个采样循环,给定 prompt 发出交替的文本与图像 token。

代码故意把 Transformer 做到极小(二元),让你能端到端追踪信号流。

VQ-VAE 量化的伪代码

# 输入: 图像特征 feat (32, 32, 256), 码本 codebook (K, 256) def vq_quantize(feat, codebook): flat = feat.reshape(-1, 256) # (1024, 256) # 每个特征找最近码本项 (L2) dists = cdist(flat, codebook) # (1024, K) idx = dists.argmin(axis=1) # (1024,) 整数索引 quantized = codebook[idx] # (1024, 256) 量化特征 return idx, quantized # idx 即图像 token 序列 # 训练损失 = 重建(解码回像素) + 承诺(Feat 靠近码本) + 码本(码本靠近 Feat)

共享词表的自回归

# 词表: [文本 0..31999] [图像 32000..40191] [分隔符 40192=<image>, 40193=</image>] # 文档: <image> img_tokens... </image> caption text_tokens... def forward(shared_sequence): # 一条序列, 一个交叉熵损失, 不管模态 logits = transformer(shared_sequence[:-1]) loss = cross_entropy(logits, shared_sequence[1:]) return loss def generate(prompt): out = prompt while not eos(out): next_id = sample(transformer(out)) # 可能是文本/图像/分隔符 out.append(next_id) if next_id == IMAGE_START: # 接下来 1024 个是 VQ 索引 # 收集后送 VQ 解码器渲染像素 return out # 文本与图像交替

💡 关键洞察:早期融合的精髓是模态无特殊待遇——文本 token 与图像 token 走同一个嵌入、同一个注意力、同一个 softmax。这让模型能自主决定何时说话、何时画图,而无需外部调度。

QK-Norm

def qk_norm_attention(q, k, v): q = layer_norm(q) # 点积前归一化, 防 logit 爆炸 k = layer_norm(k) attn = softmax(q @ k.T / sqrt(d)) return attn @ v

三、框架对比

  • Chameleon 官方(Meta):VQ-VAE 分词器 + 共享词表自回归,QK-Norm/dropout/LayerNorm 稳定训练;34B 模型混合模态生成。
  • CM3Leon(Meta 前作):同早期融合思路,先文本后图像,奠定 Chameleon 基础。
  • AnyGPT:四模态(文本/图/语音/音乐)共享 Transformer,任意到任意生成。
  • Fuyu(Adept):跳过视觉编码器,原始 patch 当 token 过 LLM 输入投影,理解优先无生成。
  • Emu3(第 12 节):同早期融合,但用更强分词器(MAGVIT-v2 类)把生成质量追上 SDXL。

工程取舍:需要混合模态生成用 Chameleon/Emu3 系;只需理解用 LLaVA/BLIP-2(更便宜);要任意到任意用 AnyGPT;要最简理解用 Fuyu。

四、可复用产物

本节产出 outputs/skill-tokenizer-vs-adapter-picker.md。给定产品规格(只理解 vs 理解+生成、所需图像质量、成本预算),它在 Chameleon 系(早期融合)与 LLaVA 系(晚期融合)间选择,并用定量经验法则论证。

五、练习

  1. 压缩比:Chameleon 用 K=8192 码本项、每张 512×512 图 1024 token。估算相对 24 位 RGB 图的压缩比。有损吗?多损?

  2. 4K 图:同样 VQ-VAE 密度下,4K 图(3840×2160)产多少图像 token?Chameleon 式模型能一次推理生成 4K 图吗?什么先崩——上下文、分词器质量,还是 KV 缓存?

  3. 实现 QK-Norm:用纯 Python 实现 QK-Norm,给定 64 维 query 与 key,展示 LayerNorm 前后的点积。为什么深度下量级控制重要?

  4. 读论文:读 Chameleon 第 2.3 节关于训练稳定性,描述论文在 34B 无 QK-Norm 时观察到的确切失败模式。「范数爆炸」的特征是什么?

  5. 混合生成:扩展玩具解码器,给定纯文本 prompt 发出混合模态响应。训练数据分布 60% 文本优先/40% 图像优先时,测量模型选图先 vs 文先的频率。

本节要点回顾

  1. 早期融合:图像也离散成 token,与文本共享词表,从第一步就一条序列一个损失。
  2. VQ-VAE 分词:CNN+ViT 编码 + 码本量化 + CNN 解码,图像变整数索引序列。
  3. 共享词表:文本 + 图像 + 分隔符同属一个 ID 空间,同一嵌入/注意力/softmax。
  4. 混合模态生成:一次推理自主交替文本与图像 token,无需外部调度。
  5. 三大稳定技巧:QK-Norm(防 logit 爆炸)、残差后 dropout、Pre-LN 加末块跳接 LN。
  6. 分词器天花板:VQ 有损,8192 码本/1024 token 重建 PSNR 约 26~28 dB,差于扩散。
  7. Chameleon vs adapter:Chameleon 能生成但贵;adapter 只理解但便宜且复用 LLM。
  8. Fuyu:跳过视觉编码器,patch 当 token,理解优先无生成。
  9. AnyGPT:四模态共享 Transformer,任意到任意。
  10. 分词器决定上限:Emu3 仅靠更强分词器就追上 SDXL 质量。

下一节,我们将进入 Emu3——它沿用 Chameleon 的早期融合,但证明「只要分词器够好,纯下一 token 预测就能同时做理解和生成,且质量追上专门的扩散与理解模型」。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U