Calibri: Enhancing Diffusion Transformers via Parameter-Efficient Calibration

Paper: arXiv:2603.24800 Code: v-gen-ai/Calibri Code reference: main @ dee7bda6 (2026-04-13)

1. Motivation (研究动机)

Problem framing

现有 DiT / MM-DiT 文生图模型(FLUX.1-dev、SD-3.5M、Qwen-Image)质量很高,但默认推理把所有 transformer block 的残差贡献固定为训练后权重,没有显式校准每层在不同 denoising 轨迹中的贡献。论文的动机实验表明:把某些 DiT block 的输出绕过(等价于将公式中的 gate/残差贡献乘以 0)并不总是降低 ImageReward,个别 block 被削弱后反而能提升生成质量;进一步把 block 输出乘以 时,每个 block 往往存在不同的更优 scaling。

Figure 1 解读:Calibri 的核心不是重新训练整套 DiT,而是在原模型的 DiT block / gate 外部放少量可搜索的 scale。这样做把“模型对 reward 的偏好对齐”从百万/千万级参数微调,变成约 个校准系数的黑盒搜索问题。

这篇论文要解决的具体问题是:在不更新原始 DiT 权重的前提下,找到一组轻量 calibration coefficients,使 reward model 评价的生成质量上升,同时把推理 NFE 从原模型常用的 30/80/100 降到 15/30 左右。这个问题值得研究,因为它把偏好对齐和推理加速合并成一个离线、小参数搜索过程;如果成立,模型发布方可以只发布少量 JSON scale,而不是完整 LoRA/finetuned checkpoint。

更细的动机拆解

DiT / MM-DiT 的主干由重复 transformer block 组成,但“重复结构”不等于“重复功能”:有些 block 更像全局布局控制,有些更像纹理或 prompt 细节修正。 传统推理默认每个 block 的 residual branch 强度都固定为 1,这隐含假设是训练出来的层贡献在所有 prompt、所有 timestep、所有 reward 目标下都已最优。 论文的 ablation 结果反驳了这个假设:对部分层做 bypass 或缩放时,ImageReward 并不会单调下降,说明预训练权重虽然强,但推理轨迹仍有可调自由度。 这个自由度尤其适合 parameter-efficient 方法,因为它不需要学习新的 feature extractor,而只是改变已有 feature / residual 在 denoising 中的混合比例。

为什么这个问题在 2026 年的 DiT 生态里重要

FLUX.1-dev、SD-3.5M、Qwen-Image 这类模型已足够大,完整 finetune 或 RL alignment 的训练成本、显存成本和发布成本都很高。 Reward-driven diffusion finetuning 需要在生成过程中插入 reward 估计,往往要处理 noisy latent、长采样链和高方差梯度。 许多开源用户真正需要的是“让已有 checkpoint 在偏好指标上更好,并且采样更快”,而不是重新训练一个新模型。 如果 calibration coefficient 可以稳定迁移到不同 prompts,那么它的部署形式就是一个小 JSON,而不是多 GB checkpoint。

这篇论文与已有加速/对齐工作的边界

它不是传统 pruning:Calibri 不删除层,也不改变模型拓扑;所有 block 仍在,但输出贡献被可学习标量调节。 它不是 LoRA / DreamBooth 式适配:Calibri 不引入新的低秩权重,也不改 attention/MLP 的权重矩阵。 它不是单纯 scheduler acceleration:NFE 降低来自 calibrated model 在低步数区域的 reward 曲线改善,而不是只更换 sampler。 它不是 prompt engineering:同一 prompt set、同一 backbone 下,只通过内部 scale 改变生成轨迹。

动机实验对后续方法的约束

搜索空间必须足够小,否则黑盒 reward optimization 会被候选生成成本吞掉。 scale 必须插在 residual / gate 这种“低维但高影响”的位置,而不是对每个权重做逐元素搜索。 objective 必须直接面向最终图像 reward,因为论文关注的是人类偏好/视觉质量,而不是重建误差或训练 loss。 方法必须支持不同 DiT 变体:FLUX 的 double/single blocks、SD3 的 MM-DiT、Qwen-Image 的 true CFG/ensemble 都不能只靠同一个硬编码层名。

2. Idea (核心思想)

Core mechanism

Calibri 的核心洞察是:DiT block 的输出贡献不是“训练后就不可动”的常数,而更像推理时可以调节的音量旋钮。只要对 attention、MLP、MM-DiT text/visual gates 或整个 block 的输出加标量系数,就能改变 denoising trajectory 的质量;由于可调维度只有几十到几百,直接用 reward model + CMA-ES 做黑盒优化比通过 diffusion/RL 反传更简单。

Figure 3 解读:上半部分展示 block ablation 时不同层对 ImageReward 的影响并不均匀;下半部分展示同一层在不同 scaling 下的 reward 曲线。它支撑了 Calibri 的前提:不是所有层都应该按默认残差强度参与推理,逐层 scale 有实际可优化空间。

和 Flow-GRPO / DDPO 这类 reward-driven finetuning 不同,Calibri 不把 diffusion process 改写成可训练策略,也不更新 LoRA 或 backbone 权重;它只搜索推理时插入的 scale vector 。和 Skip Layer Guidance / Autoguidance 相比,Calibri 不是手工选层或固定 guidance 规则,而是把 block/layer/gate scale 与 ensemble 权重一起作为 reward objective 的优化变量。

核心新意可以压缩成三句话

把 DiT alignment 从“更新模型参数”改成“校准模型内部贡献系数”。 把 reward optimization 从梯度反传问题改成低维 CMA-ES 黑盒搜索问题。 把质量提升和 NFE 降低绑定在同一个 coefficient set 上,让 calibrated model 在更少采样步下达到更高 reward。

直觉解释:为什么调 scale 会有效

Denoising trajectory 是许多 residual updates 的累积结果,单层输出的轻微放大/缩小会沿后续 timestep 继续传播。 如果某些 block 在预训练目标下过强,但在 reward model 偏好的图像分布上过度修正,就会出现“降低该层贡献反而更好”的现象。 如果某些 block 对 prompt alignment 或局部细节更关键,放大它们可以在不改变语义 backbone 的情况下提高最终图像质量。 因为 scale 是乘在已有表示上,它更像后验校准,而不是学习新能力;这解释了为什么几十到几百个参数也能产生可见影响。

Calibri 的设计选择

单模型 Calibri:为一个 DiT wrapper 搜索内部 scale,并可附带一个输出级模型权重 。 Calibri Ensemble:搜索多套内部 scale,同时搜索多路输出混合权重,用来模拟更灵活的 guidance / CFG 组合。 Reward 目标可替换:论文和代码支持 HPSv3、PickScore、Q-Align、ImageReward,不把方法绑定到单个 reward。 Granularity 可替换:block/layer/gate 三档允许在搜索维度、收敛速度和指标稳健性之间做 trade-off。

和同类思路的关键差异

Skip Layer Guidance 依赖人工指定跳层策略;Calibri 用 reward 自动选择连续 scale。 Autoguidance 借助弱模型或弱分支产生 guidance;Calibri 主要校准同一强模型内部 block/gate。 Flow-GRPO 优化的是可训练 checkpoint;Calibri 优化的是推理 wrapper 的 coefficient vector。 传统 ensemble 通常混合完整模型输出;Calibri 的 ensemble 还允许每个成员有不同内部 scale,因此更像“多条 calibrated denoising 路径”。

读这篇论文时应注意的语义

“Parameter-efficient” 在这里不是指训练一个小 adapter,而是指最终可调参数数量小。 “Calibration” 不是概率校准,也不是 classifier confidence calibration,而是残差/门控贡献校准。 “Black-box” 指 reward 对 coefficient 的梯度不用显式计算;模型生成和 reward evaluation 仍然是白盒/可调用流程。 “Improves NFE” 不表示每个 prompt 都能更快,而是平均指标曲线在较低 inference steps 达到更好位置。

