本文属于《Ai大模型训练教程》系列,详解奖励模型(RM)训练全流程:如何构建与清洗偏好数据、将多候选展开为pairwise样本、实现Bradley–Terry式pairwise loss,并给出奖励分数尺度失控、长度偏好、标注噪声等过拟合的可操作诊断与修复方案,帮助RM稳定泛化并服务RLHF对齐。
这篇在系列里的位置:为什么要训练奖励模型(RM)
在“Ai大模型训练教程:从入门到实战落地的系统课程”里,奖励模型(Reward Model, RM)通常位于 SFT(监督微调)之后、RLHF/RLAIF(偏好对齐)之前。它的作用是:把“人类偏好/业务偏好”转成一个可微分、可训练的打分器,让后续策略模型(policy)能通过强化学习(如 PPO、DPO 的间接形式)朝着更符合偏好的方向更新。
你可以把 RM 理解为“自动化评审员”:给定同一个提示词下的两个回答,RM 需要学会判断哪个更好,并且输出更高分。本文聚焦 奖励模型怎么训:从偏好数据怎么构建、pairwise loss 如何实现,到训练中最常见的过拟合诊断与修复策略,尽量给出可落地步骤。
奖励模型训练的输入输出:从文本到分数再到偏好
RM 的基本形式
常见做法是用一个 Transformer(通常是与基座模型同结构的 decoder-only 或 encoder-decoder)作为 backbone,在最后接一个线性头输出标量 reward:
- 输入:
prompt + answer拼接后的文本(或用特殊 token 分隔) - 输出:一个实数
r(x),表示“这个回答有多好”
在偏好学习中,我们不直接要求 reward 的绝对值准确,而是要求 相对排序正确:
- 给定同一 prompt 下的两个候选
y_win与y_lose - 期望
r(prompt, y_win) > r(prompt, y_lose)
为什么用 pairwise 而不是 pointwise
Pointwise(给单条打分)要求标注者给一个绝对分数,主观且漂移大;Pairwise(两两比较)更稳定、标注一致性更好,也更贴近“哪个更好”的实际需求。
偏好数据构建:可复用的 6 步流程
高质量偏好数据往往比模型结构更关键。下面是一个从零到可训 RM 数据的实操流程。
Step 1:明确“偏好准则”,写成可执行 rubric
不要只写“更有帮助”“更安全”,而要把偏好拆成可核查维度:
- 真实性:是否编造事实?是否引用可验证来源?
- 任务完成度:是否回答了问题的关键点?是否给出可执行步骤?
- 表达质量:结构是否清晰?是否冗长?是否有歧义?
- 安全合规:是否包含隐私泄露、违法指导、仇恨内容?
建议输出一页“评审卡”:每个维度 0/1/2 或 A/B 规则,减少标注漂移。
Step 2:构建 prompts 池,覆盖真实分布 + 困难样本
来源建议组合:
- 线上真实用户 query(脱敏、去隐私)
- 业务知识库常见问题
- 对抗/困难集:模糊指令、多约束、长上下文、诱导违规等
目标不是“越多越好”,而是 覆盖分布 和 覆盖失败模式。
Step 3:生成候选回答:至少 2 个,最好 4~8 个
候选回答可以来自:
- SFT 模型在不同温度/采样策略下生成(top-p、temperature、beam)
- 不同 checkpoint(早期/后期)
- 不同模型(基座 vs SFT)
实践建议:
- 温度拉开差异(如 0.2、0.7、1.0)以增加多样性
- 限制最大长度,避免“越长越像更好”的偏差
Step 4:偏好标注:A/B 选择 + 可选“平局/都差”
推荐标注格式:
win:更好的回答 IDlose:较差的回答 IDtie:难分胜负(可选)both_bad:都不合格(可选)reason:简短理由(用于质检与后续分析)
要点:
- 给标注者看同一 prompt 下的多个回答,但每次只做 pairwise 对比,降低认知负担
- 引入 golden set(已知答案对)做标注一致性监控
Step 5:清洗与去偏:避免“长度偏好”“模板偏好”
常见偏差与对策:
长度偏好:长回答更容易被选中
- 对策:长度分桶采样;或在标注界面隐藏 token 数;或加入“简洁性”维度
格式偏好:带小标题/列表更容易赢
- 对策:让候选回答都符合基本格式要求,避免风格差异盖过内容差异
泄漏偏好:某些候选包含“我认为我更好”之类提示
- 对策:正则过滤或规则检测此类自我评价
Step 6:划分数据集:按 prompt 分组切分,防止泄漏
务必按 prompt_id 分组做 train/val/test split,避免同一个 prompt 的不同 pair 同时出现在训练与验证,造成虚高指标。
建议比例:80/10/10,并额外保留一份“困难集验证集”(hard-val)专门监控泛化。
数据格式示例:从多候选到 pairwise
如果你有同一 prompt 的 4 个候选回答,并且标注者给出了整体排序 A > C > B > D,可以展开为多个 pair:
- (A, C), (A, B), (A, D)
- (C, B), (C, D)
- (B, D)
但要注意:pair 数会呈 O(n^2) 增长,容易让相近样本过多导致过拟合。实践中常做:
- 每个 prompt 采样固定数量的 pair(如 3~6)
- 优先采样“难分对”(模型分差小、标注争议大)用于提升决策边界
推荐的训练样本 JSONL(概念示例):
- 字段:
prompt,chosen,rejected - 每行一个 pair
Pairwise Loss 怎么写:Bradley–Terry / Logistic 形式
经典 pairwise loss(最常用)
令奖励模型输出:
r_c = RM(prompt, chosen)r_r = RM(prompt, rejected)
希望 r_c 大于 r_r。用 logistic 概率表示 chosen 胜出的概率:
p = sigmoid(r_c - r_r)
最大化对数似然等价于最小化 loss:
L = -log(sigmoid(r_c - r_r))
这就是常见的 Bradley–Terry / pairwise logistic loss。
加入 label smoothing / tie 的扩展
如果你允许 tie,可以把目标从硬 0/1 变成软标签:
- chosen 胜:target=1
- rejected 胜:target=0
- tie:target=0.5
对应 loss 可写成二元交叉熵:
L = -[ t*log(sigmoid(Δ)) + (1-t)*log(1-sigmoid(Δ)) ],其中Δ = r_c - r_r
这样可以缓解标注噪声导致的过拟合。
Reward 的尺度与正则:别让分数无界飙升
pairwise loss 对整体平移不敏感,但对尺度会驱动模型把分差拉得很大以降低 loss,导致:
- reward 数值爆炸
- 梯度不稳定
- 过拟合更快
常见抑制手段:
- L2 正则:对 reward head 或全模型加 weight decay
- Reward clamp:训练或推理时把 reward 限制在区间(如 [-5, 5])
- KL/anchor 正则:让 RM 表征不要偏离一个参考模型(较少用在 RM,但在某些体系里会做)
训练配置建议:从“能跑”到“稳定泛化”
下面给一套偏通用的训练要点,你可以按资源调整。
模型初始化:用 SFT backbone 往往更稳
- 用 SFT 后的模型作为 RM backbone,通常更容易学到偏好信号
- reward head 随机初始化即可
输入拼接与特殊符号
建议格式:
Prompt: ... \n\nAnswer: ...
或使用明确的分隔 token,防止 prompt/answer 边界混淆。对多轮对话要保留角色标识(user/assistant)。
采样与 batch 组织
- 同一个 batch 内尽量混合不同 prompt,降低相关性
- 控制每个 prompt 的重复出现频率(避免某些热门 prompt 过度训练)
学习率与训练轮数(经验值)
- backbone 微调:lr 通常 1e-5 ~ 5e-6(大模型更小)
- 只训 head:lr 可更大(如 1e-4)
- epoch:1~3 往往就够;RM 很容易过拟合,别盲目多跑
指标监控(至少三类)
- Pairwise accuracy:验证集中 chosen 的 reward 是否更高
- AUC / margin 分布:
Δ=r_c-r_r的分布是否越来越极端 - 按子集指标:安全类、事实类、长文本类分别算准确率,避免整体指标掩盖问题
过拟合诊断:RM 最常见的 5 种“看起来很准,实际很差”
奖励模型过拟合往往不表现为训练 loss 爆炸,而是“验证集也挺高,但上线排序不对”。以下给出更可操作的诊断方法。
1)训练/验证 accuracy 都很高,但线上偏好不提升
可能原因:验证集与训练集同分布且太“干净”,缺少困难样本;或按样本切分导致 prompt 泄漏。
怎么查:
- 确认按 prompt 分组切分
- 增加 hard-val:对抗提示、长上下文、易幻觉问题
- 做 offline 排序评测:对一批线上真实候选进行 RM 排序,与人工排序算 Kendall tau / pairwise agreement
怎么修:
- 补充困难偏好数据
- 对训练集做去重、降低同质 prompt 比例
2)reward 分数尺度不断变大(margin 变得极端)
表现:Δ 分布从集中在 0~2 逐渐扩到 10、20 甚至更大,loss 下降但泛化变差。
怎么查:
- 记录每个 epoch 的
mean(|r|)、std(r)、mean(Δ)、p95(Δ)
怎么修:
- 增大 weight decay
- 对 reward head 加强正则或使用较小 lr
- 早停(early stopping)通常非常有效
- 适度 clamp reward(训练时或评估时一致)
3)模型学会“投机特征”:偏爱长回答/列表/特定语气
表现:只要回答更长、更多小标题就被打更高分,即使内容胡编。
怎么查:
- 做控制变量测试:同一内容,复制扩写一倍长度,看 reward 是否系统性上升
- 统计 reward 与长度的相关系数(Spearman 相关)
怎么修:
- 数据层面:加入“简洁但正确”的 chosen,加入“冗长但空洞”的 rejected
- 训练层面:长度分桶采样;或在 loss 中对长度相关特征做对抗(高级做法)
4)对标注噪声敏感:训练到后期验证集开始下降
这是典型过拟合曲线:train loss 持续下降,val accuracy 在某个点之后下降。
怎么查:
- 画出 epoch-accuracy 曲线
- 抽取 val 里模型最自信但预测错的样本人工复核:很多会是标注噪声或规则不一致
怎么修:
- 早停 + 降低 epoch
- label smoothing 或引入 tie
- 清洗争议样本:低一致性标注的 pair 降权或移除
5)“记住 prompt”而不是学会偏好
表现:对训练中出现过的 prompt 预测很好,对新 prompt 直接失灵。
怎么查:
- 做 prompt-level 去重:相似度检索看训练集中是否存在大量近重复
- 以“新领域 prompts”做单独测试集
怎么修:
- prompt 去重(embedding + 聚类)
- 增加跨领域 prompts
- 加强 dropout / 正则,减少可记忆容量(尤其是小数据时)
一套可落地的 RM 训练与迭代闭环(推荐照做)
1)先做最小可用:2k~10k pairs
- 覆盖核心业务场景
- 每个 prompt 2~4 个候选
- 优先保证标注一致性和切分正确
2)训练 RM:短训练 + 强监控
- epoch 1~2 起步
- 每 200~500 steps 在 val/hard-val 上评估
- 监控 margin、长度相关性、子集准确率
3)用 RM 做离线重排评测(比只看 accuracy 更重要)
从线上/仿真池拿一批 prompts,每个 prompt 采样 8~16 个回答:
- 用 RM 排序取 top-1/top-3
- 人工抽检 top-1 的胜率(或用业务指标代理)
RM 训练得好不好,最终看“重排后人更满意”而不是 loss。
4)针对失败模式补数据:主动学习式迭代
把 RM 最容易错的样本挖出来:
- 高置信度错例(|Δ| 很大但人工认为相反)
- 与安全/事实相关的错例
- 长上下文错例
对这些样本补标注、加到训练集下一轮再训。通常 2~4 轮就能看到明显提升。
常见坑清单(快速自检)
- [ ] train/val 是否按 prompt 分组切分?
- [ ] chosen/rejected 是否来自同一 prompt?是否存在错配?
- [ ] 是否允许“都差/平局”?如果不允许,噪声会更大
- [ ] 是否监控了 reward 与长度/格式的相关性?
- [ ] 是否有 hard-val 或线上重排评测?
- [ ] 是否早停?RM 过拟合通常来得很快
小结
奖励模型训练的核心不是“把 loss 降到最低”,而是用 高覆盖、低偏差的偏好数据 让 RM 学到可泛化的比较准则;在训练上用 pairwise logistic loss 作为稳定基线,再通过 尺度正则、早停、困难集评测与主动学习迭代 来避免 RM 学会投机特征或在噪声上过拟合。
下一步如果你要把 RM 接到策略优化(PPO)或改用直接偏好优化(DPO/IPO),RM 的质量会直接决定对齐是否“越训越好”还是“越训越偏”。在进入 RL 阶段前,把本文的诊断清单跑一遍,通常能省下大量返工时间。
Prev:让模型稳定输出JSON与工具调用参数:约束解码、格式数据与损失设计