ParetoSlider: Diffusion Models Post-Training for Continuous Reward Control

1. Motivation(研究动机)

  • 现有方法的问题:视觉生成里用 RL / Flow 后训练对齐(如 DDPODPOKFlowGRPO、基于前向过程的 DiffusionNFT、以及偏好优化类 FPO 等)时,绝大多数实现都把多个评价维度压成单一标量 reward,或在训练开始就把多目标做成固定的加权和early scalarization)。其直接后果是:策略在训练期就被「锁死」在某个静态折中点上;推理阶段用户无法按需调节「prompt 遵循 vs. 源图保真」「美学 vs. 对齐」「照片感 vs. 风格化」等彼此冲突的目标。
  • 本文要解决的问题:在 diffusion / flow-matching 后训练场景下,用单个模型近似整条 Pareto front,并在推理时用连续的控制量(preference 权重向量 )在冲突目标之间平滑导航,而无需为每个折中点单独训练或保存多份 checkpoint。
  • 为何重要:真实产品部署中,不同用户/场景对 trade-off 的需求不同;若只能在训练时选定一个标量化方案,会牺牲可控性与可解释性。把多目标 RL 显式做成「preference-conditioned policy」,才能把「对齐」从一次性离线决策变成可交互的推理时服务。

与相关 skill 的横向关系(阅读地图)DiffusionNFT - Online Diffusion Reinforcement with Forward Process 提供高效的前向过程 RL 微调基座;flow-grpo 代表反向轨迹上的 group-normalized RL;Flow Matching Policy Gradients 等更偏偏好/流形上的目标设计。ParetoSlider 不是在单一标量上「再挤一点分」,而是把 DiffusionNFT 式更新推广到多目标 + 条件化,解决的是「一条 front,一个模型」而非「一个 reward,一个点」。


2. Idea(核心思想)

  • 核心洞见(1–3 句):把 M 维 preference 向量 (位于概率单纯形 上)作为与文本/图像并列的条件信号喂给去噪策略 ;训练时在 随机采样 ,并对每个 reward 通道单独做 group-relative advantage 与 DiffusionNFT 损失,仅在损失聚合阶段 做加权和(late scalarization)。这样单个网络在功能上扮演了「一族标量化问题」的共享解,从而在推理时对任意 输出对应的 Pareto 折中,而无需重训。
  • 与主流做法的本质区别:传统 pipeline 是「先把 合成标量再算 advantage / policy gradient」,偏好只存在于训练脚本超参里;ParetoSlider 让偏好进入网络输入,并把标量化推迟到 per-objective NFT loss 之后,避免某一维 reward 的尺度/方差「劫持」梯度并冲淡 的语义。

3. Method(方法)

3.1 Overall framework

整体是 DiffusionNFT 风格的三阶段循环:(1) 条件于 从当前策略采样 条样本;(2) 个 reward 模型打分,并在每个 prompt 组内、每个目标独立做标准化得到 advantage;(3) 对每个目标构造 NFT 损失 ,再按当前样本的 线性聚合后反传,并加 KL 约束贴近参考策略。

Figure 1 解读:上图概括了论文问题设定:在 text-to-image 中在「照片感 reward」与「线稿/sketch reward」之间连续滑动;在 image editing 中在「源图保真」与「编辑指令遵循」之间滑动。关键是同一套参数在推理时接受不同 ,输出沿 Pareto 前沿分布的不同点,而不是训练时锁死一个折中。

Figure 2 解读:训练流水线与正文 Figure 2 一致:Stage (1) 对每个 prompt 采样 并生成 张图;Stage (2) 各 reward 通道独立算组内均值方差标准化 advantage;Stage (3) 分别算每条 reward 的 DiffusionNFT loss,再用 加权求和得到总 NFT 项,最后与 KL 正则一起更新。Late scalarization 体现在: 不参与各通道 advantage 的标准化,只参与损失层的凸组合

3.2 Preference-conditioned policy 与 reward 组合

偏好向量,满足 。对固定 ,理想标量化目标是最大化

但若策略不显式依赖 ,单个网络无法对所有 同时最优;因此引入

