Okii's blog

仅作为记录自己的学习过程

0%

Parameter Efficient Fine-Tuning(PEFT)系列论文总结(二)

承接上篇Parameter Efficient Fine-Tuning(PEFT)系列论文总结(一),本篇主要介绍P-Tuning系列的微调方法。

一、P-Tuning v1

清华大学的研究者于2021年3月通过此篇论文《GPT Understands, Too》提出P-Tuning

文章的提出为了解决这样一个问题,如下图给出:

大模型的Prompt构造方式严重影响下游任务的效果。比如:GPT-3采用人工构造的模版来做上下文学习(in-context learning),但人工设计的模版的变化特别敏感,加一个词或者少一个词,或者变动位置都会造成比较大的变化。

image-20240106145327787

之前的工作都是这种离散化的token,搜索出来的结果可能并不是最优的,导致性能不稳定。

![image-20240106153147765](Parameter Efficient Fine-Tuning(PEFT)系列论文总结(二)/image-20240106153147765.png)

基于此,作者提出了P-Tuning,设计了一种连续可微的virtual token(类似Prefix-Tuning)。P-Tuning成功地实现了模版的自动构建,且借助P-tuningGPTSuperGLUE上的成绩首次超过了同等级别的BERT模型,这颠覆了在那年之前“GPT不擅长NLU”的结论,也是该论文命名的缘由

image-20240106150023656

对于上面可微的理解:

原文是continuous连续,这里可微就是可导,应该是反向传播的时候要求导数,所以可以BP优化学习=可微。

P-tuning和Prefix Tuning类似,也放弃了“模版由自然语言构成”这一常规要求,从而将模版的构建转化为连续参数优化问题

下图是一个prompt search针对The capital of Britain is [MASK](英国的首都是哪个城市)的例子
即给定上下文(蓝色区域,“英国”)和目标(红色区域,“[MASK]”),橙色区域指的是提示符号prompt tokens

image-20240107104210128
  • 在(a)中,提示生成器只收到离散的奖励
    In (a), the prompt generator only receives discrete rewards

  • 在(b)中,伪promptprompt encoder可以以可微的方式进行优化,有时,在(b)中添加少量与任务相关的anchor tokens(如capital)将带来进一步的改进
    in (b) the pseudo prompts and prompt encoder can be optimized in a differentiable way. Sometimes, adding few task-related anchor tokens(such as “capital” in (b)) will bring further improvement

    (ps:经过预训练的LM的词嵌入已经变得高度离散,如果随机初始化virtual token,容易优化到局部最优值,而这些virtual token理论是应该有关联的。因此,作者通过实验发现用一个prompt encoder来编码会收敛更快,效果更好。即用一个LSTM+MLP去编码这些virtual token以后,再输入到模型)

换言之,P-tuning做法是用一些伪prompt代替这些显式的prompt(说白了,将自然语言提示的token,替换为可训练的嵌入)
具体的做法是可以用预训练词表中的unused token作为伪promptBERTvocab里有unused 1 ~ unused99,就是为了方便增加词汇的」,然后通过训练去更新这些token的参数
也就是,P-tuning Prompt不是显式的,不是我们可以看得懂的字符,而是一些隐式的、经过训练的、模型认为最好的prompt token

Prefix Tuning和P-Tuning v1的区别:

1、prefix tuning在所有transformer layer都加入了prompt,而P-Tuning只在输入层加

2、P-Tuningvirtual token的位置也不一定是前缀,插入的位置是可选的

3、作者是用一个prompt encoder来编码收敛更快,效果更好。也就是说,用一个LSTM+MLP去编码这些virtual token以后,再输入到模型

苏剑林说:“在P-Tuning中,如果我们不将新插入的token视为“模版”,是将它视为模型的一部分,那么实际上P-Tuning也是一种类似Adapter的做法,同样是固定原模型的权重,然后插入一些新的可优化参数,同样是只优化这些新参数,只不过这时候新参数插入的是Embedding层,因此,从这个角度看,P-Tuning与Adapter有颇多异曲同工之处”

二、P-Tuning v2

之前的Prompt TuningP-Tuning等方法存在两个主要的问题:

第一,缺乏模型参数规模和任务通用性。

  • 缺乏规模通用性:Prompt Tuning论文中表明当模型规模超过100亿个参数时,提示优化可以与全量微调相媲美。但是对于那些较小的模型(从100M到1B),提示优化和全量微调的表现有很大差异,这大大限制了提示优化的适用性。
  • 缺乏任务普遍性:尽管Prompt TuningP-tuning在一些 NLU 基准测试中表现出优势,但提示调优对硬序列标记任务(即序列标注)的有效性尚未得到验证。

第二,缺少深度提示优化,在Prompt TuningP-tuning中,连续提示只被插入transformer第一层的输入embedding序列中,在接下来的transformer层中,插入连续提示的位置的embedding是由之前的transformer层计算出来的,这可能导致两个可能的优化挑战:

  • 由于序列长度的限制,可调参数的数量是有限的
  • 输入embedding对模型预测只有相对间接的影响

考虑到这些问题,作者提出了P-Tuning v2,它利用深度提示优化(如:Prefix Tuning),对Prompt TuningP-Tuning进行改进,作为一个跨规模和NLU任务的通用解决方案

P-Tuning v2(论文: P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks),该方法在每一层都加入了Prompts tokens作为输入,而不是仅仅加在输入层,这带来两个方面的好处:

  • 更多可学习的参数(从P-TuningPrompt Tuning的0.01%增加到0.1%-3%),同时也足够参数高效。
  • 加入到更深层结构中的Promp能给模型预测带来更直接的影响
image-20240107135447839

具体做法基本同Prefix Tuning,可以看作是将文本生成Prefix Tuning技术适配到NLU任务中,然后做了一些改进:

  • 移除重参数化的编码器。以前的方法利用重参数化功能来提高训练速度和鲁棒性(如:Prefix Tuning中的MLPP-Tuning中的LSTM))。在 P-Tuning v2 中,作者发现重参数化的改进很小,尤其是对于较小的模型,同时还会影响模型的表现。
  • 针对不同任务采用不同的提示长度。提示长度在提示优化方法的超参数搜索中起着核心作用。在实验中,我们发现不同的理解任务通常用不同的提示长度来实现其最佳性能,这与Prefix-Tuning中的发现一致,不同的文本生成任务可能有不同的最佳提示长度。
  • 引入多任务学习。先在多任务的Prompt上进行预训练,然后再适配下游任务。多任务学习对我们的方法来说是可选的,但可能是相当有帮助的。一方面,连续提示的随机惯性给优化带来了困难,这可以通过更多的训练数据或与任务相关的无监督预训练来缓解;另一方面,连续提示是跨任务和数据集的特定任务知识的完美载体。我们的实验表明,在一些困难的序列任务中,多任务学习可以作为P-Tuning v2的有益补充。
  • 回归传统的分类标签范式,而不是映射器。标签词映射器(Label Word Verbalizer)一直是提示优化的核心组成部分,它将one-hot类标签变成有意义的词,以利用预训练语言模型头。尽管它在few-shot设置中具有潜在的必要性,但在全数据监督设置中,Verbalizer并不是必须的。它阻碍了提示调优在我们需要无实际意义的标签和句子嵌入的场景中的应用。因此,P-Tuning v2回归传统的CLS标签分类范式,采用随机初始化的分类头(Classification Head)应用于tokens之上,以增强通用性,可以适配到序列标注任务。