自奖励方法入门:让模型自己当选手又当裁判,涨得快,分数却偏向自己
「让模型自己给自己打分」,这句话几乎概括了整个自奖励的方向。它省掉了整条流程里最贵的一环,也就是人工标注偏好数据,看起来像一架能自动往上爬的梯子。但它同时把两个本来分开的角色塞进了同一个模型里:一边生成回答,一边给回答判分。裁判和选手同体,这既是这套方法最大的卖点,也是它最可疑的地方,全篇的线索就落在这个矛盾上。
RSI 这个缩写在日常讨论里不是指某一个方法,而是指一整块「信号自我产生、自我迭代」的方法群:模型自己产出训练信号,再把信号回灌给自己。文献里与它最贴近的具体所指,是 Self-Rewarding Language Models 给出的那个最小循环。接下来我们按六步走完这条线:先把循环讲清楚,再依次回答榜单上的分在比什么、这些分能不能信、要训练还是不训练,最后落一条能跑的动手路径。
1. 自己给自己打分:自奖励的最小循环到底怎么转
1.1 先把三个词分开
reward model(奖励模型)做的事情很具体:把「哪个回答更好」学成一个可以打分的函数。给定同一个问题的两个回答,它输出两个标量,谁的分高就算谁赢。它在整条流程里有三种身份,混在一起就容易读不懂论文。训练对齐模型的时候,它是 RLHF 流程里的中间产物,负责充当人类偏好的代理;做自奖励的时候,它变成训练信号本身,模型拿它的输出去重排候选、构造偏好对;到了评测阶段,它又变成被评测的对象,RewardBench 这类榜单测的其实不是语言模型的对话能力,而是 reward model 打分的准不准。
self-rewarding(自奖励)与 self-rewarding LM 说的则是同一件事的两种粒度,前者指「模型自己打分给自己产偏好数据」这类做法,后者特指 Yuan 等人在 2024 年给出的那套完整循环。RSI 是读者拿来指代这一整块方法群的上位说法,本篇按这个用法走,不额外给 RSI 安一个更窄的定义。
1.2 最小循环只有两阶段,但要迭代很多轮
Self-Rewarding 的骨架可以拆成两阶段。第一阶段是初始化,先把基础模型在两类数据上做一遍 SFT:一类是 Open Assistant 的指令微调数据 IFT,另一类是让模型学会当裁判的评测微调数据 EFT。EFT 这一步不能省,没有它,第一代模型根本没有打分能力。第二阶段是循环,每一轮走四步:从指令数据里采样一批新 prompt,对每个 prompt 让当前模型采出 N 条候选回答,再让同一个模型按一套固定的打分标准给自己这 N 条候选打分,最后取分数最高和最低的两条组成一个偏好对,送进 DPO 训出下一代模型。标准是五项加性 criteria,relevance、coverage、usefulness、clarity、expertise,每项 0 到 5 分。
这条路线与传统 RLHF 的根本差别就在裁判身份上。标准 RLHF 里,reward model 训完就冻结,它的能力上限被锁死在人类偏好数据的水平;自奖励让裁判随训练一起涨能力。论文报告的 pairwise accuracy 变化把这件事量化了:从仅用 IFT 的 65.1%,到加了 EFT seed 的 78.7%,再随三轮自训练升到 80.4% 和 81.7%。这里要分清两段,前一段是从无到有教模型怎么当裁判带来的台阶,后一段才是自训练真正的累积效果。Self-Rewarding
用一张图把这条流水线看全,比读文字快得多。

