Prompt Learning: ChatGPT也在用的NLP新范式

3,841 阅读14分钟

编者按:自GPT-3以来,大语言模型进入了新的训练范式,即“预训练模型+Promp learning”。在这一新的范式下,大语言模型呈现出惊人的zero-shot和few-shot能力,使用较少的训练数据来适应新的任务形式。最近火爆出圈的ChatGPT是利用这一方式。

简单理解Prompt learning,其核心就是以特定的模板,将下游任务的数据转成自然语言形式,充分挖掘预训练模型本身的能力,以适应不同的下游任务。

本期IDP Inspiration,我们将和大家一起深入走进Prompt learning技术,了解其发展进展。

以下是译文,Enjoy!

作者 | Tianyu Gao, Princeton University

编译 | 岳扬

从BERT(Devlin et al., 2019)[1]开始,在下游应用上用task-specific heads对预训练语言模型(LMs)进行微调已经成为NLP的标准做法。然而,具有175B参数的GPT-3模型(Brown et al., 2020)[2]为下游应用带来了使用LMs的新方式:GPT-3利用自然语言提示词(prompt)和任务演示(task demonstrations)作为上下文(context),只使用少量的例子就能很好地处理各种任务,并且不需要更新底层模型中的参数。GPT-3的模型规模很大是其成功的一个重要因素,而 提示词(prompts) 和 演示(demonstrations)也给我们提供了关于如何更好地使用语言模型的新见解。

所以什么是提示词 (prompt)?

它是插入到输入示例中的一段文字,能够将原始任务(original task)表述为语言模型问题 (language modeling problem)。例如,假如我们要对下面这条电影评论“不值得看(No reason to watch)”进行分类,我们可以将prompt“It was”插入到句子中,得到“No reason to watch. It was ____”。很自然的,语言模型产生“terrible(可怕)”的概率比“great(伟大)”的概率高。本文会介绍大型语言模型中prompt的最新进展。

在GPT-3发布后,出现了许多与prompt有关的论文,其中许多论文都讨论了基于提示词的学习(prompt-based learning)用于中等规模的预训练模型,如BERT(BERT-base有110M参数,比最大的GPT-3小1000倍)。

在这篇博文中,我将概述最近的prompt-based方法和我的看法。

Why Prompts?

以情感分类任务为例,对预训练、标准的微调和基于提示的微调进行了说明(from Gao et al., 2021)

在传统的“预训练和微调(fine-tuning)”模式中,预训练阶段和下游任务之间存在巨大差距。

首先是目标不同。对于下游任务,通常需要引入新的参数,例如对于一个BERT大型模型和一个二元分类任务,需要额外的1,024 x 2个参数。

另一方面,通过使用prompt,下游任务有可能采用与预训练目标相同的格式(如上图所示),而不需要引入新的参数。对于分类任务,只需要设计一个模板(例如“It was”)和预期的文本(也称为标签词,例如图中的正面标签为“great”,负面标签为“terrible”)。缩小两个阶段之间的差距可以使在特定任务上部署预训练模型变得更加容易,特别是在只有少量新任务训练案例的情况下,有效地微调预训练模型和新任务的特定参数是很困难的。Scao和Rush(2021)[3]的研究表明,一个prompt可能抵得上100个常规数据点,这表明prompt可以带来采样效率的巨大提升。

在对prompt的研究中,有两种不同的范式,它们有着不同的观点。受PET论文(Schick and Schütze,2021a,b)[4]的启发,基于prompt的微调(关键点是仍然需要进一步优化参数)被认为是对小型语言模型(这里说的小型是指数百万而不是数十亿的参数,如BERT或RoBERTa)实现更好的小样本学习的途径;对于超大型模型,如175B参数的 GPT-3和11B参数的 T5(Raffel et al., 2020)[5],微调它们是困难的(这只是我的猜测,我从来没有机会这样做),而且成本很高,因此以人们期望通过不同的prompt(无论是离散提示/discrete prompt)还是软提示/soft)来固定它们的参数并将它们应用于不同的任务。

