DeepGen 1.0: A Lightweight Unified Multimodal Model for Advancing Image Generation and Editing

Paper: arXiv:2602.12205 Code: DeepGenTeam/DeepGen Code reference: main @ 7261969 (2026-03-02) RL code reference: deepgenteam/deepgen_rl main @ c4d5dc2 (2026-02-21)

1. Motivation (研究动机)

现有统一图像生成/编辑 multimodal model 往往依赖很大的参数规模:论文点名的统一模型通常超过 10B,且 LongCat-Image / HunyuanImage 3.0 级别方法使用 1.2B–5B 训练样本。DeepGen 要解决的问题不是单一 text-to-image,而是在 5B 参数预算内同时覆盖 general generation、reasoning generation、text rendering、general editing、reasoning editing,并降低训练与部署成本。 核心瓶颈在于:VLM 的最后层偏高层语义,容易丢掉 DiT 生成所需的细粒度视觉信息;如果只取单层 hidden states,条件信号还会受 layer-specific bias 影响。另一方面,RL 对齐虽然能提升偏好与文字渲染,但只靠 KL 约束会在长训练中出现能力漂移,尤其是复杂 instruction / reasoning generation。 这件事值得做,因为它把“大模型靠规模堆能力”的路线改成“VLM-DiT 结构耦合 + 数据分阶段 + 多奖励 RL”:若成立,5B 级模型就可以在开放权重场景中提供接近甚至超过 14B–80B 模型的生成、编辑和推理型视觉能力。

1.1 具体问题拆解

从 unified multimodal generation 的角度看,DeepGen 关心的不是单一指标 SOTA,而是一个更苛刻的 Pareto 问题:

参数效率:如果模型必须达到 10B+ 才能覆盖 generation/editing/reasoning/text rendering,那么训练、推理、开源复现实验都会被少数机构垄断。 数据效率:LongCat-Image / HunyuanImage 3.0 级别路线使用十亿级样本,DeepGen 论文主张约 50M 样本即可完成三阶段训练,这会把瓶颈从“纯数据规模”转向“结构和数据配比是否正确”。 能力统一:text-to-image、image editing、reasoning generation、reasoning editing、text rendering 的输入输出形式不同,简单混合训练容易让某些能力互相冲突。 细粒度控制:编辑任务不仅要理解 instruction,还要保留 reference image 的身份、布局、局部属性;这要求条件信号同时包含高层语义和低层细节。 偏好对齐稳定性:RL 能提升审美、文字和 instruction following,但 diffusion/RL 结合时 reward 噪声、KL 约束和任务混合权重都会影响训练稳定性。

论文的隐含假设是:轻量模型不是缺少“全部能力”,而是缺少把 VLM 知识稳定转译为 DiT 条件的通道。 如果只扩大 DiT 或只换更强 VLM,模型仍可能出现两类问题: VLM 能回答图像问题,但输出给 DiT 的 hidden state 对生成细节不够友好。 DiT 能生成高质量图像,但在多参考、多约束、世界知识推理上缺少可用的 structured guidance。 RL reward 能指出偏好方向,但如果没有 SFT 分布锚点,就可能把原本学到的 generation/editing 基础能力冲掉。 数据覆盖面再大,如果 architecture 不能把 reference latent、文本语义和 reasoning state 放进同一个可学习条件空间,统一模型仍会退化成多个能力的松散拼接。 因此 DeepGen 的动机可以概括为:在固定 5B 参数预算内,最大化 VLM-DiT 之间的条件带宽,并用阶段化训练避免轻量模型在多任务和 RL 中发生能力漂移。

2. Idea (核心思想)

DeepGen 的核心 insight 是:不要只把 VLM 当作最终语义 encoder,而是把多层 VLM 表征当作一组低/中/高层条件通道,通过 Stacked Channel Bridging (SCB) 深度注入 DiT;同时用 learnable think tokens 让 VLM 在输出给 DiT 前先形成一段隐式 reasoning state。 方法上,它用 Qwen2.5-VL-3B 做理解与推理,用 SD3.5-Medium 2B DiT 做生成,并通过三阶段训练把轻量模型补齐:Stage 1 只对齐 SCB / think tokens,Stage 2 解冻 DiT 并用 VLM LoRA 做 joint SFT,Stage 3 用 MR-GRPO 的多奖励 + auxiliary SFT loss 做偏好对齐。 与 OmniGen / BAGEL / LongCat-Image 等统一生成编辑模型相比,DeepGen 的差异不只是换 backbone:它显式保留多层 VLM channel 信息并把 reference-image VAE latents 与 target noise tokens 放入同一个 DiT self-attention 序列;RL 阶段还对不同 reward 分量独立 group normalize,避免单个 reward 的尺度吞掉其它信号。

