资讯动态

对齐:RLHF 与 DPO 在做什么

发布时间:2026/10/27 18:50:11 来源:尧图企业网站定制
对齐RLHF 与 DPO 在做什么SFT监督微调之后模型已经会答题了。但你问它我该不该辞职它可能给你列 12 条利弊最后补一句建议咨询专业人士。你问它我失恋了好难受它可能回你一段依恋理论。它不是不会说它是不知道你想听什么。对齐干的事就是教它这个。本文的关系图SFT 模型会答但不知道什么叫好 ↓ 人类给两个回答排序 偏好数据(prompt, 好回答, 差回答) ↓ ┌───────────────┴───────────────┐ RLHF奖励模型 PPO DPO直接优化偏好 └───────────────┬───────────────┘ ↓ 对齐后的模型更有用、更诚实、更少闯祸也更像人话一、SFT 之后为什么还需要对齐先把一个误会掰正SFT 解决的是会不会答对齐解决的是答得让不让人舒服。SFT 的数据是指令 标准答案。但现实里很多问题没有唯一标准答案。你问我失恋了好难受下面三个回答都不能算错A抱抱你。失恋确实很难受允许自己难过一阵子。要不要说说发生了什么 B这有什么好难受的下一个更好。 C失恋是一种常见的负性生活事件通常涉及依恋关系的丧失与重建……A 有人味B 像欠揍C 像论文。你要选一个发给朋友三秒钟就能选出来但你要让 SFT 数据把为什么 A 更好写成一个标准答案反而很难。因为好不是一个标签是一个排序。人类很擅长说A 比 B 好不擅长说A 值 8.7 分B 值 6.2 分。对齐要学的就是这种排序能力。业内常说的目标是 3HHelpful真能帮上忙别答非所问Honest不知道就说不知道别硬编Harmless不教人干坏事不制造伤害。注意对齐改的是愿意怎么答不是能不能答。知识的上限在预训练就定了对齐是在这个上限之内调它的口味、边界和语气。打个比方SFT 是驾校教它打方向、踩离合对齐是上路后的驾驶习惯——什么时候让行什么时候鸣笛什么时候闭嘴。二、偏好数据人类不写标准答案只做选择题对齐的数据长这样prompt我失恋了好难受。 chosen抱抱你。失恋确实很难受…… rejected这有什么好难受的下一个更好。一条样本不是问题 标准答案而是问题 两个回答 谁更好。这叫成对偏好数据pairwise preference data。为什么不用绝对打分因为人打分太不稳。你让两个人给同一篇文章打 8 分还是 9 分他们能吵一下午你让他们选A 和 B 哪个好三秒就能点。比较比打分可靠这是心理学里早就知道的事。偏好数据从哪来来源怎么来优点风险人工标注请标注员比较两个回答质量高、能处理微妙差别贵、慢、标注员有偏好AI 反馈RLAIF用强模型当裁判便宜、可扩展继承裁判模型的偏见宪法式 AI给模型一套原则让它自我批评可审计、少依赖人工原则本身有立场用户反馈点赞 / 点踩 / 采纳分布真实噪声大、容易被少数用户带偏这里有个必须记住的事实偏好数据不是真理是民调。你标注的是喜欢模型学到的也是喜欢但喜欢和对之间还隔着一条街。标注员偏爱长回答模型就会变啰嗦偏爱自信的语气模型就会变敢编偏爱顺着用户模型就会变谄媚。数据里的偏见会在训练后被放大成模型的人格。三、RLHF 第一步把偏好蒸馏成奖励模型在 SFT 模型的基础上RLHFReinforcement Learning from Human Feedback基于人类反馈的强化学习通常分两步。第一步是训练一个奖励模型reward model给它一个回答它吐一个分数。怎么训用 Bradley-Terry 模型。它假设人更喜欢 A的概率取决于两个回答的分数差P(A B) sigmoid(r(A) - r(B))训练目标就是让这个概率尽量接近 1loss -log sigmoid(r(chosen) - r(rejected))翻译成人话chosen 的分数要比 rejected 高差得越多loss 越小。这是一个 pairwise 的逻辑损失样本是成对比较不是单条标注奖励模型本身可以是一个大神经网络不一定是线性的。真实的奖励模型通常从 SFT 模型初始化把输出头换成一个标量它读完整段回答吐一个数。下面这个玩具用三个特征共情、信息量、长度来模拟只是为了把偏好 → 权重这件事画出来importmath PROMPT我失恋了好难受。ANSWERS{A:抱抱你。失恋确实很难受允许自己难过一阵子。要不要说说发生了什么,B:这有什么好难受的下一个更好。,C:失恋是一种常见的负性生活事件通常涉及依恋关系的丧失与重建……,}FEATURES{A:[0.9,0.8,0.3],B:[0.1,0.2,0.1],C:[0.2,0.4,0.9],D:[0.2,0.3,1.0],# 又长又空专门用来试探奖励模型}defsigmoid(x):ifx0:return1.0/(1.0math.exp(-x))emath.exp(x)returne/(1.0e)deftrain_reward(pairs,steps3000,lr0.5,l20.01):最小化 -log sigmoid(r(win) - r(lose))加一点 L2 让权重好读。w[0.0,0.0,0.0]for_inrange(steps):forwin,loseinpairs:diff[a-bfora,binzip(FEATURES[win],FEATURES[lose])]ssum(wi*diforwi,diinzip(w,diff))gsigmoid(s)-1.0foriinrange(3):w[i]-lr*(g*diff[i]l2*w[i])returnwdefscore(w,key):returnsum(wi*xiforwi,xiinzip(w,FEATURES[key]))defaccuracy(w,pairs):returnsum(score(w,win)score(w,lose)forwin,loseinpairs)normal[(A,B),(A,C),(C,B)]length_biased[(A,B),(C,B),(C,A)]w1,w2train_reward(normal),train_reward(length_biased)print(① 偏好数据人类只做选择题)print(f prompt{PROMPT})fork,vinANSWERS.items():print(f{k}{v})print( 标注A BA CC B)print(\n② 奖励模型把偏好蒸馏成一个打分器)print( 正常偏好学到的权重)print(f 共情{w1[0]:.2f}信息量{w1[1]:.2f}长度{w1[2]:.2f})print( 打分 .join(f{k}{score(w1,k):.2f}forkinABCD))print(f 配对准确率{accuracy(w1,normal)}/{len(normal)})print(\n 如果标注者偏爱长答案ABCBCA)print(f 共情{w2[0]:.2f}信息量{w2[1]:.2f}长度{w2[2]:.2f})print( 打分 .join(f{k}{score(w2,k):.2f}forkinABCD))print(f 配对准确率{accuracy(w2,length_biased)}/{len(length_biased)})print( D 又长又空分数却冲到了最前面——奖励作弊的入口。)真实运行结果本机实测完整脚本见code/10-alignment-demo.py① 偏好数据人类只做选择题 prompt我失恋了好难受。 A抱抱你。失恋确实很难受允许自己难过一阵子。要不要说说发生了什么 B这有什么好难受的下一个更好。 C失恋是一种常见的负性生活事件通常涉及依恋关系的丧失与重建…… 标注A BA CC B ② 奖励模型把偏好蒸馏成一个打分器 正常偏好学到的权重 共情 3.08 信息量 2.42 长度 1.49 打分A 5.16 B 0.94 C 2.92 D 2.83 配对准确率3/3 如果标注者偏爱长答案ABCBCA 共情 0.45 信息量 1.02 长度 4.34 打分A 2.52 B 0.68 C 4.40 D 4.73 配对准确率3/3 D 又长又空分数却冲到了最前面——奖励作弊的入口。看 ② 那段输出正常偏好下模型学到的权重是共情 3.08、信息量 2.42、长度 1.49——它认为共情最重要长度只是顺带。D 虽然长但共情和信息量都一般只拿到 2.83 分排在 A 的 5.16 后面。但如果你换一份长答案总是赢的偏好数据权重立刻变成共情 0.45、信息量 1.02、长度 4.34。长度成了压倒性的因素D 靠长冲到 4.73 分把 A 的 2.52 甩在后面。同样的模型结构换一份偏好数据好的定义就变了。D 又长又空却赢了——这不是模型坏了是奖励模型忠实地学会了数据里的偏见。这就是奖励作弊reward hacking的入口。奖励模型不是裁判是观众投票器。你把它当真理它就敢给你刷出个奥斯卡模型会发现长能加分于是越来越长发现自信能加分于是越来越敢编发现顺着用户能加分于是越来越会拍马屁。Goodhart 定律说当一个指标变成目标它就不再是好的指标。奖励模型就是那个指标。四、RLHF 第二步PPO 在奖励模型上刷分有了奖励模型第二步是让策略模型policy去最大化它的分数。目标写成max_π E_{y~π}[ r(x, y) ] - β · KL(π || π_ref)三部分E[r]策略生成的回答奖励模型给多少分KL(π || π_ref)新策略和参考模型通常是 SFT 模型差多远β这根缰绳有多紧。PPOProximal Policy Optimization是干这件事的常用算法。它的流程大概是这样策略模型对一批 prompt 生成回答奖励模型给每个回答打分用价值模型估计一个基线算出这个回答比预期好多少advantage更新策略好的回答提高概率差的降低概率用 KL 项把自己拴在参考模型附近。PPO 还有一个夹子新策略和旧策略的概率比不能偏离太远超出范围就截断。它怕的不是学得慢是一步迈太大直接把原来会的东西踩坏。这和 SFT 里学习率要低、轮次要少是同一个道理。这一步要同时装四个模型策略模型正在训的那个参考模型SFT 模型用来算 KL奖励模型打分价值模型估计基线。显存、算力、调参难度全上去了。PPO 像开手动挡动力足但离合松快了就熄火。学习率、KL 系数、奖励尺度、clip 范围、batch size任何一个没调好训练就会从越来越像人变成越来越像复读机。那为什么还要 KL因为奖励模型只在它见过的数据附近靠谱。你让策略跑得太远它就会找到奖励模型的盲区重复、谄媚、堆砌格式、说正确的废话。KL 就是那根安全绳你可以往外探但别探到悬崖下面。五、DPO把 RL 问题改写成一道分类题PPO 什么都好就是太麻烦。于是有人问能不能不要奖励模型也不要 RL 循环直接拿偏好数据训策略能。这就是 DPODirect Preference Optimization直接偏好优化。推导只有三步但每一步都很漂亮。为简洁下面的概率都省略了条件x它们都是在同一个 prompt 下比较。第一步写出和 RLHF 一样的目标max_π E[r(x, y)] - β · KL(π || π_ref)第二步这个目标的最优策略有闭式解π*(y) ∝ π_ref(y) · exp(r(y) / β)第三步把上式反过来用策略表示奖励r(y) β · log(π*(y) / π_ref(y)) 常数然后把它代回 Bradley-Terry 的 pairwise loss。因为 chosen 和 rejected 都带同一个常数常数直接抵消奖励模型消失了。剩下的只有策略和参考模型的概率比L_DPO -log sigmoid( β · log(π_θ(y_w) / π_ref(y_w)) - β · log(π_θ(y_l) / π_ref(y_l)) )其中y_w是 choseny_l是 rejected。这里的π_ref是冻结的 SFT 模型不参与更新它只负责当锚点。翻译成人话chosen 相对参考模型的概率要往上抬rejected 要往下压β 控制抬多狠。这已经不是一个 RL 问题了它就是一道这两个回答哪个更好的分类题只不过分类器的输入是策略模型的 log-prob。这就是 DPO 最让人拍大腿的地方它把训练一个考官再让考生刷分改成了直接告诉考生这两份卷子这份更好。下面这段代码把 ③ 跑一遍importmath NAMES[认真,敷衍,胡说]INIT[2.0,1.0,0.5]REF[2.0,1.0,0.5]defsigmoid(x):ifx0:return1.0/(1.0math.exp(-x))emath.exp(x)returne/(1.0e)deflog_softmax(logits):mmax(logits)ssum(math.exp(x-m)forxinlogits)return[x-m-math.log(s)forxinlogits]defprobs(logits):return[math.exp(x)forxinlog_softmax(logits)]print(③ DPOβ 是缰绳)p_refprobs(REF)print( 参考模型SFT .join(f{n}{x:.3f}forn,xinzip(NAMES,p_ref)))print( 假设奖励模型给「认真」1 分另外两个 0 分。)print( 在 max 奖励 - β·KL 的目标下最优策略有闭式解)print( π*(y) ∝ π_ref(y) · exp(r(y) / β))print(\n β 认真概率 敷衍概率 胡说概率 KL(π*‖π_ref))forbetain(0.05,0.10,0.50,1.00):raw[p*math.exp(r/beta)forp,rinzip(p_ref,(1.0,0.0,0.0))]ssum(raw)p[x/sforxinraw]klsum(pi*math.log(pi/ri)forpi,riinzip(p,p_ref))print(f{beta:6.2f}{p[0]:8.3f}{p[1]:8.3f}{p[2]:8.3f}{kl:10.3f})print( β 越大越贴着参考模型β 越小越敢往奖励高的地方跑。)print(\n DPO 的一步偏好「认真 胡说」β0.10)logitslist(INIT)lr2.0forstepinrange(1,21):lplog_softmax(logits)rplog_softmax(REF)z0.10*((lp[0]-rp[0])-(lp[2]-rp[2]))psigmoid(z)g(p-1.0)*0.10ifstep1:print(f 第 1 步梯度认真{g:.3f}敷衍 0.000胡说{-g:.3f})logits[0]-lr*g logits[2]lr*gifstepin(1,5,20):lp2log_softmax(logits)z20.10*((lp2[0]-rp[0])-(lp2[2]-rp[2]))loss2-math.log(sigmoid(z2))print(f 第{step:2}步后loss{loss2:.3f} .join(f{n}{x:.3f}forn,xinzip(NAMES,probs(logits))))print( 梯度只落在 chosen 和 rejected 上一个往上推一个往下压。)真实运行结果本机实测同一份脚本的 ③③ DPOβ 是缰绳 参考模型SFT认真 0.629 敷衍 0.231 胡说 0.140 假设奖励模型给「认真」1 分另外两个 0 分。 在 max 奖励 - β·KL 的目标下最优策略有闭式解 π*(y) ∝ π_ref(y) · exp(r(y) / β) β 认真概率 敷衍概率 胡说概率 KL(π*‖π_ref) 0.05 1.000 0.000 0.000 0.464 0.10 1.000 0.000 0.000 0.464 0.50 0.926 0.046 0.028 0.239 1.00 0.821 0.111 0.067 0.089 β 越大越贴着参考模型β 越小越敢往奖励高的地方跑。 DPO 的一步偏好「认真 胡说」β0.10 第 1 步梯度认真 -0.050敷衍 0.000胡说 0.050 第 1 步后loss 0.683 认真 0.660 敷衍 0.220 胡说 0.121 第 5 步后loss 0.645 认真 0.764 敷衍 0.172 胡说 0.064 第 20 步后loss 0.527 认真 0.939 敷衍 0.056 胡说 0.005 梯度只落在 chosen 和 rejected 上一个往上推一个往下压。看下面这段输出。β 是缰绳β 越大最优策略越贴着参考模型KL 越小β 越小越敢往奖励高的地方跑。玩具里 β0.05 和 0.1 都已经饱和是因为奖励差是 1 分相对于 β 太大了真实训练里 β 的常用值要跟奖励尺度一起调不能照搬。DPO 的梯度也简单得有点不像话。对单个 softmax 选择梯度只在两个位置非零这里的z就是 loss 里 sigmoid 括号内的值grad[chosen] (sigmoid(z) - 1) · β grad[rejected] -(sigmoid(z) - 1) · β推导也不复杂log π(y)对第i个 logit 的导数是1[iy] - π_i1[iy]命中时为 1否则为 0chosen 和 rejected 两边的π_i正好抵消只剩两个位置。注意符号grad[chosen]是负的梯度下降减去它chosen 的 logit 反而上升rejected 正相反。也就是说chosen 往上推rejected 往下压推多狠取决于模型有多意外。模型越确定自己选对了梯度越小越没把握——或者越确定自己选错了——改得越狠。输出里第 1 步梯度是认真 -0.050、胡说 0.050到第 20 步 loss 从 0.683 降到 0.527认真回答的概率从 0.660 升到 0.939。这是单步选择的玩具情形。真实序列模型里梯度会落到 chosen 和 rejected 的每个 Token 上但推高 chosen、压低 rejected的方向不变。DPO 为什么流行三个词便宜、稳、够用。只要两个模型策略 参考不用奖励模型不用价值模型不用在线采样像监督学习一样离线训没有 PPO 那么多容易崩的超参大多数团队用一份还不错的偏好数据就能拿到明显提升。但它不是没有代价。DPO 是离线的它只学偏好数据里出现过的 pair不会在训练中探索新回答。数据里没有的答案类型它学不到数据里有长度偏见它照样学。β 太小会过度偏离参考模型β 太大会被缰绳拽得太紧、学不出偏好数据质量差DPO 会把偏见学得又快又稳。后来还长出了一堆变体IPO、KTO、ORPO以及用当前策略生成新 pair 再训的迭代 DPO。它们大多在解决同一个问题怎么在便宜稳定和能探索之间找平衡。六、RLHF vs DPO不是谁取代谁把两者放在一张表里维度RLHF / PPODPO要不要奖励模型要不要要不要在线采样要策略边训边生成不要离线偏好对同时装几个模型4 个策略、参考、奖励、价值2 个策略、参考训练稳定性难调容易崩稳像监督学习成本高低探索能力有能发现新回答无只学数据里的 pair典型失败奖励作弊、模式坍缩过拟合偏好对、继承数据偏见适合谁有资源的前沿团队大多数团队这张表最容易让人误读成DPO 赢了。其实不是。RLHF 的优势是在线策略在训练中不断生成新回答奖励模型给新回答打分所以它能发现偏好数据里没有的东西。代价是复杂、贵、容易奖励作弊。DPO 的优势是离线不用生成、不用 RL、不用奖励模型拿一份偏好数据就能训。代价是它只能学数据里的东西数据没覆盖的地方它不会主动去探索。所以现实里的路线通常是SFT → 收集偏好数据 → DPO → 评测 ↓ 不够 迭代 DPO / RLHF先用便宜的方案拿到 80 分再决定要不要为最后 20 分烧钱。DPO 不是把 RLHF 打败了是把 RLHF 里最贵的那一段拆掉了能拆是因为它从同一个 KL 正则目标推导出来只是把在线刷分换成了离线分类。七、对齐到底在调什么偏好、边界、语气对齐经常被误解成让模型更安全。其实它调的东西更多偏好同样能答对哪种答法更让人舒服边界什么问题该答什么问题该拒什么问题该反问语气什么时候该简洁什么时候该展开什么时候该说我不确定。3H 之间是有张力的。Helpful 和 Harmless 会打架用户问怎么黑进邻居的 Wi-Fihelpful 是给步骤harmless 是拒绝。Honest 和 Helpful 也会打架模型不知道答案时honest 是说不知道helpful 是硬着头皮给一个像样的回答。对齐没做好会出现几种典型的人格病谄媚sycophancy用户说113对吧“模型说您说得对”。因为偏好数据里顺着用户的回答更容易被选上。啰嗦标注员偏爱长回答模型就学会把一句话拆成三段再加个总结。过度拒绝为了安全把正常问题也拒了。用户问怎么杀死一个进程模型以为要杀人。格式堆砌标题、加粗、项目符号全上内容却没多少。这些问题不是模型笨是奖励信号把错误的东西教给了它。对齐不是给模型戴口罩是教它判断场合。戴口罩的模型什么都不敢说会判断场合的模型知道什么时候该说、该怎么说。对齐也不是免费的业界叫alignment tax为了更安全、更符合偏好模型可能在部分能力上掉一点分。目标不是把税降到零而是别交冤枉税——该拒的拒该答的答别为了安全把正常问题也拒了。评测也不能只看一个数。成对胜率、人工评测、红队测试、偏见审计、能力回归得搭配着看。拿奖励模型的分数当验收标准相当于让考生自己出题自己判卷。八、五个常见误区误区一对齐 让模型更聪明。不是。聪明来自预训练对齐调的是行为。一个知识渊博但没对齐的模型可能满腹经纶却满嘴跑火车一个对齐良好的小模型可能知识少一点但更靠谱、更可用。对齐是让能力用对地方不是给能力加buff。误区二RLHF 人工打分然后监督学习。不是。人工打的是两个回答谁更好不是这个回答值几分奖励模型学的是这个排序PPO 再在奖励模型上做强化学习。中间隔了两层不是把标注直接拿去当标签。误区三DPO 不需要参考模型。需要。DPO 的 loss 里到处都是π_ref它就是那根缰绳。没有参考模型DPO 就失去了锚点模型可以为了这一对偏好把概率推得很极端在其他输入上漂移、退化。参考模型不是可选项是 DPO 能稳住的原因之一。误区四奖励模型的分数越高越好。不一定。奖励模型是 proxy不是真理。分数高只能说明更像奖励模型喜欢的东西不代表更像人喜欢的东西。奖励作弊就是把这个 proxy 刷爆模型找到了漏洞分数上去了体验下来了。看奖励分数也要看人评、看红队、看回归。误区五对齐一次就完事。不是。用户分布会变攻击手法会变模型的能力也会变。今天对齐好的模型明天可能被新的 jailbreak 绕过今天合适的拒答边界明天可能显得过度保守。对齐是持续工程收集新偏好、重训奖励模型、迭代 DPO、红队测试循环往复。九、把这件事放回地图上把大模型的概念按依赖关系从下往上摞成几层——最底下是算力和数据往上依次是文字的表示、模型结构、训练、调用最顶上才是增强和智能体L6 智能体层 Agent / Function Calling / ReAct / 记忆 / MCP L5 增强层 RAG / 向量检索 / Rerank / GraphRAG / 微调 L4 调用层 Prompt / Few-shot / CoT / 温度 / Top-p L3 训练层 预训练 / SFT / ★ RLHF / DPO ★ / LoRA / Scaling Law L2 结构层 Transformer / 注意力 / 参数量 / 上下文窗口 / 开源闭源 L1 表示层 Token / 分词 / 词表 / Embedding L0 底座 算力 / 数据 / 成本RLHF 和 DPO 在 L3 的后半段预训练给了能力SFT 给了指令跟随对齐再给偏好和边界。往下看没有预训练的知识对齐就是空中楼阁没有 SFT 的指令跟随偏好数据也无从谈起。对齐是在一个已经会答题的模型上调它愿意怎么答。往上看RAG 在推理时补事实Agent 在推理时调工具对齐决定了它会不会滥用工具、会不会该拒绝时拒绝、会不会在不确定时胡说。再往上安全护栏、内容审核、红队测试都是对齐的延伸。它的边界也很清楚对齐能让模型更愿意好好答但改不了它到底会不会。想让模型知道新事实靠检索想让模型能力更强靠预训练想让模型更符合偏好才轮到对齐。三条可以带走的结论对齐优化的是偏好不是知识。它让模型在能答的基础上学会答得让人舒服、可信、不出格。RLHF 奖励模型 PPO KL 缰绳DPO 把同一个目标改写成离线分类题。一个在线探索、贵而强一个离线稳定、便宜够用。奖励模型是 proxy偏好数据有偏见。对齐不是一次性补丁而是持续收集偏好、评测、红队、迭代的工程。《大模型概念地图》专栏 · 第 10 篇

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