跳转至

UniDDT: Unifying Multimodal Understanding and Generation with Decoupled Diffusion Transformer

会议: ECCV 2026
论文: ECCV 原文
代码: https://github.com/MCG-NJU/UniDDT
领域: 多模态VLM
关键词: 统一多模态模型, 解耦扩散Transformer, 统一视觉空间, 流匹配, 理解-生成对偶

一句话总结

UniDDT 用「Noisy ViT 编码器 + LLM 主干」统一理解与生成的语义编码、用一个独立扩散解码器把扩散解码从文本解码中解耦,并把同一批图文对构造成双向数据做联合训练与对偶后训练,在 MME 上拿到 1699.5、GenEval 0.87、DPG 86.9。

研究背景与动机

统一多模态模型(Unified Multimodal Model, UMM)试图把理解与生成塞进同一个框架,目前主流形态是 AR-diffusion 混合架构:文本侧沿用自回归的下一个 token 预测,图像侧换成扩散生成。但这两件事的差异比看上去大得多,现有方案在三个层面都还没谈拢。一是建模层面:早期做法用 adapter 把理解模型和生成模型「拼」起来,集成得很表面;后来出现的 Native-UMM 把两个目标放进同一个网络,但主流实现是给理解与生成各开一条并行分支,结果往往是此消彼长的性能权衡,所谓「相互促进」并没有兑现,于是大家转而按任务解耦参数。二是视觉空间层面:理解模型靠高维语义表示吃饭,生成模型却在高维语义空间里训不动,于是多数 UMM 干脆给两个任务各配一套表示——理解用语义空间、生成用 VAE 空间;这种「空间碎片化」让整条流程变复杂,也阻碍了大规模 scaling。三是训练数据层面:尽管 Mogao 提出交错多模态数据才是真统一的钥匙,但多数 UMM 其实是各用各的任务专用数据把两个组件缝在一起,没有真正吃到图文对本身的对偶性。

这三个问题的根源是同一个矛盾:理解要求的语义丰富度和生成要求的训练可行性,在同一个表示空间和同一套参数里天然打架。既然直接共享会把两边都拖下水,本文的切入角度就不是「让两边共享得更多」,而是想清楚哪些必须共享、哪些必须分离:语义编码可以共享(理解本来就在做语义提取,生成也需要语义条件),而解码过程必须分开(文本靠因果 token 解码,图像靠扩散去噪解码,两者的输出结构和训练目标根本不同)。沿着这个思路,本文提出 UniDDT,把视觉理解当作视觉生成的前置任务来组织整个模型。

核心 idea:让 Noisy ViT 编码器与 LLM 主干共用一条语义通路(带噪输入和干净输入走同一套语义编码),再把扩散解码单独拆成一个只吃语义条件的解码器,从而在统一视觉空间下做到「语义共享、解码解耦」,并用同一批图文对的双向格式把理解与生成的训练目标绑在一起。

方法详解

整体框架

UniDDT 是对 DDT(Decoupled Diffusion Transformer)的解耦思路在「理解 + 生成」场景下的重写。原始 DDT 把一个扩散模型拆成「重的条件编码器 + 轻的速度解码器」,条件编码器吃 prompt、带噪输入和时间步输出自条件特征,速度解码器据此估计速度场。UniDDT 沿用了这个骨架,但把条件编码器一分为二:Noisy ViT 编码器负责从带噪输入里抽语义,LLM 主干负责把语义和文本条件融合起来,两者合起来充当 DDT 里的条件编码器;扩散解码器仍然是那个专门做去噪的速度解码器。

整条流水线是这样的:给定一个图像-文本对 \((y, x)\),图像先被编码到统一的视觉空间得到 \(x\) 的表示,加噪后得到带噪输入 \(x_t\);Noisy ViT 编码器接收 \(x_t\) 与时间步 \(t\),输出语义特征 \(z_t\)。接下来主干按任务分两种走法——做理解时,LLM 对 \(z_t\) 和文本前缀做因果编码,然后自回归解码出答案文本 \(y^*\);做生成时,LLM 把 prompt \(y\) 和视觉语义 \(z_t\) 一起做因果编码,完成语义注入,得到被 prompt 修正过的特征 \(\hat z_t\),再把它交给独立的扩散解码器,由解码器结合 \(x_t\)\(t\)\(\hat z_t\) 估计速度 \(v_t\),积分出图像。最后还有一步对偶后训练:把生成过程中间时刻 \(s\) 的估计状态 \(x_s\) 重新送回理解分支,用「能不能从 \(x_s\) 把 prompt 还原出来」这一似然反过来约束扩散解码器。

