第一次看到DPO的论文时我脑子里就一个想法“还能这样玩”传统的RLHF做对齐流程是训练Reward Model → PPO强化学习 → 模型对齐。中间那个Reward Model训练起来又贵又麻烦还特别不稳定。DPODirect Preference Optimization直接把这个步骤砍了。不训练Reward Model不搞强化学习一个公式搞定对齐。去年我在一个对话模型项目上试了DPO效果配得上它的名气。这篇文章聊聊实战经验和踩过的坑。为什么Reward Model让人头疼先说说传统RLHF为什么烦人。做RLHF的标准流程是SFT先用高质量数据做监督微调训练Reward Model收集人类偏好数据训练一个打分模型PPO用Reward Model的分数指导模型优化每一步都有坑。尤其是RM这一步——你要训练一个专门的打分模型这个模型本身需要大量的偏好数据而且训练过程中还经常出现reward hacking模型找到了作弊的方式获得高分而不是真正变好了。更离谱的是我发现Reward Model过拟合的速度特别快。训练了2个epoch后RM给出的人类偏好准确率确实上去了但对模型质量的引导效果反而下降了。DPO的精髓就是不要Reward Model直接用偏好数据优化策略。DPO的数学直觉不讲复杂公式只说直觉。RLHF的本质是我们希望模型更倾向于输出人类喜欢的回答同时不要偏离原始SFT模型太远防止灾难性遗忘。传统做法是学一个RM来打分然后让模型跟着分数走。DPO的做法是既然最终目的是让模型直接学习哪个回答更好为什么不直接优化这个目标DPO推导出了一个可以直接用的损失函数偏好数据中好回答的log-probability - 差回答的log-probability加上一个KL散度限制防止模型跑偏。这个损失函数直接告诉模型“这两个回答里第一个比第二个好你的输出应该更靠近第一个的分布。”不需要Reward Model不需要PPO的actor-critic框架不需要经验回放缓存。直接一个损失函数搞定。实战DPO微调的完整流程数据准备DPO需要偏好数据集。每条数据包含三个字段prompt: 用户输入chosen: 人类偏好的回答rejected: 人类不偏好的回答数据来源有两种方式方式一人工标注找标注人员对模型的多条输出排序。质量最高但成本也最高。方式二对比采样 自动标注用不同模型或参数生成多个回答然后用GPT-4作为判断器打分。效果不错成本可控。# 偏好数据格式示例preference_data[{prompt:解释一下监督学习和无监督学习的区别,chosen:监督学习用带标签的数据训练无监督学习用无标签的数据...,rejected:监督学习嘛就是有老师教无监督学习就是自学...},# ...更多数据]训练代码用Hugging Face的TRL库做DPO代码比想象中简单fromtransformersimportAutoModelForCausalLM,AutoTokenizerfromtrlimportDPOTrainer# 加载模型modelAutoModelForCausalLM.from_pretrained(Qwen/Qwen2.5-7B)tokenizerAutoTokenizer.from_pretrained(Qwen/Qwen2.5-7B)# DPO参数training_args{per_device_train_batch_size:2,gradient_accumulation_steps:8,learning_rate:5e-7,max_length:2048,max_prompt_length:1024,beta:0.1,# KL散度系数}trainerDPOTrainer(modelmodel,ref_modelNone,# 如果不提供DPO会自动从model复制一个argstraining_args,train_datasetpreference_dataset,tokenizertokenizer,)trainer.train()代码不多但参数调起来很讲究。下面说参数的选择。核心参数调优BetaKL散度系数这是DPO最重要的超参数。Beta越大对模型原始分布的限制越严格模型变化较小Beta越小模型可以更大程度地偏离原始分布对齐更激进我的经验如果SFT模型质量还行只需要微调偏好beta0.1~0.2保守如果SFT模型比较差需要大幅改善beta0.05~0.1激进不知道选什么从beta0.1开始试学习率DPO的学习率通常比SFT要小。我一般从5e-7开始试效果不行再调。注意DPO对学习率很敏感。lr大了模型会迅速遗忘原始能力小了训练半天看不到效果。数据质量 数据数量这点特别重要。500条高质量的偏好数据效果远好于5000条掺水数据。我踩过的坑就是以为数据越多越好结果花了大量精力做了5000条标注数据里面很多标注人员的偏好其实不一致。模型训练出来后不但没变好反而更分裂了。好的偏好数据要求标注一致性 80%意见分歧大的数据直接丢掉。和PPO的对比在同一个对话模型上我同时试了DPO和PPO主观感受如下维度DPOPPO训练复杂度低一个训练脚本搞定高RMPPO两阶段训练稳定性稳定容易崩reward explosion对齐效果不错更好上限更高数据效率高低资源消耗低一个模型高RMPolicy两个模型我的建议小团队、预算有限、快速验证 →DPO大团队、追求极致对齐效果、有训练RM的资源 →PPO实际做法先用DPO快速上线有资源了再上PPO追赶写在最后DPO是个很聪明的设计。它没有发明什么全新的东西而是换了一个角度看问题——“既然Reward Model也是从人类偏好中学来的为什么不让模型直接学偏好”有时候最好的解决方案就是砍掉中间层。如果你已经在做模型对齐强烈建议从DPO开始。成本低、效果好、上手快。等搞清楚了偏好优化的门道再决定是否要上PPO。毕竟先跑起来再跑快才是工程正确的姿势。