多个奖励互相打架,模型就废了?GD²PO 用一招"冲突过滤"把信号救了回来

核心摘要

多奖励 RL 现在是后训练的标配——你想让模型既有用又安全,既会调工具又格式规范,就得同时优化好几个奖励。但有个很现实的坑:同一条 rollout,在"有用性"上是正优势,在"安全性"上却是负优势,最后一加权求和,正负一抵消,这条样本对训练几乎没贡献了。GDPO 把每个维度的优势单独归一化,看似解决了尺度问题,可它最后还是要把多维优势压成一个标量,该抵消的还是抵消。

这篇论文叫 GD²PO,全称 Group-Dynamic reward-Decoupled Policy Optimization,思路其实挺直接的:借鉴 DAPO"过滤掉没信息量的样本"的做法,把它搬到多奖励的优势空间里——在优势聚合成标量之前,先把那些"各维度优势打架"的 rollout 给 mask 掉。再配一个 query 级别的重加权,根据每个查询里"没冲突的样本占多少"来动态调整更新强度。在工具调用和有用性-安全性对齐两个任务上,跨四个模型骨干,GD²PO 都稳定超过 GRPO 和 GDPO。三奖励工具调用上,Llama3.1-8B 的整体分从 GDPO 的 2.607 涨到 2.627。

不是什么颠覆性的底层突破,更像是把 DAPO 的过滤哲学精准地嫁接到多奖励场景的一次"对症下药"。但这个对症,下得挺准。arXiv ID:2606.16771。


论文信息

  • 标题:GD²PO: Mitigating Multi-Reward Conflicts via Group-Dynamic reward-Decoupled Policy Optimization
  • 作者:Haotian Liu, Yihao Liu, Jingwei Ni, Siyuan Huang, Xinpeng Liu, Pengyu Cheng, Jiajun Song, Ruijin Ding, Junfeng Li, Zhechao Yu, Mengyu Zhou, Hongteng Xu, Xiaoxi Jiang, Guanjun Jiang
  • 机构:Qwen 大模型应用团队(阿里巴巴),中国人民大学,北京大学,ETH Zürich,苏黎世大学,香港中文大学
  • arXiv:2606.16771(2026 年 6 月 15 日)
  • 代码:https://github.com/Qwen-Applications/GD2PO

🤔 先说说这个"奖励打架"到底是个什么坑

你有没有遇到过这种情况:训练一个对齐模型,既要它有用,又要它安全。两个奖励模型分别打分,然后你把分数加权一加,扔进 GRPO 里训。一开始挺好,可训着训着发现,有用性涨不动,安全性也没起色,像是卡在某个地方僵住了。

问题就出在"加权求和"这一步。

设想一条具体的 rollout:它给出了一个很有帮助但稍微踩了点安全红线的回答。有用性奖励的优势是 +1.5,安全性奖励的优势是 -1.4。两个一加,净优势只剩 +0.1。这条样本本来携带了非常丰富的信息——它清楚地告诉模型"这个方向有用但不安全",但在聚合的那一刻,这些信息被压缩成了一个接近零的标量。模型从它身上几乎学不到东西。

更糟的是,这种"高度冲突但净优势接近零"的 rollout,和那种"各维度都没意见、本来优势就接近零"的平庸 rollout,在最终的标量优势上长得一模一样。模型根本分不清谁是谁。真正有信息量的冲突样本,就这么被稀释掉了。

这就是论文说的多奖励冲突,即 multi-reward conflicts。它不是某个模型或某个任务的偶发问题,而是多奖励 RL 里一个普遍存在的结构性麻烦。

之前的方案大致分三条路:奖励层面重加权(给不同目标设权重)、梯度层面协调(对齐各维度梯度方向)、优势层面归一化(GDPO 那一类)。前两条都太粗——它们在全局层面做权衡,管不住单条 rollout 级别的局部抵消。GDPO 进了一步,把每个维度的优势单独归一化,避免了尺度塌缩,但它最后那一步加权求和,还是把多维信号拍扁成了一个数。该抵消的,一个都没少。


