论文笔记:Self-Instruct: Aligning Language Model with Self Generated Instructions

Q同学

2023-04-22 08:411630

导语

本文介绍了如何使用LLM来大规模自动生成instruction。实验结果表明,这种数据增强方式非常有效,接下来就让我们看看具体是怎么做的吧。

1 简介

近期NLP文献中有大量研究构建可以遵循自然语言指令的模型,这得益于大型预训练语言模型和人工编写的指令数据。但是,由于人工编写指令的昂贵和有限性,需要开发替代方法来监督模型的指令调整。

本研究提出了一种半自动的self-instruction过程,用于使用来自模型本身的指示信号对预训练的LM进行指令调整。整个过程是一个迭代的自引导(iterative bootstrapping)算法(见图1),它从一个有限的人工编写的指令种子集开始,用于指导整个生成。在第一个阶段,提示模型为新任务生成指令。此步骤利用现有的指令集合来创建更广泛的指令,这些指令定义(通常是新的)任务。对于新生成的指令集,框架还为它们创建输入-输出实例,这些实例可在以后用于监督指令调优。最后,在将低质量和重复的指令添加到任务池之前,使用各种措施来修剪它们。这个过程可以在许多交互中重复,直到达到大量的任务。

通过在GPT3上运行该方法并微调,验证了其有效性。研究还发布了一个包含52K指令的数据集和一组手动编写的新任务,用于构建和评估未来的指令遵循模型。本文贡献如下:

  1. SELFINSTRUCT,一种用最少的人工标记数据诱导指令跟随能力的方法;
  2. 通过大量的指令调优实验证明了其有效性;
  3. 发布了一个包含52K指令的大型合成数据集和一组手动编写的新任务,用于构建和评估未来的指令遵循模型。

2 相关工作

3 方法

大规模指令数据注释对人类来说是一项挑战,因为它需要1)提出新颖任务的创造力和2)为每个任务编写标记实例的专业知识。本节将详细介绍Self-instruct的过程,它指的是使用普通的预训练语言模型本身生成任务的Pipeline,然后使用生成的数据进行指令调优,以便使语言模型更好地遵循指令。这个Pipeline如图1所示。

3.1 指令数据的定义

指令数据包含一组指令{��}{It​},每条指令用自然语言定义一个任务t。每个任务有一个或多个输入输出实例(��,��)(Xt​,Yt​)。给定任务指令��It​和实例输入x,期望模型M产生输出

�:�(��,�)=�,���(�,�)∈(��,��)y:M(It​,x)=y,for(x,y)∈(xt​,yt​)

注意,指令和实例输入在许多情况下没有严格的边界。例如,“写一篇关于学校安全的文章”可以是期望模型直接响应的有效指令,而它也可以被表述为“写一篇关于以下主题的文章”作为指令,“学校安全”作为实例输入。为了鼓励数据格式的多样性,允许不需要额外输入的指令(即,x为空)

3.2 自动指令数据生成

我们生成指令数据的管道包括四个步骤:

  1. 指令生成,
  2. 识别指令是否代表分类任务
  3. 使用输入优先或输出优先的方法生成实例,以及
  4. 过滤低质量数据

指令生成。Self-instruct是基于一个发现,即当在上下文中呈现一些现有指令时,大型预训练语言模型可以被提示生成新的和新颖的指令。本文用人类编写的175个任务(每个任务一个指令和一个实例)启动任务池。对于每一步,从这个池中抽取8个任务指令作为上下文示例。在8条指令中,6条来自人工编写,2条来自之前步骤中模型生成的任务,以促进多样性。提示模板如表6所示。

分类任务识别。 因为需要两种不同的方法来处理分类和非分类任务,所以接下来要确定生成的指令是否代表分类任务。使用来自种子任务的12个分类指令和19个非分类指令提示vanilla GPT3 few-shot来确定这一点。提示模板如表7所示。

实例生成给定指令及其任务类型,需要为每个指令独立生成实例。这是具有挑战性的,因为它要求模型根据指令理解目标任务是什么,找出需要哪些额外的输入字段并生成它们,最后通过生成输出来完成任务。有两种方式的生成:

  • 输入优先:在这种方法中,要求语言模型首先根据指令提出输入字段,然后产生相应的输出。这种生成顺序类似于模型用来响应指令和输入的方式,但这里有来自其他任务的上下文示例。提示模板如表8所示。

  • 输出优先:在这种方法中,首先生成可能的类标签,然后在每个类标签上约束输入生成。提示模板如表9所示。将输出优先方法应用于前一步确定的分类任务,并将输入优先方法应用于剩余的非分类任务。

