基于执行反馈的自我对弈:提升大型语言模型的指令跟随能力
董观亭, 卢柯铭, 李成鹏, 夏婷玉, 于博文, 周畅, 周靖人
阿里巴巴集团 Qwen团队
:sparkles: 概述
本仓库包含了论文《基于执行反馈的自我对弈:提升大型语言模型的指令跟随能力》中提出的AutoIF方法的核心实现。
AutoIF是首个可扩展且可靠的方法,用于自动生成指令跟随数据并通过代码执行反馈验证其质量。
:rocket: AutoIF的数据合成
我们将AutoIF的数据合成过程分为几个步骤,并为每个步骤提供了10-20个样本以便您复现。请记得用您自己的输入替换这些样本。
:wrench: 依赖项
一般环境设置:
- Python 3.9
- PyTorch (目前在版本2.1.2+cu121上测试)
- Transformers (版本4.41.2,低于此版本可能无法工作)
cd ./AutoIF/
pip install -r requirements.txt
指令增强与验证
首先,我们手写了36条种子指令:
步骤1:种子指令自我指导
将指令与RFT提示词连接。
python 1_RFT.py
请使用监督模型(如GPT-4、Qwen2-72B)进行k次RFT,保存格式为seed_instruction.txt。
步骤2:验证函数和案例生成
使用种子和增强指令生成验证函数和案例。
python 2_verification_funcs_cases_generation.py
请为每个样本生成K个验证函数和案例,保存在eval_func_rft.jsonl中。
步骤3:质量交叉验证
交叉验证验证函数和案例的通过率,以确保高质量指令。
python 3_cross_validation.py
步骤4 & 5:反向翻译
请将验证函数反向翻译为指令,然后使用mDeBERTa进行一致性筛选。
python 4_eval_func_backtranslator.py
python 5_eval_func_backtranslator_filter.py
查询增强与验证
步骤1:查询重构和增强
我们随机将每个查询与ShareGPT的K个查询连接,并使用我们的响应RFT模板重新格式化:
python 6_concat_sharegpt_query.py
请使用监督模型为每个查询生成k个响应。
步骤2:指令跟随验证
交叉验证验证函数和增强响应的通过率,以获得高质量查询。
python 7_query_vertification.py
在这一步中,我们还将每个样本与一致性评分提示词连接。请使用监督模型对它们进行评分。
步骤3:查询质量验证
最后,我们筛选出得分> 8的样本,并将其保存为LlaMA-Factory的SFT数据格式。
python 8_query_score_filiter.py
python 9_sft_data_construction.py
⚡ DPO数据构建
:sparkles:提示: 在我们的论文中,DPO包含两种设置,以下是它们的区别:
- **离线DPO:**响应是从您的SFT数据中获得的,这些数据由监督模型生成。
- **在线DPO:**响应是在每次训练迭代期间由您的基础模型生成的。
请使用上一步生成的评估函数处理您的SFT数据,并将结果格式化为dpo_query_eval_score_results.jsonl。
步骤1:验证函数评分
我们使用相应的验证函数来验证每个响应的通过率。
python 1_dpo_rft_wash.py
步骤2:数据选择
我们使用正样本(准确率>=0.5)和负样本(准确率=0)构建DPO对。
python 2_dpo_data_query_construct.py
构建完成后,您需要按照LlaMA-Factory中的DPO数据格式进行处理。
🎯 训练
我们使用LlaMA-Factory v0.6.3版本。感谢他们出色的工作。
:sparkles:提示: 我们两种设置的区别:
- **强到弱蒸馏:**我们使用强大的模型作为监督模型(例如GPT-4、Qwen2-72B、Llama3-70B),弱模型(例如Qwen2-7B、Llama3-8B)作为基础模型。
- **自对齐:**我们使用相同的模型(例如Qwen2-72B、Llama3-70B)作为监督和基础模型。
(1) SFT训练:
deepspeed --num_gpus=8 train_bash.py \
--deepspeed $deepspeed_zero3_config_path \
--stage sft \
--do_train \
--use_fast_tokenizer \
--flash_attn \
--adam_beta1 0.9 \
--adam_beta2 0.95 \
--model_name_or_path $MODEL_PATH \
--dataset $dataset \
--template $Template \
--finetuning_type full \
--output_dir $OUTPUT_PATH \
--overwrite_cache \
--overwrite_output_dir \
--warmup_steps 20 \
--weight_decay 0.1 \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 4 \
--ddp_timeout 9000 \
--learning_rate 7e-6 \
--lr_scheduler_type "linear" \
--logging_steps 1 \
--cutoff_len 8192 \
--save_steps 200 \
--num_train_epochs 3.0 \
--plot_loss \
--bf16
(2) DPO训练:
deepspeed --num_gpus 8 train_bash.py \
--deepspeed $deepspeed_zero3_config_path \
--stage dpo \
--do_train \
--model_name_or_path $MODEL_PATH \
--dataset $dataset \
--dataset_dir $DATA_PATH \
--template $Template \
--finetuning_type full \
--output_dir $OUTPUT_PATH \
--overwrite_cache \
--overwrite_output_dir \
--cutoff_len 4096 \
--preprocessing_num_workers 1 \
--per_device_train_batch_size 1 \
--gradient_accumulation_steps 2 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--warmup_ratio 0.1 \
--save_steps 1000 \
--learning_rate 5e-6 \
--num_train_epochs 2.0 \
--max_samples 200000 \
--ddp_timeout 180000000 \
--plot_loss \
--fp16
关于7B和70B模型训练的实现细节,请参考我们的论文。
:mag_right: 总体结果
引用
如果您发现这项工作对您的研究有帮助,请引用它。
@article{董2024自我对弈,
标题={基于执行反馈的自我对弈:提升大型语言模型的指令遵循能力},
作者={董冠廷 和 陆可明 和 李成鹏 和 夏亭玉 和 余博文 和 周畅 和 周景仁},
期刊={arXiv预印本 arXiv:2406.13542},
年份={2024}
}