2.1 核心思想的三层含义

第一层是 feature routing:DeepGen 不把 VLM 最后一层当成唯一条件,而是把低/中/高层 hidden states 沿 channel 维拼接。 这样做的直觉是,VLM 的中低层更可能保留视觉局部结构、对象属性和空间线索,高层更偏语义与任务意图;DiT 需要这两类信息同时存在。 第二层是 implicit reasoning token:think tokens 不是显式输出给用户看的 chain-of-thought,而是一组 learnable query。 这些 query 被追加到 VLM 输入序列中,经自注意力吸收 text/image context,最后成为 connector 要压缩和转译的条件 token。 因此 think tokens 更像“给 DiT 的 latent planning slots”,而不是自然语言推理文本。 第三层是 stage-wise capability allocation:Stage 1 先把 connector 和 think tokens 对齐到 DiT latent space,Stage 2 再联合训练生成、编辑和推理,Stage 3 才用 RL 做偏好对齐。

这个顺序很关键:如果一开始就联合训练全模型,小模型可能在 VLM-DiT alignment 没稳定前就被多任务梯度牵扯;如果一开始就 RL,则 reward 只能看到终端图像,不能提供足够的结构化学习信号。

2.2 与相邻路线的差异

相比 final-layer connector:DeepGen 保留多层 channel 信息,避免最后层语义抽象损失细节。 相比 average pooling 多层特征:SCB 不是先平均再投影,而是 channel concatenation 后用 MLP + connector 融合,减少不同层信息被提前抹平。 相比 shared-attention deep fusion:SCB 不把 VLM 与 DiT 每层都耦合,参数和优化复杂度更低。 相比只做 SFT 的统一模型:MR-GRPO 把多 reward 偏好引入生成过程,同时用 auxiliary SFT loss 约束能力不漂移。 相比单一任务文本渲染模型:DeepGen 把 text rendering 放入同一个 unified model,因此需要奖励和数据配比同时服务于 general generation/editing。

2.3 读者应抓住的设计取舍

DeepGen 的“轻量”不是简单裁剪大模型,而是把昂贵的全层深融合换成一个更窄的瓶颈:多层 VLM hidden states → SCB connector → DiT prompt embeddings。 这个瓶颈如果太窄,DiT 得不到足够条件;如果太宽,训练成本和小模型稳定性又会恶化。 论文选择 128 think tokens、6 个 selected layers、6-layer connector,本质是在条件带宽、显存、训练稳定性之间取平衡。 从 reproduction 角度看,最需要优先复现的不是所有 benchmark,而是三件事:SCB layer selection 是否生效、SFT 多任务配比是否保留五类能力、RL 的 SFT-Aux 是否确实阻止长期退化。

3. Method (方法)

3.1 Overall framework

Figure 3 解读:DeepGen 是 VLM-DiT 双分支结构。参考图像先走 ViT / Qwen2.5-VL 获取语义 token,同时也经 VAE 得到 DiT latent;目标图像以 noise token 形式进入 DiT。SCB 在 VLM 与 DiT 之间做多层特征融合,右侧冻结/可训练标记对应 Pre-Training、SFT、RL 三个阶段。

Figure 4 解读:训练数据覆盖 text-to-image、image editing、reasoning generation/editing、text rendering 和应用型场景。论文强调只用约 50M 样本完成三阶段训练,而不是依赖十亿级样本规模。

3.1.1 模块流向

DeepGen 的一次 forward 可以按四条信息流理解:

  1. 文本与参考图像语义流:prompt 和 reference images 进入 Qwen2.5-VL,形成 multimodal hidden states。
  2. 参考图像 latent 流:reference images 同时经过 VAE encoder,得到压缩 latent,作为 DiT 的条件 token。
  3. 目标图像噪声流:训练时 target image 经 VAE 得到 latent 后加噪;推理时从 noise latent 开始。
  4. SCB 条件流:多层 VLM hidden states + think token positions 被拼接、投影、connector 融合,最终生成 pooled prompt embeddings 和 sequence prompt embeddings。

这些流在 DiT 里汇合:reference-image latents 与 target noisy latents 拼成一个 transformer input sequence,DiT self-attention 可以同时看条件 token 和待去噪 token。

这种设计比“只给 DiT 一个文本 embedding”更适合 editing,因为 reference image 的像素级结构不会完全压缩成 VLM 文本语义。

3.1.2 三阶段可训练模块

Stage-I Pre-Training 的重点是 alignment:论文与 released config 都显示该阶段冻结 transformer / VLM 主体,只训练 SCB connector 与 think token 相关参数。 这一步的作用是让新接入的条件通道先学会把 VLM 表征映射到 DiT 可消费的条件空间。 Stage-II Joint SFT 的重点是 omni-capability:released config 将 freeze_transformer=False,并给 VLM 使用 LoRA(rank 64, alpha 128),让 DiT、connector 和 VLM adapter 在多任务数据上共同调整。 这一步承担 instruction following、编辑保真、reasoning generation、text rendering 的主要能力塑形。 Stage-III RL 的重点是 preference and stability:MR-GRPO 在采样图像上计算 reward,并通过 KL 与 SFT-Aux 约束更新幅度。 这一步不是重新学习基础生成,而是在 SFT 分布附近优化人类偏好、OCR/文字可读性和多 benchmark 相关 reward。

直觉上,DiT 需要的是“可生成”的条件,而 VLM 最终层更像“可回答”的语义摘要。SCB 把 VLM 多层 hidden states 作为 channel 拼接,等价于把细节、布局、语义和推理状态一起交给 DiT;think tokens 则提供一组固定可学习 query,在 VLM 自注意力中吸收上下文,最后变成 DiT 的 prompt embeddings。

3.2 Stacked Channel Bridging (SCB)

论文写法:给定 VLM hidden states ,从六个分布在低/中/高层的 layer 取 ,沿 channel 维拼接后送入 connector: released code 的 SCB 路径在 qwen2_5_vl_sd3_hf_dynamic_fusion.py 中实现:output_hidden_states=True 后用 selected_layers = list(range(num_layers - 1, 0, -6)) 取多层 hidden states,并用 torch.cat(selected_hiddens, dim=-1) 做 channel concatenation;projector_1 因此从 llm.config.hidden_size * 6 投到 connector hidden size。

论文公式与 released code 实现差异:论文描述为“six uniformly distributed VLM layers”;代码按 num_layers - 1, num_layers - 7, ... 的步长规则选择层,并未在该行显式写死 6 个 layer,但 projector_1 的输入维度固定为 hidden_size*6,实际要求选出 6 组 hidden states。

3.2.1 SCB 的组件解释

SCB 可以拆成四步:

  1. Think-token injectionmeta_queries 扩展成 batch 维后追加到 VLM embedding sequence,让 learnable query 和文本/图像 token 一起经过 VLM。
  2. Multi-layer extraction:VLM forward 设置 output_hidden_states=True,从多个层级取 hidden states,而不是只取最后层。
  3. Channel concatenationtorch.cat(selected_hiddens, dim=-1) 把不同层的信息放在 channel 维,保留每层差异。
  4. Connector projectionprojector_1 → ConnectorEncoder → projector_2/projector_3 分别产生 pooled prompt 和 sequence prompt。

这里最容易误读的是“stacked”:它不是在 token length 维把层堆起来,而是在 feature/channel 维拼接。 这样 DiT 看到的 token 数量不因选层数线性膨胀,但每个 token 的 feature width 包含多个 VLM 层级的信息。 如果移除 SCB,模型仍有 VLM 和 DiT,但条件通路会退化为较浅的语义转接。

Table 6 中 w/o SCB 对 GEdit-EN、RISE 等编辑/推理编辑指标有明显伤害,说明该模块不只是“让生成更好看”,而是帮助 reference-conditioned reasoning 与 editing。

如果移除 think tokens,模型仍能拿到 VLM hidden states,但缺少固定的 learnable slots 去聚合任务相关上下文。

Table 6 中 w/o Think Tokens 对 WISE/RISE 下降更明显,说明它们对 reasoning-heavy 条件压缩更重要。