图注:从新 prompt 出发,当前模型生成多条候选回答,再用 LLM-as-a-Judge 给自己这些回答打分,取最高和最低分组成偏好对,经 DPO 训练得到下一代模型,然后整条流程从头再跑一轮。底下是这套实验的起点:Llama 2 70B 基础模型加 Open Assistant 种子数据。注意这里的裁判不是另一个模型,它和生成回答的是同一组权重,训练用的是 DPO 而不是 PPO,EFT 初始化那一步也不能省。Self-Rewarding
一个写代码的人如果既写实现又给自己写测试,通常能抓住那些自己一眼就知道不该犯的低级错误,但对自己思路里的盲区几乎免疫,因为「哪里可能错」和「哪里不会错」用的是同一套判断。自奖励里的裁判处境一样,它天生看不见自己生成内容的系统性毛病。这句话先记着,第 3 章会拿数字把它钉死。
1.3 给裁判一个坐标系
「模型当裁判」在文献里有标准的拆法。给定待评的输入和一段上下文提示,裁判本质上就是让语言模型在这两者拼起来之后输出一个判断,输出的判断被约束成四种格式:打一个分、回答是或否、在两条里选一条、在多个候选里选一个或排个序。这四种格式不是随便分的,它们对应不同的工程取舍。JudgeSurvey

图注:左边是输入设计,单文本、成对文本、批量多候选分别接进 prompt 模板;右边是四种输出格式,打分、是否、两两比较、多选排序,各自是一个独立的判断形状,最右端汇总进评测流水线。其中两两比较是最容易招位置偏差和长度偏差的格式,这一条直接决定第 3 章要检查什么。JudgeSurvey
知道了「自奖励就是同一个模型既当选手又当裁判、信号自产自销」,紧接着的问题就很自然了:既然裁判和选手是同一个模型,我们凭什么相信它打出来的分?要回答这个,得先有一把尺子。
2. RewardBench 在比什么:从五分项到六分项,协议换了分数就塌
2.1 榜单的最小打分协议
RewardBench 的评测协议简单到可以用一句话说完。每道题配一个 chosen 回答和一个 rejected 回答,reward model 分别给这两个回答独立打分,chosen 的分更高就算一次 win,准确率就是 win 的次数除以题数。因为每道题只有两个选项,随机乱猜的基线是 50%。RewardBench

图注:同一个 prompt 分叉成两条独立分支,分别与 chosen 和 rejected 两个回答组合,各过一个 reward model 节点得到一个标量分数,右边再比较两个分数得出赢或输。图里出现的回答文本只是通用示意,不是某个具体分项的真实样本。RewardBench
v1 把题目分成五块。Chat 和 Chat Hard 测基本对话与刁钻指令,Safety 测该拒答时是否拒答、该回答时是否回答,Reasoning 测代码与数学,Prior Sets 则是从已有偏好数据集中搬来的对照块。这里有两个容易被忽略的加权规则:Prior Sets 在总分里只按 0.5 的权重计入,因为它噪声大、任务定义不清;Reasoning 内部 PRM-Math 的权重被人为上调,好让代码和数学在最终分数里权重相等。读 v1 分数时如果不看这两条,会误判某个模型的能力结构。
2.2 v2 换了三件事,随机基线跟着降
RewardBench 2 仍然沿用同一套 chosen 比 rejected 的准确率口径,但把三件事改掉了。提示词全部换成 WildChat 里未在下游评测中出现过的人类 prompt,目的是堵住测试泄漏;评测格式从一对一改成一对三的 best-of-4,每条题目含四条回答只有一条是 chosen,随机基线因此从 50% 压到 25%;分项也重排成六块,Factuality、Precise IF、Math、Safety、Focus、Ties,合计 1,865 条 prompt,六项之间是等权平均,不再有 Prior Sets 那种 0.5 权重。RewardBench2

图注:左边是人类 prompt 经模型池生成候选、再从中四选一的流程,中间一排是六个能力分项,右边是把这份评测分数与 best-of-N、RLHF 下游表现关联起来的部分。六个分项不是六个并行任务,而是同一套 best-of-4 准确率协议下按能力切出的不同 prompt 池。RewardBench2
六个分项各自测一种能力,题量并不平均。
| 分项 | 题量 | 在比什么 |
|---|---|---|
| Factuality | 475 | 回答里的事实是否站得住,包含自然错误与系统提示诱发的错误 |
| Precise IF | 160 | 多条约束指令是否被逐条满足,正确性由验证函数判定 |
| Math | 183 | 数学题答案是否正确 |
| Safety | 450 | 该拒答时拒答、该回答时回答 |
| Focus | 495 | 会不会被无关上下文带跑 |
| Ties | 102 | 多个等价正确答案之间,分数排序是否与真实质量次序一致 |
六个分项里最难的两块是 Precise IF 和 Math。论文的说法是,多数处于领先位置的 reward model 在这两项上分别没能做到 40% 和 70% 的准确率。这句话要按「大多数领先模型」来读,不是「所有头部模型」,因为发布表里就有个别模型把 Precise IF 顶到了 66 分上下。RewardBench2
2.3 协议一换,同一模型掉一大截
v2 升级里最有判断价值的一条证据是跨版本对比:同一个模型,从 v1 换到 v2,平均掉大约 20 分。模型没有变,权重没有变,掉的这 20 分完全来自评测协议变了:看的是没见过的 prompt,比的是四选一。

图注:横轴是模型在 v1 上的分数,纵轴是同一个模型在 v2 上的分数,每个点代表一个 reward model。整片点云明显落在对角线的下方,说明换成 v2 之后同一模型的分数整体下沉。要看某个具体模型在两个版本上各是多少,请查论文表格,不要从这张图上的点位去读精确数字。RewardBench2
所以榜单分数永远是相对协议而言的。看到「某模型 96 分」先问这是哪个版本的榜、用的是什么协议,否则这个数字没有意义。作为参照,Skywork-Reward-V2-Llama-3.1-8B 在论文报告时点上是 v1 96.4、v2 84.1,这个模型第 6 章会拿来做 baseline,届时我们会用它验证自己的实现口径。
榜单的评测脚本入口也在这里交代清楚:scripts/run_rm.py 跑 v1 协议,scripts/run_v2.py 跑 v2 协议,都来自 allenai/reward-bench 这个仓库。它们第 6 章会再出现,那时是我们检查自己实现对不对的工具。
分辨「哪个模型分高」这件事到此为止。但还有一个更基本的问题没能被榜单回答:分数高的裁判,打的分就真的可信吗?尺子本身也需要被检查。
3. 榜单高分能信吗:JudgeBench 把裁判的偏见抓了现行
3.1 换一个问题去问裁判
之前的裁判评测大多在问「你的判断和人类偏好一致吗」。这个问法在知识、推理、数学、编程这类有客观对错的题目上并不牢靠,因为人类偏好本身会把风格差异当成能力差异。JudgeBench 换了个问法,直接问「你能不能把客观正确的回答和客观错误的回答分开」。题目来自带标准答案和自动验证器的困难数据集,用强模型对同一道题采样 k 条回答,再自动判出哪条对哪条错,最后把一正一错配成一对。全库共 350 对,其中 Knowledge 154 对、Reasoning 98 对、Math 56 对、Coding 42 对。错误的那条被刻意做成「轻微错误、一眼看不出来」,裁判想判对就必须真的把题算一遍。JudgeBench

图注:四步走完 350 对客观正误样本的构造:从带标准答案的困难数据集取题,用强模型采样 k 条回答,逐条判定正确性,再配对。最后一步是每对回答交换顺序各评一次,把两次判决聚合起来,这一步只能在协议层缓解位置偏差,不能把它消除。JudgeBench
分数落差是这份工作的核心证据。直接用原版 prompt 的 GPT-4o 只拿到 50.86%,基本等于随机;换更复杂的评测 prompt,Arena-Hard Judge 版本的 GPT-4o 也只到 56.57%;微调过的裁判里最好的是 Skywork-LLaMA-3.1-70B,57.43%。直到把带 test-time compute 的 o3-mini 拿来当裁判,才跑到 70% 到 80% 的区间。这个排序说明一件事:当前裁判的瓶颈是它自己的推理能力,不是 prompt 技巧。反过来这也解释了为什么自奖励循环多转几轮就会钝下去,裁判的天花板压在那里,选手再努力也涨不过它。
3.2 三种偏差,三种命运
裁判的三类典型偏差在 JudgeBench 上被摆成了可量化的东西,它们的应对方式也各不相同。
| 偏差 | 表现 | 缓解手段 | 结果 |
|---|---|---|---|
| position bias | 裁判倾向把排在前面位置的回答判优 | swap-averaging:同一对换顺序评两次,两次判决不一致就判无效 | 只是缓解,不是消除 |
| length bias | 裁判倾向把更长的回答判优 | 构造数据时用同一模型 k 次采样配对,让正确与错误回答长度自然接近 | 在该数据集上被协议消除 |
| self-enhancement bias | 裁判偏向自己生成的回答 | 不用同一个模型同时当裁判和被评对象 | 需要换模型,后处理补不了 |
length bias 这条的数字很干净:350 对样本里,正确回答平均 562.29 个 token,错误回答 561.16 个 token,差距约 0.2%。长度几乎被对齐到没有差别,裁判就没有长度可依赖了。self-enhancement bias 这条更值得记住:把生成候选回答的模型从 GPT-4o 换成 Claude-3.5-Sonnet,同一个 Claude-3.5-Sonnet 在别人生成的样本对上能判到 64.3%,在它自己生成的样本对上掉到 44.8%。裁判面对自己的产出时会明显失准,这是裁判与选手同体这件事在数字上最直接的实锤。JudgeSurvey
所以读任何一份 RM 或裁判分数之前先问三件事:评的时候交换过位置吗,两边回答的长度对齐了吗,当裁判的模型和被评的模型是不是同源。三个问题里有任何一个答不上来,那个分数就只能当作参考。
现在把这条线索接回第 1 章:自奖励循环里的 judge 和 actor 正是同一个模型,它天然继承了这些偏差。那么把这种自产信号回灌到训练里反复迭代,是会越转越好,还是越转越假?
4. 把自产信号回灌训练:循环越转越好,还是越转越假
上一章说的是评测场景里的裁判,这一章要看的是一模一样的裁判被放进了训练循环。这一路走下来有四篇代表工作,两个病灶、两种补法,外加一条干脆绕开循环的工业级打法。
4.1 循环确实能转,但涨得非常不均匀
Self-Rewarding 的主数字来自 Llama 2 70B 加 Open Assistant 种子数据,三轮迭代在 AlpacaEval 2.0 上的 win rate 从 9.94% 升到 15.38%,再升到 20.44%,评判方是 GPT-4,对手是 GPT-4 Turbo。这一轮的收益是真实的,20.44% 已经越过 Claude 2(17.19%)和 GPT-4 0613(15.76%)的位置。
但按指令类别拆开看,收益分布得很不均匀。

图注:横轴是 AlpacaEval 的指令分类,每个分类上叠着三轮迭代的位置。Generation、Extraction、Closed QA 这几类随迭代逐步抬升,Math 和 Reasoning 几乎不动。论文把原因归结为种子数据里数学与推理样本偏少。这里只看趋势,不要去读柱子的精确高度。Self-Rewarding
「循环能转,但转起来会偏」这件事是后面两个补丁的共同起点。
4.2 病灶一:裁判自己从没被训练过
Self-Rewarding 的循环里,每一轮被训练的只有生成回答的那一侧。judge 的打分能力完全靠第一轮之前那次 EFT 初始化撑着,它不随迭代更新,所以很快就会饱和,挤不出新的训练信号。Meta-Rewarding 的补法是把裁判也训起来:同一个模型额外承担第三个角色 meta-judge,让它去比较自己写出的两份 judgment 哪个更好,从而产出一套新的 judge 偏好对。原来那套 actor 偏好对加上这套 judge 偏好对,一起送进 DPO 训下一代模型。

图注:第 t 步的语言模型同时做三件事,当 actor 生成回答、当 judge 给回答打分、当 meta-judge 评判自己的 judgment。actor 侧产出回答偏好对,judge 侧产出 judgment 偏好对,两套数据合起来训练下一轮模型。这不是 Self-Rewarding 的原版循环,多出来的那一整套 judge 偏好对就是补丁本身。Meta-Rewarding
补上这一步之后数字确实动了。Llama-3-8B-Instruct 上,AlpacaEval 2 的长度控制 win rate 从种子模型的 22.92% 一路升到第四轮的 39.44%,Arena-Hard 从 20.6% 升到 29.1%。同设置的 Self-Rewarding 加长度控制基线在第四轮只有 35.49%,两条曲线的差距主要在后两轮拉开,正好对应「judge 不被训练的话,后几轮 actor 涨不动」这个判断。Meta-Reward
这里有个反直觉的细节值得点出来:第三、四轮其实只用 actor 偏好对做 DPO,judge 偏好对只用在前两轮。按论文的解释,前两轮已经把 judge 训得足够好,后面几轮它给出的偏好数据质量够用,就不再需要新的 judge 偏好对了。所以这不是「四轮都合训」,读数字时别把前两轮的机制自动套到后两轮上。
代价也一并出现了。把 judge 训起来之后,它的打分分布开始整体右移。

图注:横轴是 judge 给出的分数,纵轴是密度,四条曲线分别是种子、SFT、第一轮和第二轮。种子与 SFT 几乎重合,峰在 4.0 附近;两轮训练之后主峰右移到 4.75 左右,均值从 4.1 升到 4.7 以上。这说明裁判越训越宽松,打分区间被压缩,能提供的分辨力反而在变少。不要说第二轮是「最优 judge」,分布右移不等于判得更准。Meta-Reward
这套漂移恰好是下一个病灶的早期征兆。
4.3 病灶二:正负样本一起变好,信号就塌了
Self-Rewarding 的偏好对里,chosen 和 rejected 都由当前这一代模型生成。随着迭代推进,模型整体变强,chosen 变好的同时 rejected 也在变好,两者之间的分数差被一点点磨掉。论文测到的是同一代际内 score gap 在 4 次迭代里缩小了约 9 倍,chosen 与 rejected 的表征相似度升到 0.85 到 0.95。DPO 靠的正是这个差值带来的梯度,差值趋近于零,梯度也就趋近于零,训练信号自己把自己耗尽了。

图注:左边是 chosen 与 rejected 之间的分数差,右边是两者之间的相似度,三个模型族用不同颜色区分。Self-Rewarding 在第一次迭代之后分数差迅速塌缩、相似度迅速上升;Temporal 方法在相同算力下把分数差维持住,相似度留在更低的区间。只作机制示意,不要去读柱子的精确数值。TemporalSR
Temporal Self-Rewarding 的解法分两半。Anchored Rejection 把负样本钉死,每轮用初始 SFT 模型 M_0 的输出当 rejected 并且不再更换,M_0 的能力是固定的,它产出的负样本就一直是那个弱基线。Future-Guided Chosen 则反向操作,先让当前模型基于锚定好的样本对做一次 DPO 得到一个临时的未来模型,再用这个未来模型生成更高质量的候选当 chosen。正样本继续往上抬,负样本原地不动,差值就保住了。
这个思路用工程语言说就是回归测试里的对照基线。一套测试用例如果跟着实现一起改,涨分说明不了任何东西,必须把对照钉在一个不再变动的旧版本上,才能看出新版本到底好多少。Anchored Rejection 钉的就是那个旧版本。
效果上,在 Llama-3.1-8B 上 Temporal Self-Rewarding 的 AlpacaEval 2.0 win rate 是 29.44%,同一篇论文里同期复现的 Self-Rewarding 基线是 19.69%,差 9.75 个百分点。这里要特别小心数字的参照对象:19.69% 是在 Llama 3.1 8B 种子上重跑 Self-Rewarding 得到的结果,而 4.1 节里的 20.44% 来自 Yuan 等人在 Llama 2 70B 上跑出的三轮最佳,两个数的基础模型不同,不能直接放在一起比大小。TemporalSR
4.4 工业级换打法:干脆不让裁判当队友
上面两个补丁都还在改循环本身,Skywork-Reward-V2 干脆换了一条路。它不再让同一个模型既当选手又当裁判,而是花大力气造一套高质量偏好数据,再训一个冻结的、专门打分的 reward model。数据来自 Hugging Face 上四十多个公开来源的偏好对,经过两阶段筛选。第一阶段是人在回路,人类和 LLM 标注员一起标注,用当前的 reward model 找出自己判断把握不大的样本优先送人工复核,迭代八轮,累计约一百万个偏好对。第二阶段不再需要人工,用一致性检查做大规模过滤:第一阶段训出的最佳 RM 和只用人工确认数据训出的 gold RM 都要点头,样本才留下,最后汇成 2,600 万条精选偏好对,训出八个尺寸的 reward model,全部在 8B 以下。

图注:上半是第一阶段,未经验证的偏好数据进入人与 LLM 标注员共同处理的回路,标成 gold 与 silver 两档,再用当前最佳 reward model 评估后把不确定的样本送回去继续迭代。下半是第二阶段,野生偏好数据同时过最佳 RM 和 gold RM 两道一致性过滤,汇成一致的子集,不再需要人工监督,被淘汰的样本回收再用。图里出现的 Best RM 和 Gold RM 是管线内部的中间模型,不是最终发布的八个尺寸。Skywork-V2
这条路线在七个 reward model 榜单上都拿到了当时的最高分,Llama-3.1-8B 版本的平均分是 85.8。它同时是本篇涉及的四篇工作里开源最完整的一个:八个尺寸的权重都能下载,推理脚本和评测入口都给了。需要说明的是那套 2,600 万精选数据背后的原始 4,000 万裸偏好对并没有公开下载入口,另有一个 4,000 万规模的实验版权重,README 里明确写了只供研究用途、不建议生产使用。Skywork-V2
训练路线到这里告一段落。它确实能涨,但信号一直在被自己的裁判磨损:judge 不训练会饱和,chosen 和 rejected 同步变好会让梯度衰减。工业级的答案是把裁判换成冻结的 RM,再把数据规模做上去。可这条路要训练、要算力。如果干脆不训练呢?
5. 不训练也能拿到自奖励信号:三条路径与各自的失效边界
不更新权重也能拿到「自我评价」的信号,关键在于把信号从训练循环里挪到推理时的采样和解码上。这条路上有三条主要路径,各自的边界都很清楚。
5.1 第一条:多数投票
Self-Consistency 的做法最小。先用 chain-of-thought(思维链)的样例把同一个模型提示好,然后把原来固定的贪心解码换成带温度采样,对同一道题生成多条推理路径,每条路径最后落在一个最终答案上,最后在这些最终答案里做多数投票,票最多的那个就是输出的答案。整篇论文强调的是它不训练、不需要任何额外标注、不引入辅助模型和微调,模型还是那个模型,只是把一个 prompt 用一次变成用几十次。
数字上,在 PaLM-540B 上相对 CoT 加贪心解码的基线,GSM8K 的绝对精度提升是 17.9 个百分点,SVAMP 是 11.0,AQuA 是 12.2,StrategyQA 是 6.4,ARC-challenge 是 3.9。这里必须连着说 base 模型:这些数字全部来自 540B 的模型,你要在自己的 8B 或 70B 模型上复现,期望值不能照搬。Self-Consistency

图注:三步走完一次自一致性推理:用 CoT prompt 提问,从解码器采样出一组各不相同的推理路径,每条路径各自给一个最终答案,最后汇总取出现次数最多的那个答案。这是同一个模型的自我集成,不是多个模型的 ensemble,也不涉及任何训练。图里的算术题只是流程示意,它的数字不代表方法的精度。Self-Consistency
这条路径的失效条件藏在它的机制里。多数投票能成立,前提是「正确答案唯一、错误答案发散」,同一个题目的多条采样会往同一个正确答案汇聚,错误则会散在不同地方。一旦答案空间是开放的,比如创作、对话、开放域问答,多条采样给出的是几个都说得通但互不等价的答案,没有可投票的等价类,众数就没有意义。同族的熵、置信度这类信号共享同样的边界。
5.2 第二条:解码时用对数差重打分
Contrastive Decoding 走的是另一条路。它同时装载同家族的一大一小两个冻结模型,大的叫 expert,小的叫 amateur,然后把下一个 token 的选择改成最大化两者对数概率之差,再配一个 α 取 0.1 的 plausibility 约束,把那些 expert 本身都没把握的 token 直接排除在候选之外。整个方法不训练任何东西,也不引入外部 reward model,信号就是两个冻结模型的对数概率差。
这个做法用工程类比说很好懂。同一段功能,写对的那份和写错的那份都会输出一些共有的东西,把两份输出相减,共有的部分互相抵消,剩下的就是只有正确版本才会说的内容。CD 减掉的正是 expert 和 amateur 都会说的部分,留下 expert 独有的知识信号。那个 plausibility 约束相当于给 diff 加了条底线,防止减出「两边都几乎不可能、但差出来很大」的空对空气 token,论文里的消融显示去掉它之后 MAUVE 会从 0.92 直接掉到 0.01。

图注:上半是 expert 模型在一个 prompt 上的下一个 token 概率,中间是 amateur 模型对同一 prompt 的概率,下半是两者相减后的对数差。在这个单 prompt 实例里,相减之后被顶到最前面的接续是 1961。这只是单个 prompt 上的一个例子,说明对数差如何放大知识信号、压低重复与跑题,不要把它当成完整的公式示意,也不要把 1961 这个结果推广到别处。ContrastDec
它的失效条件论文写得很直白:这套机制依赖「amateur 的失败模式能映照出 expert 的失败模式」。在摘要、机器翻译这类任务式生成里,两个模型的高质量模式重合度太高,相减之后剩不下什么有用信号,方法会退化成普通的束搜索。此外跨模型家族使用时必须共享同一套 tokenizer,否则 token 级的对数差根本无法对齐。ContrastDec
5.3 第三条:多采样,用现成 RM 重排
第三条路是把前面两条的聚合器换掉。不再做多数投票,也不再靠对数差,直接生成 N 条候选,让一个现成的冻结 reward model 逐条打分,选分最高的那条,也就是常说的 best-of-N。它省掉了训练和标注,代价是继承第 3 章讲过的全部裁判偏差:位置偏差、长度偏差,以及裁判与被评模型同源时最要命的自我增强偏差。如果被排的候选正是这个 RM 自己生成的,分数就不可信。
对想尽快跑通实验的人来说,最稳的组合是把第二条和第三条叠起来:先多采样拿到一组候选,再用现成 RM 重排。多采样保证多样性,冻结 RM 提供比众数更细的偏好信号,两条边界互补。
到这里,三条路径的选择和失效条件都交代完了。接下来该把它真的跑起来了:选哪条路、装什么、显存要多少、怎么确认自己跑对了。
6. 跑通第一个 baseline:单卡 16G 装一个打分模型,用论文口径验证自己
6.1 为什么从冻结 RM 入手
先看开源完整度。Self-Rewarding 没有公开最终权重,想复现得自己从 Open Assistant 种子加 Llama 2 70B 重跑多轮 DPO,门槛很高。Temporal Self-Rewarding 论文页面没有提供代码链接,目前只能按附录里的超参和 prompt 模板自己搭。Skywork-Reward-V2 是三者里唯一把权重、推理脚本、评测数据入口都给齐的,八个尺寸覆盖 0.6B 到 8B,其中 README 明确推荐 Skywork-Reward-V2-Llama-3.1-8B 作为绝大多数场景的默认选择。
| 工作 | 公开权重 | 公开代码 | 在这条线上的定位 |
|---|---|---|---|
| Self-Rewarding | 无 | 无完整训练数据 | 概念奠基与最小循环 |
| Temporal Self-Rewarding | 无 | 无代码链接 | chosen-rejected 同步变好的机制补丁 |
| Skywork-Reward-V2 | 八个尺寸 | 推理脚本加评测入口 | 推荐 baseline |
所以最短路径就是拿这个 8B 的打分模型做 best-of-N:不训练、不改权重,装上就能用,而且有现成的公开分数可以对着验证。
6.2 装上它,记住两个硬约束
transformers 推理路径是最省事的起点,bf16 加 flash_attention_2,单卡约 16GB 显存就够。
from transformers import AutoModelForSequenceClassification, AutoTokenizer
import torch
model_name = "Skywork/Skywork-Reward-V2-Llama-3.1-8B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
attn_implementation="flash_attention_2",
num_labels=1,
device_map="cuda:0",
)
# 按 chat template 拼好 prompt 与候选回答,取 logits[0][0] 作为标量分数
如果要批量吞吐或者多卡,换成 SGLang 路径:装 sglang[all]>=0.4.7.post1,用 --is-embedding 起服务,加上 --context-length 16384,从 /classify 端点取 embedding[0] 作为奖励分数。
两个硬约束必须记住。上下文不要超过 16K token,显存和时间都会失控;不要给这个模型加 system prompt,它是按纯文本偏好判定的方式训出来的,多一层 system 提示会让打分偏离训练分布。这两条都写在官方 README 的推荐用法里,不是可选项。
6.3 用论文口径验证自己
装好了不等于跑对了。最省事的自检方式是把公开榜单当标尺,跑一遍官方评测脚本,看自己的分数能不能落进合理区间。
下面这两条来自 RewardBench 官方评测仓库(github.com/allenai/reward-bench),不是 Skywork 自带脚本。
python scripts/run_rm.py --model Skywork/Skywork-Reward-V2-Llama-3.1-8B --batch_size 8
python scripts/run_v2.py --model Skywork/Skywork-Reward-V2-Llama-3.1-8B --batch_size 16 --max_length 4096
第一条跑 v1 协议,第二条跑 v2 协议。Paper 报告时点,这个模型是 v1 96.4、v2 84.1,榜单分数会随时间变动,但你的实现只要落在这个量级附近,就说明装载方式、chat template 的拼法、取分数的位置这几处口径都对了。反过来,如果你的实现和这个区间差得远,先检查的也是这几处,而不是急着怀疑模型本身。RewardBench2Skywork-V2
6.4 顺手做一个 training-free 对照
装上这个 RM 之后,第 5 章的两条结论就能在你自己的机器上对照一次。挑一组答案唯一的题目,比如 GSM8K 风格的算术题,对每道题用同一个模型采样若干条带推理链的回答。一份用多数投票取众数,一份用刚才装好的 RM 逐条打分、取最高分的那条。两者在同一个采样池上比较,你能直接看到众数和 RM 打分在什么时候给出一致的答案、什么时候不一致,也能看出长度偏差在你的任务上有没有冒出来。
需要提醒一句:这个对照不是严格的实验,它只用来验证你的加载与推理链路是否正常。真要做结论性的对比,得固定采样温度与条数,并且按第 3 章的三条检查项把位置和长度都控制住。
参考文献
本专题引用的核心资料如下,建议深入学习时阅读原文:
- Self-Rewarding Language Models — arXiv:2401.10020
- Meta-Rewarding Language Models: Self-Improving Alignment with LLM-as-a-Meta-Judge — arXiv:2407.19594
- Skywork-Reward-V2: Scaling Preference Data Curation via Human-AI Synergy — arXiv:2507.01352
- Temporal Self-Rewarding Language Models: Decoupling Chosen-Rejected via Past-Future — arXiv:2508.06026
- RewardBench: Evaluating Reward Models for Language Modeling — arXiv:2403.13787
- RewardBench 2: Advancing Reward Model Evaluation — arXiv:2506.01937
- JudgeBench: A Benchmark for Evaluating LLM-Based Judges — arXiv:2410.12784
- A Survey on LLM-as-a-Judge — arXiv:2411.15594
- Self-Consistency Improves Chain of Thought Reasoning in Language Models — arXiv:2203.11171
- Contrastive Decoding: Open-ended Text Generation as Optimization — arXiv:2210.15097