🧠 GD²PO 的核心思路:抵消之前,先把打架的拦下来

论文的核心哲学一句话能说清:在优势聚合成标量之前,先判断这条 rollout 的各维度优势方向是不是一致;不一致的,直接 mask 掉

这个想法的灵感来自 DAPO。DAPO 干的事是:如果一组采样的回答全对或全错,那这组的优势在 group 归一化后全是零,没有学习信号,直接丢掉,只保留那些"有对有错"的混合组。它过滤的是"组内一致性"。

GD²PO 把这套搬到了多奖励的优势空间。DAPO 看的是"答案对不对"的一致性,GD²PO 看的是"不同奖励维度的优势方向一不一致"。

图1:GD²PO 整体框架与性能对比。左侧展示了 GD²PO 的工作流程——先对各奖励维度解耦计算 group-relative 优势,然后做 rollout 级别的冲突感知过滤,剪掉高度不兼容的样本,再用 query 级别的重加权稳定策略优化。右侧是工具调用和有用性-安全性对齐任务上的性能对比,GD²PO 稳定超过 GRPO 和 GDPO。

整个流程分两层,我们一层一层看。

第一层:Rollout 级别的冲突感知过滤

怎么判断一条 rollout 算不算"冲突"?论文给了两种规则。

硬过滤 Hard Filtering:简单粗暴。只要存在两个奖励维度 \(i\)\(j\),它们的优势符号不一样(\(\text{Sign}(A_n^i) \neq \text{Sign}(A_n^j)\)),这条 rollout 就被判定为冲突,直接丢。保留指示符是:

\[\delta_{\text{hard}}(\bm{y}_n) = \mathbf{1}\{\text{Sign}(A_n^i)=\text{Sign}(A_n^j),\forall i,j\}\]

零优势被当作中性,不算冲突。

基于 SNR 的过滤 SNR-Based Filtering:硬过滤有个明显毛病——太严了。只要有一丁点符号不一致就全丢,可现实里很多"轻微分歧"并不会造成灾难性的信号抵消。论文借了信号处理里"信噪比"的概念,定义了一个软性的一致性度量:

\[\text{SNR}_n = \frac{\left|\sum_{i=1}^{M}w_i A_n^i\right|}{\sum_{i=1}^{M}|w_i A_n^i| + \epsilon}\]

分子是"加权求和后还剩多少"(信号),分母是"各维度优势绝对值的总和"(总潜在量级)。当各维度优势方向一致时,分子分母接近,SNR 趋近 1,说明这是个干净、建设性的更新;当正负优势大量互相抵消时,分子被吃掉,SNR 趋近 0,说明这条 rollout 的聚合更新被破坏性干扰主导了。

然后设个阈值 \(\tau\),\(\text{SNR}_n > \tau\) 的保留,否则丢掉:

\[\delta_{\text{SNR}}(\bm{y}_n) = \mathbf{1}\{\text{SNR}_n > \tau\}\]

这个 SNR 的设计我觉得是全文最漂亮的地方。它给了"冲突程度"一个连续的刻画,而不是硬过滤那种非黑即白。直觉上也很顺:你保留的是那些"虽然有点分歧但整体方向还很明确"的样本,只剔除那些"建设性信号被彻底稀释"的。

第二层:Query 级别的重加权

光过滤 rollout 还不够。论文进一步想:经过过滤后,不同 query 保留下来的 rollout 数量是不一样的。有的 query 保留了 4 个里的 3 个,有的只剩 1 个。剩得少,意味着这个 query 本身就充满冲突,它提供的监督信号天然更"吵",那是不是应该更保守地更新它?

论文做了个简单的方差分析。把保留下来的 rollout 数记为 \(\kappa(\bm{x})\),过滤后的 query 级更新可以抽象成 \(g_\delta(\bm{x}) = \frac{1}{G}\sum_n \delta(\bm{y}_n)z_n\)。假设保留的 rollout 贡献近似独立、均值 \(\mu_x\)、方差 \(\sigma_x^2\),那么它的信噪比(期望除以标准差)大致是:

\[\frac{|\mathbb{E}[g_\delta(\bm{x})]|}{\sqrt{\text{Var}[g_\delta(\bm{x})]}} = \sqrt{\kappa(\bm{x})}\frac{|\mu_x|}{\sigma_x}\]

这个比值随 \(\kappa(\bm{x})\) 单调递增——保留的样本越多,这个 query 的更新越可靠。所以论文用"保留比例" \(\hat{\kappa}(\bm{x}) = \kappa(\bm{x})/G\) 作为可靠性代理,直接拿来缩放每个 query 的更新强度。

合在一起,GD²PO 的最终目标函数是:

\[\mathcal{J}_{\text{GD}^2\text{PO}} = \mathbb{E}_{\bm{x},\mathcal{G}(\bm{x})}\Big[\frac{1}{G}\hat{\kappa}(\bm{x})\sum_{n=1}^{G}\frac{1}{|\bm{y}_n|}\sum_{t=1}^{|\bm{y}_n|}\gamma_n^t\big(\theta,\delta(\bm{y}_n)\cdot\textstyle\sum_{i=1}^{M}w_i A_n^i\big)\Big]\]

\(\delta(\bm{y}_n)\) 在 rollout 级别掐掉冲突样本,\(\hat{\kappa}(\bm{x})\) 在 query 级别给冲突多的查询降权。两个机制一前一后,把策略更新聚焦到那些多奖励信号更一致的 rollout 和 query 上。

说实话,这套设计的优雅之处在于它几乎不增加额外计算——SNR 和保留比例都是从已经算好的 reward-wise 优势里现成推出来的,没有额外的模型、没有额外的前向。这种"零成本嫁接"在工程上是很受欢迎的。


🧪 实验:冲突真的普遍存在,过滤也真的有用

实验设置

两个任务: - 工具调用:用 ToolRL 的 RLLA 训练集(4K 工具使用样本),在 API-Bank 上评测(73 个 API 工具、314 段对话、753 次 API 调用,分三个难度等级)。奖励有三个维度——正确性(\([-3,3]\))、格式(\([0,1]\),二值)、长度(\([0,1]\),鼓励更充分的推理)。 - 有用性-安全性对齐:用 Alpaca 训练集做策略优化,在 HH-RLHF、PKU-SafeRLHF、Alpaca 上评测。两个奖励维度——useful 和 harmless,用 Amo 项目放出的奖励模型打分。

骨干模型涵盖 Qwen2.5-1.5B/3B/7B-Instruct、Llama3.2-3B-Instruct、Llama-3.1-8B-Instruct。baseline 是 GRPO 和 GDPO。所有实验基于 verl 框架,8 张 A800,默认等权重(\(w_i=1\))。

主结果一:两奖励工具调用

先看正确性+长度的两奖励设置。所有方法的长度奖励都接近 1.00(长度目标基本饱和),所以差异主要体现在正确性上。

模型 方法 Correct Acc. Length Rew. Overall
Qwen2.5-1.5B GRPO 51.46 0.99 1.505
GDPO 50.89 1.00 1.509
GD²PO-Hard 52.96 0.99 1.520
GD²PO-SNR 52.36 1.00 1.524
Qwen2.5-3B GRPO 61.24 0.99 1.602
GDPO 61.57 1.00 1.616
GD²PO-Hard 62.88 1.00 1.629
GD²PO-SNR 62.35 1.00 1.624
Llama3.1-8B GRPO 57.05 1.00 1.571
GDPO 55.44 1.00 1.554
GD²PO-Hard 58.79 1.00 1.588
GD²PO-SNR 58.79 1.00 1.588

跟每个骨干上最强的 baseline 比,GD²PO-Hard 的正确率分别提升了 1.50、1.31、1.74 个百分点。在两奖励设置里,硬过滤反而比 SNR 更好——论文解释是:只有两个维度时,符号分歧本身就是个足够可靠的冲突信号,直接按符号过滤最干脆。

