赞
踩
Prompt就是“提示”的意思,通俗解释可以参考你画我猜游戏。如下图所示:提示词就作为Prompt,指导对方说出正确答案。而自然语言处理任务中的Prompt也有同样的效果,指导模型输出正确的答案。
Prompt刚刚出现的时候,还没有被叫做Prompt,是研究者们为了下游任务设计出来的一种输入形式或模板,它能够帮助PLM“回忆”起自己在预训练时“学习”到的东西,因此后来慢慢地被叫做Prompt了。
Prompt Learning是指对输入文本信息按照特定模板进行处理,把任务重构成一个更能充分利用预训练语言模型处理的形式。 Prompt的本质是构建一个语言模版,利用mask language model(MLM) 任务做微调,想让模型学习到的内容使用[MASK]进行遮蔽,让模型从整体词表Vocabulary中去做选择,找出[MASK]位置中最合适的词,[MASK]位置的候选集合是整个词库。
以下是使用预训练模型预测[MASK]的实例。我们用做测试的模型是已经训练好的模型chinese-bert-wwm,如下图所示,输入如下:
中午我吃了大盘[MASK]。
让预训练模型预测[MASK]位置的单词,其中Token“饭”是被模型预测的最优解。
引入Prompt范式之前借助预训练模型做 NLP 任务的模式可以归纳为:Pre-train, Fine-tune"的模式,其大致流程如下:
预训练模型提供了一个非常好的初始化参数,这组参数在预训练任务上的表现非常好(预训练损失非常低),但是由于下游任务千奇百怪,我们需要在这组参数的基础上进行 Fine-tune 以适应我们的下游任务(使得下游任务的损失值非常低),整体流程也就是 "Pre-train, Fine-tune"的模式,而对我们来说实际上大部分时候都是直接拿别人预训练好的模型做 Fine-tune。
这种模式在诸多任务的表现上超越了传统的监督学习方法,不论在工业生产、科研创新还是竞赛中均作为新的主流方式。然而,这套模式也存在着一些问题。例如,在大多数的下游任务微调时, 下游任务的目标与预训练的目标差距过大 导致提升效果不明显, 微调过程中依赖大量的监督语料 等。
在引入Prompt范式之后借助预训练模型做 NLP 任务的模式大致可以归纳成 "Pre-train, Prompt, and Predict",其大致流程如下:
在该模式中,下游任务被重新调整成类似预训练任务的形式。例如,通常的预训练任务有 MLM(Masked Language Model)。以情感分析任务为例,Prompt-Tuning的执行步骤如下:
1.构建模版(Template Construction):通过人工定义、自动搜索、文本生成等方法,生成与给定句子相关的一个含有[MASK]标记的模版。对于 "I love this movie" 这句输入,可以在后面加上 Prompt:"the movie is [MASK]",组成如下这样一句话成为Prompt-Tuing的输入:[CLS]I love this movie, he movie is [MASK][SEP]。然后将其喂入到BERT模型中,并使用预训练好的MLM分类器(在huggingface中为BertForMaskedLM)做完形填空,即可直接得到[MASK]
预测的各个token的概率分布;
2.标签词映射(Label Word Verbalizer) :因为[MASK]
部分我们只对部分词感兴趣,因此需要建立一个映射关系。例如如果[MASK]
预测的词是“great”,则认为是positive类,如果是“terrible”,则认为是negative类。
这样一来,我们就可以通过构造合适的「模板」,通过小样本数据集训练一个模型来解决各种各样的下游任务。Prompt 设计的这种完形填空和 MLM 任务是有区别的,二者虽然都是都是词分类,但是候选集不同,MLM 的候选词是整个词库,不过如果是生成任务,那么 Prompt 和 MLM 的候选集就是一样的,都是整个词库。其实我们可以理解,引入的模板和标签词本质上也属于一种数据增强,通过添加提示的方式引入先验知识。
Prompt-Tuning起源于GPT-3的提出《Language Models are Few-Shot Learners》(NIPS2020),其认为超大规模的模型只要配合好合适的模板就可以极大化地发挥其推理和理解能力。
其开创性提出 in-context learning 概念,即无须修改模型即可实现few-shot/zero-shot learning。同时引入了demonstrate learning,即让模型知道与标签相似的语义描述,提升推理能力。
1. In-context Learning:是Prompt的前身。其通过从训练集中挑选一些样本作为任务的提示提示(Natural Language Prompt),来实现免参数更新的模型预测;
2.Demonstration Learning:添加一些新的文本作为提示。例如在对“I like the Disney film. It was [MASK]”进行情感分析时,可以拼接一些相似场景的ground-truth文本“I like the book, it was great.”、“The music is boring. It is terrible for me.”等。此时模型在根据新添加的两个样例句子就可以“照葫芦画瓢”式地预测结果了。
不过以GPT-3为首的这类方法有一个明显的缺陷是—— 其建立在超大规模的预训练语言模型上 ,此时的模型参数数量通常超过100亿, 在真实场景中很难应用 ,因此众多研究者开始探索GPT-3的这套思路在小规模的语言模型(BERT)上还是否适用?事实上,这套方法在小规模的语言模型上是可行的,但是需要注意几点:
1.模型参数规模小了,Prompt直接用在Zero-shot上效果会下降,因此需要考虑将in-context learning和demonstrate learning应用在Fine-tuning阶段;
2.GPT-3中提供的提示(Natural Language Prompt)过于简单,并不难使用在一些具体的任务场景,因此需要单独设计一套组件实现。
PET(Pattern-Exploiting Training)出自《Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference》(EACL2021),根据论文题目则可以猜出,Prompt-Tuning启发于文本分类任务,并且试图将所有的分类任务转换为与MLM一致的完形填空。PET详细地设计了Prompt-Tuning的重要组件——Pattern-Verbalizer-Pair(PVP),并描述了Prompt-tuning如何实现Few-shot/Zero-shot Learning,如何应用在全监督和半监督场景(iPET)。
PET设计了两个很重要的组件:
1.Pattern(Template):记为,其为额外添加的带有[mask]
标记的短文本,通常一个样本只有一个Pattern(因为我们希望只有1个让模型预测的[mask]
标记)。上文也提到,不同的任务、不同的样本可能会有其更加合适的pattern,因此如何构建合适的pattern是Prompt-Tuning的研究点之一;
2.Verbalizer :记为,即标签词的映射,对于具体的分类任务,需要选择指定的标签词(label word)。例如情感分析中,我们期望Verbalizer可能是 V ( positive ) = great, V ( negative ) = terrible (positive和negative是类标签)。同样,不同的任务有其相应的label word,但需要注意的是,Verbalizer的构建需要取决于对应的Pattern。因此如何构建Verbalizer是另一个研究挑战。
上述两个组件被称为Pattern-Verbalizer-Pair(PVP),一般记作 P = ( T , V ) 。
因此基于PVP的训练目标可以形式化描述:
一般在一个句子只能有一个PVP(因为我们只需要一个[mask]
用来预测),这可能并不是最优的,是否可以为一个句子设计多个不同的PVP呢?这是可以的,这属于Prompt-Tuning的集成。PET提供了简单的集成思路。
同一个句子设计多个不同的pattern,例如It was [mask].,I think it is [mask].,This comment denotes as [mask]. 等,此时,原先只有一个句子,却可以生成多个不同的样本,也变相起到数据增强的作用。在训练时,可以当作单独的样本进行训练,推理时,则可以对所有Pattern的结果进行投票或加权。如下图所示:
在给定的某个Pattern下,并非只有1个词可以作为label word。例如positive类,则可以选择“great”、“nice”、“wonderful”。当模型预测出这三个词时,均可以判定为positive类。在训练和推理时,可以对所有label word的预测概率进行加权或投票处理,并最后获得概率最大的类。如下图所示:
Pattern和Verbalizer均进行集成,此时同一个句子有多个Pattern,每个Pattern又对应多个label word。如下图所示(以2个PVP集成为例),在训练时可以采用加权,在推理时可以采用加权或投票法。
iPET旨在先从预训练模型开始,初始化多个不同的模型(图中1步骤),在有标注的少量样本上进行Prompt-Tuning,然后通过多个不同的PVP训练得到多个不同的模型(图中a步骤),每个模型在无标注数据上进行推理打标,并根据置信度筛选(图中b步骤),根据新标注的数据与原始标注数据融合后,再重新进行Prompt-Tuning(图中c步骤),重复abc三个步骤多次后,获得每个模型后,在测试时进行集成投票(图中2、3步骤)
目前的研究开始关注如何选择或构建合适的Pattern和Verbalizer。一种简单的方法是根据特定任务的性质和先验知识人工设计模板。例如上文例子中通常会选择It was [mask]. 作为情感分析类的模板。人工构建方法虽然直观简单,但是致命问题也很突出。有相关工作在实验中发现,在同样的数据集和训练条件下,选择不同的Pattern和Verbalizer会产生差异很大的结果,一般情况下,Template等同于Pattern,Verbalizer等同于Label word)
在Pattern相同时,选择不同的label word对结果影响很大,同理,不同的Pattern对结果影响也很明显,在真正应用中,调参者需要尝试多个不同的模板和标签词以穷举出最好的结果,并不能充分发挥Prompt简单快捷的优势。因此我们总结人工设计方法的缺陷:
1.采用人工构建的方法成本高,需要与领域任务相关的先验知识;
2.人工设计的Pattern和Verbalizer不能保证获得最优解,训练不稳定,不同的PVP对结果产生的差异明显,方差大;
3.在预训练阶段MLM任务并非完全按照PVP的模式进行训练的(比如MLM训练通常都是长文本,mask的数量也并非只有1个,预测的概率分布也并非是有限的),因此人工构建的Pattern和Verbalizer使得Prompt-Tuning与MLM在语义和分布上依然存在差异。
自2020年底至今,学术界已经涌现出一批基于Prompt-Tuning的方案试图探索如何自动构建PVP。本节主要总结几种成熟的Pattern(Template)构建方法。可以罗列为如下几点:
1.人工构建(Manual Template):在前文已经描述过,不再详细说明;
2.启发式法(Heuristic-based Template):通过规则、启发式搜索等方法构建合适的模板;
3.生成(Generation):根据给定的任务训练数据(通常是小样本场景),生成出合适的模板;
4.词向量微调(Word Embedding):显式地定义离散字符的模板,但在训练时这些模板字符的词向量参与梯度下降,初始定义的离散字符用于作为向量的初始化;
5. 伪标记(Pseudo Token):不显式地定义离散的模板,而是将模板作为可训练的参数;
前面3种也被称为离散的模板构建法(记作Hard Template、Hard Prompt、Discrete Template、Discrete Prompt),其旨在直接与原始文本拼接显式离散的字符,且在训练中始终保持不变。这里的保持不变是指这些离散字符的词向量(Word Embedding)在训练过程中保持固定。通常情况下,离散法不需要引入任何参数。
后面2种则被称为连续的模板构建法(记作Soft Template、Soft Prompt、Continuous Template、Continuous Prompt),其旨在让模型在训练过程中根据具体的上下文语义和任务目标对模板参数进行连续可调。这套方案的动机则是认为离散不变的模板无法参与模型的训练环节,容易陷入局部最优,而如果将模板变为可训练的参数,那么不同的样本都可以在连续的向量空间中寻找合适的伪标记,同时也增加模型的泛化能力。因此,连续法需要引入少量的参数并让模型在训练时进行参数更新。
启发式法一般是采用规则、正则化模板的方法自动构建出相应的Pattern,或者直接通过启发式搜索的方法获得Pattern。 这一类方法在程序设计时只需要编写规则和少量的模板即可快速的获得Pattern。
给定一个具体的任务(例如分类任务),可以实现定义若干个模板(例如正则化工具),然后根据具体的句子内容,向模板中填充相关实体,以贴合句子实际的描述。例如清华大学刘知远团队提出的PTR(PTR: Prompt Tuning with Rules for Text Classification)利用启发式的规则定义若干子模板(sub-prompt),并通过若干子模板的组合来形成最终的Pattern。
因此不论给定哪个句子,模板不会完全固定不变,而是根据不同的实体而相应改变模板的字符序列。
PTR的详细解读请参考博主的论文解读:论文解读:PTR: Prompt Tuning with Rules fo Text Classification
相比之下,AutoPrompt则是另一种典型的方法,其由加州大学提出《AutoPrompt: Eliciting Knowledge from Language Models with Automatically Generated Prompts》(EMNLP2021),如下图所示,给定原始的输入,额外定义若干离散的字符作为trigger,并组成Template,喂入MLM中预测对应label word的概率。而这些trigger最终通过梯度搜索的方法进行挑选。
基于规则的方法构建的模板虽然简单,但是这些模板都是“一个模子刻出来的”,在语义上其实挺难做到与句子贴合。因此一种策略就是直接让模型来生成合适的模板,因为文本生成本质上就是去理解原始文本的语义,并获得在语义上较为相关的文本。这样不论给定什么句子,我们可以得到在语义层面上更加贴合的模板。陈丹琦团队提出LM-BFF则作为该类方法的典范,其出自于《Making Pre-trained Language Models Better Few-shot Learners》(ACL2021)。LM-BFF提出了基于生成的方法来构建Pattern,而给定相应的Pattern之后,再通过搜索的方法得到相应的Verbalizer。如下图所示:
首先定义一个Template的母版(有点类似于PTR中的含有占位符的子模板),将这些母版与原始文本拼接后喂入T5模型(T5模型属于自回归式的生成模型)后在<X>和<Y>占位符部分生成相应的字符,最终形成对应的Template。然后再基于生成的Template和label word进行训练。
通过多个任务的小样本场景测试(分类任务,每个类只有16个样本),整体观察可发现这种基于生成的方法明显比人工构建的效果更好,如图所示:
LM-BFF的详细内容请参考博主的论文解读:论文解读:Making Pre-trained Language Models Better Few-shot Learners(LM-BFF)。
不论是启发式方法,还是通过生成的方法,都需要为每一个任务单独设计对应的模板,因为这些模板都是可读的离散的token(这类模板我们称作Discrete Prompt或Hard Prompt。),这导致很难寻找到最佳的模板。另外,即便是同一个任务,不同的句子也会有其所谓最佳的模板,而且有时候,即便是人类理解的相似的模板,也会对模型预测结果产生很大差异。离散的模板存在方差大、不稳定等问题。
为避免上述问题,一种新的 “连续提示” 被提出,称作Continuous Prompt或Soft Prompt,其将模板转换为可以进行优化的连续向量,换句话说,我们不需要显式地指定这些模板中各个token具体是什么,而只需要在语义空间中表示一个向量即可,这样,不同的任务、数据可以自适应地在语义空间中寻找若干合适的向量,来代表模板中的每一个词,相较于显式的token,这类token称为 伪标记(Pseudo Token)。下面给出基于连续提示的模板定义:
3-3-3-1 Prompt Tuning
该方法率先提出了伪标记和连续提示的概念,以让模型在能过动态地对模板在语义空间内进行调整,使得模板是可约的(differentiate)。形式化的描述如下:
每个伪标记的初始化可以有下列几种情况:
1.最简单的是随机初始化:即随机初始化一个面向所有伪标记的embedding table,可采用正态分布或者均匀分布等;
2. 每个token使用预训练模型已有的embedding table进行初始化,此时,每一个伪标记先随机指定词表中的一个词,并取对应词的embedding作为这个伪标记的初始化;
3. 在分类任务上,使用label word(verbalizer)对应的embedding作为初始化,可以有效限制模型输出的是预设的输出类对应的word。
因此,在训练过程中,每个伪标记以及对应的MLP参数都可以得到训练,对于不同的输入句子x,这些伪标记对应的embedding也各不相同,达到了预期的目的。
3-3-3-2 P-tuning
P-tuning是另一个具有代表性的连续提示方法,方法图如下所示(图中的 [pi]等价于上文的 [vi] 表示伪标记)。
其在Prompt Tuning方法上主要做出三个改进:
1.考虑到这些伪标记的相互依赖关系:认为 [v1]与[v2]是有先后关系的,而transformer无法显式地刻画这层关系,因此引入Prompt Encoder,实际过程中采用一层RNN;
2.指定上下文词:如果模板全部是伪标记,在训练时无法很好地控制这些模板朝着与对应句子相似的语义上优化,因此选定部分具有与当前句子语义代表性的一些词作为一些伪标记的初始化(例如上图中“capital”、“Britain”等);
3.重参数(Reparameterization):具体到代码实现上,P-tuning先通过一个Prompt Encoder表征这些伪标记后,直接将这些新的表征覆盖到对应的embedding table上,换句话说,Prompt Encoder只在训练时候会使用到,而在推理阶段则不再使用。
4.混合提示(Hydride Prompt):将连续提示与离散token进行混合,例如 [x] [it] [ v1 ] [ mask]。
P-tuning的详细内容请参考博主的论文解读:论文解读:GPT Understands, Too。
3-3-3-3 PPT(Pre-trained Prompt Tuning)
Prompt-Tuning通常适用于低资源场景,但是由于连续的模板是随机初始化的,即其存在新的参数,少量样本可能依然很难确保这些模板被很好地优化。因此简单的方法就是对这些连续的模板进行预训练。PPT旨在通过先让这些连续提示在大量无标注的预训练语料进行预训练,然后将其加载到对应下游任务的PLM上进行训练,如下图所示(图中的P为连续的提示模板,<x> 表示为mask token):
1.首先在大量无标注语料上进行预训练,获得训练好的连续提示;
2.对下游任务(是非问答、NLI、文本匹配等),加载这些训练好的提示之后,进行微调,或者直接进行zero-shot预测。
3-3-3-4 小结
下图对几种template优化进行的对比。
我们为任务设计的模板都是建立在一个假设上:即模板都是尽可能是可读的,即满足人类语言的语法形态。然而最近也有工作认为,最优的模板可能是不符合语法的乱语 (Ungrammatical Gibberish Text),即人类可读的模板,模型也许不可读。虽然这很反直觉,但是我们不能否认这种情况的存在。论文《RLPROMPT: Optimizing Discrete Text Prompts with Reinforcement Learning》给出了相应的发现,并提出了一种基于强化学习的方法RLPROMPT来寻找最优的模板。
上图为RLPROMPT框架,左侧为策略网络,右侧分别为双向预训练模型(Masked LM)和生成式预训练模型(Left-to-Right LM),分别对应于分类任务和生成任务。RLPROMPT的原理如下:
Step1:给定一个句子(例如“I have …”),一个 [mask] token,以及一个用于待生成的模板占位符 [Prompt]。
Step2:如果是分类任务,则将输入句子喂入一个双向语言模型中获得 [mask] 位置的预测token,并通过verbalizer映射到对应类别的概率分布,如果是在训练阶段,真实标签是已知的,其概率可以作为当前模板的反馈(reward)。如果是生成任务,则喂入生成模型中,获得生成token的预测概率(或者其他文本生成的指标)并作为反馈。
Step3:根据当前的反馈,使用强化学习的policy gradient方法训练一个决策函数。基于这个决策函数可以对[Prompt]生成一个离散的模板词。决策函数本质上是一个预训练语言模型,通过LM head来生成一个token。
Step4:生成一个模板词之后,重复Step2~Step3,直到生成足够的模板词。
基于RLPROMPT,最终可以得到一些离散的模板,相比连续的提示更加有解释性。取几个常用的评测任务,对比不同方法生成的模板的区别:
除了Template以外,Verbalizer是直接关系到预测的结果是什么,不同的Verbalizer会对最终预测效果产生较大的影响,不同的任务会有不同的合适的label word。例如在电影评论任务中,positive类别的label word比较合适的是wonderful,而在美食点评任务中,positive比较合适的是testy。因此label word的选择也是Prompt-Tuning中关键的部分。如下图所示,以SST-2为例,相同的模板条件下,不同的label word对应的指标差异很大。
传统的方法是人工设计(Manual Design),即可以根据对每个任务的经验来人工指定这些label word。但是人工设计需要依赖大量的人力,且对于一些具有专业性的任务还需要依赖于专家,使得Prompt-Tuning的效率很低。为了缓解这个问题,一些工作开始研究如何根据不同的任务自动地选择合适的label word。受到Template的离散和连续两种类型优化的启示,Verbalizer也可以分为离散和连续两种类型。
3-4-1-1 KPT(Knowledgeable Prompt Tuning)
领域知识指导搜索离散的label word:《Knowledgeable Prompt-tuning:Incorporating Knowledge into Prompt Verbalizer for Text Classification》,代表方法为KPT。
KPT的详细内容请参考博主的论文解读:论文解读:Knowledgeable Prompt-tuning: Incorporation Knowledge into Prompt Verbalizer for Text Classification
针对不同的任务,都有其相应的领域知识,为了避免人工选择label word,该方法提出基于知识图谱增强的方法,如下图所示:
具体思路如下:
Step1:首先通过一些已有的字典工具,从词表中获得与给定label相关的词。如何建模这种相关性呢,该方法引入知识库,依赖于知识库中的三元组来衡量。例如SCIENCE在知识库中是一个实体,与该实体存在多挑关系的词可能有science、mathematics等等;
Step2:第一步可以获得大量的词,但是也容易引入噪声,因此需要进行提炼(Refine),可以设计一系列的启发式方法来度量每个词与label的相关度,最后获得指定数量的若干个合适的label word;
Step3:对于选定的label word,采用Verbalizaer集成的方法获得最终的预测结果。
3-4-2-1 ProtoVerb
回顾在Template的构建中,离散的模板是无法在训练过程中被优化的,从而引入了连续的模板。同理,离散label word也是只能在训练之前被指定,而在后续训练中无法被改变。因此,为了让label word也可以自适应的变化,提出连续的label word。
ProtoVerb巧妙的运用了原型网络(Prototypical Network)的思路,将每个类别的所有样本的表征的期望作为该类的原型向量,并使用该原型向量代替连续的label word。
如上图,以新闻分类为例,首先定义固定的模板“A [mask] news.”,并拼接到原始的输入句子上。喂入BERT模型中,获得 [mask] 位置的表征向量代表句子向量。在训练过程中的label是已知的,所以可以求得同一label对应所有句子向量的均值来表示这个label的表征(图中的五角星)。
在测试阶段,则只需要计算测试句子的表征与各个类别的原型向量的相似度,并取最大相似度对应的label作为预测结果。
通过这种连续的label word,基本避免了显式获取label word的过程,使得模型的训练一气呵成。相似的做法也在《PromptBERT: Improving BERT Sentence Embeddings with Prompts》中被提及。
简单来说,Prompt-Tuning的动机旨在解决目前传统Fine-tuning的两个痛点问题:
1.降低语义差异(Bridge the gap between Pre-training and Fine-tuning) :预训练任务主要以Masked Language Modeling(MLM)为主,而下游任务则重新引入新的训练参数,因此两个阶段的目标通常有较大差异。因此需要解决如何缩小Pre-training和Fine-tuning两个阶段目标差距过大的问题;
2.避免过拟合(Overfitting of the head) :由于在Fine-tuning阶段需要新引入额外的参数以适配相应的任务需要,因此在样本数量有限的情况容易发生过拟合,降低了模型的泛化能力。因此需要面对预训练语言模型的过拟合问题。
reference:
1.https://blog.csdn.net/qq_36426650/article/details/120607050
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。