hiyouga / LLaMA-Factory

Unified Efficient Fine-Tuning of 100+ LLMs (ACL 2024)
https://arxiv.org/abs/2403.13372
Apache License 2.0
34.8k stars 4.29k forks source link

请问DPO训练的时候有什么注意事项吗?我训练出来效果很差。 #5484

Open zlh-source opened 2 months ago

zlh-source commented 2 months ago

Reminder

System Info

训练命令:

llamafactory-cli train \ --stage dpo \ --do_train \ --finetuning_type full \ --deepspeed examples/deepspeed/ds_z0_config.json \ --model_name_or_path "LLaMA3" \ --dataset "" \ --dataset_dir ./data/ \ --template empty \ --output_dir ${save_model} \ --overwrite_cache \ --overwrite_output_dir \ --cutoff_len 2048 \ --preprocessing_num_workers 16 \ --per_device_train_batch_size 4 \ --gradient_accumulation_steps 4 \ --lr_scheduler_type cosine \ --logging_steps 10 \ --save_steps 200 \ --learning_rate 5e-6 \ --num_train_epochs 2 \ --plot_loss \ --bf16 \ --save_total_limit 1 \ --pref_beta 0.1 \ --pref_loss sigmoid

推理命令: llamafactory-cli train \ --stage sft \ --do_predict \ --model_name_or_path ${save_model} \ --eval_dataset ${eval_dataset} \ --dataset_dir ./data \ --template empty \ --finetuning_type full \ --output_dir ${pred_path} \ --overwrite_cache \ --overwrite_output_dir \ --cutoff_len 2048 \ --preprocessing_num_workers 16 \ --per_device_eval_batch_size 16 \ --predict_with_generate

Reproduction

None

Expected behavior

请问DPO训练的时候有什么注意事项吗?我训练出来效果很差。

例如:

  1. rejected数据需要很高的质量么? 例如,我用SFT模型的response作为rejected,chatgpt的response作为chosen。这样是否合理?

  2. 2k数据,全量dpo微调3B模型的话,学习率,epoch一般怎么设置?

感谢!

Others

No response

owenliang commented 2 months ago

DPO很严重的破坏了原先模型能力。。奇怪

zlh-source commented 2 months ago

+1。但是没确定出来是什么原因。 仅似乎用chosen数据做SFT,效果能到70. 但是用chosen+rejected数据做DPO,只能到31 差的也太多了

divisionblur commented 2 months ago

+1。但是没确定出来是什么原因。 仅似乎用chosen数据做SFT,效果能到70. 但是用chosen+rejected数据做DPO,只能到31 差的也太多了

你用的哪个评估集?

zlh-source commented 2 months ago

+1。但是没确定出来是什么原因。 仅似乎用chosen数据做SFT,效果能到70. 但是用chosen+rejected数据做DPO,只能到31 差的也太多了

你用的哪个评估集?

自己的一个代码生成的评估集合。dpo之后,模型基本上就不能生成正常代码了。很奇怪

muziyongshixin commented 1 month ago

+1。但是没确定出来是什么原因。 仅似乎用chosen数据做SFT,效果能到70. 但是用chosen+rejected数据做DPO,只能到31 差的也太多了

你用的哪个评估集?

自己的一个代码生成的评估集合。dpo之后,模型基本上就不能生成正常代码了。很奇怪

dpo通常只能训练一个epoch,多了显著过拟合。另外lr可以调小一点 另外训练数据使用sft模型自己生产的可能效果会好一些(之前试过开源的数据不如自己跑多条然后让gpt打分构造的数据好)

zlh-source commented 1 month ago

+1。但是没确定出来是什么原因。 仅似乎用chosen数据做SFT,效果能到70. 但是用chosen+rejected数据做DPO,只能到31 差的也太多了

你用的哪个评估集?

自己的一个代码生成的评估集合。dpo之后,模型基本上就不能生成正常代码了。很奇怪

dpo通常只能训练一个epoch,多了显著过拟合。另外lr可以调小一点 另外训练数据使用sft模型自己生产的可能效果会好一些(之前试过开源的数据不如自己跑多条然后让gpt打分构造的数据好)

非常感谢 我试一下

Uooga commented 1 month ago

+1,请问你现在进展怎么样了,我也自己设计了一个数据集,大概是4w条,只用chosen的去sft效果不错,但是加上rejected的,模型直接崩溃了,学习率是1e-5

zlh-source commented 1 month ago

+1,请问你现在进展怎么样了,我也自己设计了一个数据集,大概是4w条,只用chosen的去sft效果不错,但是加上rejected的,模型直接崩溃了,学习率是1e-5

没有用dpo了,放弃了。不知道怎么回事,尝试了学习率、epoch的修改,但是都没救回来。😫

lzzzx666 commented 3 weeks ago

+1,请问你现在进展怎么样了,我也自己设计了一个数据集,大概是4w条,只用chosen的去sft效果不错,但是加上rejected的,模型直接崩溃了,学习率是1e-5

没有用dpo了,放弃了。不知道怎么回事,尝试了学习率、epoch的修改,但是都没救回来。😫

可以看一下chosen和rejected的log_probs变化,dpo可能会让二者都变的很小。可以尝试加一点sft_loss, Llamafactory应该是在dpo里面直接支持加入sft loss的