Late-scalarization advantage:对组内样本 、目标 ,在该 prompt、该 条件下的 个样本上,逐通道做 FlowGRPO / DiffusionNFT 风格的 group-relative 标准化(论文式 (3),本文不把 混入标准化):

再对每个 独立映射插值权重 (式 (4) 的 clip + 线性映射),构造逐目标 NFT 损失(式 (9)):

其中 为 flow 目标速度,EMA old policy 与当前 policy 按 DiffusionNFT 的 implicit velocity steering(式 (5–6))得到。最终在样本 上聚合(式 (10)):

总目标(正文):

(附录 Algorithm 1 将 KL 写成当前条件策略速度 条件的参考速度 的平方误差形式,与实现中「ref 前向不传 preference」一致。)

训练时 的采样(论文附录 A.3):先从对称 Dirichlet 采样;再以固定概率强制采样单纯形顶点(one-hot)随机两目标的边(Dir(1,1) 在两维上),以覆盖边界与极端 trade-off;并对分布式训练保证「给定 prompt 与 step, 可复现」。

3.3 Conditioning 注入方式(按 backbone)

  • SD3.5(T2I):在共享 timestep embedding 上加 MLP 映射的 (式 (11)),使 AdaLN 全局感知偏好;再用正弦编码 + MLP 得到共享向量 ,在每个 block 的 image stream 上按门控残差注入(式 (12))。实现与开源代码中 SD3Transformer2DModelWithConditioning / ablation 变体一致。
  • FluxKontext(I2I):将 与池化文本嵌入拼接,经 MLP 预测 context stream AdaLN 的 scale/shift 残差(式 (13)),与 Kontinuous Kontext 的「调制空间控制」同脉络,但把标量强度换成多维
  • LTX-2(T2V):复用 SD3.5 的 shared block-residual 思路,作用在 video stream、隐藏维改为 3840;并对 MLP 末层做小方差初始化以稳定早期 RL。

3.4 推理阶段

用户指定 ,标准采样流程中对 transformer 全程传入同一 无需多 checkpoint 插值、无需逐步梯度引导(对比 PROUD 等)。

3.5 直觉段落:为何 preference conditioning 能近似整条 Pareto front?

若只在损失里用固定的 ,网络学到的是「单一折中策略」;把 作为条件,相当于在函数逼近层面学习映射 「在该线性效用权重下应偏向的生成统计」。Late scalarization 保证每个 reward 通道在自己的组内相对优势上都被充分更新,避免某一维 raw reward 因尺度更大而支配梯度;在此前提下再用 做凸组合,梯度方向与「当前样本声明的效用」一致。结合在 上覆盖顶点、边与内部的采样,网络在训练分布上「填满」不同效用方向的最优折中,从而在推理插值 时得到平滑、单调的轨迹(实验上表现为连续的 slider 与更好的 hypervolume)。

3.6 开源代码与伪代码(Python / PyTorch 风格)

Code reference: main @ 8ce73f28 (2026-04-12) — 以下伪代码与映射基于该 commit 的 T2I/ 子目录(公开实现当前主要覆盖 SD3.5 T2I 管线;论文还包含 FluxKontext / LTX-2 的工程化扩展,未完全体现在该仓库树中)。

Preference 采样(结构化顶点 / 边 / 内部 + 分布式一致性)

import numpy as np
import torch
import hashlib
 
def stable_prompt_hash_u32(prompt: str) -> int:
    digest = hashlib.sha256(prompt.encode("utf-8")).digest()
    return int.from_bytes(digest[:4], byteorder="little", signed=False)
 
def sample_structured_preference(num_rewards: int, rng: np.random.Generator) -> np.ndarray:
    if num_rewards == 2:
        w = rng.dirichlet([1.0, 1.0]).astype(np.float32)
        return w / w.sum()
    roll = rng.random()
    if roll < 0.50:  # vertex
        pref = np.zeros(num_rewards, dtype=np.float32)
        pref[int(rng.integers(0, num_rewards))] = 1.0
    elif roll < 0.85:  # edge
        pref = np.zeros(num_rewards, dtype=np.float32)
        pair = rng.choice(num_rewards, size=2, replace=False)
        w = rng.dirichlet([1.0, 1.0]).astype(np.float32)
        pref[pair[0]], pref[pair[1]] = w[0], w[1]
    else:  # interior
        pref = rng.dirichlet([1.0] * num_rewards).astype(np.float32)
    return pref
 
