0%
URL
TL;DR
- 本文提出一种提示词微调的方法,是对
P-Tuning
的升级
P-Tuning v2
要解决的问题是:对于所有(或大多数)任务类型和模型参数规模,将提示词微调的精度达到和整体参数微调同样的效果,这也是这篇论文的题目
Algorithm
对 P-Tuning
的优化
1. P-Tuning
只在模型输入层添加可学习的连续嵌入,P-Tuning v2
在模型的每一层都添加
Prefix Tuning / Prompt Tuning / P-Tuning
三种方法都是在模型输入中加入连续嵌入
- 添加方式可能是前缀,也可能是其他
Concat Pattern
- 通过
Self-Attention
的 embedding
间信息融合机制让虚拟连续嵌入影响整个模型
P-Tuning V2
的做法则完全不同,是对模型的 每一层 都添加了可学习的虚拟连续嵌入
- 具体来说是通过初始化虚拟
past_key_values
来实现的
- 用
GPT2-small
来举例(12
层 transformer
,每层 12
个头,每个头的 dim = 64
)
- 假设
virtual_prompt_seq_len=3
,input_prompt_seq_len=10
- 那么需要先初始化
past_key_values
,shape = [12, 2, 12, 3, 64]
,分别表示:
num_layers
key and value
num_heads
virtual_prompt_seq_len
dim
shape = [12, 2, 12, 3, 64]
以及修改后的输出层参数是可训练的所有参数
- 然后将序列长度为
10
的 input token embeddings
输入模型,第一层输出长度还是 10
- 第二层以及之后的每一层都将上一层输出的长度为
10
的序列和长度为 3
的 virtual_prompt_key_values
合并计算,并输出长度为 10
的序列
2. 不再使用 Verbalizer
,而是使用 class head
- 什么是
Verbalizer
?
- 传统的预训练语言模型(例如
Bert
)的输入是一个 token
序列,输出是一个 token
,也就是说词表中每个词都有可能输出
- 现在有个下游任务需要用
Bert
做情感分类,输入是一段话,输出是:{正面,负面,中性} 中的一种,而且用 P-Tuning
方法微调,那么直接把输入附加上一些虚拟连续提示嵌入,输出的结果还是整个词表,不是三分类
- 这时候就需要
Verbalizer
的存在了,它的作用是将 Bert
模型的输出从词表空间映射到三分类空间,它的实现形式可以是规则,也可以是深度学习模型
P-Tuning V2
如何抛弃 Verbalizer
?
- 抛弃
Verbalizer
的方式很简单,就是打破 Prompt Tuning
模型时不应修改模型参数和结构 的限制
- 直接删除预训练模型输出层,改成任务相关的层并随机初始化,然后微调
Thought
- 看起来比
P-Tuning v2
更优雅,和 kv cache attention
结合起来,推理耗时增加较小
- 据说对大模型来讲,这种方法和
Prompt Tuning
相比并没有显著精度优势(模型参数量小时,设计很重要;模型参数量大时,参数量几乎可以弥补一切设计上的非最优)