def scb_forward(llm, connector, projector_1, projector_2, projector_3,
                input_embeds, attention_mask, position_ids, meta_queries):
    # released path: qwen2_5_vl_sd3_hf_dynamic_fusion.py
    output = llm(
        inputs_embeds=input_embeds,
        attention_mask=attention_mask,
        position_ids=position_ids,
        output_hidden_states=True,
        return_dict=True,
    )
    hidden_states = output.hidden_states
    num_layers = len(hidden_states) - 1
    selected_layers = list(range(num_layers - 1, 0, -6))  # expected six layers
    selected_hiddens = [hidden_states[i] for i in selected_layers]
    merged_hidden = torch.cat(selected_hiddens, dim=-1)
 
    x = projector_1(merged_hidden)
    x = connector(x)
    pooled_prompt_embeds = projector_2(x.mean(dim=1))
    prompt_embeds = projector_3(x)
    return pooled_prompt_embeds, prompt_embeds

3.3 Unified generation/editing diffusion loss

Text-to-image 训练中,target image 先经 VAE 得到 latent ,随机采样 flow-matching timestep / sigma,构造 noisy latent: 代码中的 diff_loss() 目标是 velocity / flow target ,loss 为加权 MSE: image editing 与 text-to-image 共用 DiT loss,但 editing 会把 reference images 编码为两类条件:一类是 VLM semantic image embeds,用于 Qwen2.5-VL prompt;另一类是 VAE latents,作为 cond_hidden_states 传给 transformer。

3.3.1 generation 与 editing 的统一方式

DeepGen 的统一不是把 editing prompt 改写成 text-to-image prompt,而是在 diffusion input 里显式区分 reference token 和 target token。 对于 generation,条件主要来自文本和 think-token 聚合后的 VLM 表征。 对于 editing,reference image 同时走两条路: 语义路:reference image 经 VLM/ViT 路径进入 multimodal prompt,使模型理解“要改什么、保留什么”。 生成路:reference image 经 VAE 得到 latent,作为 DiT 条件序列的一部分,使模型保留结构与局部视觉信息。 这解释了为什么 Figure 3 中会同时出现 ViT/VLM 分支和 VAE/DiT 分支:前者服务理解,后者服务生成可控性。 训练 loss 仍是 flow-matching / diffusion loss,因此 text-to-image 与 image-to-image 可以共享大部分 denoising machinery。

不同任务的差别主要体现在 prompt construction、reference latent 是否存在、以及 batch 中调用 text2image_loss() 还是 image2image_loss()。 这种统一方式的好处是模型不必维护两个完全独立的生成器;坏处是训练数据配比很敏感,一类任务过强会挤压另一类任务。

def deepgen_sft_loss(model, batch):
    # released path: qwen2_5_vl_sd3_hf_dynamic_fusion.py
    if batch["type"] == "text2image":
        target_latents = [model.pixels_to_latents(img[None])[0]
                          for img in batch["pixel_values"]]
        text_inputs = model.prepare_text2image_prompts(batch["texts"])
        query = model.meta_queries[None].expand(len(target_latents), model.num_queries, -1)
        inputs = model.prepare_forward_input(query_embeds=query, **text_inputs)
        pooled, seq = scb_forward_from_inputs(model, inputs)
        return model.diff_loss(target_latents, pooled, seq)
 
    if batch["type"] == "image2image":
        ref_latents = [[model.pixels_to_latents(ref[None])[0] for ref in refs]
                       for refs in batch["pixel_values_src"]]
        image_embeds, image_grid = model.get_semantic_features_dynamic(flatten_refs(batch))
        target_latents = [model.pixels_to_latents(img[None])[0]
                          for img in batch["pixel_values"]]
        text_inputs = model.prepare_image2image_prompts(
            batch["texts"], num_refs=[len(r) for r in batch["pixel_values_src"]],
            ref_lens=[len(x) for x in image_embeds],
        )
        query = model.meta_queries[None].expand(len(target_latents), model.num_queries, -1)
        inputs = model.prepare_forward_input(
            query_embeds=query,
            image_embeds=torch.cat(image_embeds),
            image_grid_thw=image_grid,
            **text_inputs,
        )
        pooled, seq = scb_forward_from_inputs(model, inputs)
        return model.diff_loss(target_latents, pooled, seq, cond_intput=ref_latents)

3.4 MR-GRPO with auxiliary SFT loss

