首页 >科技周边 >IT业界 >使用直接偏好优化(DPO)对开源LLM进行微调开源LLM

使用直接偏好优化(DPO)对开源LLM进行微调开源LLM

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌原创
2025-02-08 09:24:10547浏览

Fine-Tuning an Open-Source LLM with Axolotl Using Direct Preference Optimization (DPO)

大型语言模型(LLM)的出现为AI应用带来了无数新的机遇。如果您一直想微调自己的模型,本指南将向您展示如何轻松地做到这一点,无需编写任何代码。我们将使用Axolotl和DPO等工具,逐步引导您完成整个流程。

什么是大型语言模型(LLM)?

大型语言模型(LLM)是一种强大的AI模型,它在海量文本数据(数万亿字符)上进行训练,以预测序列中的下一个词组。这只有在过去2-3年中,随着GPU计算的进步才成为可能,这些进步使得如此庞大的模型能够在几周内完成训练。

您可能之前已经通过ChatGPT或Claude等产品与LLM互动过,并亲身体验了它们理解和生成类似人类回应的能力。

为什么要微调LLM?

我们不能只使用GPT-4o来处理所有事情吗?虽然在撰写本文时,它是我们拥有的最强大的模型,但它并不总是最实用的选择。微调一个较小的模型(参数范围为30亿到140亿),可以在成本的一小部分获得可比的结果。此外,微调允许您拥有自己的知识产权,并减少对第三方的依赖。

理解基础模型、指令模型和对话模型

在深入微调之前,务必了解现有不同类型的LLM:

  • 基础模型:这些模型在大量非结构化文本(如书籍或互联网数据)上进行预训练。虽然它们具有对语言的内在理解,但它们并未针对推理进行优化,并且会产生不连贯的输出。基础模型的开发是为了作为开发更专业模型的起点。
  • 指令模型:指令模型建立在基础模型之上,使用结构化数据(如提示-响应对)进行微调。它们旨在遵循特定指令或回答问题。
  • 对话模型:也建立在基础模型之上,但与指令模型不同,对话模型在对话数据上进行训练,使它们能够进行来回对话。

什么是强化学习和DPO?

强化学习(RL)是一种技术,模型通过接收对其行为的反馈来学习。它被应用于指令模型或对话模型,以进一步改进其输出的质量。通常,RL不会在基础模型之上进行,因为它使用更低的学习率,这不足以产生显著变化。

DPO是一种RL形式,其中模型使用同一提示/对话的优劣答案对进行训练。通过呈现这些对,模型学习偏向好的示例并避免坏的示例。

何时使用DPO

当您想要调整模型的风格或行为时,DPO特别有用,例如:

  • 风格调整:修改响应的长度、细节级别或模型表达的置信度。
  • 安全措施:训练模型拒绝回答可能不安全或不合适的提示。

但是,DPO不适合教模型新的知识或事实。为此,监督微调(SFT)或检索增强生成(RAG)技术更合适。

创建DPO数据集

在生产环境中,您通常会使用用户的反馈来生成DPO数据集,例如:

  • 用户反馈:在响应上实现点赞/点踩机制。
  • 比较选择:向用户呈现两个不同的输出,并要求他们选择更好的一个。

如果您缺乏用户数据,您也可以通过利用更大、更强大的LLM来创建合成数据集。例如,您可以使用较小的模型生成错误答案,然后使用GPT-4o对其进行纠正。

为简单起见,我们将使用HuggingFace的现成数据集:olivermolenschot/alpaca_messages_dpo_test。如果您检查数据集,您会注意到它包含带有已选择和已拒绝答案的提示——这些是好坏示例。这些数据是使用GPT-3.5-turbo和GPT-4合成创建的。

您通常至少需要500到1000对数据才能有效地进行训练而不会过拟合。最大的DPO数据集包含多达15,000-20,000对数据。

使用Axolotl微调Qwen2.5 3B指令模型

我们将使用Axolotl来微调Qwen2.5 3B指令模型,该模型目前在其规模类别中在OpenLLM排行榜上排名第一。使用Axolotl,您可以无需编写任何代码即可微调模型——只需要一个YAML配置文件。以下是我们将使用的config.yml:

<code class="language-yaml"># ... (YAML configuration remains the same) ...</code>

设置云环境

要运行训练,我们将使用Runpod或Vultr等云托管服务。以下是您需要的:

  • Docker镜像:克隆Axolotl团队提供的winglian/axolotl-cloud:main Docker镜像。
  • 硬件要求:80GB VRAM GPU(如1×A100 PCIe节点)对于这种规模的模型绰绰有余。
  • 存储:200GB的卷存储将容纳我们所需的所有文件。
  • CUDA版本:您的CUDA版本至少应为12.1。

(此类型的训练被认为是LLM的完整微调,因此非常占用VRAM。如果您想在本地运行训练,而不依赖于云主机,您可以尝试使用QLoRA,这是一种监督微调的形式。虽然理论上可以组合DPO和QLoRA,但这很少见。)

开始训练的步骤

  1. 设置HuggingFace缓存目录:
<code class="language-bash">export HF_HOME=/workspace/hf</code>

这确保原始模型下载到我们的持久卷存储中。

  1. 创建配置文件:将我们之前创建的config.yml文件保存到/workspace/config.yml。

  2. 开始训练:

<code class="language-bash">python -m axolotl.cli.train /workspace/config.yml</code>

瞧!您的训练应该开始了。在Axolotl下载模型和训练数据后,您应该会看到类似于此的输出:

<code class="language-yaml"># ... (YAML configuration remains the same) ...</code>

由于这是一个只有264行的较小的数据集,因此训练应该只需几分钟即可完成。微调后的模型将保存到/workspace/dpo-output。

将模型上传到HuggingFace

您可以使用CLI将模型上传到HuggingFace:

  1. 安装HuggingFace Hub CLI:
<code class="language-bash">export HF_HOME=/workspace/hf</code>
  1. 上传模型:
<code class="language-bash">python -m axolotl.cli.train /workspace/config.yml</code>

将yourname/yourrepo替换为您实际的HuggingFace用户名和存储库名称。

评估微调后的模型

对于评估,建议使用Text Generation Inference (TGI)等工具来托管原始模型和微调后的模型。然后,使用温度设置为0(以确保确定性输出)对两个模型进行推理,并手动比较两个模型的响应。

这种实践方法比仅仅依赖训练评估损失指标提供了更好的见解,因为损失指标可能无法捕捉LLM中语言生成的细微之处。

结论

使用DPO微调LLM允许您自定义模型以更好地满足应用程序的需求,同时保持成本可控。通过遵循本文中概述的步骤,您可以利用开源工具和数据集的力量来创建符合您特定要求的模型。无论您是想调整响应的风格还是实施安全措施,DPO都提供了一种改进LLM的实用方法。

祝您微调愉快!

以上是使用直接偏好优化(DPO)对开源LLM进行微调开源LLM的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn