Transfusion:一个 Transformer 里的自回归文本 + 扩散图像


文档摘要

Transfusion:一个 Transformer 里的自回归文本 + 扩散图像 本节摘要:Chameleon 与 Emu3 把全部赌注押在离散 token 上,能用,但量化瓶颈可见——图像质量在连续空间扩散模型之下平台化。Transfusion(Meta,Zhou 等人,2024 年 8 月)押相反的注:保持图像连续,彻底丢掉 VQ-VAE,用一个 Transformer 训两个损失。文本 token 走下一 token 预测,图像 patch 走流匹配/扩散损失,两个目标优化同一套权重。Stable Diffusion 3 的底层架构(MMDiT)是近亲。本节读 Transfusion 论点,搭一个玩具级双损失训练器,并追踪让一个 Transformer 同时干两份活的那张注意力掩码。

Transfusion:一个 Transformer 里的自回归文本 + 扩散图像

本节摘要:Chameleon 与 Emu3 把全部赌注押在离散 token 上,能用,但量化瓶颈可见——图像质量在连续空间扩散模型之下平台化。Transfusion(Meta,Zhou 等人,2024 年 8 月)押相反的注:保持图像连续,彻底丢掉 VQ-VAE,用一个 Transformer 训两个损失。文本 token 走下一 token 预测,图像 patch 走流匹配/扩散损失,两个目标优化同一套权重。Stable Diffusion 3 的底层架构(MMDiT)是近亲。本节读 Transfusion 论点,搭一个玩具级双损失训练器,并追踪让一个 Transformer 同时干两份活的那张注意力掩码。

学习目标

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

  1. 在一个主干上接好跑两个损失(文本 token 的 NTP、图像 patch 的扩散 MSE)的 Transformer。
  2. 解释为什么「图像 patch 间双向注意力 + 文本 token 上因果注意力」是正确的掩码选择。
  3. 在算力、质量、代码复杂度上,对比 Transfusion 式(连续图像、扩散损失)与 Chameleon 式(离散图像、NTP)。
  4. 说出 MMDiT 的贡献:每块模态专属权重、残差流上的联合注意力。

一、问题与直觉

离散 vs 连续图像 token 的争论比 LLM 还古老。连续表示(原始像素、VAE 潜变量)保留细节;离散 token(VQ 索引)契合 Transformer 原生词表,但在量化步骤损失细节。

  • Chameleon / Emu3 走离散:一个损失、一个架构,但图像保真度被分词器质量封顶。
  • 扩散模型走连续:图像质量极佳,但与 LLM 是分开的模型,噪声调度工程复杂,且无法与文本生成干净整合。

Transfusion 问:能不能两者都要?保持图像连续,仍训练一个模型,把两个损失缝进同一个梯度步。

双损失架构

一个纯解码器 Transformer 处理一条序列,里面含:

  • 文本 token(离散,来自 BPE 词表)。
  • 图像 patch(连续,16×16 像素块,经线性嵌入投影到隐藏维——与 ViT 编码器输入一样)。
  • <image></image> 标签标记连续 patch 的位置。

前向跑一次。损失按 token 选两个头之一:

  • 文本 token:在词表 logits 头上做标准交叉熵。
  • 图像 patch:在连续 patch 上做扩散损失——预测加到每个 patch 上的噪声。

梯度流过共享的 Transformer 主体,两个损失同时改进共享权重。

注意力掩码:因果文本 + 双向图像

文本 token 必须是因果的——不能让文本 token 关注未来文本,否则教师强制失效。但图像 patch 表示的是同一张快照,它们应在同一图像块内双向互相关注。

掩码:

M[i, j] = 1 当满足以下任一: (i 是文本 且 j 是文本 且 j <= i) # 文本因果 或 (i 是图像 且 j 是图像 且 同一图像块(i,j)) # 图像块内双向 或 (i 是文本 且 j 是图像 且 j < i_图像结束) # 文本关注之前的图像 或 (i 是图像 且 j 是文本 且 j < i_图像开始) # 图像关注之前的文本

训练与推理时实现为块三角掩码。

💡 融合的核心:这张掩码就是「模态融合」在 Transfusion 里的物理体现——文本单向流动(因果),图像整体被看见(双向),文本能回看之前的图、图能看之前的文本。同一个注意力矩阵,不同区域不同规则,把两种模态缝在一起。

Transformer 内的扩散损失

扩散损失是标准的:给图像 patch 加噪,让模型预测噪声(等价于预测干净 patch)。Transfusion 用流匹配——预测从噪声到干净的速度场。

训练时:

  1. 对每个图像 patch x0,采样随机时间步 t。
  2. 采样噪声 ε,计算 xt = (1−t)·x0 + t·ε(流匹配的线性插值)。
  3. Transformer 预测 v_θ(xt, t);损失 = MSE(v_θ(xt, t), ε − x0)。
  4. 与同序列的文本 NTP 损失一起回传。

推理时,生成是:

  • 文本 token:标准自回归采样。
  • 图像 patch:在先前文本 token 条件下,跑扩散采样循环(典型 10~30 步)。

MMDiT:Stable Diffusion 3 的变体

Stable Diffusion 3(Esser 等人,2024 年 3 月)在 Transfusion 同期发布了 MMDiT(多模态扩散 Transformer)。两者架构是兄弟。

MMDiT 的关键差异:

  • 每块模态专属权重:每个 Transformer 块对文本 token 与图像 patch 有独立的 Q、K、V、MLP 权重。注意力是联合的(跨模态);其余都模态专属。
  • 整流流训练:一种特定的流匹配变体,采样已知、数学比 DDPM 简单。
  • 规模:MMDiT 是 SD3 的主干(20 亿与 80 亿参数变体);Transfusion 论文扩到 70 亿。

两者收敛到同一个核心想法:一个 Transformer 对文本跑 NTP、对连续图像表示跑扩散。

为什么胜过 Chameleon 式

连续扩散 vs 离散 NTP 在图像生成上的质量差距可测。Transfusion 论文报告:

  • 70 亿参数下,FID 比同等大小的 Chameleon 式模型好 3~5 分。
  • 无需训练分词器——图像编码器更简单(线性投影到隐藏维,与 ViT 输入层一样)。
  • 推理可并行化图像 patch 去噪,不像自回归图像 token 必须串行。

代价:Transfusion 是双损失模型,训练动力学更棘手。损失权重需调;NTP 与扩散的调度失配会让一个头主导。

下游

Janus-Pro(第 15 节)改进 Transfusion:把理解与生成的视觉编码器解耦——一个用 SigLIP、另一个用 VQ——同时共享 Transformer 主体。Show-o(第 14 节)把扩散换成离散扩散(掩码预测)。Transfusion 之后,统一生成家族迅速分叉。

2026 年能产出图像的生产 VLM——Gemini 3 Pro、GPT-5、Claude Opus 4.7 的图像生成路径——几乎肯定用了这个家族的某种后代,细节未公开。

二、从零实现

code/main.py 在 MNIST 级玩具问题上搭一个 Transfusion:

  • 文本 caption 是描述数字(0~9)的短整数序列。
  • 图像是 4×4 的字节网格。
  • 一对共享权重的线性投影充当 Transformer 替身;文本上 NTP 损失,含噪 patch 上 MSE 损失。
  • 训练循环交替两个损失,注意力掩码显式。
  • 生成在单次前向里产出一个文本 caption 与一张 4×4 图像。

Transformer 是玩具,真正的产物是双损失管道、注意力掩码构造、推理循环

双损失训练的伪代码

def transfusion_step(sequence, model): # sequence = [文本 token, <image>, 连续 patch, </image>, 文本 token...] hidden = model.forward(sequence, mask=block_triangular_mask(sequence)) # 文本位置走 NTP text_logits = model.text_head(hidden[text_positions]) loss_ntp = cross_entropy(text_logits, sequence[text_positions + 1]) # 图像位置走扩散 (流匹配) for patch_pos in image_positions: x0 = sequence[patch_pos] # 干净 patch t = random_timestep() eps = random_noise() xt = (1-t)*x0 + t*eps # 线性插值 v_pred = model.diff_head(hidden[patch_pos], t) loss_diff = mse(v_pred, eps - x0) # 速度场目标 loss = w_text * loss_ntp + w_img * loss_diff # 权重平衡两损失 backward(loss)

块三角掩码

def block_triangular_mask(seq_layout): # seq_layout 标注每个位置: text / image_start / image_patch / image_end n = len(seq_layout) M = zeros((n, n)) for i in range(n): for j in range(n): if is_text(i) and is_text(j) and j <= i: M[i,j] = 1 # 文本因果 elif is_img_patch(i) and same_image(i,j): M[i,j] = 1 # 图像双向 elif is_text(i) and is_image(j) and j < image_end(i): M[i,j] = 1 # 文本看之前图 elif is_image(i) and is_text(j) and j < image_start(i): M[i,j] = 1 # 图像看之前文本 return M