主结果二:有用性-安全性对齐

模型 方法 HH-RLHF Avg PKU Avg Alpaca Avg Overall Avg
Llama3.2-3B GRPO 5.204 6.171 5.893 5.756
GDPO 5.197 6.179 5.904 5.760
GD²PO-Hard 5.269 6.192 5.965 5.808
GD²PO-SNR 5.232 6.171 5.934 5.779
Qwen2.5-7B GRPO 4.853 6.110 5.312 5.425
GDPO 5.014 6.136 5.652 5.600
GD²PO-Hard 5.105 6.194 5.811 5.703
GD²PO-SNR 5.071 6.135 5.794 5.667

这里有个值得点的细节:GD²PO 的提升不是靠牺牲一个维度换另一个。多数设置下,useful 和 harmless 是一起涨的,而不是此消彼长。下面这张训练动态图说得很清楚。

图2:Qwen2.5-7B-Instruct 上有用性-安全性对齐任务的训练动态。左为 useful 分数,右为 harmless 分数,对比 GRPO、GDPO、GD²PO-Hard、GD²PO-SNR 四种方法。GD²PO 的两个变体在大部分训练过程中都维持在更高水平,且 useful 和 harmless 倾向于同步提升,而非明显发散。

两条曲线没有出现明显的"你上我下",而是同步往上走。这恰好印证了 GD²PO 的核心主张——通过稳定两个目标的优化,而不是在它们之间做零和权衡,来改善对齐。

主结果三:三奖励工具调用

加上格式奖励,变成正确性+格式+长度的三奖励设置。这时候情况反过来了——GD²PO-SNR 成了最强的那个

模型 方法 Correct Acc. Format Acc. Length Overall
Qwen2.5-1.5B GDPO 55.34 86.87 1.00 2.422
GD²PO-Hard 54.47 94.51 0.99 2.480
GD²PO-SNR 56.01 91.53 1.00 2.475
Qwen2.5-3B GDPO 60.50 99.90 1.00 2.604
GD²PO-Hard 60.80 99.90 1.00 2.607
GD²PO-SNR 60.97 99.80 1.00 2.608
Llama3.1-8B GDPO 60.70 100.00 1.00 2.607
GD²PO-Hard 61.37 99.90 1.00 2.613
GD²PO-SNR 62.75 99.97 1.00 2.627

为什么维度多了,SNR 反而占优?论文给的解释挺有道理:维度一多,纯按符号过滤就太粗暴了——有些 rollout 可能在某个维度上有轻微分歧,但整体更新方向其实很明确。硬过滤会把这种"轻伤"也一刀切掉,而 SNR 能区分"轻微分歧"和"严重抵消",保住有用信号。这个发现挺关键:它告诉你过滤规则的选择要看奖励维度数,不是一招吃遍天。

冲突到底有多普遍?

这是我觉得论文最有说服力的一块。作者直接统计了训练过程中的"冲突比例"(优势符号不一致的 rollout 占比)。

图3:训练过程中的冲突比例动态。左图是正确性+长度设置下不同骨干模型的冲突比例,右图是 3B 骨干上不同任务的对比。冲突在不同模型和任务上都普遍存在,但时间模式各异——有的集中在早期快速下降,有的持续更久或在后期达峰。

结论很明确:冲突不是个别现象,跨骨干、跨任务都存在,但它是个动态的训练现象,而不是某个模型的静态属性。有意思的是,三奖励设置的早期冲突比两奖励更高(维度多了,分歧机会自然增加);而有用性-安全性对齐的冲突贯穿整个训练过程,反映了"有用"和"无害"之间那种持久的张力。这组观察其实是 GD²PO 存在的最好理由——既然冲突真实而普遍,那么针对性地处理它就是必要的。

消融:阈值敏感性和重加权

阈值 \(\tau\) 敏感吗?在 Qwen2.5-3B 三奖励设置上扫了一遍。

图4:GD²PO-SNR 在 Qwen2.5-3B-Instruct 上的阈值敏感性。左图是不同 τ 值下的保留比例,右图是对应的整体正确率。GD²PO-SNR 在所有测试阈值上都超过 GDPO,其中 τ=0.5 取得最高正确率。

结论是:在测试的阈值范围内,GD²PO-SNR 一直压着 GDPO,说明方法对 \(\tau\) 的选择是稳健的。\(\tau=0.5\) 表现最好——太小过滤太弱(保留比例高),太大早期剪掉太多,中间值给了个更平衡的过滤行为。

query 级重加权(QR)有没有用?单独消了一下:

方法 Correct Acc.
GDPO 61.57
Hard w/o QR 62.51
Hard 62.88
SNR w/o QR 62.21
SNR 62.78

光做冲突过滤(w/o QR)就已经比 GDPO 强了,再叠加 query 级重加权还能再涨一点。两个机制是叠加增益的,不是其中一个在白干。

论文附录还做了个挺巧的验证:把 rollout 按 SNR 排序,分别用高一半(Low-Conflict Half)和低一半(High-Conflict Half)训。结果 Low-Conflict Half 正确率 61.84,超过 GDPO 的 61.57,而 High-Conflict Half 只有 60.67,低于 GDPO。两组用的 rollout 数量相同,差距只能来自冲突程度——这直接证明了 SNR 确实能区分"靠谱信号"和"被抵消掉的噪声"。


💡 我的判断:小而准的一刀,但别指望它改写格局

先说优点。这篇论文的问题定义非常清晰,SNR 那个度量设计得干净利落,而且几乎零额外开销。最打动我的是"冲突比例动态"那组实验——它没有停留在"我提出了一个方法"的层面,而是先扎实地证明了"这个问题真实存在且普遍",再顺理成章地引出解法。这种"先确诊再开药"的论证节奏,比那种上来就堆方法的论文要扎实得多。

两个过滤规则随维度数切换(两维用 Hard、多维用 SNR)的发现也很实用,直接告诉了你工程落地时该怎么选。

再说几个我觉得需要冷静看待的地方。

第一,提升幅度是真实的,但不大。三奖励工具调用上最大的整体分提升是从 2.607 到 2.627,正确率层面大多是 1-2 个百分点的量级。这是个稳健的工程改进,不是数量级的飞跃。论文自己也很克制,没有用"颠覆""首创"之类的词,这点我反而欣赏。

第二,它本质上是 GDPO + DAPO 式过滤的组合。创新点是把 DAPO 的过滤哲学迁移到多奖励优势空间,并加了 SNR 这个软度量。idea 漂亮,但它是站在两个已有工作肩膀上的精准嫁接,不是凭空起的新范式。

第三,也是论文自己承认的——SNR 过滤引入了阈值 \(\tau\)。虽然敏感性分析说它在合理范围内稳健,但最优阈值会随任务、奖励尺度、奖励组合、骨干变化。作者把"自适应阈值"列为了未来工作,这块确实还没解决。

工程上的启发很直接:如果你正在做多奖励的 RL 后训练,尤其是奖励维度之间存在天然张力(有用 vs 安全、详细 vs 简洁),那么在优势聚合前做一道冲突过滤,几乎是稳赚不赔的。它代码改动小、不增加额外模型、效果稳定。维度少用硬过滤,维度多用 SNR,\(\tau\) 先从 0.5 试起。

附录里四个 case study 也值得一看——从"密码修改需要先认证""追踪未完成的 LikeCount 调用",到"牙贴面咨询""礼貌拒绝恶作剧请求",GD²PO 在语义决策层面确实表现出更好的工具依赖追踪和更清晰的安全边界,而不只是格式上更规范。这些定性结果跟定量数字互相印证,让整套方法更可信了。

总的来说,这是一篇定位清楚、论证扎实、工程友好的好论文。不指望它改写多奖励 RL 的格局,但如果你手头正好有这个痛点,它给的这一刀,下得准、下得值。


觉得有启发的话,欢迎点赞、在看、转发。跟进最新 AI 前沿,关注我