MR-GRPO 对每个 prompt 采样 张图,分别计算 preference / CLIP similarity / OCR 等 reward。对第 个 reward,先在同组内归一化: 再加权合并并做 batch-wise normalization 得到 。GRPO objective 使用 per-step importance ratio: 总 loss 加上 velocity-space KL 和 auxiliary SFT: released DeepGen-RL 中 atrain_adv_type="gdpo" 对每个 reward function 分别 group normalize;compute_loss() 先 rollout、算 rewards、算 advantages,再按 micro-batch/timestep 累积梯度,最后每步额外 backward 一次 SFT-Aux loss。

3.4.1 MR-GRPO 为什么需要多 reward 拆开归一化

多 reward 的难点不是把分数相加,而是不同 reward 的尺度、方差和稀疏性不同。 例如 OCR/text rendering reward 可能在某些 prompt 上波动很大,preference reward 可能更平滑,image similarity reward 又更依赖 reference。 如果直接把所有 reward 加权求和再统一 group normalize,高方差 reward 会主导 advantage,低方差信号容易被淹没。 MR-GRPO 的做法是先对每个 reward function 单独按组归一化,再合并,这样每个 reward 至少在自己组内有可比较的相对排序。 released code 中 _compute_rewards() 保留 rewards_per_func_compute_advantages() 支持 gdpo 路径,正对应论文的 reward-wise normalization 思路。

3.4.2 SFT-Aux 与 KL 的角色不同

Velocity-space KL 是“不要离 reference policy 太远”的约束,防止 actor 更新过猛。

Auxiliary SFT loss 是“继续向高质量监督样本学习”的正向梯度,防止模型只围绕 reward hack 调整。

Figure 6a/6b 和 Table 7 的现象说明二者互补:去掉 SFT-Aux 后,整体曲线在约 300 steps 后退化;去掉 KL 后,UniGenBench overall 与 DPGBench 都低于 full RL。

因此论文的 RL 设计不是单纯 PPO/GRPO 套壳,而是针对 diffusion generation 的能力漂移问题增加了监督锚点。

released code 也体现这一点:compute_loss() 先计算 GRPO/GRPO-Guard policy loss 与 KL,再在满足 sftaux_every_n_steps 时额外计算 _compute_sftaux_loss() 并 backward。

3.4.3 Noise-preserving sampling 的作用

论文 appendix 说明 deterministic flow-matching ODE 不适合 RL exploration,因此需要随机采样轨迹。 但普通 Flow-SDE 如果额外注入过多噪声,会让图像质量下降,reward 变得不可靠。 DeepGen 采用 noise-preserving stochastic sampling,使每个 timestep 的噪声水平与 scheduler 预期匹配。 这一步的意义是让 RL 看到的 reward 反映模型策略差异,而不是被采样噪声污染。 从实现视角看,轨迹里需要保存 old log-prob、prev latents、timesteps 等信息,之后 actor update 才能构造 importance ratio 和 clipped policy loss。

def mr_grpo_train_step(trainer, model, prompts):
    images, old_logp, prev_latents, next_latents, timesteps = [], [], [], [], []
    for _ in range(trainer.rollout_accumulation_steps):
        traj = trainer._generate_images_with_trajectory(model, prompts, cfg_prompts=[""] * len(prompts))
        images += traj.images
        old_logp.append(traj.log_probs)
        prev_latents.append(traj.prev_latents)
        next_latents.append(traj.pred_latents)
        timesteps.append(traj.timesteps)
 
    rewards, rewards_per_func = trainer._compute_rewards(prompts, images)
    adv = trainer._compute_advantages(rewards, rewards_per_func, prompts)
    adv = torch.clamp(adv, -trainer.adv_clip_max, trainer.adv_clip_max)
 
    for step_idx in sample_training_timesteps(timesteps, fraction=trainer.timestep_fraction):
        for mb in micro_batches(prev_latents, next_latents, timesteps, old_logp, adv):
            v_pred = trainer._compute_diffusion_loss_single_batch(model, mb.x_t, mb.t, mb.cond)
            _, logp, mean_policy, std_policy = sde_step_with_logprob(
                trainer.scheduler, v_pred, mb.t, mb.x_t, mb.x_next,
                eta=trainer.sde_eta, sampler_type=trainer.atrain_sde_sampler,
            )
            ratio = torch.exp(logp - mb.old_logp)
            unclipped = -mb.adv * ratio
            clipped = -mb.adv * torch.clamp(ratio, 1 - trainer.clip_range, 1 + trainer.clip_range)
            policy_loss = torch.maximum(unclipped, clipped).mean()
            kl_loss = velocity_kl(v_pred, trainer.reference_prediction(mb))
            trainer.accelerator.backward(policy_loss + trainer.beta * kl_loss)
 
    if trainer.sftaux_coef > 0 and trainer.global_step % trainer.sftaux_every_n_steps == 0:
        sft_loss = trainer._compute_sftaux_loss(model, trainer._next_sftaux_batch())
        trainer.accelerator.backward(trainer.sftaux_coef * sft_loss)