3. Method (方法)

3.1 DiT / MM-DiT 被校准的位置

标准 DiT block 的两个残差分支可写为: MM-DiT 则分别对 visual/text tokens 使用 ,attention 层负责跨模态通信。Calibri 的 scale 实际作用在这些 residual/gate 输出上:block scaling 用一个系数统一调节同一 block 内 attention+MLP;layer scaling 分别调 attention 与 MLP;gate scaling 进一步区分 MM-DiT 中 visual/text 或 context/main gates。

Figure 2 解读:左图是标准 DiT block,右图是 MM-DiT block。Calibri 关注的不是重写 attention/MLP 本身,而是在这些模块的 gated residual output 上乘可搜索系数;这解释了为什么参数数可以保持在 57/76/114 这种量级。

3.2 优化目标与搜索空间

论文把 calibration 写成: 其中 是对当前 calibrated model 生成图像的 reward score。对 DiT/flow model ,搜索向量包含输出级 ensemble 权重 与内部层 scale ,calibrated output 记作 。Calibri Ensemble 把多个 calibrated model 同时组合: 并优化 的整体 reward。直觉上,单模型 Calibri 是“找一套更好的层音量”,ensemble Calibri 则是“找多套层音量并学习怎么混合它们”。当 且处在 CFG setting 时,它可以看作对 conditional/unconditional 或多路模型输出的可学习 generalization。

Figure 4 解读:CMA-ES 每轮从高斯分布 采样候选 scale vector;每个候选都会生成一批图像,用 HPSv3 / PickScore / Q-Align / ImageReward 等 reward 打分;rank 0 聚合 fitness 后更新 CMA-ES 分布。这里没有通过 reward model 对 latent 或 DiT 反传梯度。

3.3 参数化细节与优化直觉

Calibri 的关键是把“该调哪里”限制在少数有语义影响的位置。论文给出三种 granularity: Block scaling:同一个 transformer block 内 attention 和 MLP 的输出共享一个 scale,适合最快收敛和最低搜索维度。Layer scaling:attention 与 MLP 分别有 scale,能区分“语义混合”和“非线性特征变换”两类 residual contribution。

Gate scaling:在 MM-DiT / FLUX 这类含 text/image 分支或 gate 的结构中,分别校准 visual/text 或 main/context gate,更适合 multimodal interaction。搜索向量 可以理解为四类量的拼接: internal residual scales:控制 block/layer/gate 在 denoising 中的输出强度。model mixing weights:控制 ensemble 中每个 calibrated model 的输出权重。

CFG-related weights:在 Qwen-Image true CFG wrapper 中,条件/无条件分支可被视作两路可混合模型。experiment-specific target reward:同一个 wrapper 可以用 HPSv3、PickScore 或其他 reward 训练出不同 coefficient。

CMA-ES 为什么适合这个任务。

维度低:论文报告的内部 scale 约为 57/76/114,Qwen-Image gate case 约数百维,仍适合进化策略。 Reward 不可微或不方便微分:HPSv3、Q-Align、ImageReward 的打分链路不需要对 DiT latent 反传。 候选可以并行:每个 candidate coefficient 都是独立生成图像、独立打分,适合多 GPU / distributed evaluation。 排名比绝对分数更稳定:CMA-ES 主要依赖候选之间的 fitness ordering,对 reward scale 的线性变换不太敏感。

算法流程(论文版)。

  1. 初始化 为默认 coefficient(通常接近原模型 scale=1,ensemble 第一路权重为 1)。
  2. 设定初始 与协方差
  3. 每轮从 采样一批 candidate coefficient。
  4. 对每个 candidate,把 coefficient 写入 DiT wrapper。
  5. 在 bucket prompts 上生成图像。
  6. 用 reward model 计算每个 candidate 的平均 fitness。
  7. 用 candidate 排名更新
  8. 周期性在 validation prompts 上评估并保存最优 coefficient。

