4、奖励模型训练:损失函数设计、训练数据构建与过拟合平衡
奖励模型,说白了就是给大模型当“裁判”。
我刚开始做RLHF那会儿,总觉得奖励模型就是个打分器,随便搞搞就行。后来被现实狠狠教育了一顿——模型学歪了,生成的内容看着分数高,实际根本没法用。嗯,今天咱们就把这块掰开揉碎了讲。
4.1 损失函数设计:不只是简单的二分类
奖励模型的核心任务,是学会判断“哪个回答更好”。但这里有个坑——你没法给每个回答标一个绝对分数,因为人的偏好是相对的。
所以,我们通常用Pairwise Ranking Loss,也叫对比损失。公式长这样:
L = -E[log(σ(r(x, y_w) - r(x, y_l)))]
其中,y_w是更好的回答,y_l是更差的。σ是sigmoid函数。说白了,就是让模型给好回答打高分,给差回答打低分,分差越大越好。
关键点:这个损失函数只关心相对排序,不关心绝对分数。所以奖励模型的输出值本身没有绝对意义,只看相对大小。
我在项目中遇到过一个问题:直接用这个loss训练,模型会倾向于把分数越推越高,导致训练不稳定。后来我加了一个正则项,限制分数的方差:
L_total = L + λ * Var(r(x, y))
这个λ我一般设0.01左右,效果还不错。
4.2 训练数据构建技巧:质量比数量重要
很多人一上来就堆数据,觉得数据越多越好。其实不然。奖励模型的数据,质量远比数量重要。
我总结了几条实战经验:
- 偏好差异要明显:两个回答如果差别不大,标注员都分不清好坏,模型更学不会。我一般要求标注员只选“明显更好”的那个。
- 覆盖多样性:不要只挑简单的例子。模型容易犯错的地方,比如长文本、逻辑推理、多轮对话,这些要多收集。
- 平衡正负样本:虽然是对比学习,但整体上好的回答和差的回答比例不要差太多,我习惯控制在1:1到2:1之间。
小技巧:我曾经用“模型自己生成 + 人工筛选”的方式构建数据。让当前模型生成一批回答,人工挑出最好的和最差的,这样数据分布和模型当前能力匹配,训练效率更高。
4.3 过拟合与泛化平衡:别让裁判变成“书呆子”
奖励模型特别容易过拟合。为什么?因为训练数据量通常不大(几万条算多的),但模型参数量不小(6B甚至更大)。
我见过一个项目,奖励模型在训练集上准确率98%,但上线后完全失效——模型学会了记住训练数据中的“标准答案”,而不是真正的偏好。
怎么解决?我常用的方法:
- 早停法:在验证集上监控准确率,一旦开始下降就停。验证集要单独构建,不能和训练集有重叠。
- Dropout:在奖励模型的最后一层加Dropout,概率设0.1-0.2。别太大,否则模型学不动。
- 数据增强:对同一个prompt,用不同的生成参数(温度、top_p)生成多个回答,增加数据多样性。
注意:我曾经犯过一个错误——用同一个prompt的多个回答做对比训练,结果模型学会了“只要回答长就是好”,完全忽略了内容质量。后来我强制要求每个对比对中的回答长度相近,才解决了这个问题。
4.4 知识体系总览
下面这张图,是我自己梳理的奖励模型训练核心逻辑,你看一眼就能明白整体脉络:
4.5 实战中的几个坑
最后,分享几个我踩过的坑,你遇到了可以少走弯路:
- 标注一致性:不同标注员的标准可能不一样。我建议每批数据都做交叉验证,标注一致性低于70%的要重标。
- 模型规模匹配:奖励模型的大小最好和策略模型差不多。太小了学不到复杂偏好,太大了容易过拟合。
- 定期更新:策略模型在变,奖励模型也要跟着更新。我一般每训练一轮策略模型,就重新训练一次奖励模型。
总结一下:奖励模型训练,核心就三件事——损失函数选对、数据质量管好、过拟合防住。这三件事做好了,你的RLHF就成功了一半。