转自:NLP新宠——浅谈Prompt的前世今生
作者:闵映乾,中国人民大学信息学院硕士,目前研究方向为自然语言处理。
导读:本文的目标是对近期火爆异常的Prompt相关研究作一些追溯和展望,内容主要参考论文《Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing》,并掺杂了笔者的一些个人见解。另外,封面及文中使用的图片均截取自该论文,转载请注明出处。各位知乎er如果有什么问题都可以在评论区留言讨论,欢迎经常交流!
本文的内容框架:
一、Prompt的产生和兴起
二、什么是Prompt
三、Prompt的设计方法
四、Prompt面临的挑战
近几年来,有关预训练语言模型(PLM)的研究比比皆是,自然语言处理(NLP)也借着这股春风获得了长足发展。尤其是在2017-2019年间,研究者们的重心逐渐从传统task-specific的有监督模式转移到预训练上。基于预训练语言模型的研究思路通常是**“pre-train, fine-tune”**,即将PLM应用到下游任务上,在预训练阶段和微调阶段根据下游任务设计训练对象并对PLM本体进行调整。
随着PLM体量的不断增大,对其进行fine-tune的硬件要求、数据需求和实际代价也在不断上涨。除此之外,丰富多样的下游任务也使得预训练和微调阶段的设计变得繁琐复杂,因此研究者们希望探索出更小巧轻量、更普适高效的方法,Prompt就是一个沿着此方向的尝试。
融入了Prompt的新模式大致可以归纳成”pre-train, prompt, and predict“,在该模式中,下游任务被重新调整成类似预训练任务的形式。例如,通常的预训练任务有Masked Language Model, 在文本情感分类任务中,对于 “I love this movie.” 这句输入,可以在后面加上prompt “The movie is ___” 这样的形式,然后让PLM用表示情感的答案填空如 “great”、“fantastic” 等等,最后再将该答案转化成情感分类的标签,这样以来,通过选取合适的prompt,我们可以控制模型预测输出,从而一个完全无监督训练的PLM可以被用来解决各种各样的下游任务。
因此,合适的prompt对于模型的效果至关重要。大量研究表明,prompt的微小差别,可能会造成效果的巨大差异。研究者们就如何设计prompt做出了各种各样的努力——自然语言背景知识的融合、自动生成prompt的搜索、不再拘泥于语言形式的prompt探索等等,笔者将会在第三节进行进一步讨论。
Prompt刚刚出现的时候,还没有被叫做Prompt,是研究者们为了下游任务设计出来的一种输入形式或模板,它能够帮助PLM“回忆”起自己在预训练时“学习”到的东西,因此后来慢慢地被叫做Prompt了。
对于输入的文本 x x x,有函数 f p r o m p t ( x ) f_{prompt}(x) fprompt(x),将 x x x 转化成 prompt 的形式 x ′ x′ x′,即:
x ′ = f p r o m p t ( x ) x'=f_{prompt}(x) x′=fprompt(x)
该函数通常会进行两步操作:
还用前文提到的例子。在文本情感分类的任务中,假设输入是 x = x= x= ‘I Love this movie.’,使用的模板是 " [ X ] [X] [X] Overall, it was a [ Z ] [Z] [Z] movie."。那么得到的 x ′ x′ x′ 就应该是 “I love this movie. Overall it was a [ Z ] [Z] [Z] movie.”
在实际的研究中,prompts应该有空位置来填充答案,这个位置一般在句中或者句末。如果在句中,一般称这种prompt为cloze prompt;如果在句末,一般称这种prompt为 prefix prompt。 [ X ] [X] [X] 和 [ Z ] [Z] [Z] 的位置以及数量都可能对结果造成影响,因此可以根据需要灵活调整。
另外,上面的例子中 prompts 都是有意义的自然语言,但实际上其形式并不一定要拘泥于自然语言。现有相关研究使用虚拟单词甚至直接使用向量作为 prompt ,笔者将会在第三节讲到。
下一步会进行答案搜索,顾名思义就是LM寻找填在[Z]处可以使得分数最高的文本 z ^ \hat{z} z^ 。最后是答案映射。有时LM填充的文本并非任务需要的最终形式,因此要将此文本映射到最终的输出 y ^ \hat{y} y^。例如,在文本情感分类任务中,“excellent”, “great”, “wonderful” 等词都对应一个种类 “++”,这时需要将词语映射到标签再输出。
Prompt大致可以从下面三个角度进行设计:
Prompt 的形状主要指的是 [ X ] [X] [X] 和 [ Z ] [Z] [Z] 的位置和数量。上文提到cloze prompt和prefix prompt的区别,在实际应用过程中选择哪一种主要取决于任务的形式和模型的类别。cloze prompts 和 Masked Language Model 的训练方式非常类似,因此对于使用MLM的任务来说 cloze prompts 更加合适;对于生成任务来说,或者使用自回归LM解决的任务,prefix prompts就会更加合适;Full text reconstruction models 较为通用,因此两种 prompt 均适用。另外,对于文本对的分类,prompt 模板通常要给输入预留两个空, [ X 1 ] [X_1] [X1] 和 [ X 2 ] [X_2] [X2]。
Prompt最开始就是从手工设计模板开始的。手工设计一般基于人类的自然语言知识,力求得到语义流畅且高效的模板。例如,Petroni等人在著名的LAMA数据集中为知识探针任务手工设计了cloze templates;Brown等人为问答、翻译和探针等任务设计了prefix templates。手工设计模板的好处是较为直观,但缺点是需要很多实验、经验以及语言专业知识,代价较大。
为了解决手工设计模板的缺点,许多研究开始探究如何自动学习到合适的模板。自动学习的模板又可以分为离散(Discrete Prompts)和连续(Continuous Prompts)两大类。离散的主要包括 Prompt Mining, Prompt Paraphrasing, Gradient-based Search, Prompt Generation 和 Prompt Scoring;连续的则主要包括Prefix Tuning, Tuning Initialized with Discrete Prompts 和 Hard-Soft Prompt Hybrid Tuning。
自动生成离散Prompts指的是自动生成由自然语言的词组成的 Prompt,因此其搜索空间是离散的。目前大致可以分成下面几个方法:
既然构造 Prompt 的初衷是能够找到一个合适的方法,让 PLM 更“听话”地得出我们想要的结果,那就不必把 prompt 的形式拘泥于人类可以理解的自然语言了,只要机器可以理解就好了。因此,还有一些方法探索连续型 prompts——直接作用到模型的 embedding 空间。连续型 prompts 去掉了两个约束条件:
目前的连续 prompts 方法大致可以分为下面几种:
Prefix Tuning. Prefix Tuning 最开始由 Li 等人提出,是一种在输入前添加一串连续的向量的方法,该方法保持 PLM 的参数不动,仅训练合适的前缀(prefix)。它的形式化定义是,在给定一个可训练的前缀矩阵 M ϕ M_\phi Mϕ 和一个固定的参数化为 θ \theta θ 的 PLM 的对数似然目标上进行优化,即:
max ϕ log P ( y ∣ x ; θ ; ϕ ) = max ϕ ∑ y i log P ( y i ∣ h < i ; θ , ϕ ) \max_{\phi}\log P(\mathbf{y|x};\theta;\phi)=\max_\phi\sum_{y_i}\log P(y_i|h_{ϕmaxlogP(y∣x;θ;ϕ)=ϕmaxyi∑logP(yi∣h<i;θ,ϕ)
其中 h < i = [ h < i ( 1 ) ; … ; h < i ( n ) ] h_{h<i=[h<i(1);…;h<i(n)] 指的是所有神经网络层在第 i i i 个时间步的连接。如果对应的时间步在前缀中,即 h i i s M ϕ [ i ] h_i\ \ is\ \ M_{\phi}^{[i]} hi is Mϕ[i] . 则它可以直接从前缀矩阵中复制过来;否则需要使用 PLM 进行计算。
类似地,Lester 等人在输入序列前面加上特殊的 token 来组成一个模板,然后直接调整这些 token 的 embedding。 和上面的 Prefix Tuning 的方法相比,他们的方法相对来说参数较少,因为没有在每一层网络中引入额外的参数。
Tuing Initialized with Discrete Prompts. 这类方法中连续 prompts 是用已有的 prompts 初始化的,已有的 prompts 可以是手工设计的,也可以是之前搜索发现的离散 prompts。Zhong 等人先用一个离散 prompt 搜索方法定义了一个模板,然后基于该模板初始化虚拟的 token,最后微调这些 token 的embedding 以提高准确率。
Hard-Soft Prompt Hybrid Tuning. 这类方法可以说是手工设计和自动学习的结合,它通常不单纯使用可学习的 prompt 模板,而是在手工设计的模板中插入一些可学习的 embedding。Liu 等人提出了“P-Tuning”方法,通过在 input embedding 中插入可训练的变量来学习连续的 prompts。并且,该方法使用 BiLSTM 的输出来表示 prompt embeddings,以便让 prompt tokens 之间有一定的交互。P-tuning 还引入了任务相关的 anchor tokens(例如关系提取中的“capital”)来进一步提高效果,这些 anchor tokens 不参与后续的调优。Han等人提出了 Prompt Tunning with Rules(PTR)方法,使用手工指定的子模板按照逻辑规则组装成完整的模板。为了增强生成的模板的表示能力,该方法还插入了几个虚拟 token,这些虚拟 token 的 embeddings 可以和 PLM 的参数一起被调整,PTR 的模板 token 既有实际 token 也有虚拟 token 。实验结果证明了该方法在关系分类任务中的有效性。
尽管Prompt相关研究搞得如火如荼,但目前仍存在许多问题,值得研究者们去探索。
[1] Liu P, Yuan W, Fu J, et al. Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing[J]. arXiv preprint arXiv:2107.13586, 2021.