论文链接:P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks
代码链接:https://github.com/THUDM/P-tuning-v2
将prompt tuning引入到NLU(Natural Language Understanding)中,提出了P-Tuning v2, 可以作为fine-tuning的有效替代
预训练的语言模型已经在NLU领域上取得了很大成功,其中fine-tuning功不可没,但是由于需要存储所有的梯度和优化器状态的参数,fine-tuning在训练过程中需要消耗很多的内存。而且,fine-tuning需要在推理过程中为每一个任务保留一份模型参数,由于预训练模型的体积较大,fine-tuning因此变得不方便。
prompting通过冻结预训练模型的所有参数,并且使用自然语言提示符来查询语言模型。举例来说,对于情绪分析任务,我们可以将一个样本连接到提示符“这部电影是[MASK]”,然后让预训练的语言模型来预测[MASK]的信息。然后我们可以用[MASK]被预测为“好”或者“坏”的概率来预测样本的标签。prompting不需要训练并且只需要保留一份模型的参数。但是,相比fine-tuning,prompting在很多情况下只能到次优的性能。
prompting tuning是一种只调整连续prompt的思路,具体来说[1]、[2]提出了在原始的输入embedding序列中增加可训练的连续embedding的方法。这些连续的embedding(prompt)类似于prompting中手动设计的离散prompt。在训练过程中,只要连续的prompt会被更新。当prompt tuning在许多任务上取得比prompting更优性能的同时,promp tuning在小模型上的效果仍然不然fine-tuning,特别是在小于100亿参数的模型上。此外,正如我们的实验所示,prompt tuning在一些困难序列任务上表现不如fine-tuning,如提取问题回答和序列标记。
文章的主要贡献在于一个新颖的实验发现:合理优化的prompt tuning可以在各种尺寸模型和NLU任务上取得比fine-tuning更优的效果。与之前工作相比,我们的发现显示了prompt tuning对NLU任务的通用性以及其巨大的潜力。
具体说来,我们的方法P-tuning v2可以被看作优化版本的prefix-tuning,一种为生成而设计并且适用于NLU的方法。P-tuning v2最显著的提升来源于使用了深度的prompt tuning,即对预训练模型的每一层都采用连续的prompt。深度prompt tuning增加了连续prompt的能力并且缩小了在fine-tuning的差距,特别是在小模型和复杂任务的情况下。而且,我们提供了一些优化和实现的细节来增强我们的结果。
实验证明:P-tuning v2在300M到10B参数的模型范围,以及多种困难NLU任务,比如问题回答以及序列标记上都取得了和fine-tuning匹配的性能。与fine-tuning相比,P-tuning v2每个任务只使用了0.1%-3%的可训练参数,这极大程度上减少了训练时间、存储成本。
将NLU任务分为简单和困难两类
1)简单任务包括对单个标签进行分类。大部分的数据集来自于GLUE和Super-GLUE,包含了文本分类,自然语言推理,多项选择题回答等
2)困难任务包括对一系列标签进行分类。主要是关于信息提取,比如开放信息提取,命名实体标识,提取问题回答以及语言角色标记
prompt tuning以及P-tuning在主干语言模型参数被冻结时,引入了可训练的连续prompt作为NLU自然语言prompt的替代。举例说来,记 V \mathcal{V} V为语言模型 M \mathcal{M} M的词汇, e e e为 M \mathcal{M} M的embedding函数。
为了判断一个影评 x = "Amazing movie" x=\text{"Amazing movie"} x="Amazing movie"是积极的还是消极的,很自然的会想到在影评中增加一个prompt "这是[MASK]"并且生成[MASK]被预测为好或者坏的条件概率。在这种情况下,prompt token{“It”, “is”, “[MASK]”}属于模型词汇 V \mathcal{V} V, 输入的embedding序列可以表示为:
[ e ( x ) , e ( " I t " ) , e ( " i s " ) , e ( " [ M A S K ] " ) ] [e(x), e("It"), e("is"), e("[MASK]")] [e(x),e("It"),e("is"),e("[MASK]")]
然而,由于模型 M \mathcal{M} M在本质上式连续的,从优化的角度来看,使用离散的自然prompt无法达到全局最优。然而,P-tuning提出使用可训练的连续embedding [ h 0 , . . . , h i ] [h_0, ..., h_i] [h0,...,hi]来替换prompt,然后将输入序列转化为
[ e ( x ) , h 0 , . . . , h i , e ( " [ M A S K ] " ) ] [e(x), h_0, ..., h_i, e("[MASK]")] [e(x),h0,...,hi,e("[MASK]")]
这样输入连续可微,有利于达到全局最优(如下图(a)所示)
在预训练模型的主干被冻结的限制下,prompt tuning已经被证实了在简单NLU任务,以及100亿参数的的模型上,取得了和fine-tuning相当ed性能。
prompt-tuning h和 P-tuing已经被证实在许多NLP的应用上相当有效,然后,考虑到通用性,P-tuning还不是fine-tuning一个很好、很全面的替代。
prompt tuning已经被证实在超过100亿参数的模型上取得了和fine-tuning近似的性能,但是对于小模型(模型参数在100M到1B之间),prompt tuning的性能远不如fine-tuning。
尽管P-tuning以及再NLU的benchmark,比如GLUE和Super-GLUE上体现了卓越的性能,但是,P-tuning在困难NLU任务上的性能没有得到验证。首先,序列标记需要预测一个序列的标记而不仅仅是一个标记。其次,序列标记通常预测没有实际意义的标记,这很难转化为有效的语言表达。在我们的实验中,我们展示了P-tuning在序列标记上的性能不如fine-tuning。
考虑到这些挑战,我么提出了P-tuning v2。它将前缀调优作为一个跨规模和NLU任务的通用解决方案。
前缀调优被提出主要是为了解决自然语言生成问题(NLG),但是我们发现它对NLU同样适用。
在P-tuning中,对于transformer的第一层,连续的prompt只被嵌入到输入embedding中。在接下来的transformer层,连续prompt嵌入到embedding中的位置由之前的transformer层决定,这可能会导致两个可能的优化挑战:
1)微调的参数量是有限的。大部分的语言模型目前支持的最大序列长度为512(由于注意力二次计算的复杂度)。如果我们额外去除上下文的长度(比如要分类的句子),用来填补连续prompt的长度是有限的。
2)当使用非常深的transformer时,其稳定性是有限的。当transformer变得更深的时候,由于许多中间层(非线性激活函数)的计算,来自transformer第一层的prompt的影响可能是意想不到的,使得优化过程不平滑。
考虑到这些原因,P-tuning v2借鉴前缀微调,使用了多层prompt来提升P-tuning的性能。不同层中的prompt作为输入序列中的前缀token被添加,并且它们彼此独立于其他中间层(而不是由之前的transformer层计算)。另一方面,通过这种方式,P-tuning v2有更多针对任务的可调参数(从0.01%到0.1%-3%),从而允许更多的单任务容量,但这个参数量仍然比整个预训练语言模型要小的多。另一方面,添加到更深层的prompt,由于包含更少的中间层,可以对输出产生更大更直接的影响。
同样有一些有效的优化和实现细节
之前的方法使用再参数化函数来增加训练速度、鲁棒性以及性能。然后,对于NLU任务,我们发现再参数化是否有用,取决于所选择的数据集和任务。对于一些数据集,比如RTE和CONLL04,MLP的再参数化带来了很好的性能提升,对于其他数据集,如BoolQ,再参数化可能没有效果,甚至效果更差(如CONLL12)。
prompt的长度在prompt tuning的超参数搜索中起到了核心作用。在我们的实验中发现,不用的NLU任务通常在不同的prompt长度下取得最优的效果。
多任务学习的方法对我们的方法来说是可选地,但是可能会很有帮助。一方面,连续prompt的随机初始化增加了优化的难度,这点可以通过更多的训练数据或者任务相关的无监督预训练来缓解。另一方面,连续prompt可以作为实现特定知识,跨任务和跨数据集的有效载体。我们的实验展示,在一些困难任务中,多任务学习可以有效t提升P-tuning v2的性能。
语言器(verbalizer)一直是prompt tuning的核心部分,它将一个one-hot类别转换为有意义的单词,来利用预训练语言模型的头。尽管它在few-shot设置中潜在的必要性,verbalizer在全数据监督中却不是必要的。它妨碍了在需要无实际意义标签和embedding场景中prompt tuning的应用。因此,P-tuning v2回到了传统的具有随机初始化线性头的[CLS]标签化分类范式。