1-范式发展历程:
- P1. 非神经网络时代的完全监督学习 (Fully Supervised Learning, Non-Neural Network)--特征工程
- P2. 基于神经网络的完全监督学习 (Fully Supervised Learning, Neural Network)--架构工程
- P3. 预训练,精调范式 (Pre-train, Fine-tune)--目标工程
- P4. 预训练,提示,预测范式(Pre-train, Prompt, Predict)--prompt挖掘工程
从 2017-2019 年开始,NLP 模型发生了翻天覆地的变化,这种全监督范式发挥的作用越来越小。具体而言,研究重点开始转向预训练、微调范式。在这一范式下,一个具有固定架构的模型通过预训练作为语言模型(LM),用来预测观测到的文本数据的概率。由于训练 LM 所需的原始文本数据需要足够丰富,因此,这些 LM 都是在比较大的数据集上训练完成。之后,通过引入额外的参数,并使用特定任务的目标函数对模型进行微调,将预训练 LM 适应于不同的下游任务。在这种范式下,研究重点转向了目标工程,设计在预训练和微调阶段使用的训练目标(损失函数)。
「预训练、微调」过程被称为「预训练、prompt 和预测」的过程所取代。在这种范式中,不是通过目标工程使预训练的语言模型(LM)适应下游任务,而是重新形式化(Reformulate)下游任务,使其看起来更像是在文本 prompt 的帮助下在原始 LM 训练期间解决的任务。通过这种方式,选择适当的 prompt,该方法可以操纵模型的行为,以便预训练的 LM 本身可以用于预测所需的输出,有时甚至无需任何额外的特定任务训练。这种方法的优点是给定一组合适的 prompt,以完全无监督的方式训练的单个 LM 就能够用于解决大量任务。然而该方法也存在一个问题——这种方法引入了 prompt 挖掘工程的必要性,即需要找出最合适的 prompt 来让 LM 解决面临的任务。
不同范式之间存在一定的规律
1.1-每个范式都会涉及繁琐的,需要人来参与(提供先验)的工程(engineering)
- 特征工程:研究者要进行无聊的特征模版定义环节---不就是我们的pattern
- 结构工程:神经网络虽然解放手动配置特征模板所需要的人力,但是是以需要人工去设计合适网络结构为代价的。因此,在这样的研究范式下,研究人员花了很多时间在探究最适配下游任务的结构偏置(Structural Bias)。比如是使用Rnn、Transformer。
- 目标函数挖掘:这个过程研究者往往是通过引入额外的目标函数到预训练语言模型上,以便让其更适配下游任务。这个过程有时候也需要些网络结构的挖掘,但相比较而言,不是这个范式的主旋律,一个实际的原因在于:(1)预训练过程本身费时,过度的结构偏置(structural bias)探索开销过大;(2)精调的过程中,很多时候 预训练语言模型本身提供的知识已经可以让大家“忘记”使用卷积神经网络和循环神经网络的差异。
- Prompt挖掘工程:在这个过程我们往往不对预训练语言模型改动太多,我们希望是通过对合适prompt的利用将下游任务建模的方式重新定义。
1.2-新范式带来的收益可以让我们暂时忽略那些额外需要的人力代价
- P1-P2:总是吐槽神经网络调参就是炼丹,但是享受着不用人工配置模版,就能收获还不错甚至更好的结果
- P2-P3:研究哪一种损失函数效果更好总比排列组合网络结构看起来更好
- P3-P4:prompt learning激活了类似于小样本学习等场景
2-什么是Prompting Learning:
在传统的用于 NLP 任务的监督学习系统中,输入 x 通常是文本数据,并基于模型 P(y|x; θ) 预测输出 y。但是,监督学习面临的一个主要问题是,即为了训练模型 P(y|x; θ),必须要有用于训练任务的监督数据,但找到这种适用数据是比较困难的。
在 NLP 中,基于 Prompt 的学习方法试图通过学习 LM 来规避这一问题,该 LM 对文本 x 本身的概率 P(x; θ) 进行建模并使用该概率来预测 y,从而减少或消除了训练模型对大型监督数据集的需求。
举个case-分类任务:
输入:我喜欢这个电影
输出:“正面" 或者 "负面"
而如果用Prompt Learning去解决的话,任务可以变成“完形填空",
输入:我喜欢这个电影,整体上来看,这是一个 __ 的电影
输出:“有趣的" 或者 "无聊的"
说到底,就是为了迎合预训练模型而去重构我们的网络,这样做的一个前提是预训练语言模型的知识已经很丰富了
- Fine-tuning中:是预训练语言模型“迁就“各种下游任务。具体体现就是上面提到的通过引入各种辅助任务loss,将其添加到预训练模型中,然后继续pre-training,以便让其更加适配下游任务。总之,这个过程中,预训练语言模型做出了更多的牺牲。
- Prompting中:是各种下游任务“迁就“预训练语言模型。具体体现也是上面介绍的,我们需要对不同任务进行重构,使得它达到适配预训练语言模型的效果。总之,这个过程中,是下游任务做出了更多的牺牲。
3-other
prompt learning现在主要用于一些简单的任务,如分类,而如何应用在ner任务中是值得探索的,不过可以借鉴这篇2021文章--https://arxiv.org/pdf/2106.01760.pdf
下面会从预训练模型+提示工程+答案工程等多个方面详细介绍
4-预训练模型
4.1-预训练目标-Training Objectives
- Standard Language Model:自回归模式预测每个token的概率,如GPT\ELMO等。一个可替换的方式是denoising objectives,通过给输入x加入噪声预测原句x,有下面两种形式:
- Corrupted Text Reconstruction:计算输入句子中噪声部分的损失来重塑原句
- Full Text Reconstruction:计算整个句子的损失来重塑原句
不同训练目标对不同下游任务有不同的适应性,如从左到右的自回归形式适用于prefix prompt;噪声文本重建适用于cloze prompt;基于SLM和FTR的预训练适用于文本生成;像文本分类任务被适用于上述的所有
4.2-不同的噪声形式-noising functions
不同的噪声形式对算法会有不同的效果,对实体加噪声就会对下游实体识别任务效果更好。
Masking:用mask来代替token,mask实体可以增强实体识别的下游任务
Replacement:用相近词来代替原词,这样可以增强鲁棒性
Deletion:删除某个token,一般与FTR一起使用
Permutation:对text进行拆分,再随机排列组合
4.3-表示的方向性-directionality of representations
- Left-to-Righ:从左到右的模式,更加适合用在计算SLM或计算FTR的输出
- Bidirectional:每个token的描述受上下文的影响
- 把两种策略融合或以随机排列的方式对表示进行调节,尽管很少使用这种策略。当在网络中使用这些策略时,这种调节通常通过attention mask来实现,attention mask是来掩盖某些节点的值,使得在decoder预测y时不能看到之后的信息,与XLNET的mask形式相似。-- 相关博客--https://blog.csdn.net/yeziyezi210/article/details/103864518?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
4.4-四种经典预训练模式
- Left-to-Right Language Model:GPT-3、GPT-Neo
- Masked Language Models:Bert、ERNIE
- Prefix and Encoder-Decoder:对于文本生成任务如翻译和摘要提取,需要预训练模型能够编码输入x和生成输出y,以下两种结构使用fully-connected mask来encoder输入x,自回归来decode输出y
Prefix Language Model:共享编码与解码参数,同时采用CTR来更好的描述x,使用SLM来输出y,经典模 型有:UniLM、ERNIE-M
Encoder-decoder:编码和解码的参数不共享,其他都类似,经典模型有:T5、BART、MASS
5-提示工程-prompt engineering
5.1-prompt shape
- clozeprompts-完形填空,使用MLM模型、FTR模型
- prefixprompts-前缀提示,更适用于生成任务,使用自回归模型、FTR模型
5.2-人工提示工程-manual template engineering
基于人的直觉去产生提示模版。Brown人工生成一批前缀提示模版来处理多个任务,如问答,翻译;Schick使用预先定义好的模版解决分类和文本生成的小样本问题
5.3-automated template learning
可以解决人工模版的两个问题:1、对于一些复杂任务如语义分析来说,构造提示模版是一种艺术;2、即使是很有经验的行业专家也很难找到最优的提示模版。自动生成的模版又可以分为两种,一种是discrete prompt-离散提示,即字符串;另一种是continuous prompt-连续提示,即向量;后者显然更有难度但是更有优势,一是离散提示必须是自然语言空间的token,而连续提示不必;二是连续模版不必依赖预训练的参数,可以有自己单独的参数。
template可以分为两种:static-静态的,对每个输入都是相同的tempalte;dynamic-动态的,为每个输入产生一个template,显然动态的更好,但设计更复杂
5.3.1-discrete prompts
- prompt mining:使用包含训练数据x和y的语料库,找到x到y在预料中的中间词或依赖路径,那么这个词或依赖路径就可以作为模版,[X],middle words,[Z]
- prompt paraphrasing:构建一个seed prompt,通过回译、重写器、同义词替换去生成更多的prompt,选择指标最高的
- gradient-based search:基于梯度搜索以找到可以trigger预训练来生成所需目标的短序列
- prompt generation:当作一个文本生成任务,使用SLM。如使用T5为每个输出产生独有的template供下游使用
- prompt scoring:没看懂咋整的
5.3.2-continuous prompts:提示并不一定要满足人们的常规文本模式,可以使用语义表示
- Prefix Tuning:freeze 预训练模型参数,单纯调参前缀提示向量参数
- Tuning initialized with discrete promopts:使用离散提示进行辅助初始化调参
- Hard-soft prompt hybrid tuning:软硬模式混合调参
6-answer engineering
6.1-answer shape
tokens+span+sentence。tokens和span广泛应用于分类、关系提取和实体识别任务;sentence广泛应用于文本生成、问答任务
6.2-answer space design methods-z空间和y空间之间的映射
- manual design:unconstrained spaces + constrained spaces。前者一般使用identity mapping来进行两个空间的映射。
- discrete answer search:answer paraphrasing-初始化一个答案空间z,使用语义信息(如回译)扩展空间z。prune-then-search-对可信答案空间进行修剪,再来找到最后的空间z。label decomposition-对关系提取任务,分解关系到word,如per:city_of_death---{person,city,death},每个token的probability的sum作为answer的probability
- continuous answer search:几乎没有相关研究
7-multi-prompt learning
我们上面讨论了为输入构造单一的prompt,但是实践证明,为输入构建多重prompt会有更好的收益
prompt ensembling:可以使用均值、加权平均、投票等多种方案得到最后答案z
prompt augmentation:数据增强,影响因素有样例的选择及排序
prompt composition:数据合成,把两个pr进行合并
prompt decomposition:数据分解,实体识别中,把pr分解成多个
8-training strategies for prompting methods
上面介绍了如何构造prompt和answer mapping,有些任务可能是不需要训练的,如利用预训练的model直接进行预测,但是也有一些训练的方法,使模型向着正确方向优化。full-data-learning:使用大量样本进行训练;few shot learning:使用少量样本进行训练。
基于prompt的下游任务训练中,有两种参数:1-预训练模型参数;2-prompts参数。下表列举了参数更新的方法,主要基于:预训练参数是否不变+是否有额外的prompt参数+如果有额外的paompt参数,是否不变
- Promptless Fine-tuning:直接使用下游任务进行训练,不实用prompt,更新预训练参数;优点-简单,不需要设计prompt;缺点-小数据集上容易过拟合或者不稳定
- Tuning-free Prompting:基于prompt直接生成答案,无需调参。优点-简单高效;缺点-需要较重的prompt设计
- Fixed-LM Prompt Tuning:固定预训练参数,调整prompt参数,使下游任务更好作用于prompt的产生;优点-适合小样本学习;缺点-不适合零样本学习,prompt模版通常不再是人工设计的
- Fixed-Prompt LM Tunin:固定prompt参数,调整预训练参数
- Prompt+LM Fine-tuning:调整prompt参数,调整预训练参数。适合大数据集,小数据集易过拟合
9-applications
分类:X,the topic of the document is Z
自然语言推理:X,the relation of the sentences is Z
关系抽取:X,the relation of the entity1 and entity2 is Z
实体识别:X,the type of the entity1 is Z
常识推理:i want to drive my car to city,then i relaized i did not have a Z
文本生成:X,Z
除偏-debiasing:the following text contains violence,X,Z(Z = {yes,no})
数据集构建:write two sentences that mean the same thing,X,Z
10-相关结果
P-tuning在superGLUE数据集上取得了最优效果
-- SuperGLUE 包含的任务: WSD 是词义消岐、NLI 是自然语言推理、coref. 是共指消解、SC 是句子完成、QA 是问答,较之前的GLUE难度更高
思考点:
- NER:不像文本分类任务那样,ner需要预测每一个token或者span是否是一个实体;token label之间存在潜在的关系。相关工作很少,2021有人做了一种形式,“mike went to New York yerterday” --"mike went to New York yerterday, mike is a Z entity",Z的空间是{person,organization},这样的话运算量会很大,如果改成“Mike went to New York yerterday,Z is a person entity”;“Mike went to New York yerterday,Z is a organization entity”变成两个,但是句子中存在多个同一类型实体 就会漏掉
- CLS:
相关资料:论文prompt.pdf
知乎 prompt相关-https://zhuanlan.zhihu.com/p/395795968
-https://zhuanlan.zhihu.com/p/391606045
superGLUE数据集介绍-https://zhuanlan.zhihu.com/p/181706541