过滤和后处理。为了鼓励多样性,只有当一条新指令与任何现有指令的ROUGE-L重叠小于0.7时,它才会被添加到任务池中。排除了包含某些特定关键字(例如,图像、图片、图形)的指令,这些指令通常无法被语言模型处理。当为每条指令生成新实例时,过滤掉完全相同或具有相同输入但不同输出的实例。

3.3 指令微调

在创建大规模指令数据后,使用这些数据对原始语言模型(即self - instruction)进行微调。使用多个模板将指令和实例输入编码在一起。例如,指令可以加“Task:”前缀,输入可以加“input:”前缀,提示符末尾可以加“Output:”前缀,中间可以加不同数量的换行符,等等。

4 来自GPT-3的Self-instruct数据

在本节中,将Self-instruct用于引导指令数据到GPT3作为案例研究。使用通过OpenAI API 访问的最大的GPT3语言模型(“davinci”引擎)。生成的数据概述如下:

总共生成了超过52K的指令,过滤后这些指令对应的实例超过82K。

为了研究生成的指令类型及其多样性,通过识别生成指令中的动词-名词结构。使用Berkeley Neural Parser 来解析指令,然后提取最接近解析树根的动词及其第一个直接名词对象。52,445条指令中有26,559条包含这种结构;其他指示通常包含更复杂的从句(例如,“Classify whether this tweet contains political content or not.”)或以问题的形式(例如,“Which of these statements are true?”)。图2中绘制了前20个最常见的词根动词及其前4个直接名词宾语,占整个集合的14%。总的来说,在这些指令中看到了相当不同的意图和文本格式。

进一步研究生成的指令与用于提示生成的种子指令的区别。对于每个生成的指令,计算其与175个种子指令最高ROUGE-L重叠。图3中绘制了这些ROUGE-L分数的分布,表明有相当数量的新指令与种子没有太多重叠。图4中展示了指令、实例输入和实例输出长度的多样性。

对于生成质量的评估,作者随机抽取200条指令,并为每条指令随机选择1个实例。请一位注释专家(本文的合著者)根据指令、实例输入和实例输出来标记每个实例是否正确。表2的评估结果表明,生成的大多数指令是有意义的,而生成的实例可能包含更多的噪声(在合理的程度上)。然而,作者发现即使这些代可能包含错误,但它们中的大多数仍然是正确的格式,甚至是部分正确的,这可以为训练模型提供有用的指导。表10和表11中列出了一些好的代和坏的生成。

5 实验结果

5.1 Zero-Shot Generalization on SUPERNI benchmark

5.1.1 数据集

使用SUPERNI数据集,其中包含有119个任务,每个任务100个样例。

5.1.2 Baseline

  • T5 : 原始T5 模型,参数量为11B;
  • T0 : 基于T5模型,在PROMPTSOURCE上做了指令微调后的模型;
  • Tk-INSTRUCT : 基于T5模型,在指令数据集 SUPERNI 上做了微调后得到的模型;
  • GPT3 : 原始GPT3 模型,参数量为175B;
  • ���3����−��������GPT3Self−instruct​ : 基于GPT3模型,采用Self-Instruct方法进行了指令微调得到的模型;
  • GPT3 + T0 training : 基于GPT3模型,在PROMPTSOURCE上做了指令微调后的模型;
  • GPT3 + SUPERNI training : 基于GPT3模型,在指令数据集SUPERNI上做了微调后得到的模型;
  • InstructGPT001 : openai发布的模型Text-davinci-001;
  • ���3����−��������GPT3Self−instruct​ + SUPERNI Training : 基于 175B 的GPT3模型,采用本文的 Self-Instruct 方法获取指令数据集,在加上 SUPERNI 这个指令数据集,在合并这两份数据集之后的总的数据集上微调之后的模型。

5.1.2 结果

