赞
踩
NLP技术的发展可分为4个阶段/范式,如下图:
仅在目标任务的输入输出样本数据集上训练特定任务模型,其严重依赖特征工程。
使得特征学习与模型训练相结合,于是研究重点转向了架构工程,即通过设计一个网络架构(如CNN,RNN,Transformer)能够学习数据特征。
先在大数据集上预训练,再根据特定任务对模型进行微调,以适应于不同的下游任务。在这种范式下,研究重点转向了目标工程,设计在预训练和微调阶段使用的训练目标(损失函数)。
无需要fine-tune,让预训练模型直接适应下游任务。方便省事,不需要每个任务每套参数,突破数据约束。
近几年来,有关预训练语言模型(PLM)的研究比比皆是,自然语言处理(NLP)也借着这股春风获得了长足发展。尤其是在2017-2019年间,研究者们的重心逐渐从传统task-specific的有监督模式转移到预训练上。基于预训练语言模型的研究思路通常是“pre-train, fine-tune”,即将PLM应用到下游任务上,在预训练阶段和微调阶段根据下游任务设计训练对象并对PLM本体进行调整。
随着PLM体量的不断增大,对其进行fine-tune的硬件要求、数据需求和实际代价也在不断上涨。除此之外,丰富多样的下游任务也使得预训练和微调阶段的设计变得繁琐复杂,因此研究者们希望探索出更小巧轻量、更普适高效的方法,Prompt应运而生。
Prompt刚出现时是研究者们为了下游任务设计出来的一种输入形式或模板,用以帮助PLM“回忆”起在预训练时“学习”到的东西,因此后来慢慢地被叫做Prompt。
具体“Prompt”的做法是,将人为的规则给到预训练模型,使模型可以更好地理解人的指令的一项技术,以便更好地利用预训练模型。例如,在文本情感分类任务中,输入为"I love this movie.",希望输出的是"positive/negative"中的一个标签。那么可以设置一个Prompt,形如:“The movie is ___”,然后让模型用来表示情感状态的答案(label),如positive/negative,甚至更细粒度一些的“fantastic”、“boring”等,将空补全作为输出。
对于输入的文本x,有函数fprompt(x),将x转化成prompt的形式x’,即:
fprompt(x)函数通常会进行两步操作:
1)使用一个模板,模板通常为一段自然语言,并且包含有两个空位置:用于填输入x的位置[X]和用于生成答案文本z的位置[Z];
2)把输入x填到[X]的位置。
在实际的研究中,prompts应该有空位置来填充答案,这个位置一般在句中或者句末。如果在句中,一般称这种prompt为cloze prompt;如果在句末,一般称这种prompt为prefix prompt。[X]和[Z]的位置以及数量都可能对结果造成影响,因此可以根据需要灵活调整。
实际上,prompt 可以看做是对预训练语言模型中已经记忆的知识的一种检索方式,由于 prompt 任务形式就是预训练任务,所以相比于 fine-tuning,当使用 prompt 形式向模型中输入样本时,预测时得到了“提示”,因此所需使用到的信息量是更多的。因为要用到更多的信息量,所以样本的类别分布在 prompt 视角之下都是稀疏的,这应该也是 prompt 在 few-shot 上效果显著的原因。
prompting 更加依赖先验,而 fine-tuning 更加依赖后验:
Prompt的优点是给定一组合适的prompt,以完全无监督的方式训练的单个LM就能够用于解决大量任务。然而该方法也存在一个问题——这种方法引入了 prompt 挖掘工程的必要性,即需要找出最合适的 prompt 来让 LM 解决面临的任务,即怎么做Prompt Engineering。
Prompt参数量要小很多。如下图T5的两者对比图所示,Fine-tune模型的每个副本都需要110亿个参数;而Prompt每个任务只需要20480个参数——减少超过5个数量级。
Prompt的形状主要指的是[X]和[Z]的位置和数量。cloze prompt和prefix prompt的区别,在实际应用过程中选择哪一种主要取决于任务的形式和模型的类别。cloze prompts和Masked Language Model的训练方式非常类似,因此对于使用MLM的任务来说cloze prompts更加合适;对于生成任务来说,或者使用自回归LM解决的任务,prefix prompts就会更加合适;Full text reconstruction models较为通用,因此两种prompt均适用。另外,对于文本对的分类,prompt模板通常要给输入预留两个空,[X1]和[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. 是一种在输入前添加一串连续的向量的方法,该方法保持PLM的参数不动,仅训练合适的前缀(prefix)。它的形式化定义是,在给定一个可训练的前缀矩阵和一个固定的参数化为的PLM的对数似然目标上进行优化,即
Tuing Initialized with Discrete Prompts. 这类方法中连续prompts是用已有的prompts初始化的,已有的prompts可以是手工设计的,也可以是之前搜索发现的离散prompts。
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 。实验结果证明了该方法在关系分类任务中的有效性。
【综述论文】:https://arxiv.org/pdf/2107.13586.pdf
【知乎帖子】:https://zhuanlan.zhihu.com/p/399295895
【Prefix-Tuning】
paper:https://arxiv.org/abs/2101.00190
code:https://github.com/XiangLi1999/PrefixTuning
【P-tuning V1】
paper:https://arxiv.org/abs/2103.10385
code:https://github.com/THUDM/P-tuning
【P-Tuning v2】
paper:https://arxiv.org/abs/2110.07602
code:https://github.com/thudm/p-tuning-v2
【OpenPrompt】
document: https://thunlp.github.io/OpenPrompt/notes/installation.html#installation-from-github
code: https://github.com/thunlp/OpenPrompt
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。