3.5 Code-to-paper mapping

Code reference: main @ 7261969 (2026-03-02) — pseudocode and mapping based on this commit. RL-specific rows additionally use deepgen_rl main @ c4d5dc2 (2026-02-21).

Paper ConceptSource FileKey Class/Function
SCB model config, 128 think tokens, Qwen2.5-VL + SD3.5-Mediumconfigs/models/deepgen_scb.pymodel.num_queries=128, connector.num_hidden_layers=6, freeze_lmm=True
SCB multi-layer channel concatenationsrc/models/sd3_kontext/qwen2_5_vl_sd3_hf_dynamic_fusion.pyQwen2p5VLStableDiffusion3HF, selected_layers, torch.cat(..., dim=-1)
Connector transformersrc/models/connector/modeling_connector.pyConnectorEncoder, ConnectorEncoderLayer, ConnectorAttention
Unified T2I / I2I SFT losssrc/models/sd3_kontext/qwen2_5_vl_sd3_hf_dynamic_fusion.pytext2image_loss, image2image_loss, diff_loss
Pre-training configconfigs/pretrain/deepgen_joint_pretrain_scb.pymax_iters=200000, lr=1e-4, freeze_transformer=True, lora_modules=None
Joint SFT configconfigs/finetune/deepgen_joint_sft_scb.pymax_iters=400000, lr=5e-5, freeze_transformer=False, lora_rank=64
RL entrypointdeepgen_rl/grpo_deepgen.pydefault rollout_n=8, learning_rate=2e-6, beta=5e-7, clip_range=1e-4, sftaux_coef=0.0001
MR-GRPO trainerdeepgen_rl/trainer/grpo_deepgen_trainer.py_compute_advantages, _compute_rewards, compute_loss, sde_step_with_logprob
Reward mixture configassets/rl_datasets/deepgen/deepgen_train.yamltext rendering rewards 0.2/0.1/0.7, general T2I rewards 0.7/0.3

代码核对时应注意三个边界:

DeepGenTeam/DeepGen 主仓库包含 DeepGen-RL 子目录,但独立 deepgenteam/deepgen_rl 仓库的 HEAD 为 c4d5dc2,本笔记的 RL 映射按独立仓库核对。 主仓库 README 声称 training code 覆盖 Pre-training、SFT、RL 与 evaluation;实际方法相关的 SCB/SFT 路径在主仓库,GRPO trainer 和 reward service 在独立 RL 仓库。 主仓库当前 HEAD 7261969 只更新 README,核心 method files 的路径仍与本笔记映射一致。

4. Experimental Setup (实验设置)

Datasets. Pre-Training 使用 general generation 35M(text-to-image-2M、LAION-Aesthetic-6M、Megalith-10M、RedCaps-5M、CC-12M)和 general editing 6.6M(NHR-Edit、GPT-Image-Edit、ShareGPT-4o-Image-Edit、OpenGPT4o-Image-Edit、Nano-banana-consist、Pico-Banana、X2I2、Uniworld-Edit、in-house editing)。

SFT 继续使用 general generation 11M、general editing 6.6M,并加入 UniReason-T2I 150K、UniReason-Edit 100K、text rendering / poster / Chinese poem 560K。RL prompts 分两类:text rendering 采样权重 3.0×,general T2I 采样权重 1.0×;auxiliary SFT data 同样提高 text rendering 权重。