离散提示词Discrete prompts

使用prompt进行预训练模型的研究最早可以追溯到GPT-1/2(Radford et al., 2018, 2019)[6]。这些研究表明,通过设计适当的prompt,语言模型(LMs)可以在情感分类和阅读理解任务中实现和零样本学习一样的表现。

随后,Petroni等人(2019)[7];Davison等人(2019)[8];Jiang等人(2020)[9];Talmor等人(2020)[10]探索了如何利用prompt从LMs中挖掘事实和常识性知识(factual and commonsense knowledge)。

在GPT-3采用prompt和固定参数之后,基于prompt的方法被引入到较小的LMs中(Schick和Schütze,2021a,b[11];我们的工作LM-BFF,Gao等人,2021[12])。

这些方法与GPT-3的不同之处在于,它们采用了双向掩码(bidirectional masked)LMs,而不是单向(unidirectional)LMs,并对完整的模型进行微调。最近的几篇论文也沿用了这一思路,调整了任务目标(Tam等人,2021[13])或以统一的形式制定任务,如问题回答(Zhong等人,2021[14])或文本蕴涵(Wang等人,2021[15])。

在所有这些模型中,prompt都是自然语言,由离散的词汇标记组成。综合研究不同变体的结果,Logan等人(2021)[16]表明,当采用基于prompt的微调方法(而不是冻结所有参数)时,模型可以获得比标准微调更好的性能(但好的提示仍然会产生明显的差异)。而只调整部分模型参数——例如,采用最近提出的bias tuning method(Ben-Zaken等人,2021)在few-shot setting中与full model fine-tuning相当。

大多数工作都需要人工设计的prompt,提示工程是不简单的,因为一个小的扰动就会极大地影响模型的性能,而创建一个完美的prompt需要了解LMs的内部工作原理和不断试错。

除了人工设计的prompt,人们还可以自动生成或优化prompt。Guo等人在2021年展示了一种soft Q-learning方法,在生成prompt时效果很好。

AutoPrompt(Shin et al., 2020)[17]提议采取基于梯度的搜索(该想法来自Wallace et al., 2019[18],旨在搜索一个通用的对抗性触发器,使模型产生特定的预测),为特定任务找出最佳prompt。AutoPrompt的设置是不同的,因为它固定了模型:它假设所有的东西都被编码在预训练的模型中,我们需要的只是”prompt”出来;另一个原因是,AutoPrompt的目标也是LAMA(LAnguage Model Analysis)(Petroni et al., 2019[19]),这是一种知识探测任务,它被要求不触及模型参数。

下面是一个用于情感分类的AutoPrompt的例子:

An illustration of AutoPrompt (Shin et al., 2020)

搜索到的templates大大改善了LAMA的性能;它们在使用完整数据集的情感分类和自然语言推理任务中也取得了十分惊人的准确性(不过仍然低于微调范本)。查看搜索到的discrete(但不再是自然语言)prompt,可以找到对一些“trigger tokens“的解释,但很多只是特殊情况。

目前还不清楚,AutoPrompt 是否真的能帮助LMs回忆起里面的 ”knowledge“,或者它只是优化的另一种方式,在预训练模型中从“彩票”中挑选出“中奖彩票”(关于彩票假说,见Frankle和Carbin,2019[20])。

软提示/连续提示Soft prompts

我们真的需要在prompt中使用离散单词吗?

既然AutoPrompt已经做了基于梯度的提示搜索,为什么不从discrete tokens转向连续的“soft prompts”?例如,Zhong等人(2021)[21]和Qin、Eisner(2021)[22]提出将 soft prompts用于知识探测任务(LAMA等),并取得了比discrete prompts更大的提升。这个想法非常简单:只是在输入序列中放入一些随机向量(不与词汇中的特定词嵌入相联系),并对其进行调整,而预训练模型的其他部分则固定不变。

