乐趣区

关于深度学习:未闻Prompt名论文学习笔记

文章起源 | 恒源云社区(专一人工智能 / 深度学习 GPU 收费减速平台,官网体验网址:https://gpushare.com)

原文作者 | Mathor

原文地址 | https://gpushare.com/forum/to…

集体感觉 2021 年 NLP 最火的两个 idea,一个是比照学习(Contrastive Learning),另一个就是 Prompt

浅谈我对 Prompt 的了解

Prompt 说简略也简略,看了几篇论文以及博客后发现其实就是构建一个语言模版。然而细想起来又感觉简单,因为总感觉外面还有很多细节,因而本文就来从头梳理一下 Prompt(Prompt 很多中央会翻译成「范式」,然而「范式」这个词自身也不好了解,因而读者把他看作是「模板」即可)

明天我还与室友探讨预训练模型(例如 BERT)到底做了什么,我给出的答复是

预训练模型提供了一个十分好的初始化参数,这组参数在预训练任务上的体现十分好(预训练损失非常低),然而因为上游工作千奇百怪,咱们须要在这组参数的根底上进行 Fine-tune 以适应咱们的上游工作(使得上游工作的损失值非常低)

下面这段话其实隐含了目前做 NLP 工作的大抵流程,即 “Pre-train, Fine-tune”,而对咱们来说实际上大部分时候都是间接拿他人预训练好的模型做 Fine-tune,并没有 Pre-train 这一步

融入了 Prompt 的模式大抵能够演绎成 “Pre-train, Prompt, and Predict”,在该模式中,上游工作被从新调整成相似预训练任务的模式。例如,通常的预训练任务有 MLM(Masked Language Model),在文本情感分类工作中,对于 “I love this movie” 这句输出,能够在前面加上 Prompt:”the movie is ___”,组成如下这样一句话:

I love this movie, the movie is ___

而后让预训练模型用示意情感的答案(例如 “great”、”terrible” 等)做完形填空,最初再将该答案转换为情感分类的标签。这样一来,咱们就能够通过结构适合的「模板」,通过小样本数据集训练一个模型来解决各种各样的上游工作

留神,Prompt 设计的这种完形填空和 MLM 工作是有区别的,二者尽管都是都是词分类,然而候选集不同,MLM 的候选词是整个词库,不过如果是生成工作,那么 Prompt 和 MLM 的候选集就是一样的,都是整个词库

如何构建 Prompt

对于输出文本 \(x\),存在一个函数 \(f\)Prompt(x),将 \(x\) 转化成 \(x′\) 的模式,即

$$
x^{’}=f_{\text{Prompt}}(x)
$$

该函数通常会进行两步操作:

  1. 应用一个模板,模板通常为一段自然语言句子,并且该句子蕴含两个空地位:用于填输出 \(x\) 的地位 \([X]\)、用于生成答案文本 \(z\) 的地位 \([Z]\)
  2. 把输出 \(x\) 填到 \([X]\) 的地位

以前文提到的例子为例,在文本情感分类工作中,假如输出是

x = "I love this movie"

应用的模板是

[X]. Overall, it was a [Z] movie

那么失去的 \(x′\) 就应该是

I love this movie. Overall, it was a [Z] movie

在理论状况中,Prompt 来填充答案的地位个别在句中或句末。如果在句中,个别称这种 Prompt 为 Cloze Prompt;如果在句末,个别称这种 Prompt 为 Prefix Prompt。\([X]\) 和  \([Z]\) 的地位、数量以及应用模板句的不同,都有可能对后果造成影响,因而须要灵便调整

下面讲的都是简略的情感分类工作的 Prompt 设计,读者看到这里自然而然的会想到,其余 NLP 工作的 Prompt 如何设计呢?实际上刘鹏飞大神在他的论文中给咱们提供了一些参考

Text Generation 中摘要工作里有一个关键字 TL;DR,这其实是 Too Long; Don't Read 的缩写

Prompt 的抉择十分重要且艰难

有上述 Prompt 的根底后,咱们能够得悉 Prompt 的设计次要蕴含两局部:

  1. 模板 T:例如 [X]. Overall, It was [Z]
  2. 标签词映射:即  \([Z]\) 地位预测输入的词汇汇合与实在标签  \(y\) 形成的映射关系。例如,标签 positive 对应单词 great,标签 negative 对应单词 terrible

在基于 Prompt 的微调办法中,不同的模板和标签词对最终后果影响很大,下图是陈丹琦团队论文中的试验后果

从上图咱们能够看出两点:

  1. 应用雷同的「模板」,不同的「标签词」会产生不一样的成果。例如 great/terribel 和 cat/dog 这两组标签词的成果不一样,而且即使是雷同标签词,调换程序也会导致最终成果有所变动,例如 cat/dog 和 dot/cat
  2. 应用雷同「标签词」,对「模板」进行小改变(例如增删标点)也会出现不同的后果

Prompt 的设计

Prompt 大略能够从上面三个角度进行设计:

  • Prompt 的形态
  • 人工设计模板
  • 主动学习模板

Prompt 的形态

Prompt 的形态次要指的是 \([X]\) 和 \([Z]\) 的地位和数量。上文提到的 Cloze Prompt 与 Maksed Language Model 的训练形式十分相似,因而对于 MLM 工作来说,Cloze Prompt 更适合;对于生成工作或者应用自回归 LM 解决的工作,Prefix Prompt 更适合

人工设计模板

Prompt 的模板最开始是人工设计的,人工设计个别基于人类的自然语言常识,力求失去语义晦涩且高效的「模板」。例如,Petroni 等人在驰名的 LAMA 数据集中为常识探针工作人工设计了 Cloze Templates;Brown 等人为问答、翻译和探针等工作设计了 Prefix Templates。人工设计模板的长处是直观,但毛病是须要很多试验、教训以及语言专业知识。下图是 GPT Understands, Too 论文中的一个试验后果

能够看到不同的 Prompt 只有轻微的区别,有的甚至只是减少缩小一个词,然而最初的后果会差几十个点

主动学习模板

为了解决人工设计模板的毛病,许多研究员开始探索如何主动学习到适合的模板。主动学习的模板又能够分为离散(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,P-Tuning v2

离散 Prompts

简略说一下上述几种办法,首先是离散的 Prompt Mining,这篇文章发表在 TACL 2020,讲的是如何拿预训练语言模型当作「知识库」应用,并且引入了依存树和 Paraphrase(转述)等办法来开掘更好的「模板」,下图是试验后果

能够看到,被开掘进去的若干「连贯谓词」相比于人工设计的「模板」后果晋升还是很显著的

有很多种办法能够实现 Prompt Paraphrsing,例如「回译」,咱们通过 DeepL 翻译看个例子:


这样咱们就失去了 x shares a border with y 的一个 Prompt Paraphrasing:x and y share a boundary

论文 BARTScore 罗唆给咱们提供了一张表,外面有各种词组的同义替换,这个我再相熟不过了,因为以前英语考试我也背过相似的货色

Gradient-based Search(基于梯度的搜寻)是由论文 AUTOPROMPT 提出的,这篇文章发表在 EMNLP 2020,它的次要思维用上面这张图就能够示意

上图中,a real joy 是原始的输出句子 \(xinp\),红色的 Trigger tokens 是由 \(x\)inp「激发」的相干词汇汇合 \(x\)trig,依据 Template \(λ\) 的配置,将 \(x\)trig 和 \(x\)inp 组合起来结构最终的输出 \(x\)prompt,送入 Masked LM 预测情感标签。上面的表格减少了很多 NLP 其余工作的例子

对于如何生成 \(x\)trig 汇合,实际上次要应用的是 HotFlip 和反抗训练的思维,感兴趣的同学能够看原论文以及 HotFlip: White-box adversarial examples for text classification、Universal Adversarial Triggers for Attacking and Analyzing NLP 这两篇论文

Prompt Generation 是陈丹琦团队的一项工作,次要是把 Seq2Seq 预训练模型 T5 利用到模板搜寻的过程。T5 基于多种无监督指标进行预训练,其中最无效的一个无监督指标就是:利用 \(<X>\) 或 \(< Y >\) 替换一个或多个间断 span,而后生成对应输入。例如:

Thank you <X> me to your party <Y> week

T5 会在 <X> 生成 for inviting,在 \(<Y>\) 生成 last。很显然,T5 这种形式很适宜生成模板,而且不须要指定模板的 token 数。具体来说,有三种可能的生成形式

<\(S_1\)> →<\({X}\)> \({M}(y)\) <\({Y}\)> <\(S_1\)>

<\(S_1\)> → <\(S_1\)><\({X}\)>\({M}(y)\) <\({Y}\)>

<\(S_1\)> <\(S_2\)>→ <\(S_1\)> <\({X}\)> \({M}(y)\) <\({Y}\)> <\(S_2\)>

具体的模板生成过程如下图所示:

首先在标签词前后增加填充位 \(<X>\) 和 \(< Y>\)(下面提到的三种生成形式),而后将其送入 T5 模型中,T5 会主动在填充位生成序列,最初将标签词(great 或 terribel)转换为 [MASK] 标签,造成多个模板。具体过程中采纳 Beam Search 的办法生成多个候选模板,而后对每一个候选模板利用 dev 集进行微调,抉择其中一个最佳模板

我还想说一下这篇论文中另外一个有意思的点,最初送入模型进行预测的句子还拼接上了每品种别的「示例」(Demonstration),如下图所示

这种 Prompt 的设计有点像是在做语义类似度工作,\(X\) 为原始 Input 句子,已知 \(Y\) 为正例,\(Z\) 为负例,结构了如下模式的输出:

 X 是 [MASK] 例?Y 为正例;Z 为负例

这有点像是编程语言中的三目运算符,或者说相当于让模型比拟 \(X\) 与 \(Y\)、\(Z\) 的语义类似度。这里咱们自然而然会想问:\(Y\)、\(Z\) 是如何筛选进去的?实际上是根据上面两条规定:

  1. 对于每个原始输出句子,从每个类别中随机采样一个样本「示例」拼接到 Prompt 中
  2. 对于每个原始输出句子,在每个类别中,通过与 Sentence-BERT 进行类似度计算,从类似度最高的前 50% 样本中随机抉择一个样本「示例」

间断 Prompts

结构 Prompt 的初衷是可能找到一个适合的办法,让 Pre-trained Language Model(PLM)更好地输入咱们想要的后果,但其实并不一定要将 Prompt 的模式设计成人类能够了解的自然语言,只有机器了解就行了。因而,还有一些办法摸索连续型 Prompts—— 间接作用到模型的 Embedding 空间。连续型 Prompts 去掉了两个约束条件:

  1. 模版中词语的 Embedding 能够是整个自然语言的 Embedding,不再只是无限的一些 Embedding
  2. 模版的参数不再间接取 PLM 的参数,而是有本人独立的参数,能够通过上游工作的训练数据进行调整

Prefix Tuning 最开始由 Li 等人提出,这是一种在输出句子前增加一组连续型向量的办法,该办法放弃 PLM 的参数不动,仅训练前缀(Prefix)向量。Prefix Tuning 的提出次要是为了做生成工作,因而它依据不同的模型构造定义了不同的 Prompt 拼接形式,在 GPT 类的 Auto-Regressive(自回归)模型上采纳的是 \([Prefix;x;y]\) 的形式,在 T5 类的 Encoder-Decoder 模型上采纳的是 \([Prefix;x;Prefix\)′\(;y]\) 的形式

输出局部 \(Prefix,x,y\) 的 Position id 别离记作 \(Pidx,Xidx,Yidx\)。Prefix Tuning 初始化一个可训练的矩阵,记作 \(P\)θ\(∈R\)|Pidx|×dim⁡(hi),其中

上述公式的含意是,索引 \(i\) 如果属于前缀的局部,则从 \(Pθ\) 中抽取向量;\(i\) 如果不是前缀局部,则由 参数固定的预训练模型 生成对应的向量。训练指标为:

$$
\mathop{\text{max}}\limits_{\phi} \ \log p_{\phi}(y\mid x) = \sum\limits_{i\in \text{Y}{\text{idx}}} \log p{\phi} (z_i\mid h_{<i})
$$

\(P\)θ 实质上是一个矩阵,而生成一个矩阵的办法又很多,能够用 nn.Embedding(),或者 nn.Linear()

同样是在间断空间上搜寻 Prompt,OptiPrompt 构建的「模板」并不局限于前缀,也能够在句子的两头

首先依据 AutoPrompt 定义一个 Prompt 模板:

$$
[x]\ [v]_1\ [v]_2\ …\ [v]_m\ [\text{MASK}]
$$

其中 \([v]i\) 为一个连续型向量(与 BERT 的输出维度统一)。OptiPrompt 还思考以人工构建的离散 Prompt 作为终点,在间断空间上进行搜寻以构建较优的 Prompt。例如 \([x] is [MASK] citizen\) 能够转换为

$$
[x]\ [v]_1\ [\text{MASK}]\ [v]_2
$$

将 is 和 citizen 对应的 input Embedding 作为 \([v]1\) 和 \([v]2\) 的初始化

Hard-Soft Prompt Hybrid Tuning 办法能够说是人工设计和主动学习的联合,它通常不单纯应用可学习的 Prompt 模板,而是在人工设计的模板中插入一些可学习的 Embedding。实际上有了下面的根底咱们都晓得,间断的 Prompt 要比离散的 Prompt 好一点,然而在此基础上还有什么改良的余地吗?Liu 等人提出的 P-Tuning 解决了 Prompt token 之间的关联性问题

之前间断的 Prompt 生成形式无非都是训练一个矩阵,而后通过索引出矩阵的某几行向量拼起来。坦率地说,咱们心愿这些 prompt token Embedding 之间有一个比拟好的关联性,而不是独立地学习,为了解决这个问题,P-Tuning 引入了一个 Prompt Encoder(如下图 b 所示)

上图 a 是传统的离散型 Prompt,咱们把生成离散 Prompt token 的货色叫做 Prompt Generator;上图 b 首先传入一些 Virtual(Pseudo)token,例如 BERT 词表中的 [unused1],[unused2],… 当然,这里的 token 数目是一个超参数,插入的地位也能够调整。将这些 Pseudo token 通过一个 Prompt Encoder 失去间断的向量 \(h0,…,hm\),其中

即,Prompt Encoder 是由 BiLSTM+MLP 组成的一个简单网络。作者还发现退出一些 anchor token(畛域或者工作相干的 token)能够有助于 Template 的优化。例如文本蕴含工作,输出是前提和假如,判断是否蕴含。一个间断的模版是

$$
\text{[PRE]} [\text{continuous tokens}][\text{HYP}][\text{continuous tokens}] [\text{MASK}]
$$

在其中退出一个 anchor token:[?]成果会更好,此时模板变成

$$
\text{[PRE]} [\text{continuous tokens}][\text{HYP}]?[\text{continuous tokens}] [\text{MASK}]
$$

大家可能想问,如何优化 P-tuning?实际上依据标注数据量的多少,分两种状况探讨

  1. 标注数据比拟少。这种状况,咱们固定 PLM 的参数,只优化 \([P0]∼[Pm]\) 这几个 token 的 Embedding。换句话说,咱们只是要更新 Prompt Encoder 的参数
  2. 标注数据很短缺。这种状况间接放开所有参数微调

就在 P-Tuning 办法提出不久后,Liu 等人又提出了 P-Tuning v2,次要解决 P-Tuning 的两个问题:

  1. 当预训练模型的参数量低于 100 亿(10B)时,Prompt tuning 会比传统的 Fine-tuning 差
  2. 诸如序列标注这样对推理和了解要求高的工作,prompt tuning 成果会变差

Liu 等人认为先前的 P-Tuning 只用了一层 BiLSTM 来编码 Pseudo token,这是其推理能力有余的起因之一,因而 v2 版本提出 Deep Prompt Tuning,用 Prefix Tuning 中的深层模型替换 BiLSTM,如下图所示

P-Tuning v2 相比于 P-Tuning,区别在于:

  • 勾销 Reparameterization:以前的办法利用重参数化性能来进步训练速度和鲁棒性(例如,用于 Prefix-Tuning 的 MLP 和用于 P-Tuning 的 LSTM)。在 P-Tuning v2 中,作者发现重参数化的改良很小,尤其是对于较小的模型,同时还会影响模型的体现
  • Multi-task Learning:Deep Prompt Tuning 的优化难题能够通过减少额定的工作数据或者无标注数据来缓解,同时可微调的 Prefix Continuous Prompt 也能够用来做跨工作的常识共享。例如在 NER 中,能够同时训练多个数据集,不同数据集应用不同的顶层 Classifier,然而 Prefix Continuous Prompt 是共享的
  • 勾销 verbalizer:v2 勾销了标签映射,齐全变为生成模型,能够在 [CLS] 局部输入句子级别的标签(Sentence-level label),也能够在每个 token 地位输入 token 级别的标签(Token-level label),间接输入实在标签

对于 P-Tuning 还有一些碎碎念,次要是从各个博客上看到的,汇总在这里。首先是 v1 版本的 LSTM,实际上引入 LSTM 目标是为了帮忙「模板」生成的 token(某种程度上)更贴近自然语言,或者说 token 之间的语义更晦涩,但更天然的办法应该是在训练上游工作的时候,不仅预测上游工作的指标 token(例如 “great”、”terrible”),还应该同时做其余 token 的预测

比方,如果是 MLM 模型,那么也随机 MASK 掉其它的一些 token 来预测,如果是 LM 模型,则预测残缺的序列,而不单单是指标词。这样做的理由是:因为咱们的 MLM/LM 都是通过自然语言预训练的,所以咱们认为它可能很好的实现序列的重构,即使一开始不能,随着迭代轮数的减少,模型也能很好实现这项工作。所以这实质上是让模型进行「负重训练」

* 为什么要引入 Prompt?

在规范的 Fine-tune 过程中(如上图 b 所示),新引入的参数量可能会很大(独立于原始预训练模型外的参数),例如基于 RoBERTa-large 的二分类工作会新引入 2048 个参数(nn.Linear(1024, 2)),如果你仅有例如 64 个标注数据这样的小样本数据集,微调会十分艰难

为解决这一问题,Prompt 应运而生(如上图 a 所示),间接将上游工作转换为输入空间无限的 MLM 工作。值得注意的是:上述办法在预训练参数的根底上进行微调,并且没有引入任何新参数,同时还缩小了微调和预训练任务之间的差距。总的来说,这能够更无效地用于小样本场景

Prompt 的挑战与瞻望

只管 Prompt 钻研搞得热火朝天,但目前仍存在许多问题值得研究者们去探索

  1. 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,比方种族歧视、性别对抗等。这兴许会是一个值得钻研的方向

One More Thing

最初我还想提一个理论 Code 过程中存在的问题。咱们晓得 MLM 工作会输入句子中 [MASK] 地位最有可能的词,而 Prompt 也相似的,例如上面的例子

这是一条__新闻。中国足球出线的可能性只有 0.001%,留给中国队的工夫不多了

这是一个新闻分类问题,实在标签有 “ 体育 ”、” 财经 ”、” 娱乐 ” 等,下面的样本很显著是一条体育新闻,因而咱们心愿模型对 [MASK] 局部输入 “ 体育 ”,但事实真的如此吗?理论状况模型的输入可能是 “ 足球 ”,但你认为模型预测的 “ 足球 ” 有问题吗?如同也没啥故障,因而这就引申出了 Prompt 的一个问题,是否应该限度模型的输入空间?

还是下面新闻分类的例子,咱们是否应该限度模型输入的空间,让他固定只能预测 “ 体育 ”、” 财经 ”、” 娱乐 ” 这几个标签?或者咱们罗唆把这几个标签换成索引,那就是让模型从 0,1,2 这三个数字选一个。Wait Wait Wait,如果这么做的话,和 Fine-Tune 有什么区别,Fine-Tune 也是把标签转换成索引,让模型看了句子之后,从这几个索引当选一个作为预测值

这么说的话,那咱们就不应该限度模型的输入空间,可是这样的话 [MASK] 地位的输入就限度的太死了,必须肯定是 “good”、” 财经 ” 才算对,如果输入 “nice”、” 财政 ” 就算错。实际上输入近义词或者类似词,在零样本的状况下会经常出现,然而如果你用一些有标签的样本去训练,模型本人就会缓缓固定输入空间。例如 “ 财经 ”,它不会预测成 “ 财政 ”,只会预测成其它类型的新闻,例如 “ 体育 ”

References

  • P-tuning:主动构建模版,开释语言模型潜能
  • 必须要 GPT3 吗?不,BERT 的 MLM 模型也能小样本学习
  • NLP 新宠 —— 浅谈 Prompt 的前世今生
  • 超大规模新型预训练模型详解:少样本学习等近十个数据集获得第一
  • GPT-3 的最强落地形式?陈丹琦提出小样本微调框架 LM-BFF,比一般微调晋升 11%~
  • 基于 Prompt 的 MLM 文本分类
  • Prompt-based Language Models:模版加强语言模型小结
  • 鹏飞大神的 Pre-train, Prompt, and Predict
  • P-tuning:用“间断提醒微调”来加强“超大规模语言模型”的上游能力
  • Prompting: Better Ways of Using Language Models for NLP Tasks
  • Prompt Based Task Reformulation in NLP 调研
  • PromptPapers
退出移动版