大模型——提示学习
Prompt提供上下文和任务相关信息,以帮助模型更好地理解要求,并生成正确的输出;例一:问答任务中,Prompt可能包含问题或话题的描述,以帮助模型申城正确的答案;例二:在情感分析任务中,让模型做情感分类任务的做法通常是在句子前面加入前缀“该句子的情感是”即可;通过这种方式将情感分类任务转换成为一个“填空”任务,在训练过程中,BERT可以学到这个前缀与句子情感之间的关联。
为什么需要提示学习(Prompting)?
在面对特定的下游任务时,如果进行Full FineTuning(即对预训练模型中的所有参数都进行微调),太过低效;而如果采用固定预训练模型的某些层,只微调接近下游任务的那几层参数,又难以达到较好的效果;
什么是提示学习?
Prompt提供上下文和任务相关信息,以帮助模型更好地理解要求,并生成正确的输出;
例一:问答任务中,Prompt可能包含问题或话题的描述,以帮助模型申城正确的答案;
例二:在情感分析任务中,让模型做情感分类任务的做法通常是在句子前面加入前缀“该句子的情感是”即可;
通过这种方式将情感分类任务转换成为一个“填空”任务,在训练过程中,BERT可以学到这个前缀与句子情感之间的关联。
提示学习的优点?
提示学习旨在通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本。这样一来,即使计算资源受限,也可以利用预训练模型的知识来迅速适应新任务,实现高效的迁移学习。
提示学习有哪些方法?
前缀微调(Prefix-tuning)
原因:
1.人工设计离散的Prompt变化对模型最终的性能特别敏感,加一个词或者少一个词 亦或者位置变动都会造成比较大的变化。
2.自动化搜索离散的Prompt成本比较高;
3.离散化的token搜索出来的结果可能并不是最优的;
4.传统的微调范式利用预训练模型去对不同的下游任务进行微调,对每个任务都要保存一份微调后的模型权重,一方面微调整个模型耗时长,另一方面也会占用很多存储空间;
思路:
1.Prefix构建;在输入token之前构造一段任务相关的virtual tokens 作为Prefix;
2.训练时只更新Prefix不分参数,而Transformer中的其他部分参数固定;
3.在Prefix层前面加了MLP结构(相当于将Prefix分解为更小维度的input与MLP的组合输出的结果),训练完成后,只保留Prefix的参数;
优点:
1.前缀微调可以学习到“隐式”的Prompt;
2.基于前缀的架构可以再一个批次中处理来自多个用户/任务的样本,这是其他轻量级微调方法所不能做到的;
3.Prefix Tuning只更新Prefix的部分参数;
缺点:
1.占用序列长度;(有一定的额外开销)
2.每层都加了Prompt的参数,改动较大;
指示微调(Prompt-tuning)
原因:
1.模型全量微调对每个任务训练一个模型,开销和部署成本都比较高;
2.离散的Prompt(指人工设计Prompt提示语加入到模型)方法,成本比较高,并且效果不好;
3.前缀微调占用序列长度;
4.前缀微调在每层都加了Prompt的参数,改动比较大;
思路:
1.将Prompt扩展到连续空间,仅在输入层添加Prompt连续向量,通过反向传播更新参数来学习Prompt,而不是人工设计Prompt;
2.冻结模型原始权重,只训练Prompt参数,训练完成后,只用同一个模型可以做多任务推理;
3.使用LSTM建模Prompt向量间关联性;
优点:
1.旨在输入层加入Prompt tokens,并且不需要加入MLP进行调整来解决难训练的问题;
2.随着预训练模型参数量的增加,Prompt tuning的方法会逼近全参数微调的结果;
3.提出了Prompt ensembling:在一个批次(Batch)里同时训练同一个任务的不同Prompt(即采用多种不同方式询问同一个问题),这样相当于训练了不同模型,比模型集成的成本小很多;
缺点:
1.训练难度大。不太好训练,省了显存,但不一定省时间。具体来讲,大部分Prompt现在只是Parameter Efficient并没有达到想要的Training Efficient。也就是说只是省了空间,但不一定能加快训练,训练时间有可能更长;
2.多个Prompt token之间相互独立,可能会影响效果;
3.在NLU上,Prompt tuning对于正常大小的预训练模型表现不佳;
4.现有Prompt Tuning方法不能处理困难的序列标注任务;
指令微调和前缀微调的区别
指令微调可以看作是简化版的前缀微调;
1.适用任务不同
- 前缀微调仅针对的NLG任务有效,服务于GPT架构;
- 指示微调考虑所有类型的语言
2.添加方式不同
- 前缀微调限定在输入前面添加
- 指示微调可以在任意位置添加
3.Prompt连续向量添加方式不同
- 前缀微调每一层都添加,保证效果
- 指示微调可以只在输入层添加
指示微调与fine-tuning之间的区别
1.fine-tuning需要改变预训练阶段模型参数,可能带来灾难性遗忘问题;
2.指示微调不改变预训练阶段模型参数,而是通过微调寻找更好的连续Prompt,来引导已学习到的知识使用;
P-Tuning
原因:
1.大模型的Prompt构造方式严重影响下游任务的效果。
2.之前研究表明GPT3使用Prompt训练方式可以显著提升few-shot和zero-shot效果;
3.自动化搜索模板工作成本较高,以前这种离散化的token的搜索出来的结果可能并不是最优的,导致性能不稳定;
思路:
1.可学习的Embedding层设计。将Prompt转换为学习Embedding层;
2.Prompt encoder设计。用Prompt encoder(由一个双向的LSTM+两层MLP组成)的方式来对Prompt Embedding进行一层处理,建模伪token的相互依赖,并且可以提供一个更好的初始化。
优点:
引入Prompt encoder来建模伪tokens的相互依赖,并且可以提供一个更好的初始化;
缺点:
1.复杂性增加。稍微复杂,看着不太像Prompt
2.伪token编码时是连续的,但在与输入结合时可能是不连续的,中间可能会插入输入;
P-Tuning v2
思路:
1.Deep Prompt Encoding:采用Prefix-tuning的做法,在输入前面的每层加入可微调的Prompt tokens作为输入;
2.移除了重参数化的编码器(Prefix-tuning中可选MLP,P-Tuning中的LSTM):Prefix-tuning和P-Tuning通过利用重参数化功能来提高训练速度和鲁棒性,但是该方法对于较小的模型还是会影响模型的表现;
3.针对不同任务采用不同的提示长度:提示长度在提示优化方法的超参数搜索中起着核心作用。在实验中,发现不同的理解任务通常用不同的提示长度来实现其最佳性能,这与Prefix-tuning重的发现一致,不同的文本生成任务可能有不同的最佳提示长度;
4.引入多任务学习,先在多任务的Prompt上进行预训练,然后再适配下游任务;
a、连续提示的随机惯性给优化带来了困难,这可以通过更多的训练数据或任务相关的无监督预训练来缓解;
b、连续提示是跨任务和数据集的特定任务知识的完美载体;
5.抛弃了Prompt learing中常用的verbalizer,回归到传统的CLS和token labe分类范式。标签词映射器(Label Word Verbalizer)一直是提示优化的核心部分,它将one-hot类标签变成有意义的词,以利用预训练语言模型。尽管他在few-shot设置中具有潜在的必要性,但是在全数据监督设置中,Verbalizer并不是必须的。它阻碍了提示调优在无实际意义的标签和句子嵌入的场景中的应用。因此,P-Tuning v2回归传统的CLS标签分类范式,采用随机初始化的分类头(Classification Head)应用于tokens之上,以增强通用性,可以适配到序列标注任务。
优点:
1.在输入前面的每层加入可微调的Prompts tokens作为输入
a、更多可学习的参数(从P-Tuning和Prompt tuning的0.01%增加至0.1%~3%),同时也足够参数高效;
b、加入到更深层结构中的Prompt能给模型预测带来更直接的影响;
2.解决了Prompt tuning无法在小模型上有效提升的问题;
3.将Prompt Tuning拓展至NER等序列标注任务上;
缺点:
抛弃了Prompt learing 中常用的Verbalizer,回归到传统的CLS和tokens label分类范式,这种其实某种程度上弱化了Prompt的味道;
更多推荐

所有评论(0)