Prompt Tuning是现在大模型微调方法中的一种常用方法,本文通过解读5篇论文来了解Prompt Tuning方法演进的过程。分别是Prefix-Tuning、P-Tuning v1、Parameter-Efficient Prompt Tuning、P-Tuning v2。
1. Prefix-Tuning:Optimizing Continuous Prompts for Generation
Finetuning之前是使用大模型进行下游任务重训的方法,但由于大模型参数量过大,Finetuning需要大量的数据,以及更多的算力去更新学习参数,不够实用。在2021年提出的prefix-tuning算法,并在自然语言生成任务(NLG, Nature Language Generation)上做了验证。这里注意区分下另一个NLP的概念,在NLP中还一类任务叫自然语言理解(NLU, Nature Language Understanding)。
在Prompt思想的启发下,在Prefix-Tuning中提出了给每一个input输入增加一个连续的任务相关的embedding向量(continuous task-specific vectors
)来进行训练。
这里的连续(continuous
)是相对于人工定义的文本prompt token的离散(discrete
)来说的,例如一个人工定义的prompt token数组是['The', 'movie', 'is', '[MASK]']
,把其中的token The
替换成一个embedding向量做为输入的话,其中embedding就是连续的(continuous
)表达方式。在下游任务重训的时候固定原有的大模型所有参数,只用重训跟下游任务相关的前缀向量(prefix embedding)即可。
对于自回归的LM模型(例如GPT-2
)来说,会在原有prompt之前增加prefix(z = [PREFIX; x; y]
);对于encoder+decoder的LM模型(例如BART
)来说,会分别在encoder和decoder的输入前加上prefix(z = [PREFIX; x; PREFIX'; y],
)。如下图所示,P_idx
表示加的前缀序列, h
对应的是可学习的参数, 用Pθ=[h1, h2, h3, ...]
表示可学习参数矩阵。
直接学习参数效果不好,所以使用MLP网络对Pθ
进行了reparameter修正,即Pθ[i,:] = MLP(Pθ'[i,:])
,重训完只用保存prefix的Pθ
相关参数。
huggingface peft
关于prefix-tuning
的核心代码实现在