还有一些人是将soft prompts部署在知识探测任务之外。Li和Liang(2021)[23]将这一想法扩展到了生成式任务(generation tasks),并表明它的性能提升与进行微调相当,但是只调整了0.1%的参数。Han等人(2021)[24]将soft prompts与manual templates结合起来,在关系抽取(关系抽取)方面取得了极佳的性能。

至今为止,我所看到的关于soft prompts最全面的研究来自于Lester等人(2021)[25]:他们在T5上应用了soft prompts,并表明通过调整prompt(只占总参数的一小部分),T5可以在NLU(自然语言理解)任务中取得与微调整个模型相同的性能。我很喜欢这篇论文,因为它进行了充分的ablation study(消融实验),并展示了soft prompts的几个关键的经验选择,包括从词嵌入初始化,足够数量的soft prompt tokens,以及一个aligned pre-training objective。除了参数效率,Lester等人(2021)[25]还证明了soft prompts提供了比全模型微调更好的可传递性。

让我们回顾一下soft prompts:它的效果非常好,当你不能(探测任务)或不愿(模型太大,或你希望有一个适用于所有任务的通用模型)触摸模型的参数时,它特别有效。

调整soft prompts与基于prompt的微调有很大不同,后者允许人们优化完整的模型,更重要的是,比标准的微调更适合处理小样本案例。

与人工设计的不同,AutoPrompt在某些情况下不能很好地工作,据我所知,没有任何soft prompts论文认为所有情况下它都能取得极好的性能(尽管Liu等人(2021)[26]通过从discrete manual prompts开始,对整个模型进行微调,极端情况下也出现了令人满意的结果)。

另外,正如Lester等人(2021)[25]所证明的,在使用超过100亿个参数的预训练模型之前,soft prompts从未在SuperGLUE上实现与全微调相同的性能。我认为未来值得研究的是如何进一步推动soft prompts在极端情况和较小的语言模型中更有效地工作。

GPT-3 (blue) vs full model fine-tuning (orange) vs soft-prompt tuning (green). Credit to Lester et al. (2021).

上下文学习In-context learning:新型的元学习

在本文的开头,我把GPT-3的成功归功于两个模型设计:prompts 和demonstrations(或 in-context learning),但在这一节之前我还没有谈到in-context learning。由于GPT-3的参数没有在下游任务中进行微调,它必须以另一种方式——通过context(上下文) ”学习”新任务。

GPT-3 "learns" about new tasks through demonstrations in the context (Brown et al., 2020).

如上图所示,GPT-3只是将一些随机训练样本与实际查询(本例中为 ”cheese⇒“)串联起来,由于预训练的模型已经学会了从上下文中捕捉patterns,而且Transformer的自注意力机制允许在这些实例中逐一进token比较,因此上下文中的学习效果出奇地好。GPT-3论文称其为”元学习meta-learning”,认为在阅读大量无监督的文本后,语言模型可以“训练出多样的技能和patterns识别能力“。

作者假设在预训练期间有时会有重复的子任务嵌入到一个序列中,类似于上下文学习(in-context learning)的范式。后续的工作进一步完善了使用demonstrations的方式。Gao et al., 2021[12]; Liu et al. (2021)[27] 说,与其随机抽取一些例子,不如采取在与查询相似的语境中demonstrations,可以大幅提高性能;Lu et al. (2021) 表明,demonstrations的顺序也很重要,并提出了一种确定”最佳”顺序的方法。

虽然in-context learning只有在无法调整模型时才是必要的,并且当训练实例的数量增加时很难进行泛化(因为模型的输入长度是有限的),但研究如何更好地使用demonstrations(即如何进一摄取LMs学到的”meta-knowledge”)以及哪些预训练目标和数据可以提升in-context能力,可能会进一步帮助我们了解预训练LMs的内部运行原理。

校准语言模型 Calibrating language models