def preferences_for_batch(prompts: list[str], num_rewards: int, epoch: int, batch_idx: int,
                          base_seed: int, device: torch.device) -> torch.Tensor:
    prefs = []
    for p in prompts:
        seed = (base_seed + stable_prompt_hash_u32(p) + epoch * 100000 + batch_idx) % (2 ** 32)
        rng = np.random.default_rng(seed)
        w = sample_structured_preference(num_rewards, rng)
        prefs.append(torch.tensor(w, device=device, dtype=torch.float32))
    return torch.stack(prefs, dim=0)

Per-objective advantage(组内、逐通道标准化)

def per_objective_advantages(prompts: list[str], reward_vec: np.ndarray) -> np.ndarray:
    """reward_vec: (N, M) raw rewards; group by identical prompt string."""
    prompts = np.array(prompts, dtype=object)
    adv = np.zeros_like(reward_vec, dtype=np.float32)
    for p in np.unique(prompts):
        mask = prompts == p
        g = reward_vec[mask]  # (K, M)
        for m in range(reward_vec.shape[1]):
            ch = g[:, m]
            adv[mask, m] = (reward_vec[mask, m] - ch.mean()) / (ch.std() + 1e-4)
    return adv

训练步:per-objective NFT + 线性 scalarize(对应式 (9–10) 的实现骨架)

def nft_losses_from_advantages(adv_per_obj: torch.Tensor, pos_loss: torch.Tensor,
                               neg_loss: torch.Tensor, adv_clip: float, beta: float) -> torch.Tensor:
    """adv_per_obj: (B, M) ; pos_loss/neg_loss: (B,) — broadcast per objective."""
    adv = torch.clamp(adv_per_obj, -adv_clip, adv_clip)
    rho = 0.5 + 0.5 * torch.clamp(adv / adv_clip, -1.0, 1.0)  # (B, M)
    # per-objective NFT
    loss_m = rho * (pos_loss[:, None] / beta) + (1.0 - rho) * (neg_loss[:, None] / beta)
    return loss_m  # (B, M)
 
def linear_scalarize(pref: torch.Tensor, losses_m: torch.Tensor) -> torch.Tensor:
    """pref, losses_m: (B, M) -> (B,)"""
    return (pref * losses_m).sum(dim=1)

推理:将 preference 张量传入 pipeline_with_logprob / transformer forward(与训练同形),保持 CFG、步数、噪声日程与论文 Table 1–3 一致。

Code-to-paper mapping

Paper 概念源码路径(T2I 子目录)关键符号 / 说明
Preference-conditioned SD3 transformerflow_grpo/diffusers_patch/transformer_sd3.pySD3Transformer2DModelWithConditioning, forward(..., preference=...)
Conditioning 消融(Token / Hybrid 等)flow_grpo/diffusers_patch/transformer_ablations.pySD3AblationTransformer, conditioning_mode
结构化 采样 + 分布式一致flow_grpo/preference_utils.pybuild_consistent_preferences_for_global_batch, _sample_structured_preference
Late scalarization 聚合flow_grpo/scalarization.pymake_scalarizerlinear(pref, losses)
DiffusionNFT + per-objective 训练循环scripts/train_pareto_nft_sd3.pyloss_mode == "per_objective" 分支;pipeline_with_logprob(..., preference=preferences)
Reward 组合 / 多目标展开flow_grpo/rewards.py, expand_reward_fn_to_objectives将配置中的 reward_fn 映射为 个标量通道
组统计 / GDPO advantageflow_grpo/stat_tracking.pyPerPromptAndPreferenceStatTracker.update_from_reward_vectors_gdpo

Figure 3 解读:在同一条 photorealism–sketch 轴上,三个样本展示 从偏向照片感(左)经平衡(中)过渡到线稿化(右)时,语义与构图保持相对连续。该现象对应主文「多目标风格插值」定性:单模型在单纯形边上平滑移动,而不是离散换 LoRA / 换 checkpoint。