需要强调的是,这套设计里共享的只有语义,解码是彻底分开的:理解走的是 LLM 的因果文本解码头,生成走的是一个全新的扩散解码器,两条路径不共用任何解码参数,因此不存在「同一个头既要做分类又要回归速度场」的冲突。

%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400}}}%%
flowchart TD
    A["图文对 (y, x)"] --> B["Noisy ViT 编码器与统一视觉空间<br/>带噪 x_t + 时间步 t → 语义 z_t"]
    B --> C["LLM 主干<br/>一套因果主干两种读出"]
    C -->|理解:因果解码文本| D["文本 y*"]
    C -->|生成:语义注入得 ẑ_t| E["独立扩散解码器<br/>由 x_t、t、ẑ_t 估计速度 v_t"]
    E --> F["生成图像 x"]
    E -.->|中间态 x_s 回送理解分支| G["对偶后训练<br/>最大化 log p(y | x_s, s)"]

关键设计

1. Noisy ViT 编码器与统一视觉空间:让语义编码同时吃下干净输入与带噪输入,并选 latent 作为两任务共用的表示

统一的第一个障碍是:理解模型的视觉编码器从来没见过噪声,而生成的每一步都在处理带噪输入,如果照搬预训练 VLM 的编码器,它在高噪声时间步上会直接失效。UniDDT 的做法是把 DDT 条件编码器的结构(交错的 Attention 与 FFN 块)拿来当 Noisy ViT,并像 DiT/SiT 那样用 AdaLN-Zero 把时间步 \(t\) 注入进去,使编码器输出变成 \(t\) 的函数 \(z_t = \mathrm{NoisyViT}(x_t, t)\)——同一个编码器在 \(t\) 小(干净)时退化成普通的语义编码器,在 \(t\) 大(高噪)时仍然能给出可用的语义。为了让它一开始就具备这种能力,训练时把一部分参数直接从预训练视觉基础模型初始化(Native-UniDDT 用 SigLIP2,VLM-UniDDT 用 Qwen-NaViT),只把时间步相关的 AdaLN-Zero 模块留作新参数,并用 REPA 那一套表示对齐把编码器中间层的特征拉向教师模型的特征。与 Show-o2 的关键差别在于:这里的 Noisy ViT 是真的把 \(t\) 当成额外条件去做语义提取,而不是只在干净输入上做编码、靠别的模块去处理噪声。

「统一视觉空间」则是这条通路选在哪套表示上运行的问题。作者对比了原始像素空间和 Flux-VAE 的 latent 空间(16 通道、8 倍下采样),结论是:像素空间在理解上略优但差距可忽略,在生成上明显更差、而且没有表现出更好的 scaling。于是 UniDDT 取 latent 空间作为统一视觉空间,好处是理解与生成共用一套表示,不需要在语义编码器和 VAE 之间做空间转换,整条链路才能干净地 scaling。这个取舍不是拍脑袋的,第 4.1 节专门用余弦相似度、MME、GenEval 三条曲线把它量化了。

2. LLM 主干:理解解码与生成语义注入共用一套因果主干

