Prompt-Tuning方法
1 NLP任务四种范式
目前学术界一般将NLP任务的发展分为四个阶段,即NLP四范式:
- 第一范式:基于「传统机器学习模型」的范式,如TF-IDF特征+朴素贝叶斯等机器算法;
- 第二范式:基于「深度学习模型」的范式,如word2vec特征+LSTM等深度学习算法,相比于第一范式,模型准确有所提高,特征工程的工作也有所减少;
- 第三范式:基于「预训练模型+fine-tuning」的范式,如Bert+fine-tuning的NLP任务,相比于第二范式,模型准确度显著提高,模型也随之变得更大,但小数据集就可训练出好模型;
- 第四范式:基于「预训练模型+Prompt+预测」的范式,如Bert+Prompt的范式相比于第三范式,模型训练所需的训练数据显著减少。
在整个NLP领域,整个发展历程是朝着精度更高、少监督,甚至无监督的方向发展的。而 Prompt-Tuning是目前学术界向这个方向进军最新也是最火的研究成果。
2 Fine-Tuning(微调)💥
Fine-Tuning属于一种迁移学习方式,在自然语言处理(NLP)中,Fine-Tuning是用于将预训练的语言模型适应于特定任务或领域。Fine-Tuning的基本思想是采用已经在大量文本上进行训练的预训练语言模型,然后在小规模的任务特定文本上继续训练它.
经典的Fine-Tuning方法包括将预训练模型与少量特定任务数据一起继续训练。在这个过程中,预训练模型的权重被更新,以更好地适应任务。所需的Fine-Tuning量取决于预训练语料库和任务特定语料库之间的相似性。如果两者相似,可能只需要少量的Fine-Tuning,如果两者不相似,则可能需要更多的Fine-Tuning.
但是,在大多数下游任务微调时,下游任务的目标和预训练的目标差距过大导致提升效果不明显(过拟合),微调过程中需要依赖大量的监督语料等等。至此,以GPT3、PET等为首的模型提出一种基于预训练语言模型的新的微调范式--Prompt-Tuning.该方法的目的是通过添加模板的方法来避免引入额外的参数,从而让模型可以在小样本(few-shot)或者零样本(zero-shot)场景下达到理想的效果。
Prompt-Tuning主要解决传统Fine-Tuning方式的两个痛点:
- 降低语义偏差:预训练任务主要以MLM为主,而下游任务则重新引入新的训练参数,因此两个阶段目标差异较大。因此需要解决Pre-Training和Fine-Tuning之间的Gap。
- 避免过拟合:由于Fine-Tuning阶段需要引入新的参数适配相应任务,因此在样本数量有限的情况下容易发生过拟合,降低模型泛化能力。因此需要解决预训练模型的过拟合能力。
3 Prompt-Tuning(提示微调)
3.1 什么是Prompt?💥
prompt顾名思义就是"提示"的意思,应该有人玩过你画我猜这个游戏吧,对方根据一个词语画一幅画,我们来猜他画的是什么,因为有太多灵魂画手了,画风清奇,或者你们没有心有灵犀,根本就不好猜啊!这时候屏幕上会出现一些提示词比如3个字,水果,那岂不是好猜一点了嘛,毕竟3个字的水果也不多呀。看到了吧,这就是prompt的魅力.
3.2 Prompt-Tuing定义💥
基于Fine-Tuning的方法是让预训练模型去迁就下游任务,而基于Prompt-Tuning的方法可以让下游任务去迁就预训练模型, 其目的是将Fine-tuning的下游任务目标转换为Pre-training的任务。那么具体如何工作呢?我们以一个二分类的情感分析为例子,进行简单理解:
- eg: 定一个句子
[CLS] I like the Disney films very much. [SEP]
- 传统的Fine-tuning方法: 将其通过BERT的Transformer获得
[CLS]
表征之后再喂入新增加的MLP分类器进行二分类,预测该句子是积极的(positive)还是消极的(negative),因此需要一定量的训练数据来训练。 - Prompt-Tuning执行步骤:
- 1.构建模板(Template Construction): 通过人工定义、自动搜索、文本生成等方法,生成与给定句子相关的一个含有
[MASK]
标记的模板。例如It was [MASK].
,并拼接到原始的文本中,获得Prompt-Tuning的输入:[CLS] I like the Disney films very much. [SEP] It was [MASK]. [SEP]
。将其喂入BERT模型中,并复用预训练好的MLM分类器(在huggingface中为BertForMaskedLM),即可直接得到[MASK]
预测的各个token的概率分布。 - 2.标签词映射(Label Word Verbalizer) :因为
[MASK]
部分我们只对部分词感兴趣,因此需要建立一个映射关系。例如如果[MASK]
预测的词是"great",则认为是positive类,如果是"terrible",则认为是negative类。 - 3.训练:根据Verbalizer,则可以获得指定label word的预测概率分布,并采用交叉信息熵进行训练。此时因为只对预训练好的MLM head进行微调,所以避免了过拟合问题。
- 1.构建模板(Template Construction): 通过人工定义、自动搜索、文本生成等方法,生成与给定句子相关的一个含有
注意思考:不同的句子应该有不同的template和label word,没错,因为每个句子可能期望预测出来的label word都不同,因此如何最大化的寻找当前任务更加合适的template和label word是Prompt-tuning非常重要的挑战。
其实我们可以理解,引入的模板和标签词本质上属于一种数据增强,通过添加提示的方式引入先验知识。
4 Prompt-Tuning技术发展历程
Prompt-Tuning自GPT-3被提出以来,从传统的离散、连续的Prompt构建、走向面向超大规模模型的In-Context Learning、Instruction-tuning和Chain_of_Thought.💬
5 Prompt-Tuning的主要方法
Prompt-Tuning具体如何实现,其有什么困难和挑战?这里我们挑选一些具有代表性的.
5.1 Prompt-Tuning的鼻祖----GPT3和PET
Prompt-Tuning最早是在GPT-3《Language Models are Few-Shot Learners》中被提出来的。其开创性的提出了In-context Learning(ICL, 情景学习)的思想。即无须修改模型即可实现few-shot、zero-shot的learning。同时引入了Demonstrate Learning, 即让模型知道与标签相似的语义描述,提升推理能力.
- In-context Learning: Prompt前身,通过从训练集挑选一些样本作为任务的提示,来实现免参数更新的模型预测。
- Demonstration Learning:添加一些新的样本作为提示。模型可以根据新添加的样例句子就可以"照猫画虎"式的预测结果了.
常用的In-context learning方法包括:
- zero-shot learning
- 定义: 给出任务的描述, 然后提供测试数据对其进行预测, 直接让预训练好的模型去进行任务测试.
- 示例: 向模型输入"这个任务要求将中文翻译为英文. 销售->", 然后要求模型预测下一个输出应该是什么, 正确答案应为"sell".
- one-shot learning
- 定义: 在预训练和真正翻译的样本之间, 插入一个样本做指导. 相当于在预训练好的结果和所要执行的任务之间, 给一个例子, 告诉模型英语翻译为法语, 应该这么翻译.
- 示例: 向模型输入"这个任务要求将中文翻译为英文. 你好->hello, 销售->", 然后要求模型预测下一个输出应该是什么, 正确答案应为"sell".
- few-shot learning
- 定义: 在预训练和真正翻译的样本之间, 插入多个样本(一般10-100条)做指导. 相当于在预训练好的结果和所要执行的任务之间, 给多个例子, 告诉模型应该如何工作.
- 示例: 向模型输入"这个任务要求将中文翻译为英文. 你好->hello, 再见->goodbye, 购买->purchase, 销售->", 然后要求模型预测下一个输出应该是什么, 正确答案应为"sell".
但是这类方法有一个明显的缺陷是------其建立在超大规模的预训练语言模型上,此时的模型参数数量通常超过100亿,在真实场景中很难应用,因此众多研究者开始探索GPT-3的这套思路在小规模的语言模型(如Bert)上还是否适用?事实上,这套方法在小规模的语言模型上是可行的,但是需要注意:
- 模型参数规模小了,prompt直接用在zero-shot上效果会下降,因此需要考虑将In-context Learning和Demonstrate Learning应用在Fine-Tuning阶段,也就是后面要讲到的Prompt-Tuning。
- GPT-3中提供的提示(Natural Language Prompt)过于简单,泛化性能低。
因此,PET模型问世.
5.2 PET模型
PET(Pattern-Exploiting Training)出自《Exploiting Cloze Questions for Few Shot Text Classification and Natural Language Inference》(EACL2021),根据论文题目则可以猜出,Prompt-Tuning启发于文本分类任务,并且试图将所有的分类任务转换为与MLM一致的完形填空。
PET模型提出两个很重要的组件:
- Pattern(Template) :记作T, 即上文提到的Template,其为额外添加的带有
[mask]
标记的短文本,通常一个样本只有一个Pattern(因为我们希望只有1个让模型预测的[mask]
标记)。由于不同的任务、不同的样本可能会有其更加合适的pattern,因此如何构建合适的pattern是Prompt-Tuning的研究点之一; - Verbalizer :记作V, 即标签词的映射,对于具体的分类任务,需要选择指定的标签词(label word)。例如情感分析中,我们期望Verbalizer可能是 (positive和negative是类标签)。同样,不同的任务有其相应的label word,但需要注意的是,Verbalizer的构建需要取决于对应的Pattern。因此 如何构建Verbalizer是另一个研究挑战 。
上述两个组件被称为Pattern-Verbalizer-Pair(PVP),在后续的大多数研究中均采用这种PVP组件。基于这套框架,目前的研究主要关注如何选择或构建合适的Pattern和Verbalizer 。一种简单的方法是根据特定任务的性质和先验知识人工设计模板。例如上文例子中通常会选择It was [mask].
作为情感分析类的模板。人工构建方法虽然直观简单,但是致命问题也很突出。有相关工作在实验中发现,在同样的数据集和训练条件下, 选择不同的Pattern和Verbalizer会产生差异很大的结果 ,如下图所示(一般情况下,Template等同于Pattern,Verbalizer等同于Label word)
在相同Pattern时,选择不同的label word对结果影响很大,同理,不同的Pattern对结果影响也很明显,在真正应用中,调参者需要尝试多个不同的模板和标签词以穷举出最好的结果,并不能充分发挥Prompt简单快捷的优势。因此我们总结人工设计方法的缺陷:
- 采用人工构建的方法成本高,需要与领域任务相关的先验知识;
- 人工设计的Pattern和Verbalizer不能保证获得最优解,训练不稳定,不同的PVP对结果产生的差异明显,方差大;
- 在预训练阶段MLM任务并非完全按照PVP的模式进行训练的(比如MLM训练通常都是长文本,mask的数量也并非只有1个,预测的概率分布也并非是有限的),因此人工构建的Pattern和Verbalizer使得Prompt-Tuning与MLM在语义和分布上依然存在差异。
因此如何能够自动地挑选合适的PVP? 目前构建Verbalizer的方法也有很多,不过这里不进行详细解释,我们主要着重介绍构建Pattern的方法:Prompt-Tuning.接下来我们根据使用场景的不同,分别介绍几种成熟的Prompt-Tuning方法.
5.3 Prompt-Oriented Fine-Tuning
Prompt-Oriented Fine-Tuning训练方法的本质是将目标任务转换为适应预训练模型的预训练任务,以适应预训练模型的学习体系。
例如我们利用BERT模型来实现情感分类任务:
传统Fine-Tuning方式: 将训练文本经过BERT编码后,生成向量表征,再利用该向量表征,连接全连接层,实现最终的情感类别识别。但是这种方式存在一个显式的弊端:预训练任务与下游任务存在gap。回忆BERT的预训练任务:MLM与NSP,简单来说,MLM任务是通过分类模型识别被MASK掉的词,类别大小即为整个词表大小;NSP任务是预测两个句子之间的关系。
而Prompt-Oriented Fine-Tuning方式: 将情感分类任务转换为类似于MLM任务的[MASK]预测任务,具体来说,我们构建如下的prompt文本: prompt = It was [MASK]. 将prompt文本与输入文本text = The film is attractive.进行拼接生成: It was [MASK].The film is attractive.,输入预训练模型中,训练任务目标和MLM任务的目标一致,即识别被[MASK]掉的词。通过这种方式,可以将下游任务转换为和预训练任务较为一致的任务,实验证明,Prompt-Oriented Fine-Tuning相对于常规的Fine-Tuning,效果会得到明显提升(Prompt进行情感分类)。
基于上述内容可以了解,在Prompt-Oriented Fine-Tuning方法中,预训练模型参数是可变的。其实将Prompt-Oriented Fine-Tuning方法放在Prompt-Tuning这个部分合理也不合理,因为它其实是Prompt-Tuning+Fine-Tuning的结合体,将它视为Fine-Tuning的升级版是最合适的。
Prompt-Oriented Fine-Tuning方法在BERT类相对较小的模型上表现较好,但是随着模型越来越大,如果每次针对下游任务,都需要更新预训练模型的参数,资源成本及时间成本都会很高,因此后续陆续提出了不更新预训练模型参数,单纯只针对prompt进行调优的方法,例如Hard Prompt 和Soft Prompt。
5.4 Hard Prompt & Soft Prompt
Hard Prompt (离散提示):是一种固定的提示模板,通过将特定的关键词或短语(真实的文本字符串)直接嵌入到文本中,引导模型生成符合要求的文本。这种提示方法的特点在于,提示模板是固定的,不能根据不同的任务和需求进行调整。
- 上述我们讲述的PET 是一种较为经典的硬模板方法,该方法主要思想:将问题建模成一个完形填空问题,然后优化最终的输出词。虽然 PET 也是在优化整个模型的参数 ,但是相比于传统的 Finetuning 方法,对数据量需求更少。
- 但是硬模板产生依赖两种方式:根据经验的人工设计 & 自动化搜索;从上图介绍中可以看出硬模板 对于prompt,改变prompt中的单个单词 会给实验结果带来巨大的差异, 所以也为后续优化提供了方向,如索性直接放弃硬模板,去优化 prompt token embedding即Soft Prompt。
Soft Prompt (连续提示) :是指通过给模型输入一个可参数化的提示模板,从而引导模型生成符合特定要求的文本。这种提示方法的特点在于,提示模板中的参数可以根据具体任务和需求进行调整,以达到最佳的生成效果。
接下来,我们主要针对soft Prompt方式进行讲述:
5.4.1 连续提示模板
Soft Prompt目的其将模板转换为可以进行优化的连续向量,换句话说,我们不需要显式地指定这些模板中各个token具体是什么,而只需要在语义空间中表示一个向量即可。
这样,不同的任务、数据可以自适应地在语义空间中寻找若干合适的向量,来代表模板中的每一个词,相较于显式的token,这类token称为 伪标记(Pseudo Token) 。下面给出基于连续提示的模板定义:
假设针对分类任务,给定一个输入句子 x x x,连续提示的模板可以定义为 T = [ x ] , [ v 1 ] , [ v 2 ] , . . . , [ v n ] [ M A S K ] T=[x],[v1],[v2],...,[vn][MASK] T=[x],[v1],[v2],...,[vn][MASK]:其中[v1]则是伪标记,其仅代表一个抽象的token,并没有实际的含义,本质上是一个向量。
总结来说:Soft Prompt方法,是将模板变为可训练的参数,不同的样本可以在连续的向量空间中寻找合适的伪标记,同时也增加模型的泛化能力。因此,连续法需要引入少量的参数并在训练时进行参数更新,但预训练模型参数是不变的,变的是prompt token对应的词向量(Word Embedding)表征及其他引入的少量参数。
目前基于连续提示的Prompt-Tuning的实现方法,以下列三篇论文为代表,分别作简要介绍:
- 《The Power of Scale for Parameter-Efficient Prompt Tuning》:代表方法为Prompt Tuning
- 《GPT Understands, Too》:代表方法为P-tuning
- 《PPT: Pre-trained Prompt Tuning for Few-shot Learning》:代表方法PPT
5.4.2 Prompt Tuning(NLG任务)
Prompt Tuning(基于T5模型来做的)方法为每一个输入文本假设一个固定前缀提示,该提示表由神经网络参数化,并在下游任务微调时进行更新,整个过程中预训练的大模型参数被冻结。
形式化的描述如下:
给定 n n n个tokens,记作 x 1 , . . . , x n x1, ...,xn x1,...,xn ,通过一个预训练模型对应的embedding table,可以将 n n n个token表示为一个向量矩阵 ( X e − > R n ∗ e ) (X_e->R^{n*e}) (Xe−>Rn∗e),其中 e e e是向量的维度(其与预训练模型的配置有关,例如BERT-base是768)。连续模板中的每个伪标记 v i v_i vi可以视为参数,也可以视为一个token,因此,可以通过另一个embedding table获得 p p p个伪标记token标记为向量矩阵 ( P e − > R p ∗ e ) (P_e->R^{p*e}) (Pe−>Rp∗e),然后将文本和Prompt拼接获得新的输入 [ P e : X e ] − > R ( p + n ) ∗ e [P_e:X_e]->R^{(p+n)*e} [Pe:Xe]−>R(p+n)∗e.这个新的输入将会喂入一个MLP获得新的表征。注意,只有prompt对应的向量表征参数P ( P e − > R p ∗ e ) (P_e->R^{p*e}) (Pe−>Rp∗e)会随着训练进行更新
每个伪标记的初始化可以有下列几种情况:
- 最简单的是随机初始化:即随机初始化一个面向所有伪标记的embedding table,可采用正态分布或者均匀分布等;
- 每个token使用预训练模型已有的embedding table进行初始化,此时,每一个伪标记先随机指定词表中的一个词,并取对应词的embedding作为这个伪标记的初始化;
- 在分类任务上,使用label word(verbalizer)对应的embedding作为初始化,可以有效限制模型输出的是预设的输出类对应的word。
因此,在训练过程中,每个伪标记以及对应的MLP参数都可以得到训练,对于不同的输入句子 ,这些伪标记对应的embedding也各不相同,达到了预期的目的。
Prompt Tuning特点:
-
优点:
- 大模型的微调新范式
- 模型参数规模大了之后,可以将大模型参数固定,指定附加参数来适配下游任务,而且适配性能基本和全参数微调相当。
-
缺点:
- 在小样本学习场景上表现不太行
- 收敛速度比较慢
- 调参比较复杂
5.4.3 P-tuning(NLU任务)
P-tuning的详细内容请参考论文解读:GPT Understands, Too。
P-tuning是另一个具有代表性的连续提示方法,主要针对的是NLU任务,方法图如下所示(图中的 P i P_i Pi等价于上文的 v i v_i vi ,表示伪标记), 谷歌于2021年发表。
P-Tuning方法中四个技巧点:
- 考虑到这些伪标记的相互依赖关系 :认为 [ P 1 ] [P_1] [P1] 与 [ P 2 ] [P_2] [P2]是有先后关系的,而transformer无法显式地刻画这层关系,因此引入Prompt Encoder,实际过程中采用一层Bi-LSTM+两个前馈神经网络组成;
- 指定上下文词 :如果模板全部是伪标记,在训练时无法很好地控制这些模板朝着与对应句子相似的语义上优化,因此选定部分具有与当前句子语义代表性的一些词作为一些伪标记的初始化(例如上图中"capital"、"Britain"等);
- 重参数(Reparameterization) :具体到代码实现上,P-tuning先通过一个Prompt Encoder表征这些伪标记后,直接将这些新的表征覆盖到对应的embedding table上,换句话说,Prompt Encoder只在训练时候会使用到,而在推理阶段则不再使用。
- 混合提示(Hydride Prompt) :将连续提示与离散token进行混合,例如 [ x ] [ i t ] [ v 1 ] [ m a s k ] [x][it][v1][mask] [x][it][v1][mask]
P-Tuning V2是升级版本,该方法在模型的每一层都应用连续的 prompts 并对 prompts 参数进行更新优化。同时,该方法是也是针对 NLU 任务优化和适配的。
5.4.4 PPT(Pre-trained Prompt Tuning)
Prompt-Tuning通常适用于低资源场景,但是由于连续的模板是随机初始化的,即其存在新的参数,少量样本可能依然很难确保这些模板被很好地优化。因此简单的方法就是对这些连续的模板也进行预训练。PPT旨在通过先让这些连续提示在大量无标注的预训练语料进行预训练(注意,预训练过程中,Pre-train-model参数固定不变,只改变soft prompt),然后将其加载到对应下游任务的PLM上进行训练,如下图所示(图中的 P P P即连续的提示模板, < X > <X> <X>并表示为mask token):
每一类任务都会预训练一个soft Prompt, 预训练后的soft Prompt可以直接运用到相似任务中
- 首先在大量无标注语料上进行预训练,获得训练好的连续提示(初始化下游微调任务的soft prompt);
- 对下游任务(是非问答、NLI、文本匹配等),加载这些训练好的提示之后,进行微调,或者直接进行zero-shot预测。
💫PPT的特点:
- 优点:
- 预训练soft-prompt带来了 小样本学习场景上的显著提升
- 缓解了prompt-tuning收敛慢的问题
- 缺点
- 合并同类人物需要人工设计
💯小结
- 主要介绍了NLP发展的四种范式、Fine-Tuning以及Prompt-Tuning的基本思想和原理
- 详细叙述了Prompt-Tuning主要代表方法
- 分别对不同类型架构的代表模型如:BERT、GPT、T5等相关模型进行介绍