Prompting是非常有效的,但它也可能会引入来自预训练语料的偏见。例如,在零样本情感分类设置中,如果输入为“N/A”,GPT-3可能会错误地将其认为是“正面”而不是“负面”,而实际上这两个标签应该被分配相等的概率(Zhao等人,2021)[29]。

另外,同一个物体的不同词语描述(如“computer”和“PC”)可能会互相竞争概率分配,导致任务标签分布不理想(Holtzman等人,2021)[30]。为了解决这些问题,Zhao等人(2021)[29]和Holtzman等人(2021)[30]提出了校准(Calibrating)的解决方案,即通过为有偏差的token添加补偿来纠正偏差,使其变得无偏差。

什么是正确的小样本设置(few-shot setting)?

关于小样本设置(few-shot setting)本身有很多讨论:在小数据集上进行微调会出现不稳定的情况(Dodge et al., 2020[31]; Zhang et al., 2021[32]),不同的数据分割可能会对性能产生很大的影响。

以前的工作中采取了各种设置,但为了考虑到few-shot的巨大差异,需要对小样本数据的数据分割进行多次采样和使用不同seeds进行多次试验,以进行严格的小样本评估(这就是我们以前工作中的做法)。

但是有一个经常被忽视的问题是,在只有几张照片的情况下,我们不能假设一个大的development set。为了解决这个问题,Schick和Schütze(2021)[33]没有采用development set,而是采用固定的超参数(在这样一个充满变化的环境中,这类似于“在黑暗中射击”,可能会产生不直观的结果),而在我们的工作中,我们对一个与训练集相同大小的小样本development set进行采样,所以我们可以在保持小样本的同时调整超参数。

Perez等人(2021年)[34]认为,先前的工作高估了LMs的小样本性能,因为他们或多或少地采取了许多已有的例子来进行超参数调整、模型开发或prompt设计,他们提倡 “true few-shot learning” 设置。这与我们的观点是一致的,即你只能假设小样本的dev案例。

然而,在现实世界中,我们很难实现 ”真正的小样本学习“,因为你需要足够多的例子来验证你的模型至少在一个或两个任务上是有效的。只要设计的模型能够很好地泛化到其他的小样本任务,它就是一个好的小样本模型。在我们的工作中,我们用SST-2和SNLI进行实验,表明我们的方法可以很好地推广到其他13种NLU任务。(对于这一部分技术创新感兴趣的小伙伴,可以关注ACL’21 paper, "Making Pre-trained Language Models Better Few-shot Learners")。

参考资料

arxiv.org/abs/2105.11…

arxiv.org/abs/2005.14…

arxiv.org/abs/2103.08…

arxiv.org/abs/2001.07…

arxiv.org/abs/1910.10…

cdn.openai.com/research-co…

arxiv.org/abs/1909.01…

arxiv.org/abs/1909.00…

arxiv.org/abs/1911.12…

arxiv.org/abs/1912.13…

arxiv.org/abs/2001.07…

arxiv.org/abs/2012.15…

arxiv.org/abs/2103.11…

arxiv.org/abs/2104.04…

arxiv.org/abs/2104.14…

arxiv.org/pdf/1909.04…

arxiv.org/abs/2010.15…

arxiv.org/abs/1908.07…

arxiv.org/abs/1909.01…

arxiv.org/abs/1803.03…

arxiv.org/abs/2104.05…

arxiv.org/abs/2104.06…

arxiv.org/abs/2101.00…

arxiv.org/abs/2105.11…

arxiv.org/abs/2104.08…

arxiv.org/abs/2103.10…

arxiv.org/abs/2101.06…

arxiv.org/abs/2104.08…

arxiv.org/abs/2102.09…

arxiv.org/abs/2104.08…

arxiv.org/abs/2002.06…

arxiv.org/abs/2006.05…

arxiv.org/abs/2009.07…

arxiv.org/abs/2105.11…

本文经原作者授权,由Baihai IDP编译。如需转载译文,请联系获取授权。(原文链接:thegradient.pub/prompting/)

本文正在参加 ✍🏻 技术视角深入 ChatGPT 征文活动