SuperAPI AI 工具集

preference-optimization

智能体与模型

查看项目

更新于 10-16 07:31

技能介绍

用途

该技能用于在已有偏好配对数据或非配对点赞/点踩反馈的情况下,对微调后的模型进行偏好对齐。它假定上游的 finetuning-method-selection 已根据数据形态完成路由:数据不是演示样本(那属于 lora-qlora-recipes),也不是可验证的奖励信号(那属于 grpo-rlvr-training)。这里要解决的是 DPO 家族内的选型、选型重要程度的证据、生产训练模式,以及如何构建配对。

输入是路由决策(偏好优化)加上偏好配对或非配对反馈,通常来自 SFT 检查点。输出是经过验证的方法选择加上配置——即 references/method-configs.md 中的 kwarg 取值,而不是自由形式的建议——供 llm-finetuning-training-engineer 直接使用。

主要能力:方法选择

依据数据形态选择方法:

  • 偏好配对(默认情况)→ DPO,关键参数 β=0.1,学习率 5e-7–1e-6,1–2 轮。
  • 内存受限或无 SFT 检查点 → ORPO,无参考模型,将 SFT 与偏好目标融合进一个损失。
  • 非配对点赞/点踩 → KTO,每个样本一个二元标签,无需配对。
  • 观察到长度偏差且有 sweep 预算 → SimPO,无参考模型。

DPO 是安全默认项。使用 β=0.1 与 5e-7 至 1e-6 的学习率训练 1–2 轮。该学习率低于产生该检查点的 SFT 学习率——把 SFT 量级的学习率搬到 DPO 是最常见的配置错误,而非边缘情况。

ORPO 在内存受限、或没有可起步的独立 SFT 检查点时进入:它无参考模型,把 SFT 与偏好目标融合为一个损失,省去单独的 SFT 阶段和 DPO 所需的参考模型显存开销。

KTO 在反馈为非配对的二元信号(点赞/点踩)而非匹配的偏好配对时进入——不要把非配对反馈强行合成为配对来使用 DPO。

SimPO 修正了 DPO 的长度偏差,但只有在有纪律地 sweep 时才有收益——它公布的增益是在调优 sweep 下报告的上限,而不是任何单一配置都能复现的基线。仅在有 sweep 预算时路由到这里,否则使用 DPO。

经典 RLHF(奖励模型 + PPO)在前沿实验室之外已退役。生产流水线中不要使用它——上述每种方法在相同数据形态下都更便宜、支持更好。

使用方式:示例判断

  • “我们有 SFT 检查点和干净的配对偏好数据,目前没有长度偏差投诉。” → 默认情况 → DPO,β=0.1。
  • “标注者对每条回复点赞/点踩;没有配对。” → 非配对信号 → KTO 而非 DPO——不要合成配对来强行套用 DPO。
  • “GPU 预算不足以支撑单独的 SFT 阶段加 DPO 参考模型。” → 内存受限、无独立检查点 → ORPO。
  • “DPO 输出偏好更长的回答而不论质量,且有跑 sweep 的时间。” → 长度偏差加 sweep 预算 → SimPO;如果 sweep 预算其实不存在就跳过。

低杠杆的真相

一项 2026 年、240 次 H100 运行的研究(arXiv 2603.19335)是上表背后的关键证据:损失函数选择的杠杆约值 1 个百分点,模型规模的杠杆约值 50 个百分点。所测 20 个 DPO 变体中没有一个胜过原版 DPO。排名还会随规模反转——在小规模试点中胜出的变体在部署规模上可能落败。

两个实践后果:不要在路由决策中纠结于 DPO 变体的对比评测,上表已足够,更深的变体选择相对数据质量和规模而言杠杆很低。其次,在信任排名前应在部署规模上验证——在小规模试点模型上做的方法比较不会迁移到生产规模类别,规模变化后需要重新确认胜出者。

这也是上表刻意简短的原因:它编码的是约 1pp 的杠杆,而不是该研究显示无法跨规模成立的 DPO 变体排名。任何不在该表中的变体选择建议——包括声称某个变体“胜出”的建议——在被目标部署规模验证之前都应视为未经验证。

生产模式:迭代式 on-policy DPO

在静态偏好数据集上做一次离线 DPO 只是起点,不是生产模式。随着训练推进,策略会偏离配对采样时的分布,静态数据集会相对这一漂移而过时。生产流水线以迭代、on-policy 的方式运行 DPO:

  1. 从当前策略检查点采样补全。
  2. 对补全打分或排序(奖励模型、评判模型或任务评分器)。
  3. 以当前检查点作为参考模型运行一次 DPO。
  4. 产出的检查点同时成为下一轮的新策略和新参考。
  5. 重复。每轮的参考模型是上一轮的输出,而非固定的初始检查点——这正是让偏好信号保持 on-policy、而不是用越来越陈旧的分布打分的原因。

单次 DPO 运行仍是合理的第一轮迭代,只是它不是完整流水线。在第一份检查点产生后应计划至少再跑一轮,而不是把第一轮当作成品。

配对构建

从同任务的通过/失败轨迹构建 DPO/ORPO 配对——这是对同一底层任务的两次尝试,而不是从不同任务中拉来的无关最佳与最差样本。在该轨迹集合内,被拒样本应选在奖励分布的 μ−2σ 处,而非最小值。朴素的“最佳对最差”配对构建(最大奖励对绝对最小)会随规模增大而退化;μ−2σ 选择对上述低杠杆研究揭示的同一规模敏感性更稳健。

sorted_by_reward = sort(trajectories, key=reward)
chosen   = sorted_by_reward[-1]                # highest reward
mu, sigma = mean(rewards), stdev(rewards)
rejected = closest(sorted_by_reward, mu - 2 * sigma)
# NOT sorted_by_reward[0] — the absolute minimum
# is the naive best-vs-worst construction that
# degrades as scale increases.

关于如何把已评分的轨迹转成这些配对的机制——包括拒绝采样和评判打分的 delta 选择——参见 trace-to-training-data。

限制与参考

每种方法的完整 TRL 配置块——DPOConfig、ORPOConfig、KTOConfig 以及 SimPO sweep 网格——加上 Unsloth 封装和灾难性遗忘说明位于 references/method-configs.md。这些配置使用与 lora-qlora-recipes 的 references/unsloth-trl-mapping.md 一致的当前 TRL API 约定(processing_class,而非 tokenizer=)。

该方法配置文档还包含灾难性遗忘说明:当偏好调优后的检查点丢失通用能力时,通常原因是学习率过高,修复几乎总是把学习率降到上表范围的低端,然后再考虑其他补救措施。

相关技能:finetuning-method-selection 在存在偏好配对或非配对反馈后路由到这里;lora-qlora-recipes 产出 DPO/KTO/SimPO 对齐所用的 SFT 检查点(ORPO 的融合路径可以跳过它);trace-to-training-data 把通过/失败的轨迹转为本技能配对构建部分消费的配对。