18. Reward Model 怎么设计和训练?质量直接决定 RLHF 上限
整理 Reward Model 的架构选择、数据构造与常见失败模式。
简单回答
Reward Model(RM)的架构通常是从 SFT 模型权重初始化,去掉 LM head 换成一个输出标量分数的线性层。训练目标是 Bradley-Terry 偏好模型——给定一对 (chosen, rejected) 偏好数据,最大化 chosen 比 rejected 高的对数似然。质量取决于三件事:偏好数据的覆盖度和一致性、RM 的容量是否匹配 policy、是否做了多种 reward hacking 的预防(比如 reward shaping、length penalty、ensemble)。RM 训不好的常见症状包括:对长度过敏、对特定句式过敏、对训练分布外样本打分不可靠。
详细解释
RM 的基本架构
最常见的 RM 架构是从 SFT 模型权重出发改造的:
- 用 SFT 模型的 transformer backbone(相同的层数、维度、参数)
- 去掉原来的 LM head(输出 vocab 大小的 logits)
- 换成一个 reward head,结构通常是
Linear(hidden_dim, 1)—— 把最后一个 token 位置的 hidden state 映射成一个标量分数
输入是 prompt + response 的拼接序列,输出是一个 scalar reward ,表示 RM 认为这段 response 在给定 prompt 下的"质量分"。
为什么要从 SFT 模型初始化而不是从头训?因为 RM 需要"理解语言"才能判断质量好坏,从头训一个能理解语言的模型成本和 SFT 是一个量级的,没必要重复。直接用 SFT 模型做 backbone,相当于把语言理解能力迁移过来,再针对"打分"任务做微调。
Bradley-Terry 训练目标
RM 训练数据的标准形式是偏好对:(prompt, chosen, rejected)。标注员看一个 prompt 配两个候选回答,挑哪个更好。训练目标是让 RM 给 chosen 的分高于 rejected:
其中 是 winner(chosen), 是 loser(rejected), 是 sigmoid。这个 loss 来自 Bradley-Terry 模型——一个统计学经典模型,假设两个选项的偏好概率由它们的 utility 差决定。
直觉:让 chosen 和 rejected 的分差尽量大(差越大 sigmoid 越接近 1,loss 越接近 0)。但 sigmoid 的饱和性也意味着差距足够大后梯度会变小,避免分数无界发散。
训练数据怎么收集
RM 的天花板由数据决定。三个核心维度:
多样性:偏好数据要覆盖目标场景的各种 query 类型——闲聊、知识问答、代码、数学、创意写作、多语言、安全敏感等。覆盖度不够 RM 在某些 query 类型上就是瞎打分。
质量差异度:一对 (chosen, rejected) 的质量差距太小会让 RM 学到的信号弱(标注员自己都判断不清的对模型也学不到稳定的偏好)。差距太大又容易让 RM 学到表面特征(比如长度、格式)。理想是覆盖从"明显差距"到"细微差距"的连续谱。
标注一致性:多个标注员对同一对的判断要尽量一致。一致性可以用 Cohen's Kappa 等指标量化。RLHF 经验里标注员一致性通常在 60%-80% 之间——也就是有 20%-40% 的样本标注员之间会有分歧。这部分噪声会直接传到 RM 里。
收集偏好数据的常见做法:用 SFT 模型对同一个 prompt 采样多个回答(temperature 调高保证多样性),让标注员对这些回答做 pair-wise 或 ranking 标注。规模上一个 production 级 RM 通常需要几万到几十万对偏好数据。
RM 容量和 Policy 容量的匹配
一个长期争议是:RM 应该比 Policy 大、一样大、还是小?
实证经验是 RM 至少不能比 Policy 小太多。如果 Policy 是 70B、RM 是 7B,RM 可能根本判断不准 70B 模型生成的细微差异——70B 的回答往往在语言流畅性、知识准确性上都很好,要在它们之间分高下需要更强的判别能力。
InstructGPT 论文里 OpenAI 用的是 6B 的 RM 优化 175B 的 Policy,但他们也明确提到 RM 是瓶颈之一。后来的实践更倾向于 RM 和 Policy 同规模,或者用一个稍大的 RM。
代价是 RM 越大训练和推理成本越高——PPO 阶段每生成一段都要 RM 跑一遍,RM 大小直接进入训练吞吐量瓶颈。
常见的 RM 失败模式
长度偏置:RM 系统性地给长回答打高分,因为偏好数据里长回答恰好被标注员偏好(可能是因为长答案显得"详细")。Policy 学到这点后会输出冗余内容。缓解:在 reward 上加 length penalty,或者标注阶段就教标注员"长不等于好"。
格式偏置:RM 偏好特定格式(比如 markdown 列表、bullet point)。Policy 学到后会把所有回答都套这个格式。缓解:偏好数据里覆盖各种合理格式。
讨好偏置(sycophancy):RM 偏好"我很乐意帮助你"、"这是一个很好的问题"这类礼貌套话。Policy 学到后输出充斥废话。缓解:标注阶段明确扣分这类废话,RM 训练后做对比测试。
OOD 失效:RM 在偏好数据分布内表现好,但 Policy 在 PPO 中可能采样出训练时没见过的 OOD 回答。RM 对这些样本的打分极不可靠——可能给极高分或极低分。这是 reward hacking 的根源之一。缓解:在 PPO 训练中持续采样新数据让人重新标注,迭代更新 RM。
奖励 over-optimization:随着 PPO 训练进行,RM 给的分数越来越高(看起来训练在进步),但人类评估的实际质量却在下降。这是典型的 Goodhart's law——一旦把指标当成目标,指标就不再能衡量真实质量。Anthropic 的研究表明这个曲线非常稳定:PPO 早期人类评估和 RM 评估同向,过了某个点 RM 继续上涨但人类评估下降。
进阶:Reward Shaping 和 Ensemble
为了让 RM 更鲁棒,工业界做了不少 reward shaping 的工作:
Length penalty:在 RM 输出上减一个长度相关项,抑制长度偏置。 这种简单形式。
KL penalty 进入 reward:把 PPO 里的 KL 项也算进 reward 里(reward = RM 分数 - β·KL),这样 reward 本身就包含"不要偏离 reference"的约束。
RM ensemble:训多个不同的 RM(不同初始化、不同数据子集、不同架构),PPO 时取平均或最小值作为 reward。降低单个 RM 的偏置和过拟合风险。
Multi-aspect RM:训练时不输出单一标量,而是输出多个维度的分数(有用、安全、引用准确、简洁等)。PPO 时再组合成总 reward。这样不同维度可以独立调权重,问题定位也更清楚。
评估 RM 本身的质量
RM 训完后怎么知道好坏?常见的评估方式有:
- Held-out accuracy:留一部分偏好数据不用于训练,看 RM 在这部分数据上预测对的比例。基线值在 65%-75% 之间,超过 80% 已经很好。
- RewardBench 这类公开 benchmark,覆盖多种 query 类型。
- Pairwise reward gap analysis:分析 RM 给 chosen 和 rejected 的分差分布,分布太窄说明 RM 没区分能力,太宽可能过拟合。
- Sanity check 测试:手工构造一些"明显好"和"明显差"的对,验证 RM 打分方向是否正确。
面试时可以这样答
Reward Model 的架构是从 SFT 模型出发,去掉 LM head 换成一个输出标量的 reward head。输入 prompt + response,输出一个分数表示这段回答的质量。从 SFT 模型初始化是因为 RM 需要语言理解能力,从头训太浪费。
训练用 Bradley-Terry loss——给一对 chosen 和 rejected,最大化 chosen 分数高于 rejected 的对数似然。数据形式是偏好对,规模上生产级 RM 一般几万到几十万对。质量取决于三个维度——多样性(覆盖各种 query 类型)、质量差异度(避免太接近也避免只学到表面特征)、标注一致性(不同标注员对同一对要尽量一致)。
失败模式有几种很典型。长度偏置——RM 系统性偏好长回答,Policy 学了之后输出冗余。讨好偏置——偏好"我很乐意帮助"这类套话。OOD 失效——PPO 采样出训练时没见过的样本,RM 打分不可靠,这是 reward hacking 的根源。还有奖励 over-optimization——RM 分越来越高但人类评估反而下降,典型 Goodhart's law。
缓解手段有 length penalty 抑制长度偏置、RM ensemble 降低单 RM 偏置、multi-aspect RM 输出多维分数让不同维度独立调权重。RM 容量上经验是不能比 Policy 小太多,否则判别力跟不上 Policy 的能力。
评估 RM 用 held-out accuracy(基线 65-75% 算正常,80%+ 已经很好)、RewardBench 这类 benchmark、还有手工 sanity check 验证打分方向。
常见追问
- RM 训练时 chosen 和 rejected 一起喂还是分别喂?显存上有什么差别?
- Multi-aspect RM 多个维度的分数怎么组合?权重怎么学?
- RM ensemble 几个模型够用?取平均还是取最小值?