Figure 4 解读Instruction-based editing 上, 控制「保留源图身份与细节」与「执行风格/语义编辑」的权衡:左侧更接近 preservation,右侧更激进地遵循编辑指令(面部细节随 adherence 上升而让位于风格化)。中间点展示 ParetoSlider 的「可控中点」。

Figure 5 解读LTX-2 text-to-video 上,在 animation vs. photoreal 两目标之间调节 :左帧更偏动画质感,中间为折中,右侧更接近实拍影像。单模型跨三段偏好生成,体现方法在时序生成骨干上的可迁移性。

Figure 6 解读:左:在 SD3.5 上,ParetoSlider 随 扫出光滑且占优的 Pareto 曲线;FixedWeights 需多点独立训练且易向某一 reward 塌缩;FlowMulti 仅静态策略;Prompt Rewriting 只在少数改写点上离散采样。右:同一 prompt 的定性插值显示 ParetoSlider 的连续性与保真过渡。

Figure 7 解读:在 photorealism–sketch 任务上比较 Shared / Per-block / Hybrid / Token 等注入方式:Shared(时间嵌入 + 跨 block 共享图像流残差)在前沿覆盖与定性平滑度上最佳;Token / Hybrid 易出现可控性弱或向主指标塌缩。

Figure 8 解读:比较 late vs early scalarization 与 Smooth Tchebycheff (STCH):三者整体前沿形状可相近,但 late scalarization 在中间 区域的过渡更平滑,更少出现「提前偏向 photoreal」的塌缩;与 Panacea 等「线性聚合仍可用」的理论叙述相容,但实现细节决定可控性质量

Figure 9 解读I2I 上与 Text-CFG / Image-CFG / FixedWeights 对比:ParetoSlider 的前沿更单调;CFG 扫描虽提供推理旋钮,但易引入伪影或饱和,且前沿不如显式 条件训练光滑。右列定性显示从 preservation 到 adherence 的连续过渡。

Figure 10 解读(附录 Fig. 10 精神复现):在 T2I 上换用与训练 reward 不同的评测组合(如 Qwen2.5-VL sketch + CLIP photorealism)绘制 Pareto 曲线时,ParetoSlider 相对 FixedWeights / FlowMulti / Prompt Rewriting 仍保持占优前沿,说明学到的可控性不完全是「过拟合单一 reward 口径」。


4. Experimental Setup(实验设置)

4.1 任务、骨干与数据

骨干任务数据 / 设定
SD3.5 MediumText-to-imageDiffusionNFT 对齐,使用 PickScore 数据集 split;主实验关注 photorealism vs. sketch;另展示多风格(水彩、动漫、三目标等)
Flux.1 Kontext devInstruction editing基于 FFHQ-512 caption 用 Claude 4.6 Opus 生成多样化编辑指令;附录还给 EditScore 训练的结果
LTX-2 (19B)Text-to-video1,000 条由 Claude 4.6 Opus 生成的中等长度 prompt

4.2 Reward 设计(摘要)

  • T2IPickScoreCLIPScore;抽象风格用 Qwen2.5-VL / UnifiedReward-2.0 提示词打分;结构化 sketch 用 PACS 风格分类器 + Sobel 边缘统计 的自定义指标。主消融在 PickScore(photoreal 提示模板) + sketch metric 上训练,评测可用 Qwen sketch + CLIP photoreal 以检验未过拟合。
  • I2IQwen2.5-VL 编辑成功度 + CLIP I2I 余弦相似度 衡量 preservation(附录给出显式公式 )。
  • T2VUnifiedReward-2.08 帧子采样上分别用两份 rubric 提示评估 photorealanimation,分数离散 0–5 再归一化到

4.3 Baselines

  • T2IFixedWeights(多次独立 DiffusionNFT);Flow-Multi(GRPO + batch Pareto 选点,但推理无 );Prompt Rewriting(Gemini 3 改写 prompt,仅离散点)。
  • I2IText-CFG / Image-CFG(类 InstructPix2Pix 双引导扫描);Prompt RewritingFixedWeights(5 个 DiffusionNFT 模型)。

