【大模型】使用DPO技术对大模型Qwen2.5进行微调
前言
- 定义
- DPO(Direct Preference Optimization)即直接偏好优化算法,是一种在自然语言处理领域,特别是在训练语言模型时使用的优化策略。它的主要目的是使语言模型的输出更符合人类的偏好。
- 背景和原理
- 在传统的语言模型训练中,通常是基于极大似然估计(MLE)来训练模型,让模型预测的下一个词的概率分布尽可能地接近训练数据中的真实分布。然而,这种方法没有直接考虑人类对于不同生成文本的偏好。
- DPO则不同,它通过直接优化人类对生成文本的偏好来训练语言模型。例如,给定一对生成文本(文本A和文本B),人类标注者会表明对它们的偏好(比如更喜欢文本A),DPO算法就会利用这种偏好信息来调整语言模型的参数。
- 从数学角度看,DPO的目标是最大化一个基于偏好的奖励函数。假设我们有一个语言模型 (p_{\theta}(y|x))(其中(\theta)是模型参数,(x)是输入,(y)是输出文本),奖励函数 (r(y)) 表示人类对生成文本 (y) 的偏好得分。DPO的目标是调整(\theta),使得生成的文本能够获得更高的奖励得分。
- 训练过程
- 首先,需要收集人类对生成文本的偏好数据。这可以通过人工标注来完成,例如让标注者比较两个由语言模型生成的文本片段,并选择更喜欢的一个。
- 然后,在训练过程中,DPO算法会根据这些偏好数据来计算损失函数。具体来说,它会比较语言模型生成的不同文本的概率和人类偏好的关系,使更受偏好的文本的生成概率相对更高。
- 例如,如果文本A比文本B更受偏好,DPO算法会调整模型参数,使得 (p_{\theta}(y = A|x)) 相对 (p_{\theta}(y = B|x)) 增大。
- 应用场景
- 对话系统:在聊天机器人的开发中,DPO可以用于训练模型,使其生成的回答更符合用户的偏好。比如,在一个客服聊天机器人中,通过DPO训练可以让机器人的回答更有礼貌、更准确,从而提高用户满意度。
- 文本生成:在故事生成、新闻写作等文本生成任务中,DPO可以帮助模型生成更吸引人、更符合人们期望的内容。例如,在生成小说情节时,使生成的情节更符合读者对于情节跌宕起伏、逻辑连贯等方面的偏好。
- 优势和局限性
- 优势
- 直接考虑人类偏好:与传统方法相比,DPO能够更直接地将人类对文本的偏好融入到模型训练中,从而生成更符合人类期望的文本。
- 灵活性:可以根据不同的任务和用户群体,灵活地收集和利用偏好数据来训练模型。
- 局限性
- 偏好数据收集困难:获取高质量的人类偏好数据是一个比较复杂和耗时的过程,需要大量的人工标注工作。
- 偏好的主观性:不同的人可能有不同的偏好,这可能会导致在训练数据收集和模型训练过程中出现不一致的情况。
- 优势
1-环境
pip install transformers trl
2-数据集
- 选择数据集:根据具体的微调任务,选择合适的数据集。例如,可以选择与任务相关的文本分类数据集、对话数据集等 。确保数据集的格式符合 LLaMA-Factory 的要求,一般是 JSON 格式,包含输入文本、输出文本等必要信息.
- 数据预处理:对数据集进行必要的预处理,如清洗数据,去除噪声、重复或无效的样本等。还可以进行分词、标记化等操作,以便将文本数据转换为模型能够处理的格式.
- 标注偏好数据:对于 DPO 算法,需要人工标注或通过其他方式获取文本的偏好数据,即对于同一输入,哪一个输出更符合期望。标注数据应整理成包含 “prompt”(输入提示)、“chosen”(更优的生成响应)、“rejected”(次优的生成响应)三个键的字典形式.
1、选择数据集:lvwerra/stack-exchange-paired
2、下载数据集:可以使用 Hugging Face 的 datasets 库来加载数据集:
from datasets import load_dataset
dataset = load_dataset('lvwerra/stack-exchange-paired')
3、数据格式:将数据处理为 DPO 所需的格式。通常,DPO 需要一个包含对话对和相应偏好标签的数据集。
3-配置DPO训练
配置训练参数
你需要配置 DPO 的训练参数,包括模型配置、训练设置等。以下是一个基本的配置示例(通常保存在 YAML 文件中):
model:
name_or_path: "Qwen2.5" # 替换为 Qwen2.5的模型路径或名称
bos_token_id: 0 # 设置 bos_token_id,如果模型没有此 token
training:
output_dir: "./output"
per_device_train_batch_size: 8
per_device_eval_batch_size: 8
num_train_epochs: 3
logging_dir: "./logs"
logging_steps: 10
evaluation_strategy: "steps"
save_strategy: "epoch"
dpo:
draw_threshold: 0.25
# 其他 DPO 特定配置
创建 DPO 训练器
from trl import DPOTrainer
from transformers import AutoTokenizer, AutoModelForCausalLM
from datasets import load_dataset
# 加载模型和 tokenizer
model_name = "Qwen2.5"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 加载数据集
dataset = load_dataset('lvwerra/stack-exchange-paired')
# 配置 DPO 训练
dpo_trainer = DPOTrainer(
model=model,
args=train_args, # 训练参数从 YAML 文件中加载
train_dataset=dataset["train"],
eval_dataset=dataset["validation"],
tokenizer=tokenizer
)
# 执行训练
dpo_trainer.train()
4-执行训练
终端运行
python train_dpo.py --config_path path/to/your/config.yaml
5-评估和保存模型
训练完成后,你可以评估模型的性能,并保存微调后的模型:
# 保存模型
model.save_pretrained("./output")
# 评估模型
results = dpo_trainer.evaluate()
print(results)