大型语言模型(LLMs)使得在自然语言处理(NLP)中微调模型的过程变得复杂。
最初,当像ChatGPT这样的模型首次出现时,主要的方法包括首先训练一个奖励模型,然后优化LLM策略。
来自人类反馈的强化学习(RLHF)显著推动了发展,并解决了NLP中许多长期存在的挑战。
然而,这是一项艰苦的工作,需要适当且相关的数据,以及复杂的多模型架构。
此外,改进的质量并不总是显而易见的,模型还会倾向于模仿和产生幻觉。
然而,最近的进步引入了更简单、更高效的方法。其中一种方法是直接偏好优化(DPO)。
什么是DPO?
DPO是一种实现对大型语言模型(LLMs)进行精确控制的方法。
在ChatGPT中,基于人类反馈的强化学习(RLHF)是基于训练一个奖励模型,然后使用近端策略优化(PPO)来使语言模型的输出与人类偏好一致。虽然有效,但复杂且不稳定。
DPO则将受限奖励最大化问题视为基于人类偏好数据的分类问题。这种方法稳定、高效且计算负担轻。它消除了对奖励模型拟合、大量采样和超参数调整的需求。
DPO是如何工作的?
DPO流程可以分为两个主要阶段:
1. 监督式微调(SFT):这是初始步骤,模型在感兴趣的数据集上进行微调。
2. 偏好学习:在SFT之后,模型使用偏好数据进行偏好学习,理想情况下这些数据来自与SFT示例相同的分布。
DPO的美在于其简洁性。它不是先训练一个奖励模型,然后基于该模型优化策略,而是直接将偏好损失定义为策略的函数。这意味着没有必要先训练一个奖励模型。
在微调阶段,DPO使用LLM作为奖励模型。它利用二元交叉熵目标来优化策略,借助人类偏好数据来确定哪些回应是被偏好的,哪些则不是。通过将模型的回应与偏好的回应进行比较,策略被调整以提高其性能。
监督式微调
监督式微调(SFT)是DPO的第一步。SFT是一种专门的方法,其中一个LLM在一个标记过的数据集上进行进一步训练。这个数据集提供了特定输入与期望输出之间的清晰映射。SFT的本质,特别是当与偏好学习结合时,是根据人为定义的标准塑造模型的响应,确保它更紧密地与特定要求对齐。
想象一家公司希望建立一个会话式人工智能,以帮助用户导航他们的新应用程序。虽然像Falcon-7B这样的现成LLM可能提供技术上准确的答案,但它可能与公司的语调或品牌形象不协调。例如,如果用户询问“协作编辑”这样的功能,Falcon可能会提供一个通用的描述。然而,为了提供无缝的用户体验,回应应该是用户友好的、详细的,甚至提供故障排除提示。SFT优化模型的输出,以确保它们不仅准确,而且也适当和一致。
理解自然语言处理中的偏好数据
偏好数据是针对特定提示精选的一组选项或替代方案。然后,标注员根据特定指南评估这些选项。目标是将这些选项从最受欢迎的排到最不受欢迎的。这种排名提供了人类偏好的洞察,用于微调模型以产生符合人类期望的输出。
创建偏好数据的过程包含几个步骤:
- Prompt选择
PD的基础是Prompt。选择Prompt有各种策略。有些人可能会选择预定义的一套,而其他人可能会使用模板来动态生成Prompt。另一种方法是将预定义的Prompt与从数据库中获取的随机提示符结合起来。
- 答案选择
一旦确定了提示,下一步就是确定答案。这些答案可以由模型的特定版本或各种检查点生成。要排名的答案数量可以不同。虽然有些人可能更喜欢二元排名系统(最好-最差),其他人可能选择更细粒度的方法,按比例对答案进行排名,比如从1到5。
- 注释指南
制定清晰的注释指南是至关重要的。这些指南确保排名过程得到标准化,并尽量减少个人偏见或解释。
公共偏好数据集
有几个数据集可供那些希望深入了解偏好数据的人使用。例如:
- OpenAI WebGPT 对比数据集:该数据集提供了2万个对比实例,每个实例包括一个问题、一对模型答案以及每个答案的人类评分偏好分数。
- OpenAI摘要数据集:该数据集提供了64k个文本摘要示例,包括人类编写的回应和人类评级的模型回应。
- Reddit ELI5:源自问答子版块的这个数据集包含了27万个问题、答案和评分的示例。
- 人类与ChatGPT对比语料库(HC3):该数据集提供了大约24K个问题的60K个人类回答和27K个ChatGPT回答。
实施DPO与TRL:分步指南
对于那些热衷于利用直接偏好优化(DPO)的力量的人来说,TRL(Transformer Reinforcement Learning)库通过其DPO训练器提供了一种简化的方法。以下是一个全面的指南,帮助您开始:
监督式微调
开始训练你的SFT模型。确保用于SFT的数据是符合分布的,为DPO算法有效工作奠定基础。
理解数据集格式
DPO训练器要求特定的数据集格式。鉴于模型被训练用于直接优化两个句子之间的偏好,数据集应该反映这种结构。
- prompt:包含上下文输入。
- chosen:存放相应的选定回应。
- rejected:列出相应的负面(或被拒绝的)回应。
值得注意的是,单个prompt可以对应于数据集数组中重复条目所反映的多个响应。
例如,一个样本数据集可能看起来像:
利用DPOTrainer
为了启动过程,请初始化DPOTrainer。这包括指定要训练的模型,一个用于计算偏好和拒绝响应的隐式奖励的参考模型`ref_model`,隐式奖励的`beta`超参数,以及带有上述三个条目的数据集。