Transfusion:一个 Transformer 里的自回归文本 + 扩散图像 本节摘要:Chameleon 与 Emu3 把全部赌注押在离散 token 上,能用,但量化瓶颈可见——图像质量在连续空间扩散模型之下平台化。Transfusion(Meta,Zhou 等人,2024 年 8 月)押相反的注:保持图像连续,彻底丢掉 VQ-VAE,用一个 Transformer 训两个损失。文本 token 走下一 token 预测,图像 patch 走流匹配/扩散损失,两个目标优化同一套权重。Stable Diffusion 3 的底层架构(MMDiT)是近亲。本节读 Transfusion 论点,搭一个玩具级双损失训练器,并追踪让一个 Transformer 同时干两份活的那张注意力掩码。
本节摘要:Chameleon 与 Emu3 把全部赌注押在离散 token 上,能用,但量化瓶颈可见——图像质量在连续空间扩散模型之下平台化。Transfusion(Meta,Zhou 等人,2024 年 8 月)押相反的注:保持图像连续,彻底丢掉 VQ-VAE,用一个 Transformer 训两个损失。文本 token 走下一 token 预测,图像 patch 走流匹配/扩散损失,两个目标优化同一套权重。Stable Diffusion 3 的底层架构(MMDiT)是近亲。本节读 Transfusion 论点,搭一个玩具级双损失训练器,并追踪让一个 Transformer 同时干两份活的那张注意力掩码。
阅读完本节,你应当能够:
离散 vs 连续图像 token 的争论比 LLM 还古老。连续表示(原始像素、VAE 潜变量)保留细节;离散 token(VQ 索引)契合 Transformer 原生词表,但在量化步骤损失细节。
Transfusion 问:能不能两者都要?保持图像连续,仍训练一个模型,把两个损失缝进同一个梯度步。
一个纯解码器 Transformer 处理一条序列,里面含:
<image> 与 </image> 标签标记连续 patch 的位置。前向跑一次。损失按 token 选两个头之一:
梯度流过共享的 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 里的物理体现——文本单向流动(因果),图像整体被看见(双向),文本能回看之前的图、图能看之前的文本。同一个注意力矩阵,不同区域不同规则,把两种模态缝在一起。
扩散损失是标准的:给图像 patch 加噪,让模型预测噪声(等价于预测干净 patch)。Transfusion 用流匹配——预测从噪声到干净的速度场。
训练时:
推理时,生成是:
Stable Diffusion 3(Esser 等人,2024 年 3 月)在 Transfusion 同期发布了 MMDiT(多模态扩散 Transformer)。两者架构是兄弟。
MMDiT 的关键差异:
两者收敛到同一个核心想法:一个 Transformer 对文本跑 NTP、对连续图像表示跑扩散。
连续扩散 vs 离散 NTP 在图像生成上的质量差距可测。Transfusion 论文报告:
代价: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:
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/MMDiT;要代码最简用 Chameleon/Emu3;要避开扩散调度用 Show-o;要理解与生成各用最佳编码器用 Janus-Pro。
本节产出 outputs/skill-two-loss-trainer-designer.md。给定一个新的多模态训练任务(文本+图像、文本+音频、文本+视频),它设计双损失方案(损失权重、掩码形状、共享 vs 模态专属块)并标出实现风险。
损失权重:Transfusion 式模型 70% 文本 token、30% 图像 patch,图像扩散损失量级约为文本 NTP 的 10 倍。什么损失权重能平衡它们?
掩码实现:为序列 [T, T, <image>, P, P, P, P, </image>, T] 实现块三角掩码,标出每项 0 或 1。
MMDiT 开销:MMDiT 有模态专属 QKV 权重。相比 Transfusion 全共享 Transformer,参数量开销增加多少?70 亿参数下值得吗?
生成前向数:给定文本 prompt,模型跑 50 个 token 的 NTP,然后命中 <image>,再在 256 个 patch 上跑 20 步去噪扩散。总共多少次前向?
整流流:读 SD3 论文第 3 节,描述整流流,为什么它比 DDPM 用更少推理步就能收敛?
下一节,我们将进入 Show-o——它把扩散换成「离散扩散」(掩码预测),让统一模型既不需要 VQ 码本,也不需要连续扩散调度,是 Transfusion 与 Chameleon 之间的第三条路。