Prefix-Tuning_Prompt-Tuning论文笔记
Prefix-Tuning_Prompt-Tuning论文笔记
当前NLP任务的主流方向大致有两种:预训练模型+finetuning以及预训练模型+Prompt+预测。前者存在着种种问题:首先,预训练的训练形式与下游任务有很大的鸿沟,难以完全发挥预训练模型的潜能,而且需要大量数据去填补这样的鸿沟,直接导致这种方法在下游任务数据不足的时候学习能力差。其次,数千亿参数的预训练模型在fine-tuning的时候需要庞大的算力和显存以及很长的时间,成本太大,此外对于每一个形式的下游任务都需要fine-tuning一个新模型去进行部署,过于冗余浪费。因此,prompt learning开始获得关注,这里先对prompt learning方法做一个简单的综述。
prompt learning
GPT-3提出了In-Context Learning,证明了在Zero-shot、Few-shot场景下,模型不需要学习任何额外参数,只要在推断的过程中加入一些提示,就能达到不错的效果;这说明预训练模型中存在大量甚至可以说充足的知识,预训练模型本身学会的知识让它具有小样本学习能力。但是前面提到过,使用fine-tuning的话在小样本下游任务上会导致过拟合,因此需要找寻其他的tuning方法,而非全局的fine-tuning。
Prompt Learning 的本质
将所有下游任务统一成预训练任务(或许是T5给的启发,将分类、总结等各种任务统一为text-to-text的文本生成类任务);以特定的模板,将下游任务的数据转成契合上游预训练任务的形式,充分挖掘预训练模型本身的能力。
举例:对于情感分类问题,要将输入蕴含的情感进行二分类。原始输入如果是:特效非常酷炫,我很喜欢。那么现在Prompt learning中的输入变为:特效非常酷炫,我很喜欢。这是一部[MASK]电影。
典型的Prompt Learning方法总结
硬模板方法:人工设计/自动构建基于离散 token的模板,比如[x] is located in [y].
1)PET 2)LM-BFF
软模板方法:这种方法不再追求模板的直观可解释性,不再设计/搜索硬模板,而是直接优化Prompt Token Embedding(例如prefix或者soft-prompt,都是可学习的参数),自动化地寻找连续空间中的合适模板,现在的方法大都选择这种。
1)P-tuning 2)Prefix Tuning 3)prompt-tuning
Prefix-Tuning
Fine-Tuning是利用大规模预训练语言模型来执行下游任务的一种方法。但是,它会修改语言模型的所有参数,因此需要为每个任务存储一个完整的副本。因此,作者提出了Prefix-Tuning,这是一种针对自然语言生成任务的fine-tuning的轻量级替代方法,它可以冻结语言模型的参数,只优化一个连续的特定任务的小向量(称为前缀)。经过实验发现只要0.1%fine-tuning的参数,prefix-tuning模型在小数据集上的表现就超过了fine-tuning,在大数据集上的表现媲美fine-tuning。
prefix-tuning的示意图,以及跟fine-tuning的区别如下图所示:
fine-tuning需要调整所有参数(粉红色的部分),而prefix-tuning只需要调整prefix部分,大大减少了tuning过程所需的时间、算力以及存储模型所需的空间。值得注意的是作者将token优化为连续词嵌入,而不是离散token,其效果将向上传播到所有Transformer激活层,然后向右传播到后续token。
prefix-tuning的一个例子如下所示:
对于Autoregressive-LM,增加前缀变为z=[PREFIX;x;y];对于Encoder-Decoder模型,增加前缀变为z=[PREFIX;x;PREFIX‘;y]。
prefix-tuning时,首先要初始化一个可训练的矩阵$P_{\theta}$用于储存前缀参数,它的维度是$|P_{idx}|\times dim(h_i)$,其中$|P_{idx}|$代表前缀的长度,$h_i$代表第i个时间步下所有激活层结果的拼接。此外,作者发现直接更新前缀参数会出现不稳定的情况,甚至模型表现还有轻微的下降,因此作者对前缀参数矩阵进行重参数化:$P_\theta[i,:]=MLP_\theta(P_\theta^{’}[i,:])$。其中$P_{\theta}^{‘}$的第一维度和$P_{\theta}$一样(前缀长度),第二维度比后者小,然后经过一个扩大维数的MLP即可。一旦训练完成,这些重参数化的参数就可以丢弃,只保留$P_{\theta}$。
数据集:
- table-to-text task:E2E,WebNLG,DART。
- summarization task:XSUM。
作者使用GPT-2模型,利用prefix-tuning进行了实验,实验结果如下所示:
此外,作者研究了内在因素对prefix-tuning效果的影响。包含如下方面:
- 前缀长度————先逐渐增高然后略有降低。
- 只调整embedding层————性能下降很大。
- 使用内缀(在x和y之间插入和训练的激活)替代前缀————性能有所下降。
- 前缀初始化策略————使用真实单词的激活比随机的初始化要好。
Prompt-Tuning
Prompt-Tunning是以上prefix-Tunning的简化版本,它使用100个prefix token作为默认参数,大于以上prefix-tuning默认的10个token,不过差异在于prompt-Tunning只对输入层(Embedding)进行微调,而Prefix是对虚拟Token对应的上游layer全部进行微调。因此Prompt-Tunning的微调参数量级要更小,且不需要修改原始模型结构,这是“简化”的来源。相同的prefix长度,Prompt-Tunning(<0.01%)微调的参数量级要比Prefix-Tunning(0.1%~1%)小10倍以上。
110亿的T5模型借助prompt-tuning(上面prefix-tuning使用的是15亿的GPT2),已经可以打平在下游多任务联合微调的LM模型,并且远远的甩开了Prompt Design(GPT3 few-shot所使用的方法),实验结果如下图所示:
在110亿参数下,prompt-tuning的T5跟多任务调优的T5达到了相同的表现,但是调优的参数比后者少了20000倍。prompt-tuning的T5-small和GPT-3 XL有相同的表现,两者参数量差了16倍,prompt-tuning的T5-large更是超过了GPT-3 175B,两者参数量差了220倍。
prompt-tuning的示意图如下所示:
作者进行了许多消融实验来探索影响prompt-tuning效果的因素。
- prompt长度:尝试了五种长度的prompt,超过20个token的prompt可以获得大的收益。
- prompt初始化策略:测试了随机初始化和词汇表采样策略以及类标签初始化,后者效果最好。
- 预训练目标:测试了T5的Span Corruption、Span Corruption+sentinel以及LM Adaptation三种方法,发现最后一种是最好的,所有的Span Corruption都不太适用于prompt-tuning。
- LM adaptation:作者尝试了四种adaptation步数,发现步数越长效果越好。
对于以上所有消融实验,当参数足够多的时候这四种因素并不会带来大的影响。
在域迁移问题上,实验表明prompt tuning优于fine tuning,结果如下图所示:
提出了“提示集成”方法。模型集成的方法随着模型大小的不断增加已经不再合适,因此作者在同一个任务上训练了N个prompt,通过这样的方式以极小的代价实现了模型的集成,实现了不错的效果。