如果理解与生成各配一套主干,参数量翻倍且损失了「理解能力迁移到生成」的可能;但如果强行让主干同时输出文本 token 和图像速度,又回到老冲突。UniDDT 选择让 LLM 主干只负责语义层面的两件事,而把「怎么变成最终输出」完全交出去。具体地,参考 Qwen-VL 的做法给理解和生成各写一套 chat template,把模板里的图像占位 token 替换成 Noisy ViT 抽出的语义特征 \(z_t\):理解任务下,主干对 \(z_t\) 与理解前缀做因果编码后自回归解码文本;生成任务下,主干对 prompt \(y\)\(z_t\) 做因果编码,把 \(y\) 的语义注入到视觉特征里得到 \(\hat z_t\)。两种任务的主干输出统一表达为「视觉语义经过文本条件修正后的特征」,只是读出的方式不同(一个读成文本 token,一个送给扩散解码器),参数完全共享。这样做还有一个额外收益:因为理解训练时时间步是随机采样的,主干顺带学会了在带噪语义上做推理,模型因此可以在生成中途「看懂」自己正在画的东西(论文图 5 展示了在可接受噪声水平下理解基本不退化)。

一个容易忽略但很关键的细节是:扩散解码器只吃 \(\hat z_t\),不吃文本 token 的隐状态。这与常规扩散 Transformer 把 LLM 最后几层文本隐状态当条件的做法不同,等于把「文本信息有没有被完整压缩进视觉语义」这个责任直接压在了主干上——消融实验专门验证了这一点是可行的(见下)。

3. 独立扩散解码器:把扩散解码从文本解码中解耦

这是全文「decoupled」二字的落点。生成侧的最终输出不是文本而是图像,需要的是连续速度场回归和去噪迭代,与文本的离散因果解码在输出结构、损失形式、推理方式上都不兼容;把两者塞进同一个头是理解与生成互相拖累最直接的来源。UniDDT 因此单开一个扩散解码器,结构与 Noisy ViT 同源(交错的 Attention 与 FFN 块,接近 DiT/SiT),输入 \(x_t\)\(t\),以 \(\hat z_t\) 为条件输出速度 \(v_t\),用流匹配(flow matching)目标训练。它和条件侧的接口只有一个 \(\hat z_t\),所以可以在 Noisy ViT 和 LLM 全部冻结的情况下单独训练——这一点被作者当作设计有效性的证据:如果这个接口的信息足够,冻结条件侧也能学会去噪。

注入方式也被改过:DDT 用 AdaLN-Zero 注入条件,UniDDT 改用 attention\(\hat z_t\) 注入解码器特征(论文 Eq. 8-9 的块结构公式在缓存中已损坏,此处只描述机制,⚠️ 以原文为准)。此外为了训练稳定性,解码器末端还接了几个全注意力的 refinement 块(借鉴 Fluid/PixNerd 的 refiner 设计),把主干给的隐状态再细化一遍。整体上解码器是「重的条件侧 + 专门的轻解码侧」,条件侧承担语义,解码侧只管把语义落成像素。

4. 对偶后训练:把生成的中间态送回理解分支,用似然反过来修生成

前面三步保证了模型既能生成又能理解,这一步是让理解的判断力直接给生成当裁判。既然模型能理解带噪输入,那它在去噪途中得到的中间状态就不该只是「半成品」,还可以自检「这个状态是否还忠实于 prompt」。具体做法是:冻结 Noisy ViT 与 LLM 主干,只训扩散解码器;给定 \(x_t\)\(t\) 与 prompt \(y\),解码器给出速度 \(v_t\) 后,用一阶外推估计另一时刻 \(s\) 的状态

\[x_s = x_t + v_t\,(s - t)\]

再把 \((x_s, s)\) 送进理解分支估计似然 \(\log p(y \mid x_s, s)\)最大化这个似然来优化解码器。换言之,生成器被要求让「自己造出来的中间帧在理解分支看来仍然像 prompt 描述的那张图」。这比只优化最终图像与真值的距离更贴近语义一致性,而且完全复用已有分支、不引入任何额外参数,是「理解作为生成前置任务」这一论断最直接的兑现方式。

损失函数 / 训练策略