4.4 指标

  • Pareto 前沿可视化Hypervolume (HV)(全局 min-max 归一化后,以原点为参考;论文强调 Non-Dominated 点数)。
  • VIEScore 作为与训练奖励正交的编辑评测;附录还报告 CLIP Directional + LPIPS 组合。
  • User study:主文未作为核心量化(论文未强调大规模人工排序为主表)。

4.5 训练配置(摘自附录 Table 1–3)

SD3.5(Table 1):冻结 VAE 与文本编码器;LoRA rank 32warm start 6 epoch(CLIPScore + PickScore DiffusionNFT);再 9 epoch ParetoSlider;分辨率 512×512;训练 25 步、评测 40 步;DPM2guidance scale 1.0noise level 0.7;每 prompt 24 重复采样、2 个 preference 子组;AdamW lr ;implicit fp16

FluxKontext(Table 2)LoRA rank 64, alpha 12812 epoch384×384;训练 10 步、评测 15 步;guidance 2.5;每 prompt 24 样本、4 偏好子组;bf16

LTX-2(Table 3):文本编码 Gemma 3 12B ITLoRA rank/alpha 32512×512、41 帧、25 fps;训练 20 步、评测 50 步;评测 guidance 4.0;每样本 5 个训练时间步;EMA 0.9bf16

算力:致谢提到 NVIDIA Academic Grant 通过 Brev 提供 GPU 时数;主文未逐实验列出总 GPU hour。


5. Experimental Results(实验结果)

5.1 Hypervolume(附录 Table 6–7,数值照录)

Table 6 — T2I(评测:Qwen2.5-VL sketch + CLIP photorealism)

MethodHV ↑Non Dom. ↑Pts.
ParetoSlider0.87055
Prompt Rewriting0.82723
FlowMulti ckpt3000.68311
Fixed-Weights0.43525

Table 7 — I2I(评测:VIEScore 双通道)

MethodHV ↑Non Dom. ↑Pts
ParetoSlider0.57455
Text-CFG0.56134
Fixed-Weights0.51645
Prompt Rewriting0.45933
Image-CFG0.39514

解读:ParetoSlider 在 HV非支配点数量上整体领先;FixedWeights 虽可有多个点,但前沿质量(HV)显著落后;FlowMulti 在 T2I 上几乎退化为单有效点(ckpt300 行 Non Dom.=1)。

5.2 定性结论

  • T2I:在多组风格轴上, 插值产生语义连续的图像序列;三目标(照片 / 水彩 / 线稿)也能在三角形偏好内平滑过渡。
  • I2I:在身份细节保留与指令强度之间可解释地滑动;CFG baseline 在极端区域更易出现artifacts。
  • T2V:在 animation–photoreal 轴上,极端与中点均合理。

5.3 Ablations(与主文 Figure 7–8 一致)

  • ConditioningShared(默认)优于 Token / Hybrid 等变体,前沿更分散、插值更平滑。
  • ScalarizationLate 在中间区域过渡最佳;Early / STCH 仍可覆盖大致前沿,但更易偏向某一目标。

5.4 Limitations(附录 Section C,作者原述)

  • 强烈依赖 reward 质量:若某一维 proxy reward 与真实用户意图不一致(如把「灰度图」误认为 sketch),会扭曲整条 trade-off 表面;多目标下错误会被放大。
  • 未claim:在 reward 严重错误指定时仍能恢复「真」Pareto front;需要谨慎设计与验证奖励。

5.5 结论

ParetoSlider 将 multi-objective RL 中的 preference conditioningDiffusionNFT 式前向 RL 结合,并以 late scalarization 稳定多通道学习;在 SD3.5 / FluxKontext / LTX-2 三类骨干上,单模型即可在推理时连续扫描 Pareto 前沿,并在 HV 与定性上优于多模型固定权重与 CFG / 改写类基线。


备注

  • paper_to_skill:扫描 ~/ai-skills/skills/*/sources.json 未找到 2604.20816 的匹配项,故 frontmatter 未设置该字段。
  • 公开仓库当前以 T2I/ 为主;若需 I2I / T2V 的完整复现,请同时以论文附录实现细节为准或关注仓库后续更新。