在ChatGPT引领的大型语言模型时代,一个绕不过去的话题就是「基于人类反馈的强化学习」(RLHF),不仅提升了语言模型的性能,也将人类社会的价值观注入到模型中,使得语言模型能够帮助用户解决问题,提高模型的安全性。
不过在ChatGPT之后,大量模型和相关技术不断发布,RLHF也早已更新换代,并衍生出来一些无需人工的微调方法,效果提升也很明显。
最近,Lightning AI创始人、AI研究大牛Sebastian Raschka发表了一篇博客,描述了Llama 2中的RLHF机制和原版相比做出了哪些改变和提升,还介绍了几个RLHF算法的替代方案。
目前最先进的、基于Transformer的大型语言模型,例如ChatGPT或Llama 2,大体都包括三个训练步骤:预训练,有监督微调和对齐。
在预训练阶段,模型会吸收来自海量、无标注文本数据集的知识,然后使用有监督微调细化模型以更好地遵守特定指令;最后使用对齐技术使LLM可以更有用且更安全地响应用户提示。
预训练阶段通常需要包含数十亿到数万亿个token的庞大文本语料库,但训练目标只是一个简单的「下一个单词预测」(next word prediction)任务,模型需要根据提供的文本来预测后续单词或token。
自监督预训练可以让模型从大规模的数据中学习,只要能够在不侵犯版权,或是无视创造者偏好的情况下收集到数据,就可以不依赖人工标注完成训练,因为训练标签实际上就是文本的后续单词,已经暗含在数据集中了。
第二阶段大体上来看也是「next token prediction」任务,不过需要人工标注的指令数据集,其中模型的输入是一个指令(根据任务的不同,也可能包含一段文本),输出为模型的预期回复内容。
数据形式类似于:
Instruction: “Write a about a pelican.”
使用说明:“写一首关于鹈鹕的打油诗。“
Output: “There once was a pelican so fine…”
输出:“从前有一只鹈鹕很好…“
模型会将指令文本作为输入,并逐个token输出,训练目标是与预期输出相同。
虽然两个阶段都采用相似的训练目标,但有监督微调数据集通常比预训练数据小得多,指令数据集需要人类(或其他高质量的LLM)提供标注结果,所以无法大规模应用。
第三阶段依然是微调,不过其主要目标在于将语言模型与人类的偏好、价值观进行对齐,也是RLHF机制发挥作用的地方。
RLHF主要包括三步:
Step 1. 预训练模型的有监督微调
先收集一个提示词集合,并要求标注人员写出高质量的回复,然后使用该数据集以监督的方式微调预训练的基础模型。
Step 2. 创建奖励模型
对于每个提示,要求微调后的LLM生成四到九个回复,再由标注人员根据个人偏好对所有回复进行排序。
虽然排序过程很耗时,但工作量还是比第一步的数据集构建少一些。
在处理排序结果时,可以设计一个奖励模型RM,将微调语言模型SFT的输出通过一个回归层(单个输出节点)转换为奖励分数,用于后续优化。
Step 3.PPO微调
使用邻近策略优化(PPO,proximal policy optimization ),根据奖励模型提供的奖励分数对SFT模型进一步优化。
PPO的具体技术细节可以参考InstructGPT或下面的论文列表。
Meta AI在创建Llama-2-chat模型时也使用了RLHF技术,不过与ChatGPT相比还是有些细微区别。
简单来说,Llama-2-chat在第一步RLHF微调上使用相同的指令数据,但在第二步使用了两个奖励模型;通过多个阶段的不断进化,奖励模型也会根据Llama-2-chat模型出现的错误进行更新;并且增加了拒绝采样(rejection sampling)步骤。
Margin Loss
在标准InstructGPT中使用的RLHF PPO方法,研究人员需要收集同一个提示下的4-9个模型输出并进行排序,比如四个回复的排序结果为A<C< D<B,那么就可以得到六个对比结果:A < C,A < D ,A < B,C < D,C < B,D < B
Llama 2的数据集也采用类似的方式,不过标注人员每次只能看到两个(而非4-9个)回复并进行对比,但新增了一个边际(margin)标签,对比结果可以为「显著更好」(significantly better)和「好的不明显」(negligibly better)。
在排序训练时中,Llama 2相比InstructGPT增加了边际损失:
其中,rθ(x,y)是提示x和生成的回复y的标量分数输出; θ为模型权重; σ是将层输出转换为范围从0到1的分数的逻辑S形函数; yc是由标注人员选择的更优回复; yr是较差的回复。
m(r)可以调节两个回复之间的差值,如果对比结果为「显著更好」,则会增加梯度值,加快更新速度。
两种奖励模式
Llama 2中的两个奖励模型分别侧重「有用性」(helpfulness)和「安全性」(safety),用于模型优化的最终奖励函数会将两个分数进行线性组合。
拒绝采样(Rejection sampling)
Llama 2的作者使用了一个训练流水线,同时使用PPO和拒绝采样算法,迭代地产生多个RLHF模型(从RLHF-V1到RLHF-V5),模型在拒绝采样时会得到K个输出,在每次优化迭代时选择具有最高奖励的输出用于梯度更新,而PPO每次只基于单样本进行更新。
从实验结果来看,RLHF微调模型在无害性和有用性上都得到了改善,并且在最后阶段RLHF-v5使用PPO算法的性能最好。
可以看到,RLHF是一个相当复杂的过程,如此精心的设计是否值得?
虽然InstructGPT和Llama 2论文实验结果中证实了RLHF带来的性能提升,但也有相关工作在关注开发更有效的替代品:
研究人员提出了一种基于人类提供的规则列表的自我训练机制,也使用了强化学习的方法。
论文标题:Constitutional AI: Harmlessness from AI Feedback
论文链接:https://arxiv.org/abs/2212.08073
发表日期:2022年12月
上图中的「红队」(Red Team)指的是测试目标系统的防御能力,即外部或内部专家模拟潜在对手的过程,通过模仿现实世界攻击者的战术、技术和程序来挑战、测试并最终改进系统。
研究人员提出了一种基于重新标注的有监督方法HIR用于微调,在12个BigBench任务上都优于RLHF算法。
论文标题:The Wisdom of Hindsight Makes Language Models Better Instruction Followers
论文链接:https://arxiv.org/abs/2302.05206
发表时间:2023年2月
HIR方法包括两个步骤,采样和训练:在采样时,提示和指令被馈送到LLM以收集回复,并基于对齐分数,在训练阶段适当的地方重新标注指令;然后使用新指令和原始提示用于微调LLM。
重新标注可以有效地将失败案例(LLM创建的输出与原始指令不匹配的情况)转化为有用的训练数据以用于监督学习。
直接偏好优化(DPO)是使用PPO的RLHF的替代方案,实验结果显示,用于拟合RLHF中的奖励模型的交叉熵损失可以直接用于微调LLM,并且DPO更有效,在回复生成质量方面通常也优于RLHF/PPO
论文标题:Direct Preference Optimization: Your Language Model is Secretly a Reward Model
论文链接:https://arxiv.org/abs/2305.18290
发表日期:2023年5月
ReST是RLHF的替代方案,可以将LLM与人类偏好对齐,其使用采样方法来创建一个改进的数据集,在质量越来越高的子集上迭代训练,以完善其奖励函数。
论文标题:Reinforced Self-Training (ReST) for Language Modeling
论文链接:https://arxiv.org/abs/2308.08998
发表日期:2023年8月
根据作者的说法,ReST通过离线生成其训练数据集,与标准在线RLHF方法(PPO)相比,实现了更高的效率,但缺少与InstructGPT或Llama 2中使用的标准RLHF PPO方法的全面比较。
基于人工智能反馈的强化学习(RLAIF)的研究表明,RLHF中奖励模型训练的评级不一定必须由人类提供,也可以由LLM生成(如PaLM 2)。
论文标题:RLAIF:Scaling Reinforcement Learning from Human Feedback with AI Feedback
论文链接:https://arxiv.org/abs/2309.00267
发表日期:2023年9月
标注人员在一半的案例中更喜欢RLAIF模型,也就意味着两个模型的差距并不大,并且RLHF和RLAIF都大大优于纯粹通过监督指令微调训练的模型。
这项研究的结果是非常有用的,基本上意味着我们可以更容易获得RLHF的训练数据,不过RLAIF模型如何在定性研究中表现还有待观察,这项研究侧重于信息内容的安全性和真实性,只是对人类偏好研究的部分捕获。
但这些替代方案在实践中是否有价值还有待观察,因为目前还没有哪个模型可以不用RLHF的情况下,取得与Llama 2和Code Llama相近的性能。
参考资料:https://magazine.sebastianraschka.com/p/llm-training-rlhf-and-its-alternatives
原文:https://mp.weixin.qq.com/s/oWmMgIkaqkxDfoyD_RrQ4Q
既然来了,说些什么?