[论文学习]P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Task

[论文学习]P-Tuning V2

P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks

P-Tuning v2一种在不同规模和任务中都可与微调相媲美的Prompt-Tuning方法,但并不是一个全新的方法,将文本生成的Prefix-Tuning优化并适应到NLU任务中,成为一个跨规模和NLU任务的

动机

  1. 模型通用性:以前关于Prompt-Tuning的工作(或者说是P-Tuning v1)在正常大小的预训练模型中表现不够理想,100亿以上的参数量的预训练模型打败Fine-Tuning

  2. 任务通用性:现在的Prompt-Tuning不能很好地处理序列标注任务

    首先,序列标注需要预测一连串的标签,而不是单一的标签。其次,序列标注通常预测的是无实际意义的标签,这对于将其转化为有效的verbalizers来说可能是个挑战

    为了解决这两个问题,提出P-Tuning V2

方法

施法前摇
前缀微调

​ 前缀微调(Li and Liang, 2021)最初是为自然语言生成(NLG)任务提出的,由[Prefix, x, y]三部分构成,Prefix为前缀,x为输入,y为输出。Prefix-tuning将预训练参数固定,Prefix参数进行微调:不仅只在embedding上进行微调,也在TransFormer上的embedding输入每一层进行微调。

​ 假设我们有自回归模型GPT(transformer的结构,12层),让z = [x;y],聚合x和y, X i d x X_{idx} Xidx是x的索引, i d x _{idx} idx是y的索引, h i ( j ) h_i(j) hi(j)是transformer第j步的输出, h i = [ h i ( 1 ) , . . . , h i ( n ) ] h_i = [h_i(1),...,h_i(n)] hi=[hi(1),...,hi(n)],生成 h i h_i hi的输入是 z i z_i zi h < i hh<i为下式:
h i = L M ϕ ( z i , h < i ) h_{i}=\mathrm{LM}_{\phi}\left(z_{i}, hhi=LMϕ(zi,h<i)
h i h_i hi来计算下一个token的概率分布:

p ( z i + 1 ∣ h < = i ) = s o f t m a x ( W h i ( n ) ) p(z_{i+1} | h <=i) = softmax(Wh_i(n)) p(zi+1h<=i)=softmax(Whi(n))

还有一种生成式架构是encoder-decoder,就是BART,同GPT相比,就是BART的encoder是双向的,decoder是单向的。如下图所示:

[论文学习]P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Task_第1张图片

​ prefix-tuning在生成式任务中可以替代fine-tuning,方法就是在自回归模型前加个prefix,z=[PREFIX;x;y]或者再encoder和decoder前都加prefix,z=[PREFIX;x;PREFIX’;y],如问题描述中的图所示。 P i d x P_{idx} Pidx表示prefix中的索引, h i h_i hi由下式所示:
h i = { P θ [ i , : ] ,  if  i ∈ P i d x L M ϕ ( z i , h < i ) ,  otherwise  h_{i}= \begin{cases}P_{\theta}[i,:], & \text { if } i \in \mathrm{P}_{\mathrm{idx}} \\ \mathrm{LM}_{\phi}\left(z_{i}, h_{hi={Pθ[i,:],LMϕ(zi,h<i), if iPidx otherwise 

​ 论文中提到,直接更新prefix的参数会导致优化的不稳定,因此会在prefix上加个mlp的映射:
P θ [ i , : ] = MLP ⁡ θ ( P θ ′ [ i , : ] ) P_{\theta}[i,:]=\operatorname{MLP}_{\theta}\left(P_{\theta}^{\prime}[i,:]\right) Pθ[i,:]=MLPθ(Pθ[i,:])

模型

[论文学习]P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Task_第2张图片

P-Tuning V2实际上就是使用Prefix-Tuning,即在每一层embedding 中加入前缀prompt,将预训练参数固定,对Prefix Prompt进行微调

  • P-tuning v1只有第一层的embedding加入prompt

  • 假设Prefix部分由50个token组成,则P-Tuning v2共有 50x12=600个参数需要tuned。

  • 在Prefix部分,每一层transformer的输入不是从上一层输出,而是随机初始化的embedding(需要tuned)作为输入。

  • 其他改进

    1. 移除了Reparamerization加速训练方式

      作者发现P-Tuning v1中,在输入对随机初始化Pseudo token经过 一个LSTM 层 和两个前馈层,生成表示Pseudo token的新向量,这种方法是否有效取决于任务和数据集

    2. 多任务学习优化[可选]:基于多任务数据集的Prompt进行预训练,然后再适配的下游任务。

      Deep Prompt Tuning的优化难题可以通过增加额外的任务数据或者无标注数据来缓解,同时可微调的prefix contiguous prompt也可以用来做跨任务的共享知识

      比如NER中,可以同时训练多个数据集,不同数据集使用不同的顶层classifer,但是prefix contiguous prompt是相同的

    3. 不同的NLU任务采用不同长度的Prompt

      比如简单的分类喜欢小于20的Prompts,困难的序列标注问题喜欢较长的Prompts(大约100)

    4. 删除了带有LM头的verbalizers,并返回到带有普通线性头的传统类别标签。即重新利用[CLS]和字符标签,跟传统Fine-Tuning一样利用[CLS]或者token的输出做NLU,以增强通用性,可以适配到序列标注任务。

实验

settings: 全量数据 + Fixed LM Prompt Tuning。

不同大小的模型以研究模型通用性

[论文学习]P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Task_第3张图片

​ P-tuning在较小的规模上没有优势。当涉及到自然语言在推理,蕴含和问答方面的复杂挑战时,它们的表现更差。

​ 相反,P-tuning v2 在较小规模的所有任务中与微调的性能相匹配。

​ 在更大规模的参数上(2B 到 10B),P-tuning和微调之间的差距逐渐缩小。在 10B 尺度上,Prompt-Tuning变得有竞争力。

​ P-tuning v2在所有规模上可以媲美微调的效果,而只需微调 0.1% 的特定任务参数。

跨越任务以研究任务通用性

GLUE和SuperGLUE的大多数任务都是相对简单的NLU问题。另一个重要的硬NLU挑战系列在于序列标注,它与一些更高级的NLP应用有关,包括开放信息提取、阅读理解等等

[论文学习]P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Task_第4张图片

在 NER,QA 和 SRL 三个任务上测试:

  • NER:对于多任务设置,结合三个数据集的训练集进行训练。对每个数据集使用不同的线性分类器,同时共享 continuous prompt 的参数;

  • QA:对于多任务设置,混合 SQuAD 1.1 和 2.0 的数据集进行训练,不管是否有不可回答的问题;

  • SRL:同 NER 的多任务设置。

从表里可以看到 P-tuning V2 的优势以及多任务学习的优势

(除了 QA,作者认为是混合了不可回答的问题的原因)

总结

P-tuning v2就是将Prefix-tuning应用到NLU任务上的一种方法

贡献
  1. 仅精调0.1%参数量(固定LM参数),在330M到10B参数规模LM模型上,均取得和Fine-Tuning相当的效果,

  2. 将Prompt Tuning技术首次拓展至序列标注等复杂的NLU任务上

思考
  • 经历过P-Tuning论文方法与GitHub代码不一致的事情,还是要自己去验证一下才能下结论

  • P-Tuning v2并未在Few-Shot上验证性能,本来就是想用,有点违背初心了,使用prompt最开始的想法不就是为了提升在小样本的性能吗?

你可能感兴趣的:(NLP论文笔记,深度学习,自然语言处理)