Baselines. General generation/editing 比较 Nano Banana、GPT-Image-1、Seedream 4.0、FLUX.1 Kontext Pro、Janus-Pro、FLUX.1 Dev、OmniGen2、BAGEL、Hunyuan-Image 3.0、Qwen-Image、LongCat-Image、Z-Image-Turbo 等;reasoning generation/editing 还包含 STAR、UniWorld-V1、Qwen-Image edit、Lumina-DiMOO;text rendering 比较 FLUX.1 dev、Z-Image-Turbo、GLM-Image 等。

Metrics. GenEval 衡量 compositional semantic alignment;DPG-Bench 衡量 long-prompt instruction following;UniGenBench 给 general generation 综合分和 text 子分;WISE / T2I-CoREBench 衡量 world-knowledge 与哲学分类 reasoning generation;ImgEdit / GEdit-EN 衡量 editing consistency 和 output quality;RISE / UniREditBench 衡量 reasoning editing;

CVTG-2K 用 Word Accuracy、NED、CLIPScore 衡量文字渲染。Training config. Paper Table 9/10 给出的论文级训练数字:Stage-I Pre-Training 200000 iters、LR 1e-4、warmup ratio 0.01、global batch size 512、只训练 SCB connector;

Stage-II SFT 400000 iters、LR 5e-5、warmup ratio 0.01、global batch size 768、训练 SCB connector + DiT + VLM LoRA(rank 64, alpha 128, dropout 0.05)。Released configs 可直接核到:configs/pretrain/deepgen_joint_pretrain_scb.py 设置 max_iters=200000lr=1e-4warmup_ratio=0.01accumulative_counts=4

configs/finetune/deepgen_joint_sft_scb.py 设置 max_iters=400000lr=5e-5warmup_ratio=0.01accumulative_counts=3;对应 dataloader 文件 configs/datasets/deepgen_512_fix_pixels/{joint_pretrain.py,joint_sft_zh.py} 暴露的是 per-dataloader batch_sizes=[4,4] / batch_size=4

因此 512/768 是 paper-derived global batch size,released code 未提供可复现该 global batch 的 GPU count / distributed launcher 配置。

RL 使用 resolution 512×512、denoising steps 50、group size G=8、timestep fraction 0.6、LR 2e-6、total steps 1500、KL coefficient 5e-7、clip range 1e-4、SFT auxiliary coefficient 1e-4、global batch size 256、DeepSpeed ZeRO-2、BF16。论文公式与 released code 实现差异:paper Table 10 明确 RL total training steps 为 1,500

deepgen_rl/scripts/train.sh 当前只显式传 --num_train_epochs 10,没有显式传 --max_steps 1500,因此复现实验需要额外确认 dataset/epoch 换算或手动设置 max steps。

4.1 数据与训练设置解读

Pre-Training 的 35M generation data 主要提供广覆盖的 image-text alignment,6.6M editing data 则让 connector 在 reference-conditioned denoising 中见到足够多的 triplets。 SFT 阶段加入 reasoning generation/editing 和 text rendering,说明论文把“推理型视觉生成”视为后训练能力,而不是 pre-training 阶段自然涌现。 Text rendering 数据只有 560K 量级,但 RL prompts 中对 text rendering 采样权重设为 3.0×,说明作者认为文字能力更依赖后期定向优化。 训练分辨率为 512,SFT 支持 arbitrary resolution / dynamic resizing,这让模型在固定训练 budget 下先学统一能力,再逐步增强不同长宽比场景。 64×H200 的训练配置说明“轻量”主要指参数量和样本量相对更小,不代表单机即可完整复现。 对复现实验而言,最小可行路径应先复现 SCB + SFT 的 core pipeline,再决定是否投入完整 RL reward service。

4.2 Benchmark 覆盖面

GenEval 和 DPGBench 更偏 general generation / instruction following。 ImgEdit 与 GEdit-EN 更偏一般编辑质量、局部一致性和指令遵循。 WISE、T2I-CoREBench、RISE、UniREditBench 则把世界知识、常识、空间/文化/时间推理引入生成或编辑评价。 CVTG-2K 用于文字渲染,Word Accuracy 与 NED 更直接衡量可读性,CLIPScore 只能作为语义一致性辅助指标。 这种 benchmark 组合的意义是:DeepGen 不能只在美学或单图生成上强,而要证明同一模型在 editing、reasoning、text rendering 上没有明显短板。

5. Experimental Results (实验结果)

Figure 2 解读:气泡图把模型参数量和 generation/editing 指标放在一起,DeepGen 的位置体现了论文主张:不是参数最大的点,但在多项 generation/editing benchmark 上接近或超过大模型。