三阶段训练。作者发现从随机初始化直接联合训练很容易把语言模型训崩,于是拆成三段:

  1. Noisy ViT 预热:用 SigLIP2 / Qwen-NaViT 当教师,把表示蒸馏到 Noisy ViT(对齐中间层特征,REPA 式余弦损失),40K 步、常数学习率 2e-4、EMA 0.9999。这里有个值得注意的细节:扩散常用的大 time shift 值(对应更多高噪时间步)会显著损害理解能力,尤其是 OCR,所以作者改用一个较小的 time shift 值,它对更多噪声水平泛化更好。
  2. 扩散解码器预热:冻结 Noisy ViT 与 LLM 主干,加一个投影层对齐维度,联合训练投影层与扩散解码器,100K 步,最大序列长度 16384,损失是流匹配损失。缓存中该公式已损坏,其标准形式为对 \(t \sim \mathcal{U}[0,1]\) 回归目标速度 \((x_{\text{data}} - \epsilon)\) 与预测速度 \(v_t(\cdot)\) 之间的均方误差,⚠️ 以原文为准。
  3. 联合训练:解冻全部模块。数据侧是本文的第二个「解耦之外」的设计——同一批图文对\((y,x)\)构造两种格式,生成格式为 <user>generate.y<user><assistant>x<assistant>,理解格式为 <user>describe.x<user><assistant>y<assistant>,训练时随机采样其中一种;理解样本只对文本 \(y\) 算交叉熵损失,生成样本对图像 \(x\) 算扩散损失,两者相加构成联合损失(论文 Eq. 10 在缓存中损坏,此处按正文描述复述:\(\mathcal{L}_{\text{joint}} = \mathbb{E}[\mathcal{L}_{\text{diff}}(x \mid y) + \mathcal{L}_{\text{ce}}(y \mid x)]\),⚠️ 以原文为准)。Native-UniDDT 训 120K 步、VLM-UniDDT 训 10K 步,最大序列长度 8192。

对偶后训练:按设计 4 的方式,只训扩散解码器、最大化 \(\log p(y \mid x_s, s)\)4o 数据微调:最后在 OpenAI GPT-4o 风格的合成数据上再微调 8K 步(这一步对生成质量贡献极大,见消融)。

其他训练设置:数据是约 70M 张公开图像的混合集,每张图都用 Qwen2.5-VL-7B 重新打 caption,且 caption 长度多样;采用原生宽高比训练以避免中心裁剪造成的图文错配;用 FSDP 切分参数;硬件为 16×A100。四个规格为 Native-UniDDT-B(Qwen3-0.6B 主干,12 层 Noisy ViT,16+4 层扩散解码器)、Native-UniDDT-L(Qwen3-1.7B,24 层 Noisy ViT,解码器 24 头/1536 维)、Native-UniDDT-XL(把 L 的解码器维度拉到 2560)与 VLM-UniDDT(Qwen3-VL-4B 主干,其余同 L)。

实验关键数据

主实验

理解侧用 MME(perception)、GQA、SEED-Bench、MMB(en)、MMMU(val)、MMStar、AI2D 七个基准评测;生成侧用 GenEval(六个子项 + overall)与 DPGBench。所有理解评测直接固定 \(t=1.0\)

模型 参数量 MME(p)↑ SEED↑ MMB(en)↑ MMMU(val)↑ MMStar↑ AI2D↑
LLaVA-OV(理解专用) 7B 1580.0 - 80.8 48.8 57.5 81.4
Show-o2 7B 1620.5 69.8 79.3 48.9 56.6 78.6
BAGEL 14B 1687.0 - 85.0 55.3 - -
Mogao 7B 1592.0 74.6 75.0 44.2 - -
Janus-Pro 7B 1567.1 72.1 79.2 41.0 - -
VLM-UniDDT 4B+1B 1699.5 76.5 82.2 52.6 57.7 78.1
方法 GenEval Single Two Counting Colors Position Color Attri. Overall↑ DPG↑
SD3-Medium(生成专用) 0.99 0.94 0.72 0.89 0.33 0.60 0.74 84.08
DALL-E 3(生成专用) 0.96 0.87 0.47 0.83 0.43 0.45 0.67 83.50
Show-o2-7B 1.00 0.87 0.58 0.92 0.52 0.62 0.76† 86.14
Janus-Pro-7B 0.99 0.89 0.59 0.90 0.79 0.66 0.80 84.19
BLIP3-o-8B - - - - - - 0.84 81.60
BAGEL-7B 0.98 0.95 0.84 0.95 0.78 0.77 0.88† -
VLM-UniDDT (512×512) 0.99 0.93 0.71 0.92 0.85 0.80 0.87 86.9

