当标准答案不存在时:RiVER 如何让 LLM 从"比谁更好"中学习
一个没有标准答案的考场
想象一场编程竞赛,考的不是"写出二分查找"这种有标准答案的题,而是"给 500 个城市设计一条最短旅行路线"。没有最优解——因为这是 NP-hard 问题,连出题人都不知道最优路线长什么样。考官能做的只是:跑你的代码,看它花了多长时间、走了多远。
这就是 AtCoder Heuristic Contest(AHC)的赛制。你提交一个启发式算法,系统在隐藏测试用例上跑,给你一个分数。分数越高越好,但没有人能告诉你"满分是多少"。
问题来了:如果想让 LLM 在这种"没有标准答案"的任务上变强,怎么训练?
传统的强化学习用可验证奖励(RLVR)训练 LLM,依赖的是标准答案——代码能跑通就是 1 分,跑不通就是 0 分。数学题有标准答案,编程题有测试用例。但启发式优化呢?你的 TSP 路线走了 12000 公里,我的走了 11500 公里,咱俩都"可行",但我不比你知道的更优。没有 ground truth,RLVR 的奖励信号就断了。
RiVER(Ranking-induced VERifiable framework)就是来填这个坑的。
核心洞察:不需要知道最优解,只需要知道"谁更好"
RiVER 的思路极其优雅:既然没有绝对标准,那就用相对排名。
具体来说,对同一个问题,让 LLM 采样 G 个候选解(比如 8 个不同的启发式程序),在相同的隐藏测试实例上跑一遍,得到一组分数。然后按分数排名——第一名拿最高奖励,后面的递减。
这听起来简单,但作者发现了两个致命的坑:
坑一:尺度支配(Scale Dominance)
假设有 10 个测试实例。程序 A 在实例 1 上拿了 980 分,程序 B 拿了 950 分——A 比 B 好 30 分。但在实例 2 上,A 拿了 200 分,B 拿了 50 分——A 比 B 好 150 分。如果直接用原始分数差做奖励,实例 2 的信号会完全淹没实例 1 的信号,即使两个实例上 A 都比 B 好。
问题在于:不同实例的分数尺度天差地别。一个 TSP 实例总距离可能是 10000,另一个可能是 50000。直接用原始分数做 GRPO 的组内归一化,模型会被高分实例支配,学不到细粒度的比较信息。
RiVER 的解法:实例内排名。对每个测试实例单独排名,把原始分数转成排名信号。不管实例 1 的绝对分是 980 还是 98000,只要 A 比 B 好,A 就排第一。这把不同尺度的分数统一到了同一个"排名空间"。
坑二:频率支配(Frequency Dominance)
GRPO 的标准做法是组内归一化:把 G 个样本的奖励减去均值、除以标准差。但这里有个隐蔽的问题——一个平庸但经常被采到的解,可能因为出现次数多而累积了比一个稀有的优秀解更多的梯度更新。
打个比方:一个平均分 60 分的学生考了 10 次,另一个平均分 90 分的学生只考了 1 次。如果简单加权,60 分的学生可能因为"出场次数多"而获得更多话语权。这在 RL 中会导致策略被平庸解拖拽。
RiVER 的解法:胜者加权(winner-heavy reward shaping)。排名越高,奖励权重越大,且呈非线性增长。第一名拿的奖励远超第二名,第二名又远超第三名。同时,对排名靠后的解保留一个有界的非零奖励——避免完全忽略它们,毕竟一个排名垫底的解也包含了"什么不该做"的信息。
训练流程:从代码到排名到策略更新
把整个 RiVER 流程串一遍:
1. 采样:对问题 q,从当前策略 π_θ 中采样 G 个响应,每个响应包含一段推理 + 一个可执行程序。 2. 执行:提取每个程序 c_i,在 M 个隐藏测试实例上跑,得到有效性矩阵 V(G×M)和分数矩阵 F(G×M)。跑崩的记 -∞。 3. 排名:对每个测试实例 m,把 G 个程序在该实例上的分数排名。程序 i 在实例 m 上的排名记为 rank(i,m)。 4. 奖励塑形:用 winner-heavy 函数把排名转成奖励。对每个程序 i,聚合它在所有 M 个实例上的排名信号,得到一个标量奖励 R_i。 5. GRPO 更新:用 R_i 做组内归一化得到优势 A_i,用 clipped surrogate objective 更新策略。
关键在于:整个过程不需要任何 ground truth 解。评估器只做两件事——检查可行性(程序是否跑通、输出格式是否正确)和计算目标值(走了多远、花了多少时间)。这俩操作对 NP-hard 问题是高效的,不需要知道最优解。
实验结果:在没见过的任务上也变强了
RiVER 在 12 个 AHC 任务上训练,然后在三个 benchmark 上测试:
- ALE-Bench(算法工程基准):RiVER 超过基线方法,在启发式优化任务上显著提升。
- LiveCodeBench(代码生成):RiVER 训练的模型在标准代码生成任务上也变强了——虽然训练时没见过"有标准答案"的编程题。
- USACO(算法竞赛):同样有提升。
为什么这件事重要
1. 打破 RLVR 的标注瓶颈
RLVR 最大的问题是需要标准答案。数学题有人算过答案,代码题有测试用例。但现实中大量重要问题没有标准答案——投资组合优化、物流调度、芯片布局、药物分子设计。RiVER 证明了:只要你能定义一个评分函数(不需要知道最优解),就能用 RL 训练 LLM。
2. 密集信号 > 稀疏信号
二值奖励(对/错)是极度稀疏的——1000 个 token 的推理链只有最后一个 token 拿到 0 或 1。RiVER 的排名信号是密集的:G 个解中每个都有自己的排名,每个排名都贡献梯度。这解释了为什么迁移效果好——模型学到的不是"怎么答对",而是"怎么更好"。
3. "比谁更好"是更自然的学习信号
人类学习也不总是靠标准答案。程序员 review 同事代码时学到的不是"正确写法",而是"这种写法比那种好"。棋手通过复盘对局学到的不是"最优走法",而是"这步比那步好"。RiVER 把这种"相对比较"信号形式化为了 RL 训练的奖励。
代码可用性
论文未提供公开代码仓库。训练数据为 12 个 AtCoder Heuristic Contest 任务,评估使用 ALE-Bench、LiveCodeBench 和 USACO,均为公开 benchmark。复现需要自行实现排名塑形 + GRPO 训练循环。
一句话总结
RiVER 把"没有标准答案"从 RLVR 的死胡同变成了新赛道——不需要知道最优解,只需要知道"谁更好",排名信号 + 胜者加权就能训练出在多种推理任务上都变强的 LLM。
---
*深度研究回复 | 论文 arXiv: 2606.27369 | RiVER: Ranking-induced Verifiable Framework*