5.0 结果总览解读

论文最强的证据链不是某一个 benchmark,而是“参数小 + 样本少 + 多能力覆盖”的组合。 General instruction following 中,DeepGen 在 DPG-Bench 达到 87.90,超过 HunyuanImage 3.0 的 86.10。 Reasoning generation 中,DeepGen 在 WISE 达到 0.73,高于 80B HunyuanImage 3.0 的 0.57。 Reasoning editing 中,DeepGen 在 UniREditBench 达到 77.5,超过 27B Qwen-Image-Edit 的 56.5。 这三个数字分别对应 general generation、reasoning generation、reasoning editing,能支撑论文“统一而非单点优化”的主张。 但结果也显示 RL 并非所有指标都单调提升:部分 editing/reasoning 指标在 SFT 与 RL 间有 trade-off,因此 Table 7 的稳定性设计比单纯追求 reward 更重要。

5.1 Main benchmark numbers

ModelParamsGenEval↑DPGBench↑UniGenBench↑ImgEdit↑GEdit-EN↑
DeepGen 1.0 (SFT)3B + 2B0.8687.0574.184.097.12
DeepGen 1.0 (RL)3B + 2B0.8787.9075.744.147.17

Reasoning generation: WISE overall 从 SFT 0.72 到 RL 0.73;T2I-CoREBench overall 从 45.746.5。Reasoning editing: RISE overall SFT 13.3、RL 10.8;UniREditBench overall SFT 77.5、RL 75.7。Text rendering: CVTG-2K 中 DeepGen RL Word Accuracy 0.7533、NED 0.8936、CLIPScore 0.8278,相比 SFT 的 0.6605/0.8426/0.8227 主要提升在可读文字准确度。

Figure 5 解读:RL 训练 1,500 steps 内 UniGenBench overall 约从 0.747 升到 0.756,text 子分约从 0.25 升到 0.34。这支持论文关于 MR-GRPO 同时提升 general quality 与 text rendering 的结论。

5.2 Ablations

SettingGenEval↑DPGBench↑GEdit-EN↑WISE↑RISE↑
DeepGen 1.0 Settings0.8687.057.120.7213.3
w/o SCB0.8685.556.750.7012.6
w/o Think Tokens0.8786.357.020.6811.7
w/o Activate VLM0.8586.746.930.7112.9

SCB 的主要收益体现在长指令/编辑与 reasoning:移除 SCB 后 DPGBench 87.05 → 85.55、GEdit-EN 7.12 → 6.75、RISE 13.3 → 12.6;移除 think tokens 对 WISE/RISE 伤害更明显,说明 learnable query 对推理型条件压缩有作用。

Figure 6a 解读:overall curve 显示 auxiliary SFT loss 对 RL 稳定性关键;没有 SFT loss 时约 300 steps 后开始退化,低于起点。

Figure 6b 解读:text generation 子分中,所有 RL 变体都能提升文字渲染,但移除 SFT loss 后提升更慢且更不稳定,说明 KL 是过程约束,SFT loss 是结果分布锚点。

Table 7 的 RL ablation 数字:full RL 为 GenEval 0.87、DPGBench 87.75、GEdit-EN 7.05、UniGenBench Text 35.06、Overall 75.69;w/o Auxiliary SFT Loss 为 0.87 / 87.40 / 6.99 / 33.33 / 74.33;w/o Velocity KL 为 0.87 / 87.32 / 7.02 / 32.47 / 75.07;w/o Reward-wise Norm 为 0.86 / 87.73 / 7.02 / 32.18 / 75.27

5.3 Limitations / caveats

论文没有集中列出 limitations。实现侧可见的风险是:DeepGen 主 repo 的 pretrain/SFT configs 使用占位 model/data/checkpoint 路径;DeepGen-RL script 也要求本地 reward service 与 checkpoint 路径,且 scripts/train.sh 没显式固定 paper Table 10 的 1500 max steps。因此阅读结论可信,但严格复现实验仍需要作者的实际数据路径、checkpoint 和 service 配置。

整体结论:DeepGen 证明 5B VLM-DiT 只要用多层 VLM-to-DiT alignment、分阶段多任务数据和多奖励 RL,就能在 generation/editing/reasoning/text rendering 上达到接近或超过大得多模型的综合能力。