方法的直觉段落。

Calibri 有效的原因不是“scale 参数本身有表达能力”,而是 DiT 已经拥有强生成能力;scale 只是把既有能力在 denoising 轨迹中的调用顺序和强度重新配平。Reward model 不需要教模型画新物体,只需要判断当前 coefficient 是否让构图、细节、审美和文本对齐更接近偏好分布。因为每个 coefficient 的影响会穿过多步 denoising 被放大,低维 coefficient 也可能改变最终图像质量;这解释了为什么 Calibri 看起来像非常小的参数更新,却能在 HPSv3、IR、Q-Align 上同时移动。

实现上需要避免的误读。

论文表格统计的是 internal calibration parameters;released code 的 flattened vector 还会拼接 models_scales。 因此单模型 wrapper 的真实 CMA-ES 向量通常比表格多一个 ensemble/output weight。 这些 output weights 不改变 transformer 内部结构,但会影响 final sampler 输出。 当 num_models=2 时,搜索成本与向量维度都会上升,尤其 Qwen-Image CFG wrapper 会显著扩大 coefficient 数。

3.4 Released code 伪代码(基于实际实现)

Code reference: main @ dee7bda6 (2026-04-13) — pseudocode and mapping based on this commit

Pipeline 选择与训练入口(scripts/train.py, src/models/__init__.py):

def train_calibri(cfg):
    accelerator = Accelerator()
    set_seed(cfg.experiment.seed)
 
    pipe_cls = get_pipeline_by_name(cfg.model.model_name)
    pipeline = pipe_cls(
        device=accelerator.device,
        dtype=torch.bfloat16 if cfg.model.dtype == "bf16" else torch.float16,
        model_name=cfg.model.model_name,
        num_models=cfg.scaleguidance.num_models,
    )
 
    reward_fn = multi_score(cfg.device, cfg.reward_fn)
    eval_reward_fn = multi_score(cfg.device, cfg.reward_fn_eval)
    train_loader = make_loader(cfg.data.train_dataset, cfg.optimize.bucket_size, infinite=True)
    val_loader = make_loader(cfg.data.val_dataset, cfg.data.batch_size_val, infinite=False)
 
    trainer = CMAESTrainer(cfg, pipeline, reward_fn, eval_reward_fn, train_loader, val_loader)
    return trainer.train()

FLUX gate/layer/block scale 注入(src/models/flux_sg.py, flux_sg_block.py, flux_sg_mlp_attn.py):

def extend_flux_transformer(transformer, num_models):
    freeze_all_parameters(transformer)
    transformer._original_forward = transformer.forward
 
    transformer_gate_scales_main = nn.ModuleList()  # double-block main gates
    transformer_gate_scales_ctx = nn.ModuleList()   # double-block context gates
    single_gate_scales = nn.ModuleList()            # single transformer blocks
    models_scales = nn.Parameter(torch.tensor([1.0] + [0.0] * (num_models - 1)))
 
    def norm_hook(block_idx, model_idx, is_context):
        def hook(module, args, kwargs, output):
            out = list(output)
            w_attn, w_mlp = select_gate_scales(block_idx, model_idx, is_context)
            out[1] = out[1] * w_attn  # gate_msa
            out[4] = out[4] * w_mlp   # gate_mlp
            return tuple(out)
        return hook
 
    def new_forward(*args, **kwargs):
        result = None
        for model_idx, omega in enumerate(models_scales):
            register_gate_hooks(model_idx)
            y = transformer._original_forward(*args, **kwargs)
            remove_gate_hooks()
            result = omega * y if result is None else result + omega * y
        return result
 
    transformer.forward = new_forward
    return transformer

CMA-ES 搜索循环(src/optim/cmaes.py):