💡 权重平衡是关键:扩散损失量级通常是 NTP 的约 10 倍。若不调权重(w_img 远小于 w_text),扩散头会主导梯度,文本能力崩塌。Transfusion 论文显式消融了这一点。

双模态生成

def transfusion_generate(prompt, model): out = prompt while not eos(out): if next_is_image(out): # 命中 <image> x = random_noise(patches) for t in denoise_schedule(20): # 扩散采样 20 步 v = model.diff_head(model.forward(out + x), t) x = x - (t_prev - t) * v # 沿速度场去噪 out += x else: # 文本自回归 logits = model.text_head(model.forward(out)) out.append(sample(logits[-1])) return out

三、框架对比

  • Transfusion(Meta):连续图像 + 双损失(NTP + 流匹配),共享主干,块三角掩码;7B 规模。
  • MMDiT / Stable Diffusion 3:每块模态专属 QKV/MLP + 联合注意力,整流流训练,是 SD3 的主干(2B/8B)。
  • Chameleon / Emu3:离散图像 token + 单一 NTP,无扩散头,代码更简但质量被分词器封顶。
  • Show-o(第 14 节):把扩散换成离散扩散(掩码预测),仍统一但避开连续扩散。
  • Janus-Pro(第 15 节):解耦理解/生成的视觉编码器,共享主干。

工程取舍:要连续图像最高质量用 Transfusion/MMDiT;要代码最简用 Chameleon/Emu3;要避开扩散调度用 Show-o;要理解与生成各用最佳编码器用 Janus-Pro。

四、可复用产物

本节产出 outputs/skill-two-loss-trainer-designer.md。给定一个新的多模态训练任务(文本+图像、文本+音频、文本+视频),它设计双损失方案(损失权重、掩码形状、共享 vs 模态专属块)并标出实现风险。

五、练习

  1. 损失权重:Transfusion 式模型 70% 文本 token、30% 图像 patch,图像扩散损失量级约为文本 NTP 的 10 倍。什么损失权重能平衡它们?

  2. 掩码实现:为序列 [T, T, <image>, P, P, P, P, </image>, T] 实现块三角掩码,标出每项 0 或 1。

  3. MMDiT 开销:MMDiT 有模态专属 QKV 权重。相比 Transfusion 全共享 Transformer,参数量开销增加多少?70 亿参数下值得吗?

  4. 生成前向数:给定文本 prompt,模型跑 50 个 token 的 NTP,然后命中 <image>,再在 256 个 patch 上跑 20 步去噪扩散。总共多少次前向?

  5. 整流流:读 SD3 论文第 3 节,描述整流流,为什么它比 DDPM 用更少推理步就能收敛?

本节要点回顾

  1. 双损失同一主干:一个 Transformer 对文本跑 NTP、对连续图像 patch 跑扩散,梯度共享权重。
  2. 块三角掩码:文本因果、图像块内双向、文本看之前图、图看之前文本——融合的物理体现。
  3. 流匹配:预测噪声到干净的速度场,xt=(1−t)·x0+t·ε,数学比 DDPM 简。
  4. MMDiT:每块模态专属 QKV/MLP + 联合注意力,是 SD3 主干,与 Transfusion 是兄弟。
  5. 胜过 Chameleon:FID 好 3~5 分,无需训分词器,推理可并行去噪。
  6. 代价:双损失动力学棘手,权重需调,调度失配会让一头主导(扩散量级约为 NTP 10 倍)。
  7. 连续 vs 离散:连续保留细节但需扩散;离散契合词表但量化有损。
  8. 推理两套采样:文本自回归,图像扩散循环(10~30 步)。
  9. 家族分叉:Janus-Pro 解耦编码器、Show-o 用离散扩散,都源于 Transfusion。
  10. 2026 生产路径:能产图的前沿 VLM 几乎都用这个家族的某种后代。

下一节,我们将进入 Show-o——它把扩散换成「离散扩散」(掩码预测),让统一模型既不需要 VQ 码本,也不需要连续扩散调度,是 Transfusion 与 Chameleon 之间的第三条路。


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