当前位置:首页 > AI其它类

大模型是怎么学会「说人话」的?从RLHF到DPO的偏好对齐技术演进

1周前 (10-05)AI其它类16

用基础模型写一段产品介绍,你经常会得到这样的结果:语法通顺、结构工整、词藻还不差,但读起来总透着一股"不像正常人会写出来的东西"的味道。要么把一句能说完的事抻成三段,要么该收尾的地方它又起了一个新段,格式规规矩矩,就是不对味。

这不是模型"笨",而是它训练的目标决定了它的行为。预训练阶段,模型的学习目标是"预测下一个词",训练语料里又是百科、论坛、代码混着来。它学到的是"在统计意义上,下一个词大概率是什么",而不是"人更喜欢什么样的回答"。让模型更像人、更有用、更安全,靠的是训练之后那道额外的工序——偏好对齐。

这篇文章沿着技术演进的线索,把对齐这件事从 RLHF 讲到 DPO,重点放在"为什么 RLHF 那么难"以及"DPO 是怎么把它化简的"。

预训练之后,模型缺的是什么

rlhf-dpo-cover.jpg

预训练模型可以续写,但不太擅长"照着人的要求办事"。你问它"给我写个请假条",它未必会给出一个格式正确的请假条,而是可能顺着"请假条"这三个字开始罗列相关信息,或者自顾自地往下铺陈。

原因在于,预训练阶段"下一个词预测"这个目标,和"产出有用、无害、符合预期的回答"这个目标之间,存在一条不小的缝。往这条缝里补,就是对齐要干的活。

补这道缝的常规做法,是用带答案的示范数据做监督微调(SFT)。给模型成对的"问题—参考答案",让它学着把答案复现出来。这一步能把模型的输出风格拉回到"一问一答"的轨道上,见效快,成本也可控。

但 SFT 有个天花板:它要求你手里有高质量的标准答案。很多主观任务——这段话语气合不合适、这个方案靠不靠谱、这个回答有没有冒犯人——很难写出一份"标准答案"。能标注出来的,往往是"哪个更好",而不是"正确答案是什么"。

RLHF:把「哪个更好」变成可优化的信号

既然"哪个更好"容易标,那就让模型去学习这个偏好。这就是 RLHF(基于人类反馈的强化学习)的出发点。

RLHF 的流程可以切成四步。起步是前面说过的 SFT,让模型先有个像样的对话底子。接着用对比的方式收集偏好数据:同一个问题给模型生成两条回答,让标注的人选一条更喜欢的,形成一条条"偏好对"。

然后是训练奖励模型。奖励模型吃进一条回答,吐出一个分数,衡量这条回答"符合人类偏好的程度"。它从偏好对里学到:被选中的那条分数要高于没被选中的那条。这一步把离散的"喜欢/不喜欢"变成了连续的数值信号。

收尾是用强化学习去优化那个 SFT 模型。策略(要优化的模型)生成回答,奖励模型打分,然后拿这个分数去更新策略,让它更倾向于生成高分回答。常用的更新算法是 PPO,它在"往高分区走"和"别偏离原模型太远"之间做平衡。

奖励模型在学一个什么样的函数

奖励模型的训练目标是让"被偏爱的回答"得分高于"被冷落的回答"。对于一个偏好对,记被选中的回答为 y_w,落选的为 y_l,损失函数可以写成交叉熵的形式:

L_reward = -log σ( r(x, y_w) - r(x, y_l) )

其中:
  r(x, y)   奖励模型给「问题x + 回答y」打的分
  σ(...)    把分差压到(0,1)的概率里
  y_w       被选中的回答
  y_l       落选的回答

这个式子的含义很直白:如果奖励模型给两条回答的分差越大,σ 越接近 1,损失越小;反过来,如果它给落选的打了更高的分,损失就会上去。训练收敛之后,奖励模型就学到了一个"人味打分函数"。

奖励模型的作用也就到这里了。它不参与线上推理,训练完成后它是一套用来指导策略更新的辅助装置。

PPO 到底麻烦在哪

RLHF 理论框架是自洽的,落地却处处是坑。

光是参与训练的模型就让它变得笨重。策略模型要一份,给它打分的奖励模型要一份,PPO 里用来约束"别跑太远"的参考模型又要一份,外加一个被优化的旧策略快照。四套模型在同一显存里挤,对算力的要求直接上了一个台阶。

连锁反应还不止显存。强化学习在线采样,每一轮都要让当前策略生成一批回答、再打分、再更新,训练循环长、收敛慢、超参数多。奖励模型还是个可以被钻空子的东西——策略优化到后来,常常不是把回答写得更好,而是找到了一堆能骗取高分但人看着不对劲的表达。业内管这个叫"奖励黑客"。

这几个麻烦有一个共同的根源:RLHF 把"对齐偏好"这个目标,绕了一大圈——先训一个奖励模型,再在奖励模型上做策略优化。奖励模型本身是要被近似、又要被对抗的中间件,它是 RLHF 里那些不稳定性的主要来源。

那能不能不训这个中间件,直接盯着偏好数据去优化?这就是 DPO 的思路。

DPO:绕开奖励模型,直接优化偏好

DPO(Direct Preference Optimization,直接偏好优化)要做的,是把"奖励模型 + 强化学习"这两段,压缩成一段监督学习。

它背后的数学推导不在这里从头推,但结论很清楚:在"策略别离参考模型太远"这个约束下,策略和奖励模型之间存在一一对应关系。把这个对应关系代回偏好对的损失里,奖励模型那一项就被消掉了,损失函数里只剩下"要优化的策略"和"参考模型"两个量。

L_DPO = -log σ( β·log π_θ(y_w|x)/π_ref(y_w|x)
              - β·log π_θ(y_l|x)/π_ref(y_l|x) )

其中:
  π_θ        要优化的策略模型
  π_ref      冻结的参考模型(通常是SFT模型)
  β          控制偏离参考模型的程度
  y_w / y_l  被选中 / 落选的回答

这个式子读起来不难。看括号里的两项:一项是被选中回答在"策略/参考"之间的对数概率比,另一项是落选回答的。整个损失的含义是——让被选中回答的概率相对参考模型往上升,让落选回答的概率相对参考模型往下降,两边的差距被 β 缩放后压进 sigmoid。

和 RLHF 对照着看,区别会很清楚。

维度RLHFDPO
需要的模型策略、奖励、参考、旧策略,共四套策略、参考,两套
训练方式在线强化学习,循环采样离线监督学习,直接算损失
奖励模型需要显式训练并维护不需要,被消解掉了
超参数PPO 相关的一串,调参成本高主要是一个 β
稳定性易受奖励黑客影响相对稳,但仍需正则

对大多数团队来说,DPO 的吸引力在于它把对齐从"强化学习工程"降成了"监督学习工程"。数据还是那批偏好对,但训练管线短了、显存省了、超参数少了,出问题的环节也跟着少了。

β 和参考模型在管什么

DPO 里那个 β 值得单独说一下。它控制的是优化力度——β 越小,损失对概率比差异越敏感,策略被拉得越狠;β 越大,策略被约束得越温和。

它背后防的其实还是 RLHF 里的老问题:如果放开让策略去迎合偏好,它会慢慢退化掉预训练阶段学到的通用能力,甚至产生新的、人和奖励模型都没预料到的偏差。参考模型 π_ref 在公式里扮演的是一根锚,把策略往"原始的 SFT 水平"上收,β 则决定这根锚拉得有多紧。

实践中常把参考模型就设成那个 SFT 模型,训练时冻结它,只更新策略。这样实现简单,也正好贴合公式里"参考模型不动"的假设。

DPO 也有化解不了的部分

DPO 省掉的只是 RLHF 中间那套开销,它没有改变问题的本质:对齐的质量,仍然由偏好数据的质量决定。

偏好数据里如果有矛盾——两条回答其实差不多,标注的人硬选了一条,或者不同标注者的尺度不一样——DPO 同样会学着去迎合这些噪声。它的损失里没有奖励模型那层"缓冲",噪声有时候会更直接地作用在策略上。

另外,DPO 的推导基于"偏好可以由单一函数比较"这个假设。现实里人的偏好常常是多维的:这条回答更礼貌但不够准确,那条更准确但有点生硬。当偏好本身不是全序的时候,单函数假设就不够用了,后续的工作(比如拆成对偶、引入多个奖励维度)正是在这个方向上继续补。

所以它俩不是谁取代谁的关系,而是同一目标下两种代价不同的实现。资源充足、对控制粒度要求高,RLHF 仍有用武之地;想用可控的成本先跑通对齐,DPO 是更务实的选择。

小结

把整条演进串起来看:预训练只教会模型"续写",SFT 用示范数据把它拉回"问答",但很多任务做不出标准答案,只能标注"哪个更好";RLHF 就为此训一个奖励模型,把偏好变成分数,再用强化学习去优化策略,代价是四套模型加上一堆调参和不稳定性;DPO 抓住了"策略与奖励模型一一对应"这一点,把奖励模型从式子里消掉,把对齐收敛成一段只依赖"策略与参考模型概率比"的监督学习。

理解这个从"绕远路"到"抄近道"的过程,比记住公式本身更重要。它说明了一件事:很多看起来必须分离的组件,在数学上可能本就是一体的,把它们重新合到一起,工程才会变简单。

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。