提示学习(Prompting)篇
来源:AI-GC面试宝典 作者:宁静致远 日期:2023年09月18日
一、为什么需要提示学习(Prompting)?
在面对特定的下游任务时,如果进行 Full FineTuning(即对预训练模型中的所有参数都进行微调),效率太低;而如果采用固定预训练模型的某些层,只微调接近下游任务的那几层参数,又难以达到较好的效果。
📝通俗解释:想象一下,你有一个超级聪明的百科全书(预训练模型),现在你想让它专门回答医学问题。传统做法是把整本书重新写一遍(Full FineTuning),太费劲了!提示学习就像给这本书加一个"小贴士",告诉它"现在我们只聊医学",它就能很好地回答医学问题了,不用改写整本书。
二、什么是提示学习(Prompting)?
Prompt 提供上下文和任务相关信息,以帮助模型更好地理解要求,并生成正确的输出。
实例一:问答任务中,prompt 可能包含问题或话题的描述,以帮助模型生成正确的答案
实例二:在情感分析任务中,让模型做情感分类任务的做法通常是在句子前面加入前缀"该句子的情感是"即可,通过这种方式将情感分类任务转换为一个"填空"任务。在训练过程中,BERT可以学习到这个前缀与句子情感之间的关联。例如,它可以学习到"该句子的情感是积极的"和"该句子的情感是消极的"之间的差异。
📝通俗解释:就像考试时老师给你的题目加上提示词。比如题目是"判断这句话的情感:今天天气真好",如果你加上提示"这句话的情感是[填空]",模型就会去"填词"而不是做"选择题",这样模型更容易理解你想要什么。
三、提示学习(Prompting)有什么优点?
提示学习(Prompting)旨在通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本。这样一来,即使计算资源受限,也可以利用预训练模型的知识来迅速适应新任务,实现高效的迁移学习。
📝通俗解释:就像用一个万能钥匙(预训练模型)开很多把不同的锁(不同任务)。提示学习就是给这把钥匙配不同的"使用说明",不用换钥匙本身,就能开各种锁,省钱又省力!
四、提示学习(Prompting)有哪些方法?
4.1 前缀微调(Prefix-Tuning)篇
4.1.1 为什么需要前缀微调(Prefix-Tuning)?
- 人工设计离散的 Prompts 缺点:
- Prompts 的变化对模型最终的性能特别敏感,加一个词、少一个词或者变动位置都会造成比较大的变化
- 自动化搜索离散的 Prompts 缺点:
- 成本也比较高
- 离散化的 token 搜索出来的结果可能并不是最优的
- 传统的微调范式利用预训练模型去对不同的下游任务进行微调,对每个任务都要保存一份微调后的模型权重,一方面微调整个模型耗时长,另一方面也会占很多存储空间
📝通俗解释:人工设计提示就像考试时老师出题,有时候多一个字少一个字学生就理解错了。自动搜索提示成本又太高。所以Prefix-Tuning想出了一个办法:让模型自己学习一组"隐形的提示",这些提示是连续的数值,不是固定的文字,模型可以自己调整到最优。
4.1.2 前缀微调(Prefix-Tuning)思路是什么?
- step 1 Prefix 构建:在输入 token 之前构造一段任务相关的 virtual tokens 作为 Prefix
- step 2 训练时只更新 Prefix 部分的参数,而 Transformer 中的其他部分参数固定
- step 3 在 Prefix 层前面加了 MLP 结构(相当于将 Prefix 分解为更小维度的 Input 与 MLP 的组合后输出的结果),训练完成后,只保留 Prefix 的参数(用于防止直接更新 Prefix 的参数导致训练不稳定的情况)
📝通俗解释:就好比在对话开头加一段"虚拟的悄悄话",这段话是模型自己学习出来的,不是人写的。训练时只有这段悄悄话会变,模型主体不变。MLP就像一个"翻译器",把简单的提示转换成更丰富的表示,让模型学起来更稳定。
4.1.3 前缀微调(Prefix-Tuning)的优点是什么?
- 前缀微调(Prefix-Tuning)vs人工设计离散的 Prompts 无法更新参数:Prefix-Tuning可以学习的"隐式"的 Prompts
- 基于前缀的架构可以在一个批次中处理来自多个用户/任务的样本,这是其他轻量级微调方法所不能做到的
- vs full fine-tuning:full fine-tuning 更新所有参数,Prefix-Tuning 只更新 Prefix 部分的参数
📝通俗解释:人工提示是"死"的,写好了就不能改;Prefix-Tuning的提示是"活"的,模型可以自己调整。而且它很聪明,可以同时处理不同人的不同问题,就像一个服务员同时接待好几桌客人。
4.1.4 前缀微调(Prefix-Tuning)的缺点是什么?
- 占用序列长度,有一定的额外计算开销
- 在每层都加了 prompt 的参数,改动较大
📝通俗解释:就像在对话开头加了一段话,这段话会占用对话的"位置",模型处理时需要多算一些东西。而且它不只是加在输入层,而是在模型的每一层都加"小提示",改动比较大。
4.2 提示微调(Prompt-Tuning)篇
📝说明:原文使用"指示微调",但根据术语规范,Prompt-Tuning 更准确的翻译是"提示微调",此处保留原文用法以维持一致性。
4.2.1 为什么需要提示微调(Prompt-Tuning)?
- 模型全量微调对每个任务训练一个模型,开销和部署成本都比较高
- 离散的 prompts(指人工设计 prompts 提示语加入到模型)方法,成本比较高,并且效果不太好
- 前缀微调(Prefix-Tuning)占用序列长度,有一定的额外计算开销
- 前缀微调(Prefix-Tuning)在每层都加了 prompt 的参数,改动较大
📝通俗解释:Prefix-Tuning虽然好,但就像在每个地方都贴了便签,太麻烦了。Prompt-Tuning简化一下,只在输入的地方加一个提示就够了。
4.2.2 提示微调(Prompt-Tuning)思路是什么?
- 将 prompt 扩展到连续空间,仅在输入层添加 prompt 连续向量,通过反向传播更新参数来学习 prompts,而不是人工设计 prompts
- 冻结模型原始权重,只训练 prompts 参数,训练完成后,只用同一个模型可以做多任务推理
- 使用 LSTM 建模 prompt 向量间关联性
📝通俗解释:就像只在开头加一个"学习笔记",这个笔记是连续的数值(不是文字),模型自己会调整这些数值来找到最好的提示。训练完后,一个模型可以做好多不同的任务!
4.2.3 提示微调(Prompt-Tuning)优点是什么?
- 只在输入层加入 prompt tokens,并且不需要加入 MLP 进行调整来解决难训练的问题
- 随着预训练模型参数量的增加,Prompt-Tuning 的方法会逼近全参数微调的结果
- 提出了 prompt ensembling:在一个批次(Batch)里同时训练同一个任务的不同 prompt(即采用多种不同方式询问同一个问题),这样相当于训练了不同模型,比模型集成的成本小多了
📝通俗解释:只要在开头加提示就行,不用像Prefix-Tuning那样每层都加。而且模型越大,提示微调的效果越接近全参数微调。更厉害的是,它可以用不同的问法同时问同一个问题,就像让一个学生用不同方式思考同一道题,然后综合大家的答案。
4.2.4 提示微调(Prompt-Tuning)缺点是什么?
- 训练难度加大:不太好训练,省了显存,但不一定省时间。具体来讲,大部分 prompt 现在只是 parameter efficient 并没有达到想要的 training efficient。也就是说只是省了空间(显存),但不一定能加快训练,训练时间有可能更长
- 多个 prompt token 之间相互独立,可能会影响效果
- 在 NLU 上,prompt tuning 对于正常大小的预训练模型表现不佳
- 现有的 prompt tuning 方法不能处理困难的序列标注任务
📝通俗解释:省地方但不省时间——就像把书从纸质变成电子书省了书架空间,但看书时间没变短。另外,提示词之间如果没关系,可能效果不好。对于小模型效果也不行,而且做不了复杂的序列标注任务(比如给每个词分类)。
4.2.5 提示微调(Prompt-Tuning)与 Prefix-Tuning 区别是什么?
可以看作是 Prefix-Tuning 的简化版本
适用任务不同
- Prefix-Tuning 仅针对 NLG 任务有效,服务于 GPT 架构
- Prompt-Tuning 考虑所有类型的语言模型
添加方式不同
- Prefix-Tuning 限定在输入前面添加
- Prompt-Tuning 可以在任意位置添加
prompt 连续向量添加方式不同
- Prefix-Tuning 每一层都添加,保证效果
- Prompt-Tuning 可以只在输入层添加
📝通俗解释:Prefix-Tuning像是只在门口贴一张大字报,Prompt-Tuning像是可以在教室任何位置放小纸条。而且Prefix-Tuning只擅长写文章(NLG任务),Prompt-Tuning什么任务都能做。
4.2.6 提示微调(Prompt-Tuning)与 Fine-tuning 区别是什么?
- Fine-tuning 需要改变预训练阶段模型参数,可能导致灾难性遗忘问题
- 提示微调(Prompt-Tuning)不改变预训练阶段模型参数,而是通过微调寻找更好的连续 prompt,来引导已学习到的知识使用
📝通俗解释:Fine-tuning就像把原来的大脑结构改了来适应新任务,可能会忘记以前学的东西。Prompt-Tuning就像在大脑旁边加了一个"小助手",不改变大脑本身,只是告诉它怎么用已有的知识来回答新问题。
4.3 P-tuning 篇
4.3.1 为什么需要 P-tuning?
大模型的 Prompt 构造方式严重影响下游任务的效果
例如:GPT 系列 AR 建模在自然语言理解 NLU 任务上效果不好,与 BERT 双向语言模型相比有明显差距
注:GPT-3 采用人工构造的模版来做上下文学习(in context learning),但人工设计的模版的变化特别敏感,加一个词或者少一个词,或者变动位置都会造成比较大的变化
之前的研究表明 GPT3 使用 prompt 训练方式可以显著提升 few-shot 和 zero-shot 的效果
自动化搜索模版工作成本也比较高,以前这种离散化的 token 的搜索出来的结果可能并不是最优的,导致性能不稳定
📝通俗解释:人工设计提示太敏感了,就像考试时老师出题,稍微换个说法学生就不会了。自动找提示又太贵。所以P-tuning让模型自己学习最好的提示,还是连续的那种,兼顾效果和成本。
4.3.2 P-tuning 思路是什么?
P-tuning 的核心思想:通过调整 prompt 的参数,可以有效地引导模型生成期望的输出,而无需对模型的权重进行大规模的微调。
- 可学习的 Embedding 层设计:将 Prompt 转换为可学习 Embedding 层
- prompt encoder 设计:用 prompt encoder(由一个双向的 LSTM+两层 MLP 组成)的方式来对 Prompt Embedding 进行一层处理,建模仿 token 的相互依赖,并且可以提供一个更好的初始化
📝通俗解释:就像给提示加了一个"翻译官"(LSTM+MLP),这个翻译官能理解提示词之间的关系,并给出更好的"翻译"给模型,这样模型学起来更容易。
4.3.3 P-tuning 优点是什么?
引入 prompt encoder(由一个双向的 LSTM+两层 MLP 组成)来建模仿 token 的相互依赖,并且可以提供一个更好的初始化
📝通俗解释:加了"翻译官"之后,提示词之间能互相"交流",模型能更好地理解提示的意思,学起来更快更好。
4.3.4 P-tuning 缺点是什么?
- 复杂性增加:稍显复杂,看着不太像 prompt 了
- 伪 token 编码时是连续的,但在与输入结合时可能是不连续的,中间可能会插入输入
📝通俗解释:太复杂了,不像在给提示,更像在改模型结构。而且提示和输入混在一起,有时候不太连续。
4.3.5 大模型微调 P-tuning 和传统 Fine-tuning 有什么区别?
传统 Fine-tuning 会对模型所有的参数或大部分参数进行微调,对于大模型的庞大参数量来说,会消耗更多的时间和资源等,而 P-tuning 通过只优化几个 token 的参数,在有限算力下也可微调大型预训练语言模型。
📝通俗解释:传统Fine-tuning像是要重新装修整个房子,P-tuning像是在房子里挂几幅画。挂画当然比装修便宜多了!
4.4 P-tuning v2 篇
4.4.1 为什么需要 P-tuning v2?
如何让 Prompt Tuning 能够在不同参数规模的预训练模型、针对不同下游任务的结果上都达到匹敌 Fine-tuning 的结果
📝通俗解释:之前的提示方法在小模型上效果不好,P-tuning v2要让提示学习在各种大小的模型上都能和全参数微调一样好用。
4.4.2 P-tuning v2 核心思想是什么?
- Deep Prompt Encoding:采用 Prefix-tuning 的做法,在输入前面的每层加入可微调的 Prompts tokens 作为输入
- 移除了重参数化的编码器:Prefix-tuning 和 P-tuning 中通过利用重参数化功能(MLP、LSTM)来提高训练速度和鲁棒性,但是该方法对于较小的模型,同时还会影响模型的表现
- 针对不同任务采用不同的提示长度:提示长度在提示优化方法的超参数搜索中起着核心作用。在实验中,发现不同的理解任务通常用不同的提示长度来实现其最佳性能,这与 Prefix-Tuning 中的发现一致,不同的文本生成任务可能有不同的最佳提示长度
- 引入多任务学习:先在多任务的 prompt 上进行预训练,然后再适配下游任务
- 连续提示的随机惯性给优化带来了困难,这可以通过更多的训练数据或与任务相关的无监督预训练来缓解
- 连续提示是跨任务和数据集的特定任务知识的完美载体
- 抛弃了 prompt learning 中常用的 Verbalizer:回归到传统的 CLS 和 token label 分类范式。标签词映射器(Label Word Verbalizer)一直是提示优化的核心组成部分,它将 one-hot 类标签变成有意义的词,以利用预训练语言模型头。尽管它在 few-shot 设置中具有潜在的必要性,但在全数据监督设置中,Verbalizer 并不是必须的。它阻碍了提示调优在我们需要无实际意义的标签和句子嵌入的场景中的应用。因此,P-Tuning v2 回归传统的 CLS 标签分类范式,采用随机初始化的分类头(Classification Head)应用于 tokens 之上,以增强通用性,可以适配到序列标注任务
📝通俗解释:P-tuning v2综合了前面所有方法的优点:像Prefix-Tuning那样每层都加提示,但不用那个复杂的"翻译官"(MLP/LSTM)。不同任务用不同长度的提示,像多任务学习先让模型在各种任务上预习一下,再做具体的任务。而且它不再依赖"标签词映射",直接用分类头,这样就能做NER这类序列标注任务了。
4.4.3 P-tuning v2 优点是什么?
在输入前面的每层加入可微调的 Prompts tokens 作为输入,优点:
- 更多可学习的参数(从 P-tuning 和 Prompt Tuning 的 $0.01%$ 增加到 $0.1%-3%$),同时也足够参数高效
- 加入到更深层结构中的 Prompt 能给模型预测带来更直接的影响
解决了 Prompt Tuning 无法在小模型上有效提升的问题
将 Prompt Tuning 拓展至 NER 等序列标注任务上
📝通俗解释:比之前的提示方法学到更多参数(但仍然很少),因为加在更深层,对模型影响更大。而且终于能处理NER这种给每个词打标签的任务了!
4.4.4 P-tuning v2 缺点是什么?
抛弃了 prompt learning 中常用的 Verbalizer,回归到传统的 CLS 和 token label 分类范式,这其实某种程度上弱化了 prompt 的味道
📝通俗解释:为了能做更多任务,P-tuning v2牺牲了一些"提示"的特色变得更像传统微调了。
4.4.5 P-tuning v2 主要特点是什么?
- 更灵活的 Prompt 设计:P-tuning v2 允许使用更复杂的 prompt 结构,例如包含多个句子或段落的 prompt,这有助于模型更好地理解和处理复杂的任务
- 更高效的优化:P-tuning v2 采用了更高效的优化策略,例如使用 AdamW 优化器和适当的学习率调度,以加快训练过程并提高收敛速度
- 更好的泛化能力:通过改进的 prompt 设计和优化策略,P-tuning v2 在多个下游任务上显示出更好的泛化能力,即使在训练数据有限的情况下也能保持稳定的性能
- 更少的调参需求:P-tuning v2 减少了对超参数调整的需求,使得用户可以更容易地应用该方法到不同的任务上
- 适应性:P-tuning v2 可以适应不同的模型大小和架构,这使得它在不同的预训练模型上都具有较好的适用性
📝通俗解释:P-tuning v2就像一个更智能的工具:可以用更复杂的提示(多段话都行),训练更快(用了更好的优化器),效果更稳定(数据少也不怕),而且不用天天调参数,什么模型都能用。
总结
| 方法 | 主要特点 | 适用场景 |
|---|---|---|
| Prefix-Tuning | 每层加前缀,保留MLP | NLG任务 |
| Prompt-Tuning | 仅输入层加提示 | 通用场景 |
| P-tuning | 加入LSTM+MLP编码器 | NLU任务 |
| P-tuning v2 | 深层提示+多任务学习 | 通用场景+序列标注 |
📝通俗解释总结:提示学习就是给大模型一个"小抄",让它不用重新学习就能做新任务。从简单到复杂有四种"小抄"写法:Prefix-Tuning像在每页书角贴笔记,Prompt-Tuning像只在封面写提示,P-tuning像请了个"翻译官"帮忙整理提示,P-tuning v2则是综合了所有优点,还能做词性标注这种高级任务。