大语言模型实战

本节介绍基于DPO的偏好对齐实战,首先介绍本项目中所使用的数据集,然后介绍强化学习框架内容,最后介绍实战训练代码与效果验证。


1. 数据集介绍


本项目使用的数据集是基于知乎问答的偏好对齐数据集。该数据集提供3460条基于知乎问答的人类偏好数据集,其中每个输入的问题都是真实的知乎问题,而DPO算法需要的正负反馈数据分别对应在真实知乎问题下给出的赞同数据较高(chosen)和较低(rejected)的回答,这样的数据就直接可以做偏好对齐训练。

表3-1是该数据集的样例内容。不难看出,接受样本的结果的确优于拒接样本,因此我们希望训练大型语言模型在面对知乎这些真实问题时,在保证尽可能与高赞回答对齐的同时,尽可能避免生成低赞回答内容。这个数据集最有意思的地方在于,它并没有主观人为二次标注就获得大量高质量样本,这种数据集构造的方式值得我们所有人思考。

表3-1 知乎对齐数据集样例内容

 

 

 

数据集导入相关代码如下:

 


2. TRL框架介绍


TRL(Transformer Reinforcement Learning,基于Transformer的强化学习)框架也是近年来很火的算法框架,它是由大名鼎鼎的ransformer框架针对强化学习专门设计的,旨在打造一个针对大型语言模型开展强化学习所用到的全栈类库。

以InstructGPT提到的PPO为例,TRL框架提供三阶段训练框架,包括微调训练阶段使用的SFTTrainer、奖励模型训练阶段使用的RewardTrainer以及强化学习训练阶段使用的PPOTrainer。由于TRL框架设计精巧,在使用极少量的代码调用的情况下便完成了大型语言模型的三阶段训练。

本节将利用TRL框架开展DPO训练,重点关注DPOTrainer模块,这里先通过介绍DPOTrainer模块的核心参数,让读者对其有一个整体的了解。核心参数具体内容如下:

·model:用于设置参与DPO训练的原始模型,该模型是已经做过任务微调的,确保其生成内容与用户预期数据同分布。

·ref_model:同DPO中保持一致,加入一个参数未调整前的模型作为参考模型。用于确保新模型参数变化差异度不会太大,避免参数的过度拟合,是一种有效的模型参数正则化手段,注意参考模型需要对原始模型进行深度复制,否则起不到约束作用。

·args:模型训练的相关参数,涉及batch大小、步数、梯度累计步数、优化函数等核心参数。

·beta:模型更新温度指标,即参考模型对真实模型的影响范围,通常设计在0.1~0.5之间。

·train_dataset:训练数据集,数据集格式为dataset。

·eval_dataset:验证数据集,数据集格式为dataset。

·tokenizer:模型分词器,注意要与模型保持一致。

·peft_config:PEFT开展量化微调参数。

·max_prompt_length:提示词最大长度。

·max_length:文本最大长度。

 

3.训练代码解析


本次训练采用的基础模型是TinyLlama-1.1B模型,之所以选择这个模型,是因为其参数规模更小,更适合快速验证效果,该模型参数初始化代码如下:

 

 

然后设置模型参数(training_args):

 

由于我们使用PEFT包做LoRA微调,因此设置peft_config如下:

 

最终完成DPOTrainer函数的初始化内容,具体如下:

 

 

最终可以开展DPO模型训练: