基于Qwen3的DPO/KTO/ORPO/Simpo经验总结


基于Qwen3的DPO/KTO/ORPO/Simpo经验总结

仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接

总结一下RLHF的部分经验,基于Qwen3系列模型,框架使用Llama-Factory。
DPO的计算过程大概如下
在DPO优化过程中,对于chosen优化的方向是有不确定性的,DPO优化只保证整体的margin增大,而不是单一的让chosenprob增大。
loss和chosen、rejected公式如下。
这里采用了llama-factory自带的dpo_en_demo数据集进行DPO训练,可以看出rejected和chosen都是上升的,margin也在增加。
理想情况是chosen增大、rejected降低。但在数据不好/参数设置不合理的时候,就会出现chosen/rejected同时上升或者下降的情况。
下面更换Qwen2. 5模型进行DPO训练,可以看到chosen和rejected都在降低。
下面是采用实际业务数据得到的pair对,训练SFT的Qwen2,5,并加权了部分SFT的loss,以使得模型权重结果不偏离原始模型太多。
其中chosen和rejected同时上升or下降的原因分析可参考:

那么反过来讲,chosen_reward减小,表明模型更新后,离chosen样本输出越远。rejected也同理。

loss分数是update_model好坏之差和ref_model好坏之差的变化量。

通常dpo训练时,rejected样本是模型输出的,chosen是better模型优化的。那么这里就有一个问题,rejected是不是当前模型输出的,对训练效果有什么影响?
基于上面分析,考虑ref_logratios不变的情况下,loss更新后,会导致update_model更接近chosen或者远离rejected或者both(实际上肯定是both)。不管样本如何,接近chosen肯定是ok的。但如果rejected不是sft模型产生的,那么远离一个本来就不会输出的rejected(如同降低一个发生概率本身就为0的概率)就没有多大意义,这部分效果就丢失了,因此整个DPO的效果就打折了。
KTO:ModelAlignmentasProspectTheoreticOptimizationLLMRLHF2024论文(八)KTO
考虑到dpo的loss是优化margin,也就是chosen-rejected的差。可能会存在两边同时上升/下降,但margin仍然增加的情况。那么考虑固定一边,就可以优化另一部分的效果。比如rejected为0,那么优化margin就变成了优化chosen,固定chosen同理。
此时从reward优化方式变成了类似sft的优化方式(不再需要偏好数据),因为接近SFT方式,所以可以在base模型上直接KTO训练,但相比SFT来说,KTO需要有ref_model。
设置kto_tag,若为true,则chosen数据保持不变,rejected_logits设置为0,反过来则一样。从而使得独立处理两种数据均有SFT效果,可以对正负样本不均衡的数据进行训练。
论文中说的HALO方法,其实可以不用管。
KTO和SFT对比:SFT的数据只能是goodcase,而KTO的数据可以是badcase。KTO需要ref_model。

论文中说KTO的效果均比DPO要强。实际效果还是要看数据质量(目前个人实测是DPO要更好一点)。
实际测试,chosen还是会略有下降。
ORPO:MonolithicPreferenceOptimizationwithoutReferenceModel大模型的PPO、DPO偏好优化算法玩不起?那建议你看一下ORPO(更有性价比!)
ORPO在DPO的基础上,去掉了ref_model,增加了赔率比(oddsratio)的loss。又结合了SFT的loss,将SFT和RLHF的过程合并成一个。
loss如下,首先定义odds,就是将原本的概率放的更大(加速模型更新)。然后定义ORloss,最终叠加SFTloss。
ORPO从本质上来说和DPO在解决的是同一个问题:拉远正负样本的距离,让模型更好地区分正负样本。
这里有个加权系数,实验中通常取0. 1,那么实际上主要起作用的还是SFT。也就是在SFT上多引入了一点对比loss。
ORPO和DPO的区别:
1、ORPO没有ref_model,DPO有。
2、ORPO的加权通常是pair_loss0. 1,可以看作是SFT训练中增加一点对比学习效果。而DPO是sft_loss0. 1,是对比学习中引入一点sft效果,让模型不至于跑太偏。如果ORPO去掉sft_loss,那么就是一个去掉ref_model的激进RL方法,更容易跑偏。
ORPO的缺点:通常来说SFT阶段需要几万几十万的数据集,RL阶段需要几千几万条pair数据。众所周知,pair数据比sft数据难获取。而ORPO是SFT+RL阶段二合一,需要大量的pair数据。
SimPO:SimplePreferenceOptimizationwithaReference-FreeReward
可以看出DPO的训练结果中,有一半是不符合推理目标的要求的。
也就是说原始sft模型很难生成pair数据中的chosen数据,相比来说,更容易生成rejected。
实际项目中的DPO训练数据通常就是这个样子,rejected是sft模型生成的badcase(生成概率更大),而chosen是其他bettermodel生成的(sft模型生成概率很低)。
SimPO对此做了优化。从奖励函数可以看出相比于DPO,SimPO少了refmodel。训练显存占用更少,并增加了长度归一化项,解决chosen通常比rejected更长导致的rlmodel输出长度增长的问题。
简单推理过程可以理解为
Simpo中没有KL散度约束,通过降低lr进行简单约束模型偏差。
SimPOvsDPO:
总结就是,DPO是优化(当前model比refmodel更接近chosen-当前model比refmodel更远离rejected),目标太复杂,优化的结果不一定是最佳推理结果。
Simpo是优化(当前model生成chosen-当前model生成rejected),目标简单明了。
缺点:没有ref模型,没加KL散度,容易巡飞。。。实测效果一般。
1、DPO是PPO的简化版,目的是优化max(chosen-rejected),对于不是自己生成的数据,容易产生chosen和rejected同时上升和下降的情况,效果不够稳定(虽然比PPO已经好很多了)。
2、KTO把DPO的优化目标从max(margin)变成了max(chosen)ormax(-rejected),保证了RL的效果,数据集质量一般的情况下,效果比DPO好。但方法的能力上限比DPO低。
3、ORPO的核心还是SFTloss,同时对pair数据的需求变大。
4、Simpo相比DPO,去掉了refmodel,没加KL散度,容易巡飞。
总的来说,在当前所做对话项目中还是DPO用的较多,常用于针对某类具体问题纠正模型回复内容,其他任务类型不确定,完全需要具体任务具体分析。
提升对话质量方面,整体还是比较难搞的,毕竟没办法准确定义什么样的对话质量高,调prompt洗出“高质量”数据是最核心的工作内容。数据质量对结果的影响比RL方法的影响要大得多。
DirectPreferenceOptimization:YourLanguageModelisSecretlyaRewardModel
小冬瓜AIGC:为什么DPO里Chosen和Rejected概率会同时下降???
dpo的局限性
ChenShawn:【不靠谱】有关DPO训练时,为什么chosen和rejected的reward一起下降的猜想
Sonsii:DPO及其衍生算法XX-O
人人都能看懂的DPO数学原理
KTO:ModelAlignmentasProspectTheoreticOptimization
LLMRLHF2024论文(八)KTO
大模型对齐技术,各种什么O:PPO,DPO,SimPO,KTO,Step-DPO,MCTS-DPO,SPO
2024年大模型Alignment偏好优化技术PPO,DPO,SimPO,KTO,Step-DPO,MCTS-DPO,SPO
ORPO:MonolithicPreferenceOptimizationwithoutReferenceModel
大模型的PPO、DPO偏好优化算法玩不起?那建议你看一下ORPO(更有性价比!)
SimPO:SimplePreferenceOptimizationwithaReference-FreeReward


文章作者: ZejunCao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZejunCao !
  目录