NLP新宠——浅谈Prompt的前世今生

NLP新宠——浅谈Prompt的前世今生

转自:NLP新宠——浅谈Prompt的前世今生

作者:闵映乾,中国人民大学信息学院硕士,目前研究方向为自然语言处理。

在这里插入图片描述

《Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing》

导读:本文的目标是对近期火爆异常的Prompt相关研究作一些追溯和展望,内容主要参考论文《Pre-train, Prompt, and Predict: A Systematic Survey of Prompting Methods in Natural Language Processing》,并掺杂了笔者的一些个人见解。另外,封面及文中使用的图片均截取自该论文,转载请注明出处。各位知乎er如果有什么问题都可以在评论区留言讨论,欢迎经常交流!

本文的内容框架:

一、Prompt的产生和兴起

二、什么是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刚刚出现的时候,还没有被叫做Prompt,是研究者们为了下游任务设计出来的一种输入形式或模板,它能够帮助PLM“回忆”起自己在预训练时“学习”到的东西,因此后来慢慢地被叫做Prompt了。

对于输入的文本 xxx,有函数 fprompt(x)f_{prompt}(x)fprompt(x),将 xxx 转化成 prompt 的形式 x′x′x,即:
x′=fprompt(x)x'=f_{prompt}(x) x=fprompt(x)
该函数通常会进行两步操作:

  1. 使用一个模板,模板通常为一段自然语言,并且包含有两个空位置:用于填输入 xxx 的位置 [X][X][X] 和用于生成答案文本 zzz 的位置 [Z][Z][Z].
  2. 把输入 xxx 填到 [X][X][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大致可以从下面三个角度进行设计:

  • Prompt的形状
  • 手工设计模板
  • 自动学习模板

Prompt的形状

Prompt 的形状主要指的是 [X][X][X][Z][Z][Z] 的位置和数量。上文提到cloze promptprefix prompt的区别,在实际应用过程中选择哪一种主要取决于任务的形式和模型的类别。cloze prompts 和 Masked Language Model 的训练方式非常类似,因此对于使用MLM的任务来说 cloze prompts 更加合适;对于生成任务来说,或者使用自回归LM解决的任务,prefix prompts就会更加合适;Full text reconstruction models 较为通用,因此两种 prompt 均适用。另外,对于文本对的分类,prompt 模板通常要给输入预留两个空,[X1][X_1][X1][X2][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

自动生成离散Prompts指的是自动生成由自然语言的词组成的 Prompt,因此其搜索空间是离散的。目前大致可以分成下面几个方法:

  1. Prompt Mining. 该方法需要一个大的文本库支持,例如 Wikipedia。给定输入 xxx 和输出 yyy,要找到 xxxyyy 之间的中间词或者依赖路径,然后选取出现频繁的中间词或依赖路径作为模板,即“ [X][X][X] middle words [Z][Z][Z] ”。
  2. Prompt Paraphrasing. Paraphrasing-based 方法是基于释义的,主要采用现有的种子 prompts (例如手动构造),并将其转述成一组其他候选 prompts,然后选择一个在目标任务上达到最好效果的。一般的做法有:将提示符翻译成另一种语言,然后再翻译回来;使用同义或近义短语来替换等。
  3. Gradient-based Search. 梯度下降搜索的方法是在单词候选集里选择词并组合成 prompt,利用梯度下降的方式不断尝试组合,从而达到让 PLM 生成需要的词的目的。
  4. Prompt Generation. 既然 Prompt 也是一段文本,那是否可以用文本生成的方式来生成 Prompt 呢?该类方法就是将标准的自然语言生成的模型用于生成prompts 了。例如,Gao 等人将 T5 引入了模板搜索的过程,让 T5 生成模板词;Ben-David 等人提出了一种域自适应算法,训练 T5 为每个输入生成一种唯一的域相关特征,然后把输入和特征连接起来组成模板再用到下游任务中。
  5. Prompt Scoring. Davison 等人在研究知识图谱补全任务的时候为三元组输入(头实体,关系,尾实体)设计了一种模板。首先人工制造一组模板候选,然后把相应的 [X][X][X][Z][Z][Z] 都填上成为 prompts,并使用一个双向 LM 给这些 prompts 打分,最后选取其中的高分 prompt。

连续Prompts

既然构造 Prompt 的初衷是能够找到一个合适的方法,让 PLM 更“听话”地得出我们想要的结果,那就不必把 prompt 的形式拘泥于人类可以理解的自然语言了,只要机器可以理解就好了。因此,还有一些方法探索连续型 prompts——直接作用到模型的 embedding 空间。连续型 prompts 去掉了两个约束条件:

  1. 模板中词语的 embedding 可以是整个自然语言的 embedding,不再只是有限的一些 embedding。
  2. 模板的参数不再直接取PLM的参数,而是有自己独立的参数,可以通过下游任务的训练数据进行调整。

目前的连续 prompts 方法大致可以分为下面几种:

  1. Prefix Tuning. Prefix Tuning 最开始由 Li 等人提出,是一种在输入前添加一串连续的向量的方法,该方法保持 PLM 的参数不动,仅训练合适的前缀(prefix)。它的形式化定义是,在给定一个可训练的前缀矩阵 MϕM_\phiMϕ 和一个固定的参数化为 θ\thetaθ 的 PLM 的对数似然目标上进行优化,即:
    max⁡ϕlog⁡P(y∣x;θ;ϕ)=max⁡ϕ∑yilog⁡P(yi∣h<i;θ,ϕ)\max_{\phi}\log P(\mathbf{y|x};\theta;\phi)=\max_\phi\sum_{y_i}\log P(y_i|h_{<i};\theta,\phi) ϕmaxlogP(y∣x;θ;ϕ)=ϕmaxyilogP(yih<i;θ,ϕ)
    其中 h<i=[h<i(1);…;h<i(n)]h_{<i}=[h_{<i}^{(1)};\dots;h_{<i}^{(n)}]h<i=[h<i(1);;h<i(n)] 指的是所有神经网络层在第 iii 个时间步的连接。如果对应的时间步在前缀​​中,即 hiisMϕ[i]h_i\ \ is\ \ M_{\phi}^{[i]}hi  is  Mϕ[i] . 则它可以直接从前缀矩阵中复制过来;否则需要使用 PLM 进行计算。
    类似地,Lester 等人在输入序列前面加上特殊的 token 来组成一个模板,然后直接调整这些 token 的 embedding。 和上面的 Prefix Tuning 的方法相比,他们的方法相对来说参数较少,因为没有在每一层网络中引入额外的参数。

  2. Tuing Initialized with Discrete Prompts. 这类方法中连续 prompts 是用已有的 prompts 初始化的,已有的 prompts 可以是手工设计的,也可以是之前搜索发现的离散 prompts。Zhong 等人先用一个离散 prompt 搜索方法定义了一个模板,然后基于该模板初始化虚拟的 token,最后微调这些 token 的embedding 以提高准确率。

  3. 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的挑战与展望

尽管Prompt相关研究搞得如火如荼,但目前仍存在许多问题,值得研究者们去探索。

  1. Prompt的设计问题。目前使用 Prompt 的工作大多集中于分类任务和生成任务,其它任务则较少,因为如何有效地将预训练任务和 prompt 联系起来还是一个值得探讨的问题。另外,模板和答案的联系也函待解决。模型的表现同时依赖于使用的模板和答案的转化,如何同时搜索或者学习出两者联合的最好效果仍然很具挑战性。
  2. Prompt的理论分析和可解释性。尽管 Prompt 方法在很多情况下都取得了成功,但是目前 prompt-based learning 的理论分析和保证还很少,使得人们很难了解 Prompt 为什么能达到好的效果,又为什么在自然语言中意义相近的 Prompt 有时效果却相差很大。
  3. Prompt在PLM debias方面的应用。由于 PLM 在预训练过程中见过了大量的人类世界的自然语言,所以很自然地受到了影响。拿一个简单的例子来说,可能不太恰当,比如说训练语料中有很多的 "The capital of China is “Beijing.”,导致模型认为下次看到 “capital” 的时候都会预测出 “Beijing”,而不是着重看到底是哪个国家的首都。在应用的过程中,Prompt 还暴露了 PLM 学习到的很多其它 bias,比如种族歧视、恐怖主义、性别对立等等。已有相关研究关注是否可以利用 Prompt 来对这些 bias 进行修正,但还处在比较初级的阶段,这也会是一个值得研究的方向。

五、引用

[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.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532383.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

requestfacade 这个是什么类?_Java 的大 Class 到底是什么?

作者在之前工作中&#xff0c;面试过很多求职者&#xff0c;发现有很多面试者对Java的 Class 搞不明白&#xff0c;理解的不到位&#xff0c;一知半解&#xff0c;一到用的时候&#xff0c;就不太会用。想写一篇关于Java Class 的文章&#xff0c;没有那么多专业名词&#xff0…

初学机器学习:直观解读KL散度的数学概念

初学机器学习&#xff1a;直观解读KL散度的数学概念 转自&#xff1a;初学机器学习&#xff1a;直观解读KL散度的数学概念 译自&#xff1a;https://towardsdatascience.com/light-on-math-machine-learning-intuitive-guide-to-understanding-kl-divergence-2b382ca2b2a8 解读…

MySQL应用安装_mysql安装和应用

1.下载mysql安装包2.安装mysql&#xff0c;自定义->修改路径3.配置mysql&#xff0c;选择自定义->server模式->500访问量->勾选控制台->设置gbk->设置密码和允许root用户远程登录等等。以管理员权限&#xff0c;在控制台输入&#xff1a;net start MySQL, 启…

mysql 商品规格表_商品规格分析

产品表每次更新商品都会变动的&#xff0c;ID不能用&#xff0c;可是购物车还是用了&#xff0c;这就导致每次保存商品&#xff0c;哪怕什么都没有改动&#xff0c;也会导致用户的购物车失效。~~~其实可以考虑不是每次更新商品就除所有的SKU&#xff0c;毕竟有时什么都没修改呢…

huggingface NLP工具包教程1:Transformers模型

huggingface NLP工具包教程1&#xff1a;Transformers模型 原文&#xff1a;TRANSFORMER MODELS 本课程会通过 Hugging Face 生态系统中的一些工具包&#xff0c;包括 Transformers&#xff0c; Datasets&#xff0c; Tokenizers&#xff0c; Accelerate 和 Hugging Face Hub。…

隐马尔可夫模型HMM推导

隐马尔可夫模型HMM推导 机器学习-白板推导系列(十四)-隐马尔可夫模型HMM&#xff08;Hidden Markov Model&#xff09; 课程笔记 背景介绍 介绍一下频率派和贝叶斯派两大流派发展出的建模方式。 频率派 频率派逐渐发展成了统计机器学习&#xff0c;该流派通常将任务建模为一…

使用randomaccessfile类将一个文本文件中的内容逆序输出_Java 中比较常用的知识点:I/O 总结...

Java中I/O操作主要是指使用Java进行输入&#xff0c;输出操作. Java所有的I/O机制都是基于数据流进行输入输出&#xff0c;这些数据流表示了字符或者字节数据的流动序列。数据流是一串连续不断的数据的集合&#xff0c;就象水管里的水流&#xff0c;在水管的一端一点一点地供水…

huggingface NLP工具包教程2:使用Transformers

huggingface NLP工具包教程2&#xff1a;使用Transformers 引言 Transformer 模型通常非常大&#xff0c;由于有数百万到数百亿个参数&#xff0c;训练和部署这些模型是一项复杂的任务。此外&#xff0c;由于几乎每天都有新模型发布&#xff0c;而且每个模型都有自己的实现&a…

mysql精讲_Mysql 索引精讲

开门见山&#xff0c;直接上图&#xff0c;下面的思维导图即是现在要讲的内容&#xff0c;可以先有个印象&#xff5e;常见索引类型(实现层面)索引种类(应用层面)聚簇索引与非聚簇索引覆盖索引最佳索引使用策略1.常见索引类型(实现层面)首先不谈Mysql怎么实现索引的,先马后炮一…

RT-Smart 官方 ARM 32 平台 musl gcc 工具链下载

前言 RT-Smart 的开发离不开 musl gcc 工具链&#xff0c;用于编译 RT-Smart 内核与用户态应用程序 RT-Smart musl gcc 工具链代码当前未开源&#xff0c;但可以下载到 RT-Thread 官方编译好的最新的 musl gcc 工具链 ARM 32位 平台 比如 RT-Smart 最好用的 ARM32 位 qemu 平…

OpenAI Whisper论文笔记

OpenAI Whisper论文笔记 OpenAI 收集了 68 万小时的有标签的语音数据&#xff0c;通过多任务、多语言的方式训练了一个 seq2seq &#xff08;语音到文本&#xff09;的 Transformer 模型&#xff0c;自动语音识别&#xff08;ASR&#xff09;能力达到商用水准。本文为李沐老师…

【经典简读】知识蒸馏(Knowledge Distillation) 经典之作

【经典简读】知识蒸馏(Knowledge Distillation) 经典之作 转自&#xff1a;【经典简读】知识蒸馏(Knowledge Distillation) 经典之作 作者&#xff1a;潘小小 知识蒸馏是一种模型压缩方法&#xff0c;是一种基于“教师-学生网络思想”的训练方法&#xff0c;由于其简单&#xf…

深度学习三大谜团:集成、知识蒸馏和自蒸馏

深度学习三大谜团&#xff1a;集成、知识蒸馏和自蒸馏 转自&#xff1a;https://mp.weixin.qq.com/s/DdgjJ-j6jHHleGtq8DlNSA 原文&#xff08;英&#xff09;&#xff1a;https://www.microsoft.com/en-us/research/blog/three-mysteries-in-deep-learning-ensemble-knowledge…

在墙上找垂直线_墙上如何快速找水平线

在装修房子的时候&#xff0c;墙面的面积一般都很大&#xff0c;所以在施工的时候要找准水平线很重要&#xff0c;那么一般施工人员是如何在墙上快速找水平线的呢&#xff1f;今天小编就来告诉大家几种找水平线的方法。一、如何快速找水平线1、用一根透明的软管&#xff0c;长度…

Vision Transformer(ViT)PyTorch代码全解析(附图解)

Vision Transformer&#xff08;ViT&#xff09;PyTorch代码全解析 最近CV领域的Vision Transformer将在NLP领域的Transormer结果借鉴过来&#xff0c;屠杀了各大CV榜单。本文将根据最原始的Vision Transformer论文&#xff0c;及其PyTorch实现&#xff0c;将整个ViT的代码做一…

Linux下的ELF文件、链接、加载与库(含大量图文解析及例程)

Linux下的ELF文件、链接、加载与库 链接是将将各种代码和数据片段收集并组合为一个单一文件的过程&#xff0c;这个文件可以被加载到内存并执行。链接可以执行与编译时&#xff0c;也就是在源代码被翻译成机器代码时&#xff1b;也可以执行于加载时&#xff0c;也就是被加载器加…

java 按钮 监听_Button的四种监听方式

Button按钮设置点击的四种监听方式注&#xff1a;加粗放大的都是改变的代码1.使用匿名内部类的形式进行设置使用匿名内部类的形式&#xff0c;直接将需要设置的onClickListener接口对象初始化&#xff0c;内部的onClick方法会在按钮被点击的时候执行第一个活动的java代码&#…

linux查看java虚拟机内存_深入理解java虚拟机(linux与jvm内存关系)

本文转载自美团技术团队发表的同名文章https://tech.meituan.com/linux-jvm-memory.html一, linux与进程内存模型要理解jvm最重要的一点是要知道jvm只是linux的一个进程,把jvm的视野放大,就能很好的理解JVM细分的一些概念下图给出了硬件系统进程三个层面内存之间的关系.从硬件上…

java function void_Java8中你可能不知道的一些地方之函数式接口实战

什么时候可以使用 Lambda&#xff1f;通常 Lambda 表达式是用在函数式接口上使用的。从 Java8 开始引入了函数式接口&#xff0c;其说明比较简单&#xff1a;函数式接口(Functional Interface)就是一个有且仅有一个抽象方法&#xff0c;但是可以有多个非抽象方法的接口。 java8…

java jvm内存地址_JVM--Java内存区域

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域&#xff0c;如图&#xff1a;1.程序计数器可以看作是当前线程所执行的字节码的行号指示器&#xff0c;通俗的讲就是用来指示执行哪条指令的。为了线程切换后能恢复到正确的执行位置Java多线程是…