对比结果如下表3所示,总的来说:

  • Self-Instruct能够给GPT3模型带来巨大的提升,大概33.1%;
  • 经过Self-Instruct之后的GPT3的效果接近 InstructGPT001 ;
  • 从下表3的最后两行的对比来看,即使已经在同源的测评数据集 SUPERNI 上经过了微调之后,再使用 Self-Instruct 依然能够有提升;

5.2 Generalization to User-oriented Instructions on Novel Tasks

5.2.1 数据集

作者认为SUPERNI数据集更多偏向于学术性质,为此本文设计了一个更贴近普通用户日常使用的新数据集。首先,通过头脑风暴设想LLM可能有用的不同领域(例如,电子邮件写作,社交媒体,生产力工具,娱乐,编程),然后制作与每个领域相关的指令以及输入输出实例(同样,输入是可选的)。并使这些任务的风格和格式多样化(例如,指令可能长或短;输入/输出可以采用项目符号、表格、代码、方程式等形式)。总共创建了252条指令,每条指令有一个实例(下表4)。

5.2.2 Baseline

基本上和第 5.1.2 节的方法上增加了 InstructGPT-002和InstructGPT-003

5.2.3 效果分析

对比结果如下图5所示。评估方式是人工对模型的输出结果做打分,评分A最好,评分D最差。在下图5中的颜色对应着绿色最好,红色最差。可以看出:

  • 原始GPT3几乎无法响应用户的指令,所有微调过之后的模型都有明显的提升;
  • 即使Self-Instruct生成的数据是有噪音的(表11),但是模型���3����−��������GPT3Self−instruct​的效果明显优于模型 GPT3+T0 Training 和模型 GPT3 + SuperNI Training ;
  • 模型 ���3����−��������GPT3Self−instruct​的效果与模型InstructGPT-001 的效果已经非常接近;
  • 模型 InstructGPT-002和InstructGPT-003 效果确实很令人印象深刻;

5.3 案例分析

下表4给出了���3����−��������GPT3Self−instruct​模型的输出示例。

6 局限性

6.1 为何Self-instruct有用?

目前的学术界有两种观点:

  1. Human feedback is a necessary and indispensable. 人工反馈是指令调优的一个必要和不可或缺的方面,因为LMs需要了解在预训练期间没有完全了解的问题。
  2. Human feedback is an optional. 人工反馈是指令调整的一个可选方面,因为LMs已经非常熟悉预训练中的指令。观察人类的反馈仅仅是一种调整他们的预训练分布/目标的轻量级过程,这可能被不同的过程所取代。

虽然现实可能介于这两个极端之间,但本文推测它更接近观点2,特别是对于较大的模型。这种直觉,即LMs已经非常了解语言指令,是Self-instruct的关键动机,实验结果上的成功也支持了这一点。

6.2 更深远的影响

本文中的发现证明了多样化指令数据的重要性,大型合成数据集可以成为构建更好的指令遵循模型的高质量数据的第一步。

6.3 局限性

Self-instruct方法可能存在以下局限性:

  • Tail phenomena:即长尾现象,换句话说,LMs的最大收益对应于语言的频繁使用(语言使用分布的头部),而在低频上下文中收益最小。对于不常见的和创造性的指令,这种方法可能表现出脆弱性。
  • Dependence on large models:依赖于大语言模型,计算资源是一个主要挑战;
  • Reinforcing LM biases:作者担心的一点是这种情况可能放大有问题的社会偏见(关于性别、种族等的刻板印象或诽谤)。与此相关,在这个过程中,一个观察到的挑战是算法难以产生平衡标签,这反映了模型的先验偏差。

7 总结

本文介绍了self-instruction,这是一种任务无关的方法,通过语言模型自己生成指令数据(指令、输入和输出样本)并使用它进行自引导来提高语言模型的指令跟踪能力。本文在已有数据集和构建的贴近日常应用的数据集上进行了实验,实验结果表明使用self-instruct调优GPT3的性能大大优于使用现有的公共指令数据集。作者希望self-instruct可以作为调整预训练语言模型以遵循人类指令的第一步,未来的工作可以建立在这些数据的基础上,以改进指令遵循模型。

参考

  1. Self-Instruct: Aligning Language Model with Self Generated Instructions, zhuanlan.zhihu.com/p/614916562
Logo

欢迎加入我们的广州开发者社区,与优秀的开发者共同成长!

更多推荐