def cmaes_train(cfg, pipeline, reward_fn):
    x0 = pipeline.flatten_coefficients()
    es = cma.CMAEvolutionStrategy(
        x0=x0,
        sigma0=cfg.optimize.initial_sigma,
        inopts={"seed": cfg.experiment.seed, "popsize": cfg.optimize.population_size},
    )
    es.inject([es.gp.geno(x0)], force=True)
 
    for generation in range(cfg.optimize.max_generations if cfg.optimize.max_generations > 0 else INF):
        prompts = next_bucket(cfg.optimize.bucket_size)
        candidates = es.ask()
        scores = []
        for x in shard_by_rank(candidates):
            pipeline.apply_coefficients(x)
            images = pipeline(prompts, num_inference_steps=cfg.gen.num_inference_steps,
                              guidance_scale=cfg.gen.guidance_scale, height=512, width=512)
            reward = reward_fn(images, prompts, metadata={})["avg"]
            scores.append(reward)
        fitnesses = [-score for score in gather(scores)]
        es.tell(candidates, fitnesses)
        validate_and_checkpoint_best_candidate()

Code-to-paper mapping:

Paper ConceptSource FileKey Class/Function
训练入口、pipeline/reward/data loader 组装/Users/bytedance/ai-skills/papers/Calibri/scripts/train.pymain, CMAESTrainer(...)
模型名到 wrapper 的分派/Users/bytedance/ai-skills/papers/Calibri/src/models/__init__.pyget_pipeline_by_name
FLUX gate scaling(main/context/single gates)/Users/bytedance/ai-skills/papers/Calibri/src/models/flux_sg.pyextend_transformer_with_sg, SGFluxPipeline
FLUX block scaling/Users/bytedance/ai-skills/papers/Calibri/src/models/flux_sg_block.pySGFluxPipelineBlock.get_coefficient_shapes
FLUX layer scaling(attention/MLP)/Users/bytedance/ai-skills/papers/Calibri/src/models/flux_sg_mlp_attn.pySGFluxPipeline_MlpAttn.get_coefficient_shapes
SD-3.5M / Flow-GRPO checkpoints/Users/bytedance/ai-skills/papers/Calibri/src/models/sd3_sg.py, sd3_lora_sg.pyextend_sd3_transformer, SGSD3PipelineLORA
Qwen-Image CFG/ensemble wrapper/Users/bytedance/ai-skills/papers/Calibri/src/models/qwen_sg.pyextend_qwen_transformer_with_sg, SGQwenPipelineCFG
CMA-ES optimizer loop/Users/bytedance/ai-skills/papers/Calibri/src/optim/cmaes.pyCMAESTrainer, train, es.ask, es.tell
Reward aggregation/Users/bytedance/ai-skills/papers/Calibri/src/metrics/rewards.pymulti_score, hpsv3_remote, qalign_remote, pickscore, imagereward
实验配置/Users/bytedance/ai-skills/papers/Calibri/configs/base.py, /Users/bytedance/ai-skills/papers/Calibri/configs/calibri.pyinitial_sigma=0.25, bucket_size=16, cmaes_hpsv3_flux_*, cmaes_qwen_*

论文公式与 released code 实现差异:论文表中报告的 FLUX block/layer/gate scale 参数数是 57/76/114;released code 的 flatten_coefficients() 还把 models_scales(每个 ensemble model 的 )拼进 CMA-ES 向量。因此实际搜索向量在单模型 FLUX wrapper 中通常比表中 internal scale 数多 1(block 58、layer 77、gate 115),表格数字更像只统计内部 calibration scale,而不是输出混合权重。

代码实现补充。

scripts/train.py 只做 orchestration:创建 Accelerator(),设置 seed,按 cfg.model.model_name 找 pipeline wrapper,再构造 train/val loader 与 reward functions。 CMAESTrainer.train() 是真正的优化循环:先评估原始 coefficient,再反复 es.ask() 采样 candidates、bucket 评估、es.tell() 更新分布。 _eval_candidate_on_bucket() 每次都会 pipeline.apply_coefficients(x),再按 micro-batch 生成图像并调用 call_reward()_eval_validation() 使用 validation prompts 和 num_inference_steps_val,主要负责 checkpoint 选择,而不是更新 CMA-ES。

FLUX wrapper 的代码语义。

flux_sg.py 针对 gate scaling:double transformer blocks 有 main/context 两套 gate scale,每套又分 attention/MLP;single blocks 有单独 scale。 hook 注册点是 block.norm1block.norm1_context 和 single block 的 block.norm,因此 scale 作用在 DiT block 内部 gated residual 输出附近。 models_scales 是输出级混合权重;new_forward() 会对不同 model_idx 分别注册 hook、调用原 transformer,再按 weight 累加结果。 flux_sg_block.py 是更粗粒度的 block scale,收敛更快但表达更少;flux_sg_mlp_attn.py 介于 block 和 gate 之间。

Qwen-Image wrapper 的代码语义。

qwen_sg.py 使用 SGQwenPipelineCFG,默认 num_models=2cfg_case=Truecfg_scale=7.0extend_qwen_transformer_with_sg() 为每个 transformer block 注册 attnimg_mlptxt_mlp 三类 gate hook。 如果进入 CFG case,初始 models_scales 被设置成 conditional / unconditional 组合,即第一路权重近似 cfg,第二路权重近似 1-cfg。 这使 Qwen-Image 的 Calibri 更像“可搜索 true CFG + gate scaling”,而不是单纯复制 FLUX 的 gate 设计。

配置与论文数字的对应。

configs/base.py 给出通用默认:initial_sigma=0.25bucket_size=16、训练/验证 NFE 默认为 15、图像尺寸 512。 configs/calibri.py 为 FLUX block/layer/gate、PickScore/HPSv3 目标、SD3/Flow-GRPO checkpoint、Qwen-Image CFG wrapper 分别定义 experiment function。 released data 文件行数与笔记中的 dataset 规模对应:train 5,601;val 2,402;random-crop val 499。 2026-04-13 commit 还公开了 weights/flux_gates.jsonweights/qwenimage.json,说明代码库不只是训练脚本,也包含可直接推理的 calibration coefficients。

4. Experimental Setup (实验设置)

数据集与规模。 训练/中间验证使用 T2I-CompBench++ prompts:论文说 train prompts 用于 CMA-ES candidate bucket evaluation,test prompts 用于中间 reward evaluation;released code 中对应 /data/t2i_compbench_train.txt 有 5,601 行,/data/t2i_compbench_val.txt 有 2,402 行,/data/t2i_compbench_val_random_crop.txt 有 499 行。最终指标使用 HPDv3 test prompts;

论文未给出 HPDv3 全量规模,但 human study 明确使用 150 个 HPDv3 test prompts、200 名用户、5,600 次 assessment。模型与 baseline。 主实验覆盖 FLUX.1-dev、Stable Diffusion 3.5 Medium、Qwen-Image;alignment 组合实验覆盖 SD-3.5M 原始模型、Flow-GRPO-PickScore checkpoint、Flow-GRPO-GenEval checkpoint。

对比对象包括原模型、Flow-GRPO、Flow-GRPO + Calibri、不同 Calibri granularity(block/layer/gate)与 Calibri Ensemble。指标。 HPSv3 衡量人类偏好分数;ImageReward/IR 是图像偏好 reward;Q-Align 是 MLLM 视觉质量评估;PickScore 是 CLIP-based preference score;DINO Diversity 衡量生成多样性;human evaluation 分 Overall Preference 和 Text Alignment win rate。**训练/搜索配置。

** 论文配置:CMA-ES 初始 ;候选数 ;bucket size 16;图像分辨率 512;训练 NFE=15;HPSv3/Q-Align 用于训练期间 tracking,HPSv3/Q-Align/ImageReward 用于最终评估。released code 对应 configs/base.pyinitial_sigma=0.25bucket_size=16num_inference_steps=15image_size=512

configs/calibri.py 为 FLUX/SD3/Qwen 分别设置模型、reward、val_every_steps=10、train/val 文件路径。硬件成本按论文 Table 5 用 NVIDIA H100 GPU-hours 报告,而不是给出固定 GPU 数:Flux Block 32、Layer 64、Gate 150;SD-3.5M Gate 356;Qwen-Image Gate 286。

5. Experimental Results (实验结果)

主结果

Calibri 在三个 backbone 上同时提升质量指标并降低 NFE:

ModelCalibriHPSv3IRQ-AlignNFE
FLUX11.411.154.8530
FLUX13.481.184.8815
SD-3.5M11.151.104.7480
SD-3.5M14.101.174.9130
Qwen Image11.261.164.55100
Qwen Image12.951.184.7330

NFE curve

Figure 6 解读:Calibri Ensemble 把 FLUX 的最优采样步数从 baseline 的 30–50 NFE 移到 10–15 NFE,说明它不是只在固定步数上刷 reward,而是改变了低步数区域的质量-计算折中。

Granularity ablation

FLUX 上 block/layer/gate 的 HPSv3 分别是 13.29/13.41/13.48;IR 分别是 1.17/1.24/1.18;Q-Align 分别是 4.91/4.90/4.88。Gate scaling 目标 reward 最高,但 layer scaling 在非目标 reward 上更稳;三者质量差距不大,训练速度差异更关键:block 57 params/200 iters/32 H100 hours,layer 76 params/410 iters/64 H100 hours,gate 114 params/960 iters/150 H100 hours。

Figure 5 解读:不同 granularity 的曲线说明参数越细并不总是所有指标更好。Gate 能更贴合 HPSv3 objective,但 layer 在 IR/Q-Align 等指标上更均衡,因此实际选择取决于目标 reward、预算和是否需要更快 convergence。

Human evaluation

在 200 users、5,600 assessments、150 HPDv3 prompts 上,Flux 的 Overall Preference 为 Calibri 51.87 / Equal 7.33 / Original 40.80,Text Alignment 为 38.71 / 37.68 / 23.61;Qwen-Image 的 Overall Preference 为 54.62 / 7.91 / 37.47,Text Alignment 为 40.29 / 37.65 / 22.06。这说明提升不只来自自动 reward 的偏置,用户偏好也更倾向 calibrated model。

与 Flow-GRPO 组合

在 SD-3.5M 上,Calibri 可以替代一部分昂贵 finetuning,也能叠加在 Flow-GRPO checkpoint 之后:base SD-3.5M 从 HPSv3/PickScore/Q-Align = 11.15/22.40/4.74 提升到 12.47/23.13/4.91,NFE 80→30;Flow-GRPO PickScore checkpoint 再加 Calibri 后从 12.67/23.78/4.92 到 12.96/23.93/4.85;Flow-GRPO GenEval checkpoint 用 Calibri-HPSv3 后 HPSv3 从 10.16 到 14.18,Q-Align 从 4.69 到 4.88,NFE 80→30。论文强调:对 base SD-3.5M 用 PickScore 目标的 Calibri 只更新 216 个参数,而 Flow-GRPO 更新 18.78M 参数。

Qualitative alignment with Flow-GRPO

Figure 7 解读:定性图展示 Calibri 可以作为 Flow-GRPO 之后的后处理式校准层:它不覆盖原有对齐,而是在保持相同/更低 NFE 的情况下进一步改善构图、细节与 prompt adherence。

多样性与局限

作者指出 Calibri 依赖 reward model 作为 objective;如果 reward model 对多手指、额外肢体等解剖伪影不敏感,CMA-ES 可能选择到 suboptimal coefficients。多样性实验显示,SD-3.5M 原始 80 NFE 的 Dino Diversity 为 ,Calibri PickScore 30 NFE 仍为 ;相比之下 Flow-GRPO PickScore 降到 ,Flow-GRPO + Calibri 约 。因此 Calibri 本身在该实验中没有进一步损害多样性,但它的上限仍受 reward model 覆盖能力约束。