两个变体的生成表现也一并报出:Native-UniDDT-L 为 GenEval 0.88 / DPG 86.6,Native-UniDDT-XL 为 0.89 / 87.1。⚠️ 注意摘要中写的是「0.86 GenEval」,与正文/表格的 0.87 不一致,本文笔记以表格为准。

消融实验

作者的消融很大程度上是训练阶段拆解 + 空间对比,最有信息量的是逐阶段的 GenEval 进展(VLM-UniDDT,4o 微调前):

阶段 Two Obj. Counting Position Color Overall
仅预热(Warmup) 0.63 0.32 0.20 0.27 0.52
联合训练(Joint) 0.69 0.45 0.41 0.37 0.60
对偶后训练(Post) 0.84 0.56 0.50 0.61 0.72
+ 4o 数据微调 0.93 0.71 0.85 0.80 0.87
消融项 设置 观察
Noisy ViT 的 time shift 大值 vs 小值 vs 纯干净 ViT 大 time shift 严重损伤理解(尤其 OCR);纯干净 ViT 对带噪输入泛化差;小 time shift 在高噪步上仍稳定
扩散解码器预热 冻结 Noisy ViT 与 LLM,只训投影层 + 解码器 即使只吃 \(\hat z_t\)(不含文本 token)也能有效收敛,性能随算力稳定上升
联合训练去掉理解损失 解冻全部模块但把理解损失权重置 0 Latent 版仅微弱提升,Pixel 版甚至退化;带对偶的联合训练下 Latent 版出现明显跃升
视觉空间 scaling 像素 vs latent(预热/联合/后训练三段) Latent 的绝对水平全面更高:预热 \(y=7.81\times10^{-5}x^{0.34}\) vs 像素 \(1.17\times10^{-4}x^{0.31}\);联合 0.178·\(x^{0.05}\) vs 0.088·\(x^{0.07}\);后训练 0.209·\(x^{0.05}\) vs 0.044·\(x^{0.11}\)。后两段像素的指数读数反而略大,但其绝对水平低得多,整体上并未体现更好的 scaling

关键发现

  • 对偶训练是生成侧的最大功臣之一,而且它的收益依赖视觉空间:把理解损失权重置零后,latent 版几乎不长、像素版直接退化;这说明「理解信号」在 latent 空间里是一种稳定器,而在像素空间里模型本来就不稳。
  • 4o 风格数据微调带来最陡的一段提升(Overall 0.72 → 0.87),其中 Position 从 0.50 跳到 0.85、Color 从 0.61 到 0.80——说明语义绑定类能力(属性、位置)对高质量 caption 数据极其敏感,架构本身解决的是可训性,不解决数据质量。
  • 理解上的噪声鲁棒性是可调的:小 time shift 让 Noisy ViT 在整个噪声区间上的余弦相似度曲线更平,代价不大;而理解评测固定 \(t=1.0\)(最干净)即可拿到最好结果,不需要为每个任务调时间步。
  • 像素空间的「理解略优」是真的但很小,而生成上的劣势很大——这个不对称正是作者选 latent 的全部理由。

亮点与洞察

  • 「理解是生成的前置任务」这一重新定位很聪明:它把两个任务的共享面从「都要输出东西」收窄到「都要读懂输入」,共享面收窄之后冲突自然消失,而共享的那部分(语义编码)恰恰是双方都需要的。这个思路可以迁移到任何「一个模型要同时做判别式与生成式任务」的场景,比如检测 + 生成、检索 + 生成。
  • 只喂 \(\hat z_t\) 而不喂文本隐状态,是一个被验证过的强假设:它等价于要求 LLM 主干把 prompt 信息完整压进视觉语义槽位,虽然看上去信息瓶颈很窄,但实验证明可行。这提示「条件注入的通道不必是 LLM 的最后一层隐状态」。
  • 对偶后训练是一个零参数的免费午餐:不改结构、不加参数,只是把生成中间态拉回理解分支做似然最大化,就能提升语义一致性。任何「模型同时具备生成与判别能力」的场景都可以尝试这个自洽回路。
  • 诚实地报告了不利结果:作者明确写了像素空间在理解侧略优、以及大 time shift 会伤 OCR——这类「反直觉但我们如实说」的消融比只报好数字有价值得多。

