Elea Notes.

词条 · AI · 核心

奖励模型

一个专门用来给答案打分的模型,代替人类坐在旁边逐条评价。

也称:reward model、奖励模型、RM、打分模型

一句话

奖励模型是一个学会了「人类更喜欢哪个答案」的打分器。它存在的唯一理由是:人类没法陪着模型训练几百万步,得先把人的口味蒸馏成一个能自动跑的函数。

先看一个麻烦:好答案没有标准答案

训练模型做算术很好办:答案对就是对,错就是错,用不着讨论。

但「把这封投诉邮件回得得体一点」没有正确答案。有无数种回法,其中一些明显更好,可是好在哪很难写成规则。你想让模型学会这件事,第一步就卡住了:没有可以对照的标签,训练信号从哪来?

最直接的办法是人来打分。让模型生成,人看一眼给个分,模型照着分数调整。问题是量级:一次这样的训练要评估几十万到几百万个样本。雇人评,成本和时间都不成立;而且评的人一多,口味就开始互相矛盾。

朴素尝试为什么都不够

让人打绝对分(1 到 10 分)。 听起来可行,实际很糟。同一个答案,不同人给的分能差三档;同一个人上午和下午给的也不一样。更麻烦的是分数会漂移——评了一百条之后,评分人心里的「7 分」已经不是开头那个 7 分了。这些噪声会被模型忠实地学进去。

改成两两比较。 不问「这个几分」,问「A 和 B 哪个更好」。这个改动出乎意料地有效:人对相对好坏的判断远比绝对打分稳定,也不需要事先约定标尺。代价是你拿到的不是分数,而是一堆「A 胜 B」的记录。

于是问题变形了,但没解决:一堆胜负关系,怎么变成一个能给任意新答案打分的函数?

直接查表。 把见过的比较存起来,遇到新答案就找最像的。不行——答案空间是无穷的,任何新生成的句子几乎肯定没在表里。必须泛化

机制

奖励模型就是把「胜负关系」拟合成一个连续打分函数的那个模型。

拿一个预训练语言模型,把最后输出词的那层换成输出一个标量的线性头。输入一段对话,输出一个分数。

训练用的损失来自 Bradley–Terry 模型——一个把「分数差」翻译成「胜率」的经典构造:

P(A 胜 B) = σ( r(A) − r(B) )

σ 是 sigmoid,把任意实数压到 (0,1)
r(·) 是奖励模型给的分

读法:A 比 B 的分高多少,就对应人类以多大概率偏好 A。分数相等时 σ(0)=0.5,正好是「说不准」。

训练目标就是让这个预测概率贴上人类的实际选择:

loss = − log σ( r(优选答案) − r(次选答案) )
    人类偏好数据                奖励模型
  ┌──────────────┐         ┌─────────────┐
  │ A ≻ B        │  拟合   │             │
  │ C ≻ D        │ ──────► │  r(文本)→ℝ  │
  │ E ≻ F  ...   │         │             │
  └──────────────┘         └─────────────┘

                        对任意新答案都能打分

注意这个构造的一个性质:只有分数差有意义,绝对值没有。给所有分数统一加 100,所有胜率预测完全不变。所以「奖励模型给了 3.7 分」这句话本身没有信息量,只有和另一个答案比才有。

为什么值得知道

奖励模型是现代对齐流程的中间件:先有它,才能用强化学习让模型去最大化它。它的质量直接决定了上限——被优化的是它的分数,不是人的真实偏好。

这就带出它最要紧的性质:它是一个近似,而近似有长尾。在人类偏好数据覆盖到的区域,它打分靠谱;在没覆盖到的区域,它可能给出离谱的高分。而强化学习恰好是一台专门寻找高分的机器,会主动往这些区域钻。这个失效模式叫奖励攻击(reward hacking):模型找到了打分器的漏洞,分数一路上涨,输出质量却在下降。

所以实践中总要额外拴一根绳——用 KL 惩罚限制新模型别离原模型太远。这不是为了让它学得更好,是为了限制它能钻多远。理解这一点,就能理解为什么对齐流程里那些看起来多余的约束项其实是承重结构:它们防的不是学不会,是学得太狠。

一个提醒

奖励模型和被训练的模型通常规模相近,也就是说它同样会犯错、同样有偏见,而且它的错误会被下游放大。「用模型评价模型」这件事在工程上非常好用,在认识论上要一直留着怀疑——你测到的是打分器的意见,不是事实。

来源

  1. Deep Reinforcement Learning from Human Preferences · arXiv