Pref-GRPO: Pairwise Preference Reward-based GRPO for Stable Text-to-Image Reinforcement Learning
Paper: arXiv:2508.20751 Code: CodeGoat24/Pref-GRPO Code reference:
main@3e787f6d(2026-02-10)
1. 论文定位与一句话结论
这篇论文解决的是 text-to-image 强化学习里 pointwise reward + GRPO 容易把很小的 reward 差值放大成虚假的优势,从而诱发 reward hacking 的问题。作者的核心改动很简单:不再把每张图的绝对 reward score 直接喂给 GRPO,而是让组内图像两两比较,用 pairwise preference reward model 判断谁更好,再把每张图的 win rate 当作 reward。这样得到的组内 reward 分布通常比 point score 更离散,标准化优势不会被一个接近 0 的组内标准差放大,训练目标也从“追求更高绝对分数”变成“拟合相对偏好”。
论文包含两个并列贡献:第一是算法 Pref-GRPO,用于稳定 T2I RL;第二是 UniGenBench,一个更细粒度的 T2I 语义一致性评测集。Pref-GRPO 的实验主线基于 FLUX.1-dev;点式 reward baseline 包括 HPSv2、HPSv2+CLIP、UnifiedReward;pairwise reward 主要使用 UnifiedReward-Think/类似 PPRM。UniGenBench 则用 600 个 evaluation prompts、10 个 primary dimensions、27 个 sub-dimensions 把模型失败位置拆得更细,避免只看 aggregate score 时看不出模型到底是不会逻辑、不会文字、不会关系,还是只是风格偏差。
从实践角度看,Pref-GRPO 最值得记住的不是“又换了一个 reward model”,而是 reward 表示方式从 scalar score 改成 ordinal preference。同一个 judge 如果输出点分,GRPO 会受到 score scale、score compression、reward-model calibration 的影响;如果输出相对胜负,优化信号更接近人类偏好数据的结构,也更不容易被“把图片调暗/调饱和就能涨分”这类投机路径劫持。
2. 背景:为什么 pointwise GRPO 会产生 illusory advantage
现有 T2I RL 工作通常把一个 prompt 下采样出的若干张图组成一个 group。假设 group size 为 ,每张图 被 reward model 打一个分数 ,GRPO 再用组内标准化得到优势:
这个设计在 LLM 任务里经常有效,因为答案之间的 reward gap 可能比较大;但在 T2I 里,很多 reward model 给同一 prompt 的多张图打分非常接近。论文图 1 的例子里,HPSv2 对四张图的分数约为 [0.3457, 0.3530, 0.3496, 0.3494],最大差值只有 0.0073,组内标准差约 0.0026。当 很小时,任何微小的 reward 噪声、judge bias 或图像低层统计偏好都会被标准化放大成很大的 。作者把这种现象称作 illusory advantage:优势看起来很大,但它并不代表真实的视觉质量或语义对齐差异。
这种放大效应会导致两个后果。第一,策略更新会对非常小的 score gap 过度反应,模型开始沿着 reward model 的漏洞方向走;第二,训练曲线上 reward 持续上升,但人的视觉感受和独立指标可能变差。论文里 UnifiedReward baseline 逐渐偏向暗色风格,HPSv2 baseline 则在约 160 step 后出现严重过饱和。这不是单个 reward model 的偶然 bug,而是“点分 + 组内标准化 + 可被利用的生成器自由度”共同造成的结构性风险。
用更直观的话说,pointwise GRPO 把“这张图比另一张图高 0.003 分”当作可优化的连续信号;如果这个 0.003 只是 reward model 对亮度、饱和度、纹理或 prompt 长度的偏置,策略仍然会认真优化它。Pref-GRPO 的出发点是:与其相信一个小数点后三位的绝对差,不如问 judge 一个更稳定的问题——在同一 prompt 下,两张图哪一张更符合偏好?
3. 方法:从 point score 最大化改成 pairwise preference fitting
3.1 基本流程
Pref-GRPO 保留 GRPO 的 group sampling 和 policy optimization 框架,只替换 reward construction。对于 prompt ,策略模型从同一个初始噪声或可比较的采样条件下生成 张图: 随后构造所有两两组合 ,把 prompt 与两张图一起交给 PPRM。PPRM 返回一个二元偏好:、,或者无法判断时可视作平局。每张图的 reward 不再是 score,而是它在组内比较中的胜率: 若考虑平局,则平局计半胜。得到 后,仍然可以像 GRPO 一样在 group 内做标准化: 关键区别在于 的动态范围天然是 ,且来自多次比较的离散排序;当 group 内确实存在可感知质量差异时,胜率会更容易拉开,而不是像 point score 一样被压缩在极小区间。若所有图都差不多,win rate 也不会凭借小数点噪声制造出夸张差距。
3.2 训练目标的直觉
论文把 Pref-GRPO 描述为 “fitting preferences instead of high scores”。这句话很重要,因为它改变了优化目标的语义。点分训练默认 reward model 的绝对分数有校准意义:0.3530 比 0.3496 好,而且差值值得优化。偏好训练只要求 judge 在局部 group 中排序:第一张比第二张更好。这样对 reward scale 不敏感,也更符合很多视觉 preference model 的训练方式;视觉偏好通常本来就是通过 pairwise/listwise 标注学出来的,强行要求模型输出可被优化的绝对标尺容易产生校准问题。
在 flow matching / diffusion RL 里,policy update 还要沿采样轨迹传播到多个 denoising states。论文保持 Flow-GRPO 风格:先 rollout 得到图像和轨迹,再根据图像 reward 生成 advantage,最后对采样轨迹上的 policy ratio 使用 clipped objective。Pref-GRPO 不改变底层采样器或 FLUX 架构,因此它是一个 reward-objective 层面的替换;它可以和已有 Flow-GRPO 工程结合,也能作为 score reward 的稳定正则项。
3.3 纸面算法伪代码
def pref_grpo_step(policy, old_policy, ref_policy, prompts, group_size=8):
groups = []
for c in prompts:
# 同一 prompt 生成 G 张图,最好控制初始噪声以减少采样噪声干扰
images, trajectories, old_logps = rollout_group(
policy=old_policy,
prompt=c,
group_size=group_size,
same_initial_noise=True,
)
# 组内两两比较;PPRM 只回答相对偏好
wins = [0.0 for _ in images]
counts = [0 for _ in images]
for i, j in all_pairs(range(group_size)):
verdict = pprm_compare(prompt=c, image_a=images[i], image_b=images[j])
counts[i] += 1
counts[j] += 1
if verdict == "a_better":
wins[i] += 1.0
elif verdict == "b_better":
wins[j] += 1.0
else:
wins[i] += 0.5
wins[j] += 0.5
rewards = [wins[i] / counts[i] for i in range(group_size)]
advantages = normalize_within_group(rewards)
groups.append((c, images, trajectories, old_logps, advantages))
# 仍然执行 GRPO/Flow-GRPO 风格的 clipped policy update
loss = 0.0
for c, images, trajectories, old_logps, adv in groups:
for traj, old_logp, A in zip(trajectories, old_logps, adv):
new_logp = policy.logprob_trajectory(c, traj)
ratio = exp(new_logp - old_logp)
unclipped = ratio * A
clipped = clip(ratio, 1 - eps, 1 + eps) * A
loss += -min(unclipped, clipped)
optimize(policy, loss)这个伪代码体现了论文方法的三个组件:同 prompt group rollout、PPRM pairwise win-rate reward、以及用 win rate advantage 驱动的 GRPO 更新。它没有引入 value function,也不要求 reward model 可微;PPRM 只需能比较图像对即可。因此,方法的工程瓶颈不在反向传播,而在 pairwise judge 的推理成本。
4. UniGenBench:为什么还需要新的评测集
Pref-GRPO 的第二个贡献是 UniGenBench。论文指出,现有 T2I benchmark 往往只报告少数粗粒度维度或 aggregate score,无法解释模型到底在哪些语义能力上失败。UniGenBench 把 prompt 设计与评测维度拆细:5 个 prompt themes、20 个 sub-themes、10 个 primary evaluation dimensions、27 个 sub-dimensions,并让每个 prompt 附带 1 到 5 个 explicit testpoints。评测时 Gemini-2.5-Pro 不是只给一张图一个总分,而是对每个 testpoint 做二元判断并给出 rationale,最后再聚合成维度分数。
UniGenBench 的 10 个 primary dimensions 包括 Style、World Knowledge、Attribute、Action、Relationship、Logical Reasoning、Grammar、Compound、Layout、Text 等。论文的观察是:强模型在 Style 和 World Knowledge 上已经相对饱和,许多分数高于 0.8;真正拉开差距的是 Logical Reasoning、Grammar、Compound、Text、Relationship 等需要组合语义和约束跟随的维度。这一点对 T2I RL 很关键:如果 reward 只关注整体审美或图文相关性,模型可能在表面质量上变好,却继续忽略复杂 prompt 中的逻辑条件、数量、文字、空间关系和多对象交互。
作者还用 UniGenBench 排名了开放和闭源模型。闭源模型如 GPT-4o、Imagen-4.0-Ultra 在多个 primary dimensions 上领先,开放模型如 Qwen-Image、HiDream、FLUX.1-dev 等表现各有强弱。这部分的意义不是单纯做 leaderboard,而是提供诊断视角:一个模型总分低,可能是因为 text rendering 差;另一个模型总分相近,但逻辑维度明显更弱。对 RL 训练来说,这种细粒度指标可以帮助判断 reward 是否真的提升了 compositional understanding,而不是只提升了审美偏好。
5. 实验结果:Pref-GRPO 是否真的更稳
5.1 主结果
主表显示,Pref-GRPO 在 in-domain UniGenBench 上总体分数为 69.46,超过 FLUX.1-dev baseline 的 61.30、HPSv2 baseline 的 58.77、HPSv2+CLIP 的 61.81、UnifiedReward score baseline 的 63.62。更值得注意的是复杂维度:Logical Reasoning 从 UnifiedReward baseline 的 32.05 提升到 44.09,Compound 从 52.32 到 62.43,Text 从 34.44 到 47.13。这些维度正是作者认为 T2I 模型尚未饱和的瓶颈,因此提升不只是“总分涨了”,而是集中在更难的语义组合能力上。
在 out-of-domain benchmark 上,Pref-GRPO 也保持优势:GenEval overall 为 70.53,高于 UnifiedReward baseline 的 67.28 和 HPSv2+CLIP 的 64.85;T2I-CompBench overall 为 51.85,高于 UnifiedReward 的 50.20 和 HPSv2+CLIP 的 49.18。独立质量指标也没有因为偏好训练而下降:UnifiedReward / PickScore / ImageReward / Aesthetic 分别为 3.26 / 23.02 / 1.44 / 6.52,均高于最强点式 baseline 的 3.14 / 22.88 / 1.38 / 6.31。这说明 Pref-GRPO 并不是牺牲画质换语义,而是在稳定性改善后同时提升了语义与感知质量。
5.2 Reward hacking 对照
论文的 qualitative 对照非常直观:HPSv2 baseline 容易出现过饱和,UnifiedReward baseline 容易变暗,HPSv2+CLIP 虽然加了语义约束但仍会有 reward-hacked artifact;Pref-GRPO 更能保留 FLUX.1-dev 原本的视觉风格和 prompt fidelity。这里的关键不是某一个 reward 模型“坏”,而是 pointwise score 最大化让策略有动机寻找 reward 模型的捷径。Pairwise win rate 会把优化目标约束在“相对更被偏好”的方向上,降低利用绝对 score scale 的机会。
论文还做了 “point-score-derived win rate” 的对照:把 UnifiedReward 的点分先转成组内胜率,而不是直接最大化点分。这个变体 UniGen / GenEval / UnifiedReward / PickScore / ImageReward / Aesthetic 为 64.32 / 68.13 / 3.20 / 22.91 / 1.39 / 6.35,已经比直接 UnifiedReward score baseline 的 63.62 / 67.28 / 3.14 / 22.88 / 1.38 / 6.31 更稳,但仍低于原生 PPRM 的 Pref-GRPO 69.46 / 70.53 / 3.26 / 23.02 / 1.44 / 6.52。这说明稳定性的主要来源确实是相对偏好结构;同时,直接用 pairwise PPRM 比把 point score 后处理成 win rate 更好。
5.3 消融与代价
在 10% preference noise 的鲁棒性实验中,作者把每个 pairwise outcome 以 的概率翻转。带噪 Pref-GRPO 仍得到 UniGen 67.92、T2I-Comp 51.03、GenEval 70.12、UnifiedReward 3.22、PickScore 22.90,低于无噪版本但仍明显强于点式 baseline。这说明 pairwise win rate 对少量 judge disagreement 有容忍度,因为每张图的 reward 来自多个比较的聚合,而不是单次判断。
作者也测试了把 Pref-GRPO 与 CLIP score reward 联合优化。加入 CLIP 后 UniGen 从 69.46 到 70.02,GenEval 从 70.53 到 71.26,但 UnifiedReward / PickScore / ImageReward / Aesthetic 轻微下降到 3.18 / 22.86 / 1.41 / 6.44。这个结果很适合作为工程启示:score reward 不是完全不能用,但最好作为辅助项;pairwise preference fitting 应该承担稳定器角色,防止 score signal 把策略拖向 reward hacking。
代价方面,pairwise 比较是 。论文的 wall-clock 表显示,UnifiedReward point score 在 8 rollouts/group 时每步 32 个 requests、约 3 秒;Pairwise winrate 在同样 8 rollouts/group 时 112 个 requests、约 7 秒;若 16 rollouts/group,则需要 480 个 requests、约 22 秒。这是 Pref-GRPO 最现实的工程成本:它用更多 judge 推理换取更稳定的 RL 信号。对大规模训练而言,需要通过 batch inference、缓存、并行 PPRM server、减少 group size 或只比较部分 pairs 来控制开销。
6. 代码实现对照(CodeGoat24/Pref-GRPO)
代码仓库当前 main@3e787f6d (2026-02-10) 是一个基于 FastVideo/FLUX/Wan/Qwen-Image 等多模型的训练工程,已经比论文主实验更泛化。下面只锚定与 Pref-GRPO 直接相关的路径。
6.1 训练入口与配置
/scripts/full_train/ur_think_prefgrpo_flux.sh 是 FLUX full fine-tuning 入口。它调用 fastvideo/train_flux.py,模型为 black-forest-labs/FLUX.1-dev,数据为 data/unigenbench_train_data/rl_embeddings/videos2caption.json,--sampling_steps 25,--eta 0.7,--num_generations 8,--learning_rate 1e-5,--train_batch_size 1,torchrun --nnodes=8 --nproc_per_node=8。这些数值与论文实验设置中的 64 H20、25 sampling steps、8 rollouts、learning rate 、SDE noise scale 对齐。
/scripts/_common_finetune.sh 提供共享参数:--gradient_accumulation_steps 4、--use_group、--init_same_noise、--clip_range 1e-4、--adv_clip_max 5.0、--kl_beta 0、--rationorm、--apply_gdpo。其中 --init_same_noise 对应论文强调的同组可比采样;--use_group 表示优势在每个 prompt 的 group 内归一化;--adv_clip_max 5.0 用来限制极端 advantage;--rationorm 是当前代码里针对 flow log-prob ratio 的额外归一化/修正路径。
需要特别记录一个 paper-code 差异:当前 full-train 脚本的 --reward_spec 是 {"unifiedreward_think": 0.4, "clip": 0.6},即把 pairwise UnifiedReward-Think 和 CLIP score 组合起来;论文主叙述强调 PPRM pairwise preference reward,另有 joint optimization with CLIP 的消融。因此,如果要复现实验表里“纯 Pref-GRPO”主结果,不能只看当前 main 默认脚本;需要确认作者当时使用的实验分支或把 reward spec 改为只含 PPRM。当前代码更像是把论文发现工程化成一个可组合 reward dispatcher。
6.2 Pairwise win rate 的实际计算
/fastvideo/rewards/unifiedreward_think.py 是最直接对应论文的文件。cal_win_rate_images 会把当前 group 的 images 取所有 itertools.combinations,每个 pair 构造 payload:两张图、同一个 prompt problem、first_index、second_index。随后 evaluate_batch 请求 vLLM server。_pairwise_win_rate 解析 <answer>...</answer>:如果回答包含 “Image 1 is better”,则第一个 index 胜;包含 “Image 2 is better”,则第二个 index 胜;无法解析或回答不属于这两个模板时,两张图各得 0.5。最终每张图的 overall_win_rate = win_count / compare_count,并四舍五入到 3 位小数。
这段代码与论文公式的对应关系非常清楚:win_count 对应 ,compare_count 对应比较次数 ,overall_win_rate 就是 。它还暴露出一个工程细节:PPRM 输出必须遵守模板,否则会被当作平局。这个 fallback 让训练不会因为 judge 偶发格式错误崩掉,但也会把无效输出变成中性 reward,从而降低该组的有效信号强度。
6.3 Reward dispatcher 与优势计算
/fastvideo/rewards/dispatcher.py 把不同 reward 名称统一成 tensor。build_reward_inputs 会根据 reward_spec 创建 unifiedreward_think、clip、hpsv2、pickscore 等输入列表;当包含 unifiedreward_think 时,dispatcher 对 image 调用 get_unifiedreward_think_image_template() 和 cal_win_rate_images(),再把返回的 win-rate tensors 拼成 reward_tensors["unifiedreward_think"]。
优势计算在 compute_weighted_advantages。如果 use_group=True,代码会按 num_generations 切分 reward tensor,对每个 prompt group 分别计算:
group_rewards = rewards[start_idx:end_idx]
group_mean = group_rewards.mean()
group_std = group_rewards.std() + 1e-8
adv_local[start_idx:end_idx] = (group_rewards - group_mean) / group_std如果 reward_spec 里有多个 reward,代码会先对每个 reward 各自算 advantage,再按权重相加;当 apply_gdpo 打开时,还会对加权后的 advantages 做一次全局归一化。这个实现说明当前仓库的 Pref-GRPO 已经是多 reward 可组合框架,而不是只支持单一 PPRM。对于论文读者,最重要的 code path 是 unifiedreward_think -> cal_win_rate_images -> reward_tensors -> compute_weighted_advantages -> train_flux clipped loss。
6.4 训练循环中的连接点
/fastvideo/train_flux.py 在 rollout 阶段保存生成图像路径,并把 {path, prompt} 填入每个 reward input。随后 reward_dispatcher.compute_rewards(reward_inputs) 返回 reward_tensors,训练样本中保存 latents、old log probs、sigma schedule、image ids 和 advantages。更新阶段先把 sample["advantages"] clamp 到 [-adv_clip_max, adv_clip_max],再计算 ratio = exp(new_log_probs - old_log_probs) 或 rationorm 修正后的 ratio,最后使用 GRPO/PPO 风格的 clipped loss:
unclipped_loss = -advantages * ratio
clipped_loss = -advantages * clamp(ratio, 1 - clip_range, 1 + clip_range)
loss = max(unclipped_loss, clipped_loss)因此,Pref-GRPO 在代码中不是一个独立 trainer 类,而是通过 reward dispatcher 改变 advantage 来源。这个设计的好处是可以复用同一套 FLUX/Wan/Qwen-Image 训练框架;坏处是阅读时必须同时看 shell script、dispatcher、reward implementation 和 train loop,不能只搜索 “PrefGRPO” 类名。
7. 关键启示、适用边界与局限
启示一:T2I RL 的 reward scale 比 LLM RL 更脆弱。 图像 reward model 对同一 prompt 的多张图经常给出高度压缩的 score,这使得组内标准化特别危险。若训练中看到 reward 上升但图像发暗、过饱和、失真或语义退化,不能只调小 learning rate;应检查 reward variance、advantage variance、以及高 reward 样本是否真的被人类偏好。
启示二:pairwise/listwise reward 更适合视觉偏好。 人类和多模态 judge 通常更擅长回答“两张图哪张更好”,而不是给出绝对可校准分数。Pref-GRPO 把这个事实直接写进 RL objective。对后续工作,可以进一步尝试 listwise ranking、Bradley-Terry/Elo-style reward、partial pair sampling、active comparison 等方式,在稳定性和成本之间折中。
启示三:Benchmark 必须诊断维度,而不是只给总分。 UniGenBench 显示 Style 和 World Knowledge 可能已经不是强模型的主要瓶颈;Logical Reasoning、Grammar、Compound、Text、Relationship 更能区分模型能力。做 T2I RL 时,如果 reward 只让总分涨 1-2 点,但细分维度没有改善,甚至某些难维度下降,就很可能只是优化了表层偏好。
局限也很明确。第一,pairwise reward 成本随 group size 二次增长,8 rollouts 已经比 point score 慢约 2 倍以上,16 rollouts 成本更高。第二,PPRM 仍可能有偏差;只是 pairwise 形式减轻了 scale hacking,并不消除 judge hacking。第三,win rate 是局部相对信号,如果一个 group 内所有图都很差,仍会产生相对赢家;因此最好结合绝对质量过滤或 reference regularization。第四,当前 GitHub main 的默认 FLUX 脚本加入了 CLIP 辅助 reward,与论文主表的纯 PPRM 叙述存在配置差异,复现实验时必须锚定具体 commit 和脚本。
8. 与相邻工作的关系
相对 Flow-GRPO、DanceGRPO 等把 GRPO 应用于 flow matching / diffusion 的工作,Pref-GRPO 不主要贡献新的采样器或新的 policy loss,而是指出 pointwise reward 的组内标准化会制造 illusory advantage,并用 pairwise preference reward 修复 reward construction。相对 DDPO 类方法,它仍然保留 group-relative advantage 的简洁性,不引入 value model。相对常见 reward ensemble,它的重点不是简单叠加 HPS/CLIP/Aesthetic,而是改变 reward 的统计形态:从容易被 scale 和 variance 影响的 scalar score,变成更稳定的 relative ranking。
如果要把这篇论文迁移到视频生成或音视频生成,最自然的路径是把 PPRM 换成能比较视频或多模态输出的 judge,然后复用 win-rate advantage。代码仓库已经有 Wan 相关脚本和 video path,说明作者也在向更广泛生成任务扩展。但视频 pairwise judge 成本更高,帧采样、时间一致性、音画同步等维度也会带来更复杂的 preference template;这时 UniGenBench 式的细粒度 testpoint 设计可能比单个总体 preference 更重要。
9. 复现检查清单
- 先确认 reward spec:如果目标是论文主方法,应使用 PPRM/UnifiedReward-Think 的 pairwise win rate;如果使用当前
ur_think_prefgrpo_flux.sh,要记录它混合了unifiedreward_think:0.4与clip:0.6。 - 记录 group size 与 pairwise 请求量:
num_generations=8时每个 prompt 需要 28 个 pair comparisons;多卡/多 prompt 后实际 requests 会快速上升。 - 必须监控 reward hacking:同时看训练 reward、独立质量指标、advantage std、图像样例;不要只看训练 reward 是否上升。
- 评测时至少报告 UniGenBench / GenEval / T2I-CompBench 与 ImageReward / PickScore / Aesthetic,否则无法区分语义提升和画质变化。
- 对代码结果要锚定
main@3e787f6d或具体实验 commit,因为训练脚本和 reward spec 很可能随仓库演进改变。
10. 最小 takeaways
Pref-GRPO 的核心是把 GRPO 的 reward 从绝对点分换成组内 pairwise win rate。这个替换降低了 pointwise score compression 导致的 illusory advantage,并在 FLUX.1-dev 上同时改善 UniGenBench、GenEval、T2I-CompBench 和多个独立质量指标。UniGenBench 进一步说明,T2I RL 的下一步不只是“更好看”,而是让模型在逻辑、文字、复杂组合、关系和布局等细粒度语义维度上真正变强。