Prompt-Tuning
面向预训练语言模型的 Prompt-Tuning 技术发展历程
Prompt-Tuning 自从 GPT-3 被提出以来,从传统的离散、连续的 Prompt 的构建、走向面向超大规模模型的 In-Context Learning、Instruction-tuning 和 Chain-of-Thought。
自从 GPT、EMLO、BERT 的相继提出,以Pre-training + Fine-tuning
的模式在诸多自然语言处理(NLP)任务中被广泛使用,其先在Pre-training
阶段通过一个模型在大规模无监督语料上预先训练一个 预训练语言模型(Pre-trained Language Model,PLM) ,然后在Fine-tuning
阶段基于训练好的语言模型在具体的下游任务上再次进行 微调(Fine-tuning) ,以获得适应下游任务的模型。
这种模式在诸多任务的表现上超越了传统的监督学习方法,不论在工业生产、科研创新还是竞赛中均作为新的主流方式。然而,这套模式也存在着一些问题。例如,在大多数的下游任务微调时, 下游任务的目标与预训练的目标差距过大 导致提升效果不明显, 微调过程中依赖大量的监督语料 等。
至此,以 GPT-3、PET 为首提出一种基于预训练语言模型的新的微调范式——Prompt-Tuning ,其旨在通过添加模板的方法来避免引入额外的参数,从而让语言模型可以在小样本(Few-shot)或零样本(Zero-shot)场景下达到理想的效果。Prompt-Tuning 又可以称为 Prompt、Prompting、Prompt-based Fine-tuning 等。
因此简单的来说,Prompt-Tuning 的动机旨在解决目前传统 Fine-tuning 的两个痛点问题:
- 降低语义差异(Bridge the gap between Pre-training and Fine-tuning) :预训练任务主要以 Masked Language Modeling(MLM)为主,而下游任务则重新引入新的训练参数,因此两个阶段的目标通常有较大差异。因此需要解决如何缩小 Pre-training 和 Fine-tuning 两个阶段目标差距过大的问题;
- 避免过拟合(Overfitting of the head) :由于在 Fine-tuning 阶段需要新引入额外的参数以适配相应的任务需要,因此在样本数量有限的情况容易发生过拟合,降低了模型的泛化能力。因此需要面对预训练语言模型的过拟合问题。
Prompt vs Fine-tuning
Fine-tuning:预训练语言模型“迁就”各种下游任务 具体体现就是上面提到的通过引入各种辅助任务 loss,将其添加到预训练模型中,然后继续 pre-training,以便让其更加适配下游任务。总之,这个过程中,预训练语言模型 (opens new window)做出了更多的牺牲。
先在 Pre-training 阶段通过一个模型在大规模无监督语料上预先训练一个 预训练语言模型(Pre-trained Language Model,PLM) ,然后在 Fine-tuning 阶段基于训练好的语言模型在具体的下游任务上再次进行 微调(Fine-tuning) ,以获得适应下游任务的模型。
问题:在大多数的下游任务微调时, 下游任务的目标与预训练的目标差距过大 导致提升效果不明显, 微调过程中依赖大量的监督语料 等。
Prompting 中,是各种下游任务“迁就预训练语言模型。 具体体现也是上面介绍的,我们需要对不同任务进行重构,使得它达到适配预训练语言模型的效果。总之,这个过程中,是下游任务做出了更多的牺牲。
Prompt-Tuning Prompt-Tuning 又可以称为 Prompt、Prompting、Prompt-based Fine-tuning
- In-context Learning :是 Prompt 的前身。其通过从训练集中挑选一些样本作为任务的提示提示(Natural Language Prompt),来实现免参数更新的模型预测;
- Demonstration Learning :添加一些新的文本作为提示。例如在对“I like the Disney film. It was [MASK]”进行情感分析时,可以拼接一些相似场景的 ground-truth 文本“I like the book, it was great.”、“The music is boring. It is terrible for me.”等。此时模型在根据新添加的两个样例句子就可以“照葫芦画瓢”式地预测结果了
Prompt-Tuning 的研究进展
连续提示模板
假设针对分类任务, 给定一个输入句子
, 连续提示的模板可以定义为: 其中 则是伪标记, 其仅代表一个抽象的 token, 并没有实际的含义, 本质上是一个向量。
Prompt-Tuning 的本质
Prompt 是一种针对任务的指令
Prompt 本质上是对下游任务的指令,可以作为一种信息增强。
简单的来说,就是告诉模型需要做什么任务,输出什么内容。上文我们提及到的离散或连续的模板,本质上就是一种对任务的提示。当数据集不同(乃至样本不同)的时候,我们期望模型能够自适应的选择不同的模板,这也相当于说不同的任务会有其对应的提示信息。
例如在对电影评论进行二分类的时候,最简单的提示模板是“. It was [mask].”,但是其并没有突出该任务的具体特性,我们可以为其设计一个能够突出该任务特性的模板,例如“The movie review is . It was [mask].”,然后根据 mask 位置的输出结果通过 Verbalizer 映射到具体的标签上。这一类具备任务特性的模板可以称之为指令(Instruction)。
下面展示几个任务设计的指令模板:

看似设计指令是一件容易的事情,但是在真实使用过程中,预训练模型很难“理解”这些指令,根据最近研究工作发现,主要总结如下几个原因:
预训练模型不够大 :我们常使用的 BERT-base、BERT-large、RoBERTa-base 和 RoBERTa-large 只有不到 10 亿参数,相比于现如今 GPT-3、OPT 等只能算作小模型,有工作发现,小模型在进行 Prompt Tuning 的时候会比 Fine-tuning 效果差,是因为小模型很容易受到模板的影响
对比一下传统的 Fine-tuning,每个样本的输入几乎都是不同的,然而基于 Prompt 的方法中,所有的样本输入都会包含相同的指令,这就导致小模型很容易受到这些指令带来的干扰。
缺乏指令相关的训练 :这些小模型在预训练阶段没有专门学习过如何理解一些特殊的指令。
我们回顾一下上面章节,不论是生成离散的模板还是连续的模板,都是在向现有的预训练语言模型进行“妥协”,即找到能够让当前预训练语言模型在小样本上效果最好的模板,或者说是站在已有预训练模型的基础上寻找模板。然而这种寻找到的模板不可读也不可解释,或者过于通用,不具备任务特性,无法很好地在真实场景下使用。因此,我们需要的是先设计好任务相关的指令,使得这些指令是可读的,可在真实场景下使用的。不过由于预训练模型没见过这些指令,所以很难在小样本上快速理解它们。
复用预训练目标——实现基于 Prompt 的统一范式
Prompt 的本质是参数有效性学习
根据前文的讲解,我们可以发现,实现 Prompt-Tuning 只需要考虑如何设计模板或指令,而模型和训练目标则都是复用预训练阶段的,即在整个训练过程中,无须添加任何参数(或只需要添加非常少量的与模板有关的参数),而其他参数都是训练好的。基于这个思想,我们再一次将 Prompt 升华到更高的层面—— Prompt 的本质是参数有效性学习(Parameter-Efficient Learning,PEL) 。
参数有效性学习的背景 :在一般的计算资源条件下,大规模的模型(例如 GPT-3)很难再进行微调,因为所有的参数都需要计算梯度并进行更新,消耗时间和空间资源。为了解决这个问题,参数有效性学习被提出,其旨在确保模型效果不受太大影响的条件下尽可能地提高训练的时间和空间效率。 参数有效性训练 :在参数有效性学习过程中,大模型中只需要指定或额外添加少量的可训练参数,而其余的参数全部冻结,这样可以大大提高模型的训练效率的同时,确保指标不会受到太大影响。
常见经典的参数有效性学习有Adapter-Tuning、Prefix-Tuning、BitFit。下面进行简单的介绍。
(1)Adapter-Tuning
Adapter-Tuning 在 2019 年提出,其面向预训练语言模型的参数有效性学习。在多层 Transformer 模型中,在微调过程中所有的参数都需要更新,显然并不是有效的。为了提高效率,该方法提出固定 Transformer 的全部参数,然后在 Transformer 的每一个 Block 里嵌入一些新初始化的 Adapter Network。如下图所示:

(2)Prefix-Tuning
Prefix-Tuning 也是很经典的参数有效性学习,其是受到 Prompt-Tuning 的启发。我们说 Prompt-Tuning 的本质是参数有效性学习,是因为整个预训练模型参数可以全部固定,只需要对 Template 对应的少量参数(例如连续模板的 Prompt Encoder、伪标记对应的 Embedding 等)进行训练。在 Prefix-Tuning 中,则是除了对输入层添加模板外,还对 Transformer 的每一层添加“模板”。Prefix-Tuning 与传统 Fine-tuning 的对比图如下所示:

可以看到,Transformer 的参数完全固定,而我们只需要对 Prefix 部分进行训练即可,对于不同的任务训练不同的 Prefix,在实际使用时,挑选任务相关的 Prefix 和 Transformer 进行组装,实现可插拔式的应用。 与 Prefix-Tuning 类似的方法还有 P-tuning V2,不同之处在于 Prefix-Tuning 是面向文本生成领域的,P-tuning V2 面向自然语言理解。但本质上完全相同。下图针对 Prefix-tuning(P-tuning V2)与 Prompt-Tuning 对比(黄色部分表示可训练的参数,蓝色表示被冻结的参数):

左图表示的是基于连续提示的 Prompt-Tuning(例如 P-tuning),我们可以发现只有输入层对应模板部分的 Embedding 和 MLP 参数是可训练的,右图部分表示 Prefix-Tuning(P-tuning V2),Transformer 的每一层的前缀部分也是可训练的,可以抽象的认为是在每一层添加了连续的模板。但是实际上,Prefix-Tuning(P-tuning V2)并不是真正的在每一层添加模板,而是通过 HuggingFace 框架内置的 past_key_value 参数控制。其本质上与 Adapter 类似,是在 Transformer 内部对 Key 和 Value 插入可训练的两个 MLP。
有相关工作对 Adapter、Prefix-Tuning、LoRA 等参数有效性学习进行了集成,因为这些参数有效性学习方法本质上都是插入少量的新的参数,这些新的参数可以对预训练模型起到提示作用,只不过并不是以人类可读的离散的模板形式体现而已。
下图是《UniPELT: A Unified Framework for Parameter-Efficient Language Model Tuning》提出将这些参数有效性方法进行统一,提出 UniPELT 框架:

(3)BitFit
BitFit 的思想更简单,其不需要对预训练模型做任何改动,只需要指定神经网络中的偏向(Bias)为可训练参数即可,BitFit 的参数量只有不到 2%,但是实验效果可以接近全量参数。
介绍了上述的一些参数有效性方法,我们发现,Prompt-Tuning 也符合其主旨。基于参数有效性的思想,也有许多工作致力于 Prompt 与参数有效性的结合,例如《Delta Tuning: A Comprehensive Study of Parameter Efficient Methods for Pre-trained Language Models》、《LiST: Lite Prompted Self-training Makes Parameter-efficient Few-shot Learners》、《Making Parameter-efficient Tuning More Efficient: A Unified Framework for Classification Tasks》、《P-Adapters- Robustly Extracting Factual Information from Language Models with Diverse Prompts》、《Context-Tuning: Learning Contextualized Prompts for Natural Language Generation》,由于相关工作非常多而且更新频繁,这里不一一介绍。
面向超大规模模型的 Prompt-Tuning
Prompt-Tuning 发展的两年来,有诸多工作发现,对于超过 10 亿参数量的模型来说,Prompt-Tuning 所带来的增益远远高于标准的 Fine-tuning,小样本甚至是零样本的性能也能够极大地被激发出来,得益于这些模型的参数量足够大,训练过程中使用了足够多的语料,同时设计的预训练任务足够有效。最为经典的大规模语言模型则是 2020 年提出的 GPT-3,其拥有大约 1750 亿的参数,且发现只需要设计合适的模板或指令即可以实现免参数训练的零样本学习。
2022 年底到 2023 年初,国内外也掀起了 AIGC 的浪潮,典型代表是 OpenAI 发布的 ChatGPT、GPT-4 大模型,Google 发布的 Bard 以及百度公司发布的文心一言等。超大规模模型进入新的纪元,而这些轰动世界的产物,离不开强大的 Prompt-Tuning 技术。本文默认以 GPT-3 为例,介绍几个面向超大规模的 Prompt-Tuning 方法,分别为:
- 上下文学习 In-Context Learning(ICL) :直接挑选少量的训练样本作为该任务的提示;
- 指令学习 Instruction-tuning :构建任务指令集,促使模型根据任务指令做出反馈;
- 思维链 Chain-of-Thought(CoT) :给予或激发模型具有推理和解释的信息,通过线性链式的模式指导模型生成合理的结果。
In-Context Learning(上下文学习)
In-Context learning(ICL)最早在 GPT-3 中提出, 旨在从训练集中挑选少量的标注样本,设计任务相关的指令形成提示模板,用于指导测试样本生成相应的结果 。ICT 的工作原理如下所示: