第二章:奖励模型的核心原理
好,咱们直接进入正题。奖励模型这东西,说白了就是给AI的行为打分。你训练一个大语言模型,它生成了一堆回答,哪个好哪个坏?不能光靠人眼看吧。这时候就需要一个自动化的评分器——这就是奖励模型。
我个人习惯把奖励模型理解成「AI世界的裁判」。裁判得有一套评分标准,这套标准就是今天要聊的核心:基于偏好的学习、Bradley-Terry模型、还有Elo评分系统。
2.1 基于偏好的学习:为什么不是直接打分?
你可能会问:为什么不直接让标注员给每个回答打个分,比如0到10分?
嗯,这里有个坑。我刚开始做数据标注时也这么想过,结果发现人类打分极其不稳定。同一个回答,上午打8分,下午可能就打6分了。而且不同标注员的尺度完全不同——有人觉得7分就是天花板,有人随手就给9分。
所以学术界想了个办法:不让你打绝对分,只让你做比较。
核心思想:给定两个回答A和B,标注员只需要判断「A是否比B好」。这种相对比较比绝对打分稳定得多。
举个例子:
- 直接打分:请给这段代码的可读性打分(1-10)→ 标注员:嗯...6分吧(犹豫)
- 偏好比较:请比较这两段代码,哪段可读性更好?→ 标注员:左边这个(果断)
看到了吗?人类天生擅长做比较,不擅长做绝对判断。这就是基于偏好的学习的底层逻辑。
在项目中,我们通常收集成对的偏好数据。比如让模型生成两个回答,然后让标注员选出更好的那个。有时候还会加一个「差不多」的选项,但说实话,我建议尽量少用这个选项——它会让模型训练变得模糊。
2.2 Bradley-Terry模型:把偏好变成分数
好,现在我们有了大量的偏好对——A比B好,C比D好,等等。但我们需要的是一个能输出具体分数的模型,而不是只会做比较的机器。怎么把「A比B好」这种定性判断,转化成定量的分数?
Bradley-Terry模型就是干这个的。
一句话理解:Bradley-Terry模型假设每个选项都有一个隐藏的「实力值」,两个选项比较时,实力值高的胜出概率更大。
数学上长这样:
P(A 比 B 好) = σ(s_A - s_B)
其中s_A和s_B分别是A和B的分数,σ是sigmoid函数。说白了,就是两个分数的差值越大,A胜出的概率越接近1。
我在项目中遇到过一个问题:刚开始训练奖励模型时,分数总是往两极分化。好的回答分数越来越高,差的越来越低,最后模型变得过于自信。后来发现是Bradley-Terry模型的温度参数没调好。加了个温度系数后,分数分布就合理多了。
实际训练时,我们通常用交叉熵损失来优化:
loss = -log(σ(s_A - s_B))
如果A确实比B好,我们就希望s_A - s_B尽可能大,这样loss就小。反过来,如果标注说A比B好,但模型觉得B更好,loss就会很大——模型就知道自己错了。
注意:Bradley-Terry模型假设偏好是「可传递的」——如果A比B好,B比C好,那么A应该比C好。但人类标注有时会违反这个假设。我曾经遇到过标注员给的数据出现循环偏好(A>B, B>C, C>A),这种数据需要清洗掉。
2.3 Elo评分系统:从棋坛到AI
说到Elo,玩过棋类游戏或者电竞的朋友应该不陌生。国际象棋、围棋、LOL排位赛,用的都是这套系统。它最初是用来给棋手排名的,后来被引入到奖励模型领域。
Elo的核心逻辑很简单:
- 每个选手(或回答)有一个初始分数,比如1500
- 比赛后,赢家从输家那里「抢」走一些分数
- 抢多少取决于双方的分数差距——弱队爆冷赢强队,能抢更多分
在奖励模型里,我们把「比赛」换成「偏好比较」:
E_A = 1 / (1 + 10^((s_B - s_A) / 400))
s_A_new = s_A + K * (1 - E_A)
这里E_A是A胜出的期望概率,K是更新步长。如果A赢了(即标注认为A更好),但之前E_A很小(说明大家都不看好A),那么A的分数就会大幅上涨。
我记得有一次做对话系统的奖励模型,用了Elo来动态更新每个回答的分数。效果出奇的好——因为标注员会疲劳,但Elo系统不会。它自动平衡了不同标注员的偏好差异。
Bradley-Terry vs Elo:
| 对比维度 | Bradley-Terry | Elo |
|---|---|---|
| 训练方式 | 批量训练,一次优化所有分数 | 在线更新,每次比较后立即调整 |
| 适用场景 | 固定数据集,离线训练 | 流式数据,实时标注 |
| 分数含义 | 绝对实力值 | 相对排名值 |
| 我的建议 | 数据量大的时候用,稳定 | 标注过程中需要动态反馈时用 |
2.4 三者如何协同工作?
你可能会问:这三个东西到底怎么配合?我画个图你就明白了。
流程其实很直观:
- 先收集偏好数据——标注员比较成对的回答
- 用Bradley-Terry建模——把「谁比谁好」转化成「每个回答的分数」
- 用Elo动态调整——新数据来了,实时更新分数,保持排名准确
- 输出奖励分数——给强化学习用,指导模型生成更好的回答
实战小技巧:我一般会在标注初期先用Bradley-Terry做一轮离线训练,得到一个初始的奖励模型。然后在标注过程中,用Elo做在线微调。这样既保证了稳定性,又能快速响应新数据。
2.5 避坑指南
做奖励模型这几年,踩过的坑不少。分享几个典型的:
- 偏好数据不平衡:如果标注员总是选A比B好,模型会学偏。我建议在数据收集时,故意混入一些「明显差」的回答,让模型学会区分好坏。
- 分数膨胀:Bradley-Terry模型训练久了,分数会越来越高。加个正则化项或者定期重置分数基线,能缓解这个问题。
- 标注员一致性:不同标注员的偏好可能不同。我曾经遇到过标注员A喜欢简洁的回答,标注员B喜欢详细的。这时候需要做标注员校准,或者用多个标注员投票。
好了,这一章的核心内容就这些。基于偏好的学习解决了「怎么问问题」,Bradley-Terry解决了「怎么算分数」,Elo解决了「怎么动态更新」。三者配合,就是一个完整的奖励模型框架。
下一章我们会聊奖励模型的具体训练细节,包括损失函数设计、数据增强策略,还有怎么避免过拟合。到时候见。