首页 / 资讯中心 / 文章详情

大模型偏好对齐算法选型:PPO、DPO、KTO、ORPO实战

大模型偏好对齐算法选型:PPO、DPO、KTO、ORPO实战 ★ FEATURED ARTICLE
偏好对齐这四个字这两年在招聘 JD 里出现的频率已经超过了“熟悉 Transformer”。但真到要上手的时候绝大多数人卡在同一个地方PPO、DPO、KTO、ORPO 摆在一起论文都看过了公式也抄过一遍可轮到自己的项目还是不知道该选哪个。这篇就聊这件事——大模型偏好对齐算法的选型逻辑与落地细节。它解决的不是“什么是 RLHF”这种科普问题而是“我手上有一批数据、一张卡、两周时间到底该跑哪个算法、参数怎么设、跑崩了怎么救”。适合已经做过 SFT、准备往对齐阶段走的中高级从业者也适合刚接触这块、想少走弯路的同学。我会把四个算法的原理讲透把选型的判断依据摊开再给一套能直接照着改的配置和一套踩坑清单。1. 先把问题摆清楚偏好对齐到底在解决什么1.1 SFT 之后模型还缺什么做过 SFT 的人都有一个共同体验模型学会了“像人一样说话”但没学会“说得更好”。你喂给它几万条高质量问答它能模仿格式、模仿语气、模仿推理的句式可一旦遇到同一问题的多种合理回答它并不知道哪一种更受欢迎。SFT 的本质是最大似然它把所有训练样本当成“唯一正确答案”去拟合这在数学上等价于告诉模型这个回答的概率要尽可能高别的回答什么样我不管。问题在于人类对回答的偏好是相对的——“A 比 B 好”这件事无法用单条样本的似然表达出来。偏好对齐要补的就是这一块。它把训练信号从“这条数据是对的”换成“这两条数据里这条更好”让模型学习的是一个排序关系而不是一个绝对标签。这个转变带来的直接后果是数据构造方式变了、损失函数变了、训练稳定性也变差了。很多人第一次跑 DPO 时发现 loss 降得很漂亮但模型输出变短、变得敷衍原因就在这里——模型学到的不一定是你想要的偏好而是数据里隐藏的某种捷径。1.2 四条路线为什么会长成现在这个样子理解这四个算法最好别按时间顺序背而是按它们各自想省掉什么来记。PPO 是最“完整”的方案它老老实实做了三件事训一个奖励模型来打分、用强化学习在线采样来探索、用 KL 惩罚把策略拴在参考模型附近。这套流程理论上最干净因为它直接优化“人类偏好”这个目标本身但代价是四个模型同时驻留显存、在线采样吞吐受限、超参极其敏感。DPO 的想法是既然奖励模型和最优策略之间存在解析关系那我能不能把奖励模型消掉直接用偏好数据做监督学习答案是能推导出来的损失里只包含策略模型和参考模型的对数概率比。这一步把在线 RL 变成了离线分类问题工程复杂度断崖式下降这也是它这两年成为默认选项的根本原因。KTO 走的是另一条路。它注意到现实场景里成对数据其实很难拿——很多时候你只知道某个回答好或者某个回答差但配不成对。KTO 借了行为经济学里前景理论的思路把“好”和“差”当成两个独立的信号来用还引入了损失厌恶的系数让模型对坏样本更敏感。ORPO 则是在问SFT 和偏好对齐为什么非得分成两步它把 SFT 的交叉熵损失和偏好损失揉进同一个训练阶段并且去掉了参考模型显存占用进一步压缩。代价是两件事耦合在一起数据配比变得更敏感。2. 四个算法的原理拆解别只记名字要记它们在优化什么2.1 PPO最经典也最重的那条路PPO 的目标函数写出来是这样一个东西最大化“奖励模型给的分数”减去“当前策略与参考策略的 KL 散度乘一个系数 β”。这个 β 是整个算法的命门。β 太小模型会拼命去钻奖励模型的空子输出一堆奖励模型喜欢但人类看着别扭的东西这就是典型的奖励劫持β 太大模型不敢偏离参考模型训了等于没训。工程上 PPO 需要同时加载四个模型策略模型、参考模型、奖励模型、价值模型critic。以 7B 量级为例权重用 bf16 存放光模型本体就是 4 × 14GB ≈ 56GB再加上优化器状态、激活值、采样时的 KV Cache单卡基本没戏通常需要多卡并行加显存卸载。这也是它在中小团队里逐渐被冷落的核心原因——不是效果不好是成本太高。训练流程上PPO 分 rollout 和 update 两个阶段交替进行先让策略模型对一批 prompt 采样出回答用奖励模型打分用价值模型估计基线算优势函数通常用 GAE再做多轮小批量更新。这里有个容易被忽略的细节KL 惩罚一般不是加在序列末尾而是做成 token 级的 per-token reward shaping也就是每生成一个 token 就扣一点 KL。如果不这么做模型很容易在长回答里逐渐跑偏等序列结束再惩罚已经来不及了。实操上还有几个参数值得说。裁剪系数 clip range 通常设在 0.2作用类似信任域防止单次更新步子太大GAE 的 λ 一般取 0.95γ 取 1.0因为语言生成通常不折扣每次 rollout 的 batch 要足够大否则优势估计的方差会高到训练不起来。我见过最常见的失败情形是奖励均值一路上涨但人工一看输出全在堆砌形容词这就是奖励模型被攻破了此时降 β、加 KL、或者干脆停掉重训奖励模型比调策略侧的超参更有效。提示PPO 的效果上限很大程度由奖励模型决定。奖励模型的训练数据分布如果和策略模型的采样分布差太远PPO 一定会在训练中后期崩掉。上线前务必用策略模型自己采样的样本去评估奖励模型的排序准确率而不是只用留存的偏好数据。2.2 DPO把奖励模型“消掉”的优雅推导DPO 的推导起点是一个约束优化问题在 KL 约束下最大化期望奖励这个问题有解析解最优策略正比于参考策略乘以奖励的指数。把这个关系反解一下奖励就可以写成 β 乘以策略与参考策略的对数概率比再加上一个只和输入有关的常数。把这个隐式奖励代回 Bradley-Terry 偏好模型常数项在相减时消掉剩下的就是一个只含对数概率比的损失。最终形式很简洁对每条偏好对计算 chosen 和 rejected 在策略模型与参考模型下的对数概率比之差乘以 β过 sigmoid 取负对数。梯度含义也直观——把 chosen 的概率往上推、rejected 的概率往下压同时 β 和参考模型的存在保证了这个推力有上限。β 在这里的角色和 PPO 里的 KL 系数是对应的但表现方式不同。β 越大损失对概率比的缩放越强模型越倾向于快速拉开差距但也越容易过拟合到数据里的表面特征β 越小约束越松模型偏离参考模型越远。经验值大多落在 0.05 到 0.5 之间0.1 是最常见的起点。中文任务上我一般会从 0.1 试起如果发现输出变得过于简短或者句式单调就往 0.05 调如果发现几乎学不动就往 0.3 调。DPO 的最大优势是离线数据准备好之后训练就是一个标准的监督学习循环不需要在线采样不需要维护价值模型显存占用只有策略模型加参考模型。参考模型可以冻结、可以用低精度加载甚至可以用 LoRA 只训策略侧的一小部分参数。但它也有明确的短板。第一它是离线方法训练数据的分布一旦确定就不会变模型没法在训练过程中探索自己还没见过的回答这让它的效果上限低于在线 RL。第二它对数据质量极度敏感chosen 里混进一条平庸回答模型就会认真地学这个平庸。第三它存在长度偏置——因为对数概率是逐 token 累加的长回答的概率和天然更低如果数据里 chosen 系统性地比 rejected 长模型会学到“长就是好”反过来如果 rejected 更长模型会学出“短就是好”表现出来就是输出长度异常漂移。2.3 KTO没有成对数据时的现实解KTO 的出发点和前两个都不一样。它假设你手上只有一条一条独立的样本每条样本带一个二元标记这个回答是可取的还是不可取的。没有配对关系也不需要同一个 prompt 下必须有一好一坏。它的理论依据来自前景理论人对损失的敏感度高于对同等收益的敏感度。映射到训练上就是给“不可取”样本的损失乘一个比“可取”样本更大的权重让模型更用力地避开坏回答。同时它借用了 DPO 里的隐式奖励形式用一个批次内的 KL 估计作为参照点把每条样本的效用映射成一个相对于参照点的增益或损失再套上 logistic 形式的损失。这个设计带来的直接好处是数据门槛大幅降低。产品线上每天产生的用户反馈本质上就是一串带正负信号的单条样本很多场景根本凑不出严格配对。用 KTO 可以把这些信号直接吃进去而且正负样本的比例不需要严格控制算法本身通过权重处理了不平衡。代价也很明显。成对数据里包含的“相对信息”被丢掉了——知道 A 比 B 好比单独知道 A 好、B 差不等于同一件事前者信息量更大。所以同样的数据量下KTO 通常打不过 DPO。另外它依赖批次内的 KL 估计batch size 太小的时候这个估计噪声很大训练会不稳。我在实际项目里的经验是batch size 至少要到 32 以上最好 64否则 loss 曲线会剧烈抖动。参数方面除了 β同样控制偏离参考模型的程度常用 0.1还有两个权重系数可取样本的权重和不可取样本的权重。默认配置通常是把不可取样本的权重设得略高比如 1.0 对 1.33这个比例对应前景理论里的损失厌恶系数。如果你的数据里坏样本特别稀缺可以把这个比例再往上调但别超过 2否则模型会变得过度保守什么都不敢说。2.4 ORPO把 SFT 和偏好合成一步ORPO 的核心观察是SFT 阶段模型只是在拟合 chosen 的似然并没有被明确告知 rejected 是差的。那能不能在同一个损失里一边提升 chosen 的似然一边压低 rejected 的相对优势它用的工具是几率比odds ratio也就是把回答的生成概率转成“发生比不发生”的比值再对 chosen 和 rejected 的几率比取对数、过 sigmoid。损失由两部分相加第一部分是标准的 SFT 交叉熵作用在 chosen 上保证模型不丢失语言能力第二部分是偏好损失前面乘一个系数 λ 控制强度。因为整个计算只涉及策略模型自己的前向不需要参考模型所以显存占用比 DPO 还低一截——对 7B 模型来说省下的就是一个 14GB 的模型实体和对应的前向开销。这个设计的吸引力在于流程极简一次训练、一份数据、一个模型从基座直接出对齐模型。对于算力紧张或者迭代节奏快的团队这个诱惑很大。实际效果上在中等规模的开源基座上ORPO 的表现通常和“先 SFT 再 DPO”的两阶段方案接近个别任务上略差一点但训练成本省了将近一半。需要留意的是 λ 的设置常见范围是 0.1 到 0.2。设得太小偏好信号几乎不起作用退化成普通 SFT设得太大SFT 那部分的梯度被压制模型会为了拉开 chosen 和 rejected 的差距而牺牲语言质量典型表现是输出变得破碎、重复、或者突然开始说半句话。另外 ORPO 对数据配比更敏感因为 SFT 和偏好共享同一批样本如果 chosen 的质量参差不齐模型没有第二阶段的纠偏机会。注意ORPO 的损失里没有参考模型这意味着它缺少一个显式的“别跑太远”的锚点。训练轮数一定要控制住通常一到两轮就够再多容易出现语言能力退化。判断标准很简单拿训练前的基座和训练后的模型做一组通用能力对比如果明显掉分就是训过头了。3. 选型数据、算力、目标三把尺子3.1 一张表看懂四个算法的取舍选型这件事摊开来看就是几个维度的权衡我习惯用下面这张表先做初筛再结合具体情况微调。维度PPODPOKTOORPO所需模型数4策略/参考/奖励/价值2策略/参考2策略/参考1仅策略数据形态prompt 奖励模型成对偏好chosen/rejected单条 二元标签成对偏好是否在线采样是否否否训练稳定性差超参敏感较好中等依赖 batch size较好但对 λ 敏感显存压力7B 全参极高多卡高参考模型可量化高同 DPO中单卡可试效果上限最高中高中中高工程复杂度高低低最低适合阶段有成熟奖励模型的团队主流默认选项反馈信号零散的场景算力受限、快速迭代这张表只能做粗筛真正决定选哪个的是下面三个更具体的问题。3.2 数据形态是第一道分水岭先看数据。如果你手上是严格配对的偏好数据——同一个 prompt 下有一条明确更好的回答和一条更差的回答那 DPO 和 ORPO 都能直接用。这时候再判断如果数据量在几千到几万对DPO 是稳妥选择如果数据量很大且质量参差ORPO 的单阶段反而能省掉一轮调参。如果数据是零散的正负反馈比如线上日志里只有“这个回答被采纳了”和“这个回答被举报了”配不成对那 KTO 几乎是唯一顺手的选项。硬要凑配对也能做但同 prompt 下多条回答的采样成本往往比想象中高而且凑出来的对子里有很多是“矮子里拔将军”噪声很大。如果数据是 prompt 集合加上一个已经训好的奖励模型那才轮到 PPO 上场。这里要提醒一句奖励模型的质量决定 PPO 的天花板而奖励模型的训练本身又是一轮偏好数据工程。很多团队低估了这一步直接拿公开的奖励模型来用结果在自己的领域数据上排序准确率只有六成出头PPO 训出来的东西自然不能看。还有一类容易被忽略的情况你手上有大量高质量的专家示范但没有负样本。这时候一个实用做法是先做 SFT再用模型自己对同一批 prompt 采样多条回答用规则或者人工筛出差的构造出成对数据再跑 DPO。这条路径在垂直领域效果相当好因为负样本来自模型自己的分布比外部采样的负例更有针对性。3.3 算力与工程复杂度决定第二道分水岭算力这件事别只看单卡能不能装下。PPO 的真实成本不在显存在吞吐在线采样要求策略模型不断生成生成是自回归的、串行的GPU 利用率很难打满。同样一批数据DPO 可能两小时跑完PPO 要跑一整天还不算调超参的时间。给个粗略的估算方法。全参训练 7B 模型bf16 权重 14GB梯度 14GBAdam 的 fp32 主权重和两个动量各 28GB加起来接近 112GB还得加上激活值。开梯度检查点能把激活压下来但会多花约三成的计算时间。所以 7B 全参对齐基本要 8 卡起步。用 LoRA 的话可训练参数降到千分之几优化器状态几乎可以忽略单张 80GB 卡跑 DPO 完全可行ORPO 更宽松48GB 也能试。这里有个实际经验LoRA 做对齐的效果损失比很多人想象的小。在 7B 到 13B 这个量级LoRA 秩设 16 到 64、作用在所有线性层上DPO 的效果能接近全参的九成以上。真正的差距出现在更小的模型上——1B 以下的模型容量有限LoRA 的低秩约束会明显限制它学偏好信号的能力这时候全参或者更大的秩才有意义。3.4 我常用的三条组合路线抛开理论说三条我在实际项目里反复用过的路线。第一条是稳妥路线SFT → DPO。适合绝大多数从零开始的团队。先用几万条高质量示范把格式和基础知识打进去再用几千对偏好数据做对齐。这条路线的好处是每一步都可控、可回滚DPO 阶段出问题不会毁掉 SFT 的成果因为参考模型就是 SFT 模型本身。缺点是两步训练总时长翻倍。第二条是省钱路线ORPO 一步到位。适合算力紧张、数据质量已经比较高的场景。前提是你的 chosen 数据足够干净因为这一步没有独立的 SFT 阶段兜底。我一般会建议先用小规模数据跑一次观察通用能力有没有掉确认没问题再放大。第三条是冷启动路线SFT → 自采样构造偏好对 → DPO → KTO 补刀。前两步构造出成对数据跑 DPO然后把线上收集到的零散反馈用 KTO 继续训。这条路线适合已经有产品在跑、能持续拿到反馈的团队。KTO 放在最后的好处是它不会破坏 DPO 已经学到的偏好结构只是在此基础上做微调权重系数设小一点即可。至于 PPO我的看法是除非你已经有成熟的奖励模型并且有专门的工程人力维护训练管线否则不建议作为第一个对齐方案。它的收益在多数中等规模任务上并不比 DPO 高出一个数量级但成本高出一个数量级。4. 实操落地数据构造、训练配置与关键参数4.1 偏好数据的构造与清洗数据这一关过不了后面全是白搭。构造偏好对有几个实操要点。第一长度要控制。前面提过对数概率是逐 token 累加的长度差会直接变成偏好信号。我的做法是把 chosen 和 rejected 的长度差控制在 20% 以内超出这个范围的对子要么重采样要么直接丢掉。如果实在丢不掉可以在计算对数概率时做长度归一化但这会引入新的偏置不如在数据侧解决。第二负例要有区分度但不能太离谱。太容易区分的负例比如答非所问、语法错误对模型几乎没信息量训了也只是在学“别说废话”。理想的负例是“看起来合理但存在细微问题”——事实细节错了一处、推理跳了一步、语气不合适。这类难负例才是真正提升效果的来源。实操上可以让模型对同一 prompt 采样多条然后用一个更强的模型或者人工做排序取相邻档位的两条作为一对。第三清洗要做彻底。重复样本、chosen 里的事实错误、格式不统一这些问题在 DPO 里会被放大因为模型会认真地去学每一条 chosen。我一般会过三道去重按语义相似度不是字符串、长度过滤、抽样人工复核。第四数据量不是越多越好。几千对高质量数据的效果往往好过几万对凑数的数据。经验值是垂直领域任务3000 到 8000 对能覆盖主要场景通用能力对齐需要上万对。低于 1000 对的时候DPO 很容易过拟合表现出来就是训练 loss 一路降到很低但换一批 prompt 就原形毕露。4.2 DPO 实操从零跑通一个最小闭环先把损失的含义落成代码理解起来更直接。下面是不依赖任何具体框架的伪代码核心就是四个对数概率。# 输入batch 中的 chosen_ids、rejected_ids、对应 mask # policy_logps / ref_logps 均为逐序列的对数概率之和按 mask 求和 def dpo_loss(policy_chosen_logp, policy_rejected_logp, ref_chosen_logp, ref_rejected_logp, beta0.1): # 隐式奖励 beta * (log pi - log pi_ref) chosen_reward beta * (policy_chosen_logp - ref_chosen_logp) rejected_reward beta * (policy_rejected_logp - ref_rejected_logp) # Bradley-Terry 形式的成对损失 logits chosen_reward - rejected_reward loss -log_sigmoid(logits) # 监控用隐式奖励的准确率应稳步上升并趋近 1 accuracy (logits 0).float().mean() return loss, accuracy, chosen_reward, rejected_reward跑通这个闭环需要准备三样东西策略模型、冻结的参考模型、成对数据。参考模型建议直接从 SFT 检查点复制不要用基座否则约束点错了模型会被拉回预训练分布。数据侧要做的是把 chosen 和 rejected 分别 tokenize注意 padding 侧要和模型训练时保持一致并且在计算对数概率时用 mask 把 padding 排除掉——这一步错了loss 会看起来正常但模型完全学不到东西是很隐蔽的坑。配置上给一组能直接用的起点学习率 5e-7warmup 比例 0.1β 取 0.1训练一到两轮batch size 尽量大配合梯度累积优化器用 AdamW权重衰减 0.0。LoRA 的情况下学习率可以提到 1e-6 到 2e-6因为可训练参数少需要更大的步长。# 一个可直接改用的配置骨架 stage: dpo beta: 0.1 learning_rate: 5.0e-7 lr_scheduler: cosine warmup_ratio: 0.1 num_train_epochs: 1 per_device_batch_size: 2 gradient_accumulation_steps: 16 # 有效 batch 32低于这个数 loss 噪声大 max_length: 2048 max_prompt_length: 1024 gradient_checkpointing: true bf16: true peft: enabled: true rank: 16 alpha: 32 dropout: 0.05 target_modules: all_linear训练过程中盯三个指标损失、隐式奖励的准确率、以及生成的平均长度。损失应该是缓慢下降然后趋平的曲线如果一路陡降到底多半是数据里有太多容易区分的对子或者 β 设小了。隐式奖励准确率从 0.5 附近起步慢慢爬到 0.8 以上算正常如果一直卡在 0.5 附近说明模型根本没学动先检查参考模型是不是加载错了。平均长度出现明显漂移比如掉了三成就要停下来看数据里的长度分布。4.3 KTO 与 ORPO 的配置差异KTO 的配置和 DPO 大部分重合差别在数据字段和几个专属参数。数据侧不再需要配对每条样本带一个布尔标记表示可取与否。参数上除了 β还有两个权重可取样本权重和不可取样本权重起点可以设 1.0 和 1.33。如果坏样本占比低于两成把不可取权重往上推到 1.5 到 2.0 之间如果坏样本占了大半反而要往下调否则模型会被大量负信号压得不敢输出。KTO 对 batch size 的敏感度比 DPO 高很多因为它的参照点是用批次内的 KL 估计出来的。我见过最典型的失败案例是单卡 batch 只开到 4梯度累积 8训练 loss 抖得像心电图最后收敛到一个很差的局部解。解决办法就是把有效 batch 提到 32 以上或者换更大的卡。ORPO 的配置差异在损失项。数字上主要是 λ起点 0.1 到 0.2。学习率通常比 DPO 高一个量级因为它是从基座直接训需要更大的步长常见范围 5e-6 到 8e-6。训练轮数严格控制在一到两轮。另外 ORPO 对 max_length 更敏感因为 SFT 损失作用在完整序列上序列太长会稀释偏好信号建议把长度上限设得比 DPO 略低或者按数据的分位数来定。stage: orpo lambda: 0.15 learning_rate: 8.0e-6 num_train_epochs: 1 warmup_ratio: 0.05 max_length: 1536 per_device_batch_size: 2 gradient_accumulation_steps: 16 bf16: true gradient_checkpointing: trueORPO 训练时最需要关注的是通用能力的保持。建议在训练前后各跑一次小样本的通用评测如果下降超过三到五个点就把 λ 调小、轮数减半、或者往数据里掺一部分纯 SFT 样本平衡一下。4.4 显存与超参的估算方法显存估算有个简单公式可以背下来全参训练时每十亿参数大约需要 16GB 的模型与优化器状态bf16 权重 2 字节 梯度 2 字节 fp32 主权重 4 字节 两个动量 8 字节共 16 字节再加上激活值。激活值粗略按 每 token 每层 几十 KB 估序列 2048、层数 32 的话单条样本的激活在几个 GB 量级。开梯度检查点能压到原来的几分之一代价是约 30% 的时间开销。按这个算7B 全参 DPO 大约 112GB 起步实际要留余量8 张 80GB 卡比较稳。LoRA 则把优化器状态几乎清零7B 模型在单张 80GB 卡上跑 DPO 很轻松48GB 卡配梯度检查点也能撑。超参的调整顺序我一般是这样先定 β0.1 起步再定学习率全参 5e-7LoRA 1e-6 到 2e-6然后调 batch size能多大就多大最后看轮数。不要一上来就网格搜索对齐训练的方差很大小规模实验的结论未必能放大。更靠谱的做法是固定一个配置跑完看评测结果再单变量调整。还有一点值得强调随机种子。对齐训练对种子相当敏感同一套配置换个种子胜率可能差好几个百分点。所以做对比实验时至少跑三个种子取平均否则很容易得出错误结论。5. 踩坑实录那些文档里不会写的问题5.1 奖励劫持与长度偏置奖励劫持在 PPO 里最典型在 DPO 里也有变体。PPO 的表现是奖励分数稳步上升但人工评估停滞甚至下降根因通常是奖励模型在策略分布的边缘区域外推不可靠。缓解手段包括给奖励加长度惩罚项、在奖励模型训练时混入策略模型采样的样本、以及把 KL 系数从固定值改成自适应当 KL 超过目标值时加大惩罚。自适应 KL 在实践中效果明显好于固定值因为它能自动跟上策略的漂移速度。DPO 里的对应现象是模型学会某种表面模式。我遇到过一个案例数据里的 chosen 普遍带有“首先、其次、最后”这类结构化连接词训练后模型对所有问题都强行套这个模板包括那些一句话就能答完的问题。这不是长度偏置是格式偏置。定位方法是把训练后的模型输出和 chosen 做词汇分布对比看哪些词的频率异常抬升。解决靠数据侧打散格式、增加多样性或者在损失里对高频词做惩罚。长度偏置前面提过这里补一个检测方法把评测集的输出按长度分桶看各桶的胜率。如果胜率随长度单调上升基本可以确认存在长度偏置需要回到数据侧处理长度差。5.2 训练异常排查整理了一份速查表都是实际撞过的。现象可能原因处理办法loss 几乎不降参考模型加载错、mask 没排除 padding、学习率过低核对参考模型来源打印一条样本的对数概率检查学习率提一档loss 陡降到接近 0数据里对子太容易区分、β 过小、数据重复补充难负例β 提到 0.3 试按语义去重loss 剧烈震荡batch 太小、学习率过高、数据噪声大有效 batch 提到 32 以上学习率减半清洗数据输出长度骤降rejected 普遍比 chosen 长重采样或做长度匹配输出变得重复训过头、λ 或 β 过大减轮数降系数混入 SFT 数据通用能力下降偏离参考模型太远降 β、加 KL、减轮数掺入通用数据显存 OOM序列过长、batch 过大、未开检查点开梯度检查点降 max_length用 LoRA训练完模型不响应指令数据里 chosen 都是纯续写、缺少指令格式检查数据格式补指令型样本还有一类问题比较隐蔽训练日志一切正常但推理时效果很差。这往往是训练和推理的模板不一致造成的。对齐阶段用的对话模板必须和推理时完全一致包括特殊 token、角色标记、换行位置。差一个空格都可能让模型的表现掉一大截因为它是靠这些标记来识别“现在该我回答了”。5.3 评测别用训练指标骗自己对齐训练的评测是最容易自欺欺人的环节。训练 loss 低、隐式奖励准确率高只说明模型在训练分布上学会了区分不代表它真的变好了。我一般做三层评测。第一层是留出的偏好对上的排序准确率用来确认模型确实学到了偏好信号这一层快、便宜但只能排除明显失败。第二层是和基线模型的对比胜率用同一批 prompt 让两个模型各生成回答做盲评或者用裁判模型打分。裁判模型打分要注意位置偏置和长度偏置标准做法是交换 A/B 位置各评一次取平均并且把长度作为协变量记录下来。第三层是通用能力回归测试确认对齐没有把模型训傻。第三层最容易被跳过但恰恰最重要。对齐训练的目标是让模型更符合偏好不是让它变成另一个模型。如果通用能力掉了太多说明约束没做好回去调 β 或者减轮数。还有一个实操建议评测集要独立构造不要从训练数据里切。偏好数据的分布通常比较集中从里面切的测试集无法反映真实场景的多样性。更好的做法是从线上真实请求里采样覆盖不同难度和长度。最后分享一个我自己的判断标准如果一个对齐方案在留出集上的胜率提升不到三个百分点我一般不会上线因为对齐训练对种子和数据的敏感度带来的波动就在这个量级看不到明显收益就不值得承担通用能力下降的风险。宁可多花时间在数据质量上也不要指望靠调参把效果调出来。这个领域后续还可以往几个方向扩把拒绝采样和多轮迭代串起来做在线式对齐、把偏好信号拆成多个维度分别建模有用性、安全性、风格各训一个、以及在长上下文场景下处理长度归一化的问题。这些都是我目前在跟的方向等有了稳定的结论再单独写。
阅读完成 · 觉得有帮助?
咨询建站