赞
踩
这篇文章是对最近比较火的“prompt”的一个总结,一篇非常好的综述,做NLP方向建议都要读一读:)
本文将这种方法称之为“prompt-based learning”,之前传统的监督学习方法,是对给定的x训练一个模型,然后预测对应的y。prompt-based learning是基于语言模型直接对文本的概率进行建模。具体为:起初的输入x中加入一个模板(template),其中含有一些需要预测的位置slots,语言模型用于预测slots中应该出现的词的概率。这样最终需要的y也可以直接得出。
这种方法的优势在于:它可以在大量的原始文本中进行预训练,并通过设计一个prompt函数使模型可以作用于小样本(few-shot)或者零样本(zero-shot)中,并自适应到其他场景的少量或者没有标签的数据上。
全监督学习是指在具有固定输入输出的数据集上训练,然后预测相应的目标任务。之前的机器学习任务都是这种模式,当然,NLP也不例外。但是由于缺乏打标签的数据,不能学习到高质量的模型,之前NLP模型很大程度上依赖于特征工程(feature engineering)。后来由于神经网络的兴起,神经网络模型可以学习出之前特征工程提取的那些特征,因此,焦点又转向了建筑工程(architecture engineering),都在思考如何设计一个好的网络框架,可以让其学习出这些特征。
但是从2017到2019年,全监督学习的模式逐渐收缩。逐渐转变为预训练(pre-train)+微调(fine-tune)的模式。此时,具有固定框架的模型被当做语言模型(LM)被预训练,然后预测观测文本上的概率。预训练语言模型通过引入额外的参数被应用到下游任务,使用针对具体任务的目标函数微调。此时焦点又转为目标工程(objective engineering),设计在预训练和微调阶段使用的训练目标。
到现在2021年,我们又处在了一个新的海洋中,叫做“pre-train, prompt, and predict”。在这个时候,不再是通过目标工程把预训练模型应用到下游任务中,下游任务为了和预训练进行匹配,通过设计文本prompt进行实现。例如,当识别“I missed the bus today.”的情感时,我们可以设计一个prompt:“I felt so _”,然后让语言模型在这个空白处填入情感词。或者,对于一个prompt :“English: I missed the bus today. French: _”,语言模型需要在空白中填入法语的翻译。通过这种方式,选择适合的prompt可以让预训练语言模型用于预测目标输出,有时甚至不用再训练。这种方法的优势在于:给定一个合适的prompt,一个单独的语言模型以完全无监督的方式进行预训练,可以解决很多任务。我们将其定义为“prompt engineering”。
NLP传统的监督学习方法具体过程为:给定input x(经常是文本),用模型预测output y(可以是标签、文本或者其他任何形式)。这里的模型是在具有输入和输出的数据集上进行训练的。
传统的监督学习方法需要大量的带标签的数据,而这种数据在现实中是缺少的。基于prompt的方法就是为了解决这个问题,他使用语言模型对上述的输入x进行建模。然后再预测对应的y。这样就避免使用大量的标签数据。
基础的prompt预测需要3个步骤:
首先,我们需要设计一个prompt映射函数,把原始文本x转变为基于prompt的模型需要的格式x’。这种通常叫做模板(template),其包含两个位置[X]、[Z],其分别代表原始的文本x和需要预测的答案文本z(这个后面要映射到输出y上)。
例如,对于情感分类文本“I love this movie.”,其转变之后的文本为“I love this movie. Overall it was a [Z] movie.”。这里的Z要映射到对应情感类别标签。
这里设计模板的时候需要注意一下几点:
1)首先,这里的[Z]可能在原始文本的中间或者结尾,在接下来的文章中,我们对在中间的[Z]对应的prompt叫做“cloze prompt”,对在原始文本结尾的[Z]对应的prompt叫做“prefix prompt”。
2)其次,有时候这里的模板词([Z])并不是真实的语言词,其也可以是数字(对应虚拟的语言词),从而方便将其映射到embedding空间,或者也有可能直接是连续的向量(不需要映射)。
3)最后,这里的[X]、[Z]的数量可以根据任务随意调整,并不是说就是固定的一个[X]、一个[Z]。
接下来,我们需要在语言模型上寻找具有最大得分的文本(也就是要预测的文本),这里对应一个候选集合Z,可以想象是我们之前都知道的标签集合。对于生成任务,Z就是所有语言文本词,对于分类任务,其就是标签集合(可以把标签集合转化为其他文本,但是代表的意思是一样的,Z中的值要和标签集合对应起来)。例如,Z可以是“excellent”; “good”; “OK”; “bad”; “horrible”,其对应不同的情感级别。
接下来就是选择的函数说明了,可以是argmax或者sampling。形式化的东西可以看原论文。
下面就是预测的与真实标签y进行对应了,这里不同的任务可能不同,例如,对应生成任务,其预测的就是标签y,而对于分类任务,也可以存在多个对应同一个y。例如“excellent”,“fabulous”, “wonderful”都对应一个情感级别。
在我们对prompt的设计有了一个基本认知之后,我么接下来讲一下设计prompt的注意事项。
(1)预训练模型的选择:在下面的章节中会对这一部分介绍。
(2)Prompt Engineering:选择一个合适的prompt不仅对正确率还是对模型首要执行的任务都有很大的影响。这一部分将会在第四章中介绍。
(3)Answer Engineering:对于不同的任务,我们都想要设计不同的答案映射函数,这一部分在第五章中将会介绍。
(4)Expanding the Paradigm:上面介绍的prompt方法都是最简单的形式,在第六章中,我们将会介绍其的扩展,以使其在结果或者应用上进一步提升效果。
(5)Prompt-based Training Strategies:不仅对prompt还是语言模型,都有相应的训练策略,这一部分将要在第7章中介绍。
目前已经出现了很多对预训练模型的综述,如果想要深入了解,可以阅读相关参考文献。在这一章中,我们将要从以下两个方面介绍预训练模型:
(1)从不同的角度以更加系统的方式进行介绍。
(2)特别介绍其在prompt方法上的突出表现。
预训练语言模型的主要训练目标几乎总是由某种预测文本 x 概率的目标组成。
Standard Language Model (SLM):对于标准的语言模型,其训练目标是从训练语料中优化文本x的概率。其一般是以自回归(autoregressive)的方式进行,一次只预测一个token。它经常是“从左到右”的方式进行,但也可以是其他的方式。
一个比较流行的替换标准语言模型的训练目标的方法是降噪(denoising)目标,它是在原来的文本中加入一些噪声,然后用加噪声的文本预测其原始文本。这种目标有两种常见的风格:
(1)Corrupted Text Reconstruction (CTR):这种目标是通过只对输入句子的噪音部分计算损失,让其恢复至原始文本。
(2)Full Text Reconstruction (FTR):这种目标是对整个文本计算损失,包括被加噪音和没有被加噪音的文本。
预训练模型的训练目标在决定具体的prompt任务时扮演了很大的作用。例如:从左到右的自回归语言模型可能对prefix prompt更适合,重建(reconstruction)目标可能在cloze prompt上更适合。另外,使用标准LM和FTR目标训练的模型可能更适合生成任务,而其他的任务(例如分类)用哪一种应该都可以。
除了上述的主要训练目标之外,为了提升模型在不同下游任务上的效果,也出现了很多辅助(auxiliary)目标,我们在附录A.2中进行了展示。
在基于重建(reconstruction)的训练目标中,有不同的对原始文本加噪音的方式,另外,先验知识也可以用于这些方法中。例如:可以针对句子中的实体(entity)进行加噪音,这样模型可以对预测实体上有更好的表现。下面将会介绍几种加噪音的方法。
对文本中的token进行mask,可以是一个token也可以是多个连续的token,mask的时候,可以是[MASK]符号,也可以是其他自己设定的符号。mask的概率可以是从一个分布中随机采样,也可以用先验知识(例如前面提到的只mask实体)。
替换和mask比较像,一个token或者连续的token不再被[MASK]符号mask,而是用其他的token或者其他信息。
直接删除句子中的token,不被mask。这种操作经常和FTR损失一起使用。
文本首先分为不同的部分(token,连续的token,或者句子),然后重新排列这些片段组成一个新的文本。
在理解预训练模型的时候,最后一个值得注意的是计算表示的方向性问题。一般来说,下面两种方式经常被用于计算这种表示。
句子中每个词的表示是由之前词和当前词表示进行计算的。例如:对于句子“This is a good movie”,“good”的表示是由“This is a”的表示计算得到的。这种经常用于计算标准的LM目标或者FTR目标的输出部分。
句子中每个词的表示是基于句子中所有词计算的,例如:对于句子“This is a good movie”,“good”的表示不仅由“This is a”的表示计算,还由其右边的词“movie”的表示计算。
除了上述两种用的比较多的计算方式,还存在一些其他的变种。例如,可以将上述两种方式进行合并,或者在随意排列的句子中计算表示,但这样的方式用的比较少。注意:当把这些策略用于一个新的模型时,它经常使用注意力mask进行实现,例如流行的transformer。
接下来,我们介绍几种流行的预训练方法。
Left-to-Right Language Model属于自回归(auto-regressive)语言模型,基于之前词出现的概率预测当前词出现的概率。
应用场景:这种方法是1913年被一个学者提出,这已经成为了一种标准化的方法,并且从那时起一直以基于计数(count-based)和神经形式(neural forms)的形式使用。这种模型包括GPT-3和GPT-Neo。基于prompt的方法也经常用这种语言模型。其原因在于很多此类模型都很大,并难以训练,更不可能公开使用。因此使用这些模型在预训练和微调中不太可能。
虽然自回归语言模型在建模文本概率时提供了一个很强大的概率,但它也有一些缺点(例如需要从左到右计算表示)。当应用到下游任务时,例如分类,很多其他的语言模型会更好。在掩码语言模型(masked language model,MLM)中经常使用双向目标函数,其基于周围的文本预测被mask的文本片段。
应用场景:使用这种语言模型的预训练模型有BERT、ERNIE等。在基于prompt的方法中,掩码语言模型更适合自然语言理解或者分析任务(文本分类、自然语言推理、提取问题答案)。这种任务非常容易形式化为封闭问题,它和掩码语言模型中的训练目标是一致的。另外,当探索把prompt和微调进行结合时,掩码语言模型也称为预训练模型的一种比较好的选择。
对于文本生成任务,例如翻译、摘要,输入是一段文本,输出也是一段文本。我们需要一个预训练模型,其可以对输入文本进行很好的编码,并生成输出文本。目前有两种比较流行的框架可以实现这种目的,它们都具有这两种特点:使用全连接mask去编码输入x;以自回归的方式(从左到右)解码目标y。
1)Prefix Language Model:前缀语言模型是一个从左到右的语言模型,其基于前缀序列x解码目标y,它结合全连接mask,用相同的模型参数进行编码。注意:为了使前缀语言模型可以更好的学习输入的表示,损坏文本重建目标经常用于输入x,标准条件语言模型目标用于y。
2)Encoder-decoder:解码器和编码器是分开的,编码器使用全连接mask对输入x进行编码,在编码器的基础上使用从左到右语言模型解码y。这里的编码器和解码器的参数不是共享的。和前缀语言模型一样,不同的噪音可以加入到输入x中。
应用场景:前缀语言模型已经应用在UniLM1-2、ERNIE-M。encoder-decoder模型被应用于T5、BART、MASS以及它们的变种。使用前缀语言模型和encoder-decoder范式的预训练模型很自然的应用于文本生成任务中(输入文本中可以有也可以没有prompt)。但是最近的研究发现,非生成任务中也可以使用它,例如信息抽取、问答、文本生成评估可以引入合适的prompt,让其转化为文本生成任务的格式。因此,基于prompt的方法扩展了这种面向生成的预训练模型的应用方向。例如BART很少用于NER问题,但是基于prompt的方法让其成为可能。其次,基于prompt的方法克服了统一不同任务的模型的困难。
Prompt engineering就是为了构造一个最合适下游任务的prompt函数。在之前的工作中,它主要包含prompt template engineering,人类工程师或者使用算法搜索最合适特定任务的模板。在这个过程中,首先需要考虑的是prompt的形状,其次是考虑人工设计还是自动的方法。
在上述段落中已经提到,目前有两种不同的prompt:cloze prompts(填充输入文本的空缺)、prefix prompts(在后面加入一个字符串前缀)。选择哪一个取决于任务和使用的模型。一般来说,prefix prompts更适合在生成任务中或者使用自回归语言模型的任务中。cloze prompts更适合用掩码语言模型的任务中。对于全文本重建模型来说,这两种prompt都合适。并且,对于文本对分类任务,prompt模板包含的输入应该是两个([X1]、[X2])了。
一个最自然的想法就是手工设计模板,例如,Language models as knowledge bases? 中构造cloze模板去探测语言模型中的知识。Language models are few-shot learners 构造prefix模板去解决各种不同的任务,包括问答、翻译、常识推理中的探测任务。
由于手工设计模板存在以下问题:构造过程费事费力,特别对于语义解析这种复杂任务;很难构造出最优的prompts。
为了解决上述问题,一系列自动构建模板的方法被提出。这种自动构建模板的方法又可以分为离散(discrete)prompt(其中的prompt是一个实际的文本字符串),和连续(continuous)prompt(prompt直接在底层的语言模型的向量空间中表示)。另一种设计思想是prompt函数是静态的还是动态的,静态的是所有输入都使用相同的prompt模板,动态的是针对每一个输入生成特定的模板。这种静态和动态的策略已经被用于离散和连续的prompt的变种中。
离散的prompt也可以叫做hard prompt,其自动的在离散空间中寻找模板,其经常和自然语言短语(natural language phrases)相关联。下面介绍几种具体的方法:
1)Prompt Mining:How can we know what language models know? 中的主要的方法是mining-based 的方法,对于给定输入x和输出y,其可以能自动的发现模板。他们使用一个包含输入x和输出y的一个大的语料库(例如,Wikipedia),然后去发现在输入和输出之间的词或者依赖路径。最频繁的词或者依赖路径作为模板,例如:“[X] middle words [Z]”。
2)Prompt Paraphrasing:Paraphrasing-based使用一个现有的prompt(手工设计或者使用mining-based方法得到),其成为种子prompt,然后对它进行paraphrases,得到候选prompt,然后选择在训练集上表现最好的用于测试集。paraphrases的方法有很多种,例如:来回翻译(先翻译为其他语言再翻译回来)、借助词库进行短语替换、使用neural prompt重写器专门优化以提高使用prompt的系统的准确性(BERTese: Learning to speak to BERT)。注意:BERTese: Learning to speak to BERT 是在输入文本x转变为prompt模板之后进行paraphrase的,它允许对不同的输入有不同的paraphrase。
3)Gradient-based Search:Universal adversarial triggers for attacking and analyzing NLP 在原始tokens上应用基于梯度的搜索算法,以寻找短序列可以诱导潜在的预训练模型生成理想的目标结果。这种搜索是以迭代的方式进行,依次遍历prompt中的token。
4)Prompt Generation:一些工作把prompt的生成作为文本生成任务来对待,一般使用标准自然语言生成模型去完成这项任务。例如,Making pre-trained language models better few-shot learners使用T5模型搜索模板。
5)Prompt Scoring:Commonsense knowledge mining from pretrained models 研究了knowledge base completion的任务,并使用语言模型为输入设计了一个模板。具体为:他们首先手工设计一系列模板作为候选模板,然后填充输入和答案slots组成一个填充的prompt。然后使用双向语言模型为这些填充的prompt打分,选择具有最高分的模板。这样对每个输入都会产生特定的模板。
由于构建prompt是为了语言模型在目标任务上有更好的表现,没有必要用人们可解释的语言限制住它。因此,很多研究使用continuous prompts(或者soft prompts),其直接作用在模型的向量空间。具体的,continuous prompts移除了两个限制:减轻了限制模板词的embedding必须是自然语言词的embedding;移除了模板的参数受预训练模型参数的限制。相反,此时模板具有自己的参数,其可以使用下游任务的训练数据进行微调。下面介绍几种具体的方法:
1)Prefix Tuning:Prefix-tuning: Optimizing continuous prompts for generation 将一系列连续的特定于任务的向量添加到输入的方法,同时保持 LM 参数不变。
2)Tuning Initialized with Discrete Prompts:使用离散的prompt搜索方法得到的离散prompt,然后将其作为连续prompt的搜索过程的初始prompt。
3)Hard-Soft Prompt Hybrid Tuning:可以不是全部都是要学习的prompt模板,此种方法是在hard prompt模板里加入一些可以微调的embedding。
prompt engineering是要设计合适的输入,answer engineering是为了寻找答案空间Z,其可以映射到输出Y。其主要考虑两点:决定answer shape和选择一个答案设计的方法。
答案的形状也代表了其粒度。可以选择有:
1)Tokens:在预训练模型词典中的tokens(一个或其子集)
2)Span:多个token span,其经常和cloze prompt一起使用。
3)Sentence:一句话或者一篇文档。其经常和prefix prompt。
在实际中,答案的形状取决于任务。其中,token或者text-span 答案空间经常用于分类任务(情感分类、关系抽取、命名实体识别)。长的短语或者句子答案经常用于生成任务、多选择问答任务。
接下来就要思考如何选择合适的答案空间Z,以及答案空间到目标Y的映射(如果答案空间不是最终的输出)。
第一种方法为手工设计答案空间Z及其映射。在设计过程中的一些策略包括:
1)Unconstrained Spaces:在很多样例中,答案空间是所有的token或者固定长度的span、token序列。在这种场景下,直接使用 identity mapping 把答案空间映射到最终输出y。
2)Constrained Spaces:此时的答案空间是有限制。这种经常用于具有特定个数标签的任务中,例如文本分类、实体识别、多选择问答。例如,可以针对标签设计其相关的词,作为答案空间。此时必须设计答案空间到类别y的映射。
和手工设计的prompt一样,手工设计的答案空间有可能是局部最优。因此,自动答案搜索被一些研究者所研究,但其比研究搜索prompt的要少。这个也被分为离散答案空间和连续答案空间。
1)Answer Paraphrasing:这种方法是从一个初始答案空间开始,然后使用Paraphrasing的方式扩展这个空间。方法和前面的Paraphrasing差不多。
2)Prune-then-Search:在这种方法中,首先,使用模糊的答案初始化pruned answer space,然后使用搜索算法在pruned answer space中选择最终的答案集。在一些论文中,他们定义从标签y到单个答案token z的映射函数,他们把这个函数称之为verbalizer。
3)Label Decomposition:在关系抽取任务中,Adaprompt: Adaptive prompt-based finetuning for relation extraction 分解标签集合为单个词,并把它作为答案。例如,对于关系per:city of death,其可以被分为:{person, city, death}。最终答案的概率是这三个token的概率之和。
目前,比较少的工作探索可以使用梯度下降法优化的soft answer tokens。Warp: Word-level adversarial reprogramming 为每个类别标签分配一个虚拟token,然后为每个类别优化这个token embedding,其和prompt token embedding一起优化。因为答案token是直接在embedding空间进行优化,他们并没有充分利用到语言模型中训练好的embedding,反而是为每一个标签从头学习embedding。
到目前为止,我们讨论的prompt都是一个输入对应一个单独的prompt。然而,一系列的研究已经证明使用多个prompt可以进一步提升效果。我们把这样的方法叫做 Multi-Prompt Learning。
Prompt ensembling 是使用多个没有答案的prompt在推理阶段去做最终的决策。如图Figure 4中的(a)所示,其中参与决策的多个prompt可以是离散prompt也可以是连续prompt。这样做具有以下优点:
1)多个prompt之间可以互补。
2)减轻了用于prompt engineering的花销,因为选择一个最好的prompt是非常困难的。
3)可以在下游任务中更具有鲁棒性。
Prompt ensembling有点像机器学习中用于集成多个系统的ensembling方法。目前Prompt ensembling又可以分为如下几类:
这是最直观的一种方法,直接对多个prompt预测的值求平均。
简单的求平均,虽然很容易实现,但是由于一些prompt比其他的更重要一些,这种方法可能会产生局部最优。为了解决这个问题,就有研究者使用带权平均的方式。每个prompt的权重取决于其在训练集上的表现。
分类任务中的投票方法也可以运用到多个prompt的集成方法中。
一般来说,多个深度学习模型可以提高性能,而这种卓越的性能可以使用知识蒸馏提炼成单个模型。为了实现这个idea,Few-shot text generation with pattern-exploiting training,Exploiting cloze questions for few shot text classification and natural language inference,It’s not just size that matters: Small language models are also few-shot learners为每一个手工设计的template-answer pair训练一个单独的模型,然后使用他们的集成标注一个无标签的数据集。然后最终的模型用于提炼标注后的数据集中的知识。
目前比较少的工作将prompt ensembling方法用于生成任务中。在这种任务中使用集成方法的一个比较简单的方式为:使用标准的方法基于在答案序列中的下一个词的集成概率生成输出。相反,Few-shot text generation with pattern-exploiting training 为每一个prompt训练一个单独的模型,因为将这些经过微调的 LM 都存储在内存中是不可行的。因此,他们首先使用每一个模型对输出进行解码,然后通过求所有模型上他们生成的概率的平均值进行打分。
Prompt Augmentation有时也会被叫做demonstration learning(示范学习),提供了一些额外的回answered prompts,用于帮助 LM 知道应如何为实际的输入 x 提供答案。例如:不是直接提供一个prompt “China’s capital is [Z] .”。在这个prompt之前可以加入一些其他的例子,最终形成新的prompt “Great Britain’s capital is London . Japan’s capital is Tokyo . China’s capital is [Z] .”在Figure 4中的(b)中也有一个关于数字计算的样例。这些少量的帮助可以提升模型学习重复模式(repetitive patterns)的能力。
尽管Prompt Augmentation很简单,但也有很多难点:Sample Selection(如何选择最有效的例子),Sample Ordering(如何排列这些例子)。
研究者发现小样本场景中example的选择对结果的影响特别的大,在一些任务上其结果可以从最好的结果到随机的值。为了解决这个问题,Making pre-trained language models better few-shot learners 计算example与输入句子之间在embedding空间中的距离。选择距离较小的example。
Fantastically ordered prompts and where to find them: Overcoming few-shot prompt order sensitivity 发现example在prompt中的顺序对结果影响很大,就提出了entropy-based的方法计算不同候选排列的得分。Reordering examples helps during priming-based few-shot learning 在训练example中寻找一个比较好的排列,让其作为增强的prompt,然后学习这个排列中的不同prompt之间的token,从而进一步提升效果。
Prompt Augmentation 有点像retrieval-based(提供了很多上下文信息进而提升了模型效果)的方法,也有研究验证了其在基于prompt的学习中的作用。然而,关键的区别在于Prompt Augmentation也利用了模板和答案,而更大的上下文学习则没有。
对于一些组合的任务,它们是由一些基础的子任务组合而成。我们同样可以做prompt composition。我们使用多个针对子任务的prompt,然后设计一个组合策略将这些prompt进行组合。在Figure 4中的(c)有一个样例。例如,对于关系抽取任务,其目标是抽取出实体之间的关系。我们可以把这个任务分为识别实体、对识别的实体进行关系分类两个子任务。基于此,Ptr: Prompt tuning with rules for text classification 是第一个使用多个手工构造的用于命名实体识别和关系分类的sub-prompts,基于逻辑规则组合成一个完整的prompt,从而完成关系抽取。
对于一些需要多种预测值的任务(序列标注任务),直接对输入文本x设计一个完整的prompt是非常困难的。一个比较直观的想法就是把prompt转为多个不同的sub-prompts。然后对每一个prompt寻找答案。Figure 4(d)中展示的是针对命名实体识别任务中的一个样例,它的目标是要识别出句子中所有的实体。在这个样例中,输入首先会被转化为一系列的text span,然后模型为每个span预测其实体类型(包括不是实体,则预测为“Not an Entity”)。由于span的数量非常多,同时预测所有span的类型是非常困难的,因此为每个span设计一个prompt,然后进行分开预测。这种方法已经在Template-based named entity recognition using bart 中所研究。
大致就是这些了,虽然只有综述的一半,但主要内容大致都有了,想要进一步了解的,可以阅读原论文哒。
如果觉得有用的话,点个赞呗:)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。