这是LangChain 101课程模型部分的第2d部分,也是最后一部分。强烈建议您先查看前两部分,以更好地理解本文的背景。
LangChain 101:第2ab部分。关于(大型语言)模型的一切
这是LangChain 101课程的第2ab部分。强烈建议您先查看第一部分以更好理解……
pub.towardsai.net
LangChain 101:第2c部分。使用PEFT、LORA和RL进行LLM的微调
关于微调LLM、PEFT、LORA和训练大型语言模型的一切
pub.towardsai.net
(关注作者,以免错过下一部分)。
RLHF(来自人类反馈的强化学习)是当前先进语言模型的训练方法中的重要组成部分。它在微调模型时帮助包含人们的反馈,使得模型更有价值和安全。
让我们来看一下最常见的训练方法:
基础模型
基础模型是在大量通用数据集(有时还包括代码)上进行预训练的大型语言模型:GPT、LLAMA、Falcon等。
基础模型适用于通用领域的文本生成。然而,它们在特定任务或领域的性能可能欠缺。
提示
提示是通过为模型提供与任务相关的提示来提高LLM性能的技术。
例如,假设您希望LLM给出烹饪建议。那么,在查询的开头,您可能想添加“扮演专业的米歇尔·尼大厨”的内容。然后,LLM将使用这个提示来“扮演一名经验丰富的厨师”。
提示是提高LLM性能的简单方法。然而,它需要良好的提示设计,并且在需要额外信息和词汇表的任务中,效果可能不如预训练的LLM训练效果好。
微调
微调是通过训练LLM于特定数据集(所需输入和输出的示例)上来提高LLM性能的技术。
例如,您想要微调LLM以将英语翻译为阿拉伯语。在这种情况下,您需要提供一个英-阿翻译对的数据集。
与提示相比,微调通常更有效,特别适用于需要LLM学习大量新数据和信息的任务。然而,它需要更多的数据和计算资源。
LangChain 101:第2c部分。使用PEFT、LORA和RL进行LLM的微调
关于微调LLM、PEFT、LORA和训练大型语言模型的一切
pub.towardsai.net
微调+RLHF
通过使用来自人类评估者排名的已标记数据集来训练LLM,微调结合强化学习从人类反馈(RLHF)的技术可以提高LLM性能。该数据集包括任务的所需输入和输出的示例,以及人类评估者对产品质量的反馈。
使用RLHF的微调通常比单独的微调更有效,特别适用于需要LLM学习人类价值观和偏好的任务。然而,它需要更多的数据、计算资源和人力投入。
(指导)GPT RLHF流水线
让我们更仔细地看看指导RLHF流水线(ChatGPT流水线可能类似)是如何构建的。
指导(GPT)RLHF流水线包括通过监督训练(类似于“传统训练流水线”中的“有监督微调”)对预训练模型进行优化。然后,使用邻近策略优化进一步优化更新后的模型。
RLHF流水线可以总结为一个三步训练过程:
- 通过监督训练对预训练模型进行优化训练
- 开发用于提供奖励的模型
- 使用邻近策略优化进行进一步优化
在RLHF流水线的第一步中,我们生成或选择提示(可能来自数据集或数据库),并请求人类生成高质量的回答。我们利用这些数据来有针对性地微调预先存在的基础模型。
在RLHF流水线的第二步中,我们利用通过监督训练进行微调的模型构建一个奖励模型,以供下一步使用。这包括为每个提示生成多个回答,并由个体根据偏好进行排名。
为了将模型从RLHF流水线的第一步转变为奖励模型,我们将其输出层(下一个标记层)替换为具有单个输出节点的回归层。
在RLHF流水线的第三步和最后一步中,我们使用奖励模型(v2)进一步微调先前经过有监督微调(v1)的模型。
我们使用根据在RLHF流水线第二步中建立的奖励模型获得的奖励分数,通过邻近策略优化来调整v1模型。
这就是(指导)GPT RLHF流水线的工作原理。这种方法可以产生优质的结果,但需要较长的时间和大量的人力投入。我们能否更有效地完成它呢?
LLAMA RLHF流水线
虽然Meta AI Llama 2模型使用与InstructGPT类似的RLHF方法,但引入了几个值得注意的区别:
- 两个奖励模型
- 边界损失
- 拒绝采样
两个奖励模型:Llama2使用两个奖励模型,一个关注实用性,另一个关注安全性。模型的最终优化基于这两个分数的组合。
边界损失:Llama2在排名模型中引入“边界”标签,用于度量偏好之间的差距。这个边界参数有助于优化排名损失的计算。
拒绝抽样: Llama2采用迭代式RLHF方法,创建了多个模型版本(从RLHF-V1到RLHF-V5)。除了PPO,他们还使用了拒绝抽样技术。
该技术会生成多个输出,并在优化过程中选择最高奖励进行梯度更新。这与PPO不同,PPO是基于单个样本进行更新的。
最终的管道将如下所示:
我们可以看到,从2个响应中选择更好的响应比从4个集合中进行排名更快。增加边距也可以更好地帮助模型学习,因为它类似于经典的机器学习训练过程。最后,拒绝样本听起来像是一个有趣的概念,可以在管道末端获得更高的质量。
荣耀提及
在我们进入代码之前,我想列出一些其他RLHF技术:
研究人员提出了一种基于人类提供的一组规则的自我训练方法。
该研究介绍了HIR(回顾指令标记),一种两步方法,涉及提示抽样和训练,可以有效地将语言模型偏离指令的情况转换为合规的情况。
对RLHF中用于奖励模型训练的评级进行的研究表明,可以通过LLM而不仅仅依赖于人类的输入来生成评级。
ReST是一种通过基于抽样的方法将语言模型与人类偏好对齐的方法,通过在逐渐提高质量的子集上进行迭代训练来增强其奖励函数。
开始编码
完整的代码在GitHub上可用。
首先,我们需要定义通用的训练和Lora配置参数,我们将使用这些参数。这与系列的微调部分的代码非常相似。
from transformers import TrainingArgumentsfrom peft import LoraConfig# 准备训练参数training_args = TrainingArguments( output_dir="./train_logs", # 输出文件夹 max_steps=100,
现在,是时候定义我们的RLHF(强化学习人类反馈)流程了。
首先,让我们定义我们的数据。通常,在你有一组错误答案的数据集时,RLHF非常适用于生产。例如,可能是一些不赞成的答案。
稍后,我们将对这个数据集进行格式化和拆分,以便用于训练和测试我们的模型。现在我们已经准备好了人类反馈,让我们指定强化学习的代码:
from trl import RewardTrainer# 准备RewardTrainertrainer = RewardTrainer( model=model, # 强化学习的模型 tokenizer=tokenizer, # 处理输入数据的分词器 args=training_args, # 训练参数 train_dataset=formatted_dataset["train"], # 训练数据集 eval_dataset=formatted_dataset["test"], # 评估数据集 peft_config=peft_config, # PEFT配置 max_length=512, # 输入的最大长度)# 执行训练trainer.train()# 保存预训练的奖励模型trainer.model.save_pretrained("./reward_model")
这就是我们运行带有人类反馈的强化学习所需要的一切!
现在你知道何时使用RLHF,数据应该如何看起来,以及如何运行代码了。
这是第二部分的结束。这也是我LangChain 101课程中“模型”部分的最后一部分。
鼓掌并关注我,因为这激励我写新文章:)