https://ar5iv.labs.arxiv.org/html/2212.10560
这篇论文,感觉非常有意思,让语言模型自主生成新任务的指令,激发语言模型自身潜力,自我指导,实现自我超越!

这篇文章介绍了一个名为SELF-INSTRUCT的框架,旨在提高预训练语言模型(LM)遵循指令的能力。
摘要
大型“指令调优”语言模型(即,微调以响应指令)已经展示了在零样本情况下泛化到新任务的显著能力。尽管如此,它们严重依赖于人类编写的指令数据,这些数据在数量、多样性和创造性上常常受限,因此阻碍了调优模型的普遍性。我们介绍了SELF-INSTRUCT,一个框架,通过自举自身生成的内容来改进预训练语言模型的指令遵循能力。我们的流程从语言模型生成指令、输入和输出样本,然后过滤掉无效或相似的样本,再使用它们对原始模型进行微调。将我们的方法应用于普通的GPT3,我们在SUPER-NATURALINSTRUCTIONS上展示了比原始模型高出33%的绝对改进,与使用私有用户数据和人工注释训练的InstructGPT001性能相当。为了进一步评估,我们策划了一组专家编写的针对新任务的指令,并通过人工评估表明,使用SELF-INSTRUCT调优GPT3在性能上大大超过了使用现有的公共指令数据集,并且仅比InstructGPT001落后5%的绝对差距。SELF-INSTRUCT提供了一种几乎无需注释的方法,用于将预训练语言模型与指令对齐,我们发布了我们的大型合成数据集,以促进未来关于指令调优的研究。
主要方法:
SELF-INSTRUCT 是一个半自动化过程,通过模型自身生成的指令信号来调优预训练的语言模型。
该过程是一个迭代的自举算法,开始时使用一个有限的种子任务集来引导整体生成过程。
首先,模型被提示生成新任务的指令,然后根据这些新生成的指令创建输入输出实例。
使用启发式方法自动过滤掉低质量或重复的指令后,将剩余的有效任务添加到任务池中。
通过这种方式,可以生成大量的任务,这些任务随后可用于对语言模型进行指令调优,使其更好地遵循指令。
解决的问题:
传统的“指令调优”语言模型(即微调以响应指令)虽然能够零样本泛化到新任务,但它们严重依赖于人类编写的指令数据。
这些指令数据通常数量有限、多样性不足,且缺乏创造性,限制了调优模型的泛化能力。
应用:
通过在GPT-3模型上应用SELF-INSTRUCT方法,研究者们展示了与原始模型相比,在SUPER-NATURALINSTRUCTIONS数据集上33%的绝对提升。
该方法通过生成的指令数据对GPT3进行微调,生成了GPT3SELF-INST模型,并在SUPERNI数据集上与其他模型进行了比较。
此外,研究者们还通过人工评估验证了SELF-INSTRUCT在新任务上的性能,发现GPT3SELF-INST在遵循指令方面表现出色,与使用私有用户数据和人工注释训练的InstructGPT001性能相当。
结论:
SELF-INSTRUCT提供了一种几乎不需要注释的方法,通过使用预训练语言模型自身生成的指令数据来调整模型,使其更好地对齐指令。
研究者们发布了一个大型合成数据集,包含52K条指令,以促进未来在指令调优方面的研究。
影响和局限性:
SELF-INSTRUCT可能有助于提高对广泛使用的指令调优模型(如InstructGPT或ChatGPT)背后过程的透明度。
该方法的局限性包括对大型模型的依赖,可能放大了语言模型本身的偏见,并且可能在处理不常见和创造性指令时表现出脆弱性。
贡献:
提出了SELF-INSTRUCT方法,通过最小化人类标记数据来诱导指令遵循能力。
通过广泛的指令调优实验证明了其有效性。
发布了一个包含52K条指令的大型合成数据集,以及一组手动编写的新颖任务,用于构建和评估未来的指令遵循模型。
方法图示

文章中的图2提供了SELF-INSTRUCT框架的高层次概述。该过程从一个小型的种子任务集开始,通过迭代的方式引导语言模型(LM)生成新的指令和相应的实例。以下是图2描述的SELF-INSTRUCT过程的详细步骤:
-
任务池初始化(Task Pool Step 1):
- 从一个小型的种子任务集开始,这些任务是手动编写的,用于引导整个生成过程。
-
指令生成(Instruction Generation Step 1):
- 从任务池中随机抽取任务,使用这些任务作为上下文示例,提示语言模型生成新任务的指令。
-
分类任务识别(Classification Task Identification Step 2):
- 确定生成的指令是否代表分类任务,以便为分类任务和非分类任务采用不同的生成方法。
-
实例生成(Instance Generation Step 3):
- 根据指令及其任务类型,独立地为每个指令生成实例。这个过程包括输入优先(Input-first)和输出优先(Output-first)两种方法:
- 输入优先:首先生成输入字段,然后产生相应的输出。适用于非分类任务。
- 输出优先:首先生成可能的类别标签,然后根据每个类别标签条件化输入生成。适用于分类任务。
- 根据指令及其任务类型,独立地为每个指令生成实例。这个过程包括输入优先(Input-first)和输出优先(Output-first)两种方法:
-
过滤(Filtering Step 4):
- 使用各种启发式方法自动过滤掉低质量或重复的指令,然后将剩余的有效任务添加回任务池。
-
迭代(Iterative Process):
- 这个过程可以重复多次,直到达到大量的任务。
-
数据用于指令调优(Instruction Tuning):
- 利用生成的数据对原始的语言模型进行微调,使其更好地遵循指令。
-
模型评估(Model Evaluation):
- 在SUPERNI等基准测试集上评估经过SELF-INSTRUCT调优的模型的性能。
图2中还展示了一些使用GPT3生成的任务示例,这些任务展示了SELF-INSTRUCT生成任务的多样性。整个SELF-INSTRUCT过程是一个迭代的自举算法,通过不断迭代,可以生成大量的多样化任务,这些任务随后可用于对语言模型进行指令调优。
低质量指令过滤方法
在SELF-INSTRUCT框架中,过滤低质量指令是一个关键步骤,旨在提高生成数据集的质量。以下是文章中提到的过滤低质量指令的方法:
-
ROUGE-L相似度过滤:
- 新生成的指令只有在与任务池中已有指令的ROUGE-L相似度低于0.7时才会被添加到任务池中。这是为了避免重复和过度相似的指令。
-
特定关键词排除:
- 排除包含某些特定关键词的指令,这些关键词通常指代语言模型无法处理的内容,例如“image”、“picture”或“graph”。
-
无效生成的识别与过滤:
- 基于启发式规则识别并过滤掉无效的生成,例如:
- 指令过长或过短。
- 实例输出是输入的重复。
- 生成的实例与已有实例完全相同或输入相同但输出不同。
- 基于启发式规则识别并过滤掉无效的生成,例如:
-
数据质量的人工评估:
- 随机抽取一定数量的生成指令,并为每个指令随机选择一个实例,由专家注释者(文章的作者之一)进行评估,判断每个实例是否正确。
-
格式和内容的一致性检查:
- 确保生成的指令和实例在格式和内容上是一致的,并且遵循正确的任务格式。
-
多样性的鼓励:
- 通过上述过滤机制,鼓励生成多样化的任务,避免生成任务集中在特定的语言使用模式上。
通过这些过滤步骤,SELF-INSTRUCT能够移除那些质量低下、格式错误或与现有任务高度重复的指令,从而提高数据集的整体质量和多样性。这有助于生成更加精准和有用的指令数据集,这些数据集随后可以用于更有效地微调语言模型。
与传统SFT和RLHF的关系
SELF-INSTRUCT框架是一种提高语言模型遵循指令能力的方法,它与传统的监督式微调(Supervised Fine-Tuning, SFT)和基于人类反馈的强化学习(Reinforcement Learning from Human Feedback, RLHF)等对齐方法有以下关系:
与传统SFT的关系:
- 补充:SELF-INSTRUCT可以看作是传统SFT的一种补充。SFT依赖于大量的标注数据来进行微调,而SELF-INSTRUCT通过自动生成指令数据来减少对人工标注数据的依赖。
- 数据生成:SELF-INSTRUCT专注于生成多样化的指令数据集,这些数据可以用于SFT,以提高模型在未见任务上的表现。
与RLHF等更先进的对齐方法的关系:
- 替代或并行:SELF-INSTRUCT提供了一种替代传统的数据标注的方法,通过模型自身生成数据来训练和微调。同时,它也可以与RLHF等方法并行使用,RLHF通常使用模型生成的输出与人类反馈来进一步优化模型的行为。
- 对齐目标:RLHF等方法的目标是使模型的输出更贴近人类价值观和偏好,SELF-INSTRUCT虽然不直接使用人类反馈,但生成的数据可以作为RLHF的输入,帮助模型学习如何更好地遵循复杂的人类指令。
互补性:
- SELF-INSTRUCT通过自生成数据来引导模型学习多样化的任务,而RLHF等方法则可能需要在SELF-INSTRUCT生成的数据基础上,通过人类反馈来进一步指导模型的学习。
- SELF-INSTRUCT可以减少数据标注的成本和工作量,而RLHF等方法则可以在SELF-INSTRUCT的基础上进一步提升模型的性能和安全性。
发展趋势:
- 随着研究的进展,不同的对齐方法可能会相互融合,形成更高效的训练策略。例如,SELF-INSTRUCT生成的数据可以作为RLHF的训练数据,而RLHF得到的策略又可以用来生成更高质量的指令数据。
总的来说,SELF-INSTRUCT提供了一种新的方法来生成指令数据,它可以与传统的SFT和先进的RLHF等方法结合使用,以实现更好的模型对齐效果。各种方法之间的关系更多是互补和协同,而不是简单的替代。通过综合运用这些方法,可以更有效地提升语言模型的性能和对指令的遵循能力。
文章中第2节“方法”是最核心内容,整体翻译一下,更细致的阅读:
2 方法
为人类标注大规模指令数据可能具有挑战性,因为这需要1)创造性来提出新任务,以及2)专业知识来为每个任务编写解决方案。在这里,我们详细描述了SELF-INSTRUCT的过程,它指的是使用普通的预训练语言模型自身生成任务,过滤生成的数据,然后使用这些生成的数据进行指令调优,以便更好地使语言模型遵循指令。这个流程在图2中有所描述。
2.1 定义指令数据
我们想要生成的指令数据包含一组指令 {𝐼𝑡},每个指令定义一个自然语言中的任务 𝑡。任务 𝑡有 𝑛𝑡≥1 个输入输出实例 {(𝑋𝑡,𝑖,𝑌𝑡,𝑖)}𝑖=1𝑛𝑡。一个模型 𝑀预期在给定任务指令和相应的输入时产生输出:𝑀(𝐼𝑡,𝑋𝑡,𝑖)=𝑌𝑡,𝑖,对于 𝑖∈{1,…,𝑛𝑡}。注意,在许多情况下,指令和实例输入没有严格的界限。例如,“写一篇关于学校安全的文章”可以作为一个有效的指令,我们期望模型直接响应,同时它也可以被表述为“写一篇关于以下主题的文章”作为指令,“学校安全”作为实例输入。为了鼓励数据格式的多样性,我们允许这样的指令不需要额外的输入(即 𝑋是空的)。
2.2 自动指令数据生成
我们的数据生成流程由四个步骤组成:1) 生成任务指令,2) 确定指令是否代表分类任务,3) 采用输入优先或输出优先方法生成实例,以及4) 过滤低质量数据。
指令生成。在第一步中,SELF-INSTRUCT以自举方式从一小组种子人类编写的指令中生成新指令。我们用175个任务(每个任务1个指令和1个实例)初始化任务池。对于每个步骤,我们从池中随机抽取8个任务指令作为上下文示例。这8个指令中,6个来自人类编写的任务,2个来自之前步骤中模型生成的任务,以促进多样性。提示模板如表5所示。
分类任务识别。由于我们需要对分类任务和非分类任务采用两种不同的方法,我们接下来识别生成的指令是否代表分类任务。我们使用少量示例提示LM来确定这一点,使用来自种子任务的12个分类指令和19个非分类指令。提示模板如表6所示。
实例生成。给定指令及其任务类型,我们独立地为每个指令生成实例。这是具有挑战性的,因为需要模型基于指令理解目标任务是什么,弄清楚需要哪些额外的输入字段并生成它们,并最终通过产生输出来完成任务。我们发现,当用来自其他任务的上下文示例提示时,预训练的LM在很大程度上可以实现这一点。一种自然的方式是输入优先方法,我们可以要求LM首先根据指令提出输入字段,然后产生相应的输出。这种生成顺序类似于模型用于响应指令和输入的方式,但这里使用的是来自其他任务的上下文示例。提示模板如表7所示。然而,我们发现这种方法可能会产生偏向一个标签的输入,特别是对于分类任务(例如,对于语法错误检测,它通常会产生语法正确的输入)。因此,我们还为分类任务提出了输出优先方法,我们首先生成可能的类别标签,然后根据每个类别标签条件化输入生成。提示模板如表8所示。我们对前一步中识别出的分类任务应用输出优先方法,对其余的非分类任务应用输入优先方法。
过滤和后处理。为了鼓励多样性,只有当新指令与任务池中任何现有指令的ROUGE-L相似度低于0.7时,才将其添加到任务池中。我们还排除了包含某些特定关键词(例如,图像、图片、图形)的指令,这些关键词通常不能由LM处理。在为每个指令生成新实例时,我们过滤掉完全相同或具有相同输入但不同输出的实例。基于启发式规则(例如,指令太长或太短,实例输出是输入的重复)识别并过滤掉无效的生成。
2.3 微调LM以遵循指令
在创建了大规模指令数据后,我们使用这些数据对原始的语言模型(即SELF-INSTRUCT)进行微调。为此,我们将指令和实例输入作为提示串联起来,以标准监督方式训练模型生成实例输出。为了使模型对不同格式具有鲁棒性,我们使用多个模板将指令和实例输入编码在一起。例如,指令可以加上“任务:”前缀或不加,输入可以加上“输入:”前缀或不加,“输出:”可以附加在提示的末尾或不加,中间可以放置不同数量的换行符等。
5663

被折叠的 条评论
为什么被折叠?