局限与展望

  • Native-UniDDT 只能做图像描述,无法遵循指令。因为训练数据里的文本几乎全部来自别的模型生成的 caption,缺乏指令数据,作者干脆不报告 Native 版的理解指标。这是「用对偶数据省掉任务专用数据」这一设计代价的直接体现——对偶性解决了数据效率,但解决不了数据多样性。
  • 生成评测分辨率偏低(GenEval 在 512×512 上测),而论文展示的样本是 1024×1024,两者不完全对应。
  • 缺少与生成专用模型在同等数据规模下的对照:约 70M 图像 + 4o 合成数据的组合与 SD3/BAGEL 的训练配方并不可比,因此 GenEval 的领先幅度不宜直接当作架构优势的量级。
  • 并行工作已指出更强的 VAE 是可行方向(RepFusion 用了更强的 RAE),本文固定在 Flux-VAE 上;另外作者提到实验早于 JiT,像素空间的预测参数化没有考虑,这意味着「latent 优于像素」的结论有其时间边界。
  • 我自己的观察:后训练阶段只训解码器、冻结理解分支,等于假设理解分支的似然是可靠的裁判;如果理解分支本身在带噪输入上有偏差,这个回路可能把生成往错误方向拉。论文没有报告这一风险的下界实验。

相关工作与启发

  • vs DDT(Decoupled Diffusion Transformer):DDT 只做生成,把扩散模型拆成「重条件编码器 + 轻速度解码器」;UniDDT 沿用这个骨架,但把条件编码器替换成「Noisy ViT + LLM」,从而让同一套语义编码同时服务理解与生成,并把 DDT 的 AdaLN-Zero 条件注入换成 attention 注入。
  • vs Show-o2:Show-o2 是单 Transformer、用因果与全注意力混合承载两种任务,统一视觉空间也走 latent;UniDDT 与其最大的差别是 Noisy ViT 显式把时间步当条件做语义提取,并且把扩散解码整体拆出去,不做「一个主干兼两职」。
  • vs Mogao / BAGEL:这两者用理解与生成的并行分支、各自解耦参数,参数量更大(14B 级),BAGEL 的 GenEval 0.88 还带 prompt rewriting(表中 †),与 UniDDT 的 0.87 不可直接比较;UniDDT 用 4B+1B 在理解侧反超 BAGEL-14B 的 MME,但 MMB(en) 仍落后(82.2 vs 85.0)。
  • vs BLIP3-o / MetaQuery:这类方法用 adapter 把专用 MLLM 与扩散模型对接,本质是「拼装」;UniDDT 属于 native 路线,共享范围更大(语义编码完全共享),代价是理解侧的指令能力受限于训练数据。
  • vs RAE / RepFusion:都走「表示空间去噪」这一族思路,RepFusion 与本文架构相近但额外换上更强的 RAE;UniDDT 的差异点在于把「理解分支」也纳入训练回路(对偶后训练),而不仅是把表示当条件。

评分

  • 新颖性: ⭐⭐⭐⭐ 解耦扩散解码 + 统一语义编码的组合是清晰的新架构主张,「理解作为生成前置任务」的定位与对偶后训练有实际新意,但单看每个部件都能在 DDT / REPA / Show-o2 里找到出处。
  • 实验充分度: ⭐⭐⭐⭐ 理解与生成两侧都有主结果,逐阶段消融、空间对比与三条 scaling 曲线做得扎实;扣分在于生成分辨率偏低、与生成专用模型的数据规模不可比、Native 版理解能力完全缺失。
  • 写作质量: ⭐⭐⭐⭐ 三个层面的动机梳理得很清楚,公式与实现细节基本齐全;扣分在于缓存中多处公式损坏、摘要与正文的 GenEval 数值不一致。
  • 价值: ⭐⭐⭐⭐ 给出了「统一多模态模型该共享什么、该分离什么」的一个可复现答案,三阶段训练配方与对偶后训练回路都可以直接迁移。