一. 什么是 prompt
NLP 中, 一种用于 Language Model 的 Pretrained Task 范式. 中文直译为"提示".
- 前辈的特点是, 通过 引入多种任务构造辅助 loss, 让模型去适配这些任务. 流程是 “pre-train, fine-tune, and predict”.
- 而 prompt 的思路则与此相反, 将多种任务重新组织成完形填空的形式, 使其更接近于原始预训练任务(如 masked LM). 流程是 “pre-train, prompt, and predict”.
其优点是, 得到的模型更通用, 一个完全无监督训练的PLM可以被用来解决各种各样的下游任务.
历史演进
- 2017-2019, 研究者们的重心逐渐从传统 task-specific 的有监督模式转移到预训练上. 这是因为前者依赖大量的标注数据, 但很多时候是没有足够的数据的. 这个痛点促进了 pre-train 任务范式的诞生.
通过选取合适的prompt,我们可以控制模型预测输出,从而一个完全无监督训练的PLM可以被用来解决各种各样的下游任务。
二. 正式化的描述
先看一个例子
情感分析任务中, 输入 x 是一句文本, 输出 Y = {++, +, ~ , -, --}, 代表情感在 高兴/正向 的程度上逐渐递减.
那么具体一条样本就是:
x: I love this movie.
y: ++ (very positive)
通常按照多分类去建模.
有了 prompt 后
x’: I love this movie. Overall, it was a [Z] movie.
z: good
根据这个例子, 下面引入符号与概念.
Template
通过 prompt 函数将原始输入作转换
x
′
=
f
p
r
o
m
p
t
(
x
)
x' = f_{prompt}(x)
x′=fprompt(x). 而函数中会用到模板, 上例中的 template 就是:
[X] Overall, it was a [Z] movie.
- [X]: 表示原始输入 x 的占位符.
- [Z]: 模板中的一个 slot (槽位), 用于放入答案.
当 [Z] 被填充后, 就称为 filled prompt, 填充函数描述为 f fill ( x ′ , z ) f_{\text{fill}}(x',z) ffill(x′,z) .
Answer Search
我们先定义 z 的取值集合 Z = {“excellent”, “good”, “OK”, “bad”, “horrible”} 依次对应原始情感分类任务中的 Y = {++, +, ~ , -, --}.
Answer search 过程, 就是在集合 Z 中找出概率最高的
z
^
\hat z
z^.
z
^
=
search
z
∈
Z
P
(
f
fill
(
x
′
,
z
)
;
θ
)
\hat{\boldsymbol{z}}=\underset{\boldsymbol{z} \in \mathcal{Z}}{\operatorname{search}} P\left(f_{\text {fill }}\left(\boldsymbol{x}^{\prime}, \boldsymbol{z}\right) ; \theta\right)
z^=z∈ZsearchP(ffill (x′,z);θ)
Answer Mapping
对于原始数据集中的同一个 y, 有时会有多个 z 与之对应, 比如 { “excellent”, “fabulous”, “wonderful”) 都可以对应 y= “++” 这一档.
所以也有必要作映射.
适用不同任务的多种 prompt 方法
相关论文
有个整理业界相关论文的git仓库, 来自 清华nlp, 详见参考[3].
PET
较为经典的文章, 见参考[4].