
大模型 Prompt 高效微调技术详解
大模型高效微调主要包含 Prefix-tuning、P-Tuning、Prompt Tuning 及 P-Tuning v2 等方法。这些技术通过添加连续可训练的前缀或软提示,在冻结大部分模型参数的情况下适应下游任务,解决了传统微调中语义差异大、过拟合及算力成本高的问题。PEFT 框架进一步整合了 Adapter、LoRA 等技术,实现了参数高效微调。实践中可使用 LLaMA-Factory 等工具进行部署。

大模型高效微调主要包含 Prefix-tuning、P-Tuning、Prompt Tuning 及 P-Tuning v2 等方法。这些技术通过添加连续可训练的前缀或软提示,在冻结大部分模型参数的情况下适应下游任务,解决了传统微调中语义差异大、过拟合及算力成本高的问题。PEFT 框架进一步整合了 Adapter、LoRA 等技术,实现了参数高效微调。实践中可使用 LLaMA-Factory 等工具进行部署。


国内外目前有很多大语言模型,如 GPT3、GPT4、ChatGLM、Llama、Baichuan、PanGu 等,在自然语言处理任务中各有千秋。在面对具体的任务时,我们需要对大语言模型在已有的基础上进行训练、微调等,以获得适应下游任务的模型。
自从 GPT、ELMo、BERT 的相继提出,以 Pre-training + Fine-tuning 的模式在诸多自然语言处理 (NLP) 任务中被广泛使用。
首先是预训练阶段,使用大量的无监督语料库来训练通用的预训练语言模型 (PLM),此时尚未设定特定任务目标。这一阶段的目的在于使模型掌握语言的基本特征,例如语法、上下文关联及词义等。
然后是微调阶段,我们将经过预训练的模型应用于具体的下游任务,使模型适应这些具体的任务,如情感分析、问答系统或文本分类等。在微调过程中,模型的参数会被针对性地调整以适应特定的任务。
这种模式在诸多任务的表现上超越了传统的监督学习方法,不论在工业生产、科研创新还是竞赛中均作为新的主流方式。然而,这套模式也存在着一些问题。例如,在大多数的下游任务微调时,下游任务的目标与预训练的目标差距过大导致提升效果不明显,微调过程中依赖大量的监督语料等。
以 GPT-3、PET(Pattern-Exploiting Training)为首提出一种基于预训练语言模型的通过 Prompt 进行微调的新范式,通过添加模板的方法来避免引入额外的参数,从而让语言模型可以在小样本 (Few-shot) 或零样本 (Zero-shot) 场景下达到理想的效果。旨在解决目前传统 Fine-tuning 的两个痛点问题:
下面按时间线分别介绍 Prefix-tuning、P-tuning、Prompt Tuning、P-Tuning v2 这几个常用的微调方法以及 PEFT 统一框架。
Prefix-tuning 最早于 2021 年由斯坦福大学研究团队提出,是一种轻量级的微调方法。该方法在固定预训练语言模型参数的前提下,添加一个前缀,通过优化该前缀的少量参数,就能够达到不错的微调效果。
由于人工设计/自动化搜索的离散型 Prompt 对模型优化的鲁棒性很差,因此 Prefix-tuning 使用了连续可调的矩阵来调整 Prompt。在训练时,Prefix-tuning 在模型输入前添加一个连续且任务特定的向量序列(即 Prefix),固定 PLM 的所有参数,只更新优化特定任务的 Prefix。其中,Prefix 可以通过训练得到。

例如,对于 Decoder-only 的 GPT,Prefix 只加在句首,模型的输入表示为:

而对于 Encoder-Decoder 的 BART,不同的 Prefix 同时加在编码器和解码器的开头:

在下游微调时,LM 的参数被冻结,只有 Prefix 部分的参数进行更新。
Prefix-tuning 将 Prefix 参数(可训练的张量)添加到所有的 transformer 层,如下图。

机制:将多个 prompt vectors 放在每个 multi-head attention 的 key 矩阵和 value 矩阵之前。注意,P-Tuning 是加在 embedding 矩阵上。
计算方式:相当于原始的 token 要多和这些 soft prompt token 计算相似度,然后聚合。

其中是一个标量,表示 Prefix 上的归一化注意力权重之和:

通过上面等式的变换,等式的前部分是不加入 Prefix 向量的初始 attention 计算的公式,后半部分则是上下文向量无关的部分。通过一个类似门的机制来计算前后两部分的比重,如果用 h 表示原本的 attention 模块输出,则 Prefix-tuning 的 attention 计算可以写成如下形式:

那么,加入 Prefix 的 attention 模块输出等于原本 attention 模型输出和一个与上下文无关的增量之间的加权平均。
作者发现直接更新多个虚拟 token 的参数效果不稳定,因此在 Prefix 层加了 MLP,分解成了更小的 embedding 层 更大的 MLP 层。原始的 embedding 层参数是 n_prefix emb_dim,调整后变为 n_prefix n_hidden + n_hidden * emb_dim。训练完成后这部分就不再需要只保留 MLP 输出的参数进行推理即可。
prefix 部分到底使用多少个虚拟 token,直接影响模型微调的参数量级,以及处理长文本的能力。默认的 prefix 长度为 10,作者在不同任务上进行了微调,整体上 prompt 部分的参数量都在原模型的~0.1%。
Prefix-tuning 会针对不同的用户数据提供特定的 Prefix 进行训练,避免数据交叉污染,且支持在单个批处理任务中处理来自多个用户/任务的示例。
Prefix Tuning 的主要贡献如下:
相较于 Full fine-tuning 而言,大幅度减少了需要存储的副本参数量。
在少量数据的微调上,效果优于 Full fine-tuning。
相较于其他 PEFT 技术而言,Prefix-tuning 支持在单个批处理任务中处理来自多个用户/任务的示例。
但对于一些特定领域的复杂任务而言,可能需要更加复杂的模型结构和更加精细的微调方法。在这种情况下,Prefix-tuning 可能无法达到最佳的模型微调效果。
清华大学的研究者于 2021 年发表论文《GPT Understands, Too》提出 P-Tuning 方法,其与 Prefix Tuning 类似,比如考虑到神经网络本质上是连续的,故离散提示可能不是最优的,从而也采取连续的提示,而 P-Tuning 方法是将可训练的连续提示嵌入与离散提示相结合,以提高稳定性和性能。
论文实验结果表明,P-Tuning 最大限度地减少了不同离散提示之间的性能差距,并在各种 NLU 任务(包括 LAMA 和 SuperGLUE)上实现了显着改进,这颠覆了在那年之前'GPT 不擅长 NLU'的结论,也是该论文命名的缘由。
下图是一个 Prompt Search 针对'The capital of Britain is [MASK]'(英国的首都是哪个城市) 的例子。即给定上下文 (蓝色区域,'英国') 和目标 (红色区域,'[MASK]'),橙色区域指的是提示符号 Prompt tokens。

在 (a) 中,Prompt Generator(提示生成器)只收到离散的奖励;在 (b) 中,Pseudo Prompts(伪提示)和 Prompt Encoder 可以以可微的方式进行优化,有时,在 (b) 中添加少量与任务相关的 Anchor tokens(如'capital') 将带来进一步的改进。
由此可见,P-Tuning 做法是用一些伪提示代替这些显式的 Prompt 也就是将自然语言提示的 token,替换为可训练的嵌入。
具体的做法是可以用预训练词表中的 unused token 作为伪提示,然后通过训练去更新这些 token 的参数,P-Tuning 的 Prompt 不是我们可以看得懂的字符,而是一些隐式的、经过训练的、模型认为最好的 Prompt tokens。
而相比 Prefix Tuning,P-Tuning 加了可微的 virtual token,但是仅限于输入,没有在每一层都加;另外 virtual token 的位置也不一定是前缀,插入的位置是可选的,这里的出发点实际是把传统人工设计模版中的真实 token 替换成可微的 virtual token。
经过预训练的 LM 的词嵌入已经变得高度离散,如果随机初始化 virtual token,容易优化到局部最优值,这些 virtual token 理论是应该有相关关联的,如何建模这种关联也是问题,因此,论文作者通过实验发现用一个 Prompt Encoder 来编码会收敛更快,效果更好。即用一个 LSTM+MLP 去编码这些 virtual token 以后,再输入到模型。换言之,P-Tuning 并不是随机初始化几个新 token 然后直接训练的,而是通过一个小型的 LSTM 模型把这几个 Embedding 算出来,并且将这个 LSTM 模型设为可学习的。
当预训练模型足够大的时候可能无法 Fine-tune 整个模型,而 P-Tuning 可以选择只优化几个 token 的参数,因此优化所需要的显存和算力都会大大减少,训练也会变快,同时效果也与 Fine-tune 基本持平,所以 P-Tuning 提供了一种在有限算力下调用大型预训练模型的思路。主要贡献如下:
Prompt Tuning 由谷歌在 2021 年论文《The Power of Scale for Parameter-Efficient Prompt Tuning》中提出。Prompt-Tunning 是 prefix-Tunning 的简化版本,与 LM 微调(Language Model Fine-tuning)相比,Prompt Tuning 是一种更加简单高效的方法,只需要在输入文本前添加少量可训练的'软提示'(soft prompts),而不需要对整个模型进行微调。这种方法可以在保留预训练模型通用能力的同时,针对特定任务进行高效的定制和迁移,在大型语言模型上取得了与完全微调相当的性能。
Prompt Tuning 是一种简单有效的机制,用'soft prompts'来调节预训练的语言模型,使其能够执行特定的下游任务。与 GPT-3 使用的离散文本提示不同,'soft prompts'通过反向传播进行学习,可以利用任意数量的标注样本来进行调整。与完全微调相比,Prompt Tuning 只需要更新少量的提示参数,而不需要对整个预训练模型进行微调。这种参数高效性使得 Prompt Tuning 的性能能够接近完全微调,且在大规模语言模型上表现更加出色。
具体来说,Prompt Tuning 将一个可学习的软提示参数 Pe 拼接到输入序列的前面,然后输入到编码器 - 解码器模型中。模型被训练去最大化输出序列的似然概率,但只有提示参数 Pe 会被更新,而预训练模型的其他参数保持不变。这种显式地将任务特定的参数与通用的语言理解参数分离,带来了一系列额外的好处,如更好的领域迁移性能和更高效的 Prompt 集成。

论文中,对比 Prefix-Tunning,Prompt Tuning 使用 100 个 prefix token 作为默认参数,大于以上 prefix-tuning 默认的 10 个 token。不过差异在于 prompt-Tunning 只对输入层 (Embedding) 进行微调,而 Prefix 是对虚拟 Token 对应的上游 layer 全部进行微调。因此 Prompt tuning 的微调参数量级要更小,且不需要修改原始模型结构,相当于进行了简化。
相同的 prefix 长度,Prompt Tuning(<0.01%) 微调的参数量级要比 Prefix-tuning(0.1%~1%) 小 10 倍以上,如下图所示。

为什么上面 prefix-tuning 只微调 embedding 层效果就不好,放在 Prompt Tuning 这里效果就好了呢?因为评估的任务不同无法直接对比,主要有两个因素,一个是模型规模,另一个是继续预训练,前者的可能更大些,在下面的实验中会提到。
在 SuperGLUE 任务上,随着模型参数的上升,Prompt Tuning 快速拉近和模型微调的效果,110 亿的 T5 模型 (上面 prefix-tuning 使用的是 15 亿的 GPT2),已经可以打平在下游多任务联合微调的 LM 模型,并且远远的甩开了 Prompt Design(GPT3 few-shot)。

作者也做了全面的消融实验,包括以下 4 个方面,最核心的感受就是随着模型规模的增大,Prompt Tuning 与完全微调的性能差距逐渐缩小,最终达到了相当的水平。
prompt 长度 (a):固定其他参数,作者尝试了{1,5,20,100,150},当模型规模到百亿后,只要 prompt 长度大于 1,更长的 prompt 并不能带来效果提升。
Prompt 初始化 (b):作者尝试了随机 uniform 初始化,用标签文本空间初始化,和用 Top5K 高频词采样初始化,在 10^8 规模,标签词初始化效果最好。作者发现预测 label 也会在对应 prompt 空间内。不过到百亿规模后,初始化带来的影响就会消失。
T5 继续预训练 (c):作者认为 T5 本身的 Span Corruption 预训练目标和掩码词,并不适合冻结 LM 的场景,因为在微调中模型可以调整预训练目标和下游目标的差异,而只使用 prompt 可能无法弥合差异。其实这里已经能看出 En-Dn 框架在生成场景下没有 GPT 这样的 Decoder 来的自然。因此作者基于 LM 目标对 T5 进行继续预训练。
继续预训练 step(d):以上的继续预训练 steps,继续预训练步数越高,模型效果在不同模型规模上越单调。

Prompt Tuning 为大型预训练语言模型的高效复用和迁移提供了一种有效的解决方案,具有重要的理论和实践意义。主要优势和贡献如下:
参数高效性:与其他方法相比,Prompt Tuning 只需要更新少量的提示参数,而不需要对整个预训练模型进行微调。
性能接近完全微调:通过在 T5 模型上的实验,随着模型规模的增大,Prompt Tuning 的性能越来越接近完全微调,在某些任务上甚至能超过完全微调。
泛化能力强:通过将任务特定的信息编码在提示中,同时保持模型参数不变,Prompt Tuning 在领域迁移问题上表现更好。
高效推理:由于只需要更新少量的提示参数,Prompt Tuning 保留了预训练模型的高效推理能力。
可解释性:学习到的提示参数具有一定的可解释性,可以帮助理解模型的行为。
提示集成:通过学习多个提示并进行集成,可以进一步提高性能,且更加高效。
总的来说,Prompt Tuning 在参数高效性、性能、泛化能力、推理效率以及可解释性等方面都展现出了优势。
P-Tuning 在规模通用性(规模较小的模型 P-Tuning 和 Fine-tune 表现仍有很大差异)、任务通用性(对硬序列标记任务的有效性尚未得到验证)存在局限性,且缺少深度 Prompt 优化,因此清华大学的研究者于 2022 年发表论文《P-Tuning v2:Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks》提出了 P-Tuning 的 v2 版本,利用并改进深度 Prompt 优化(如 Prefix Tuning),提供一个跨规模和 NLU 任务的通用解决方案。
P-Tuning v2 方法不仅仅在输入层,而是在每一层都加入了 Prompt tokens 作为输入,这样做有两方面好处:
如下图所示,橙色块(即 h0, …, hi)指的是可训练的 Prompt 嵌入;蓝色块是由冻结的预训练语言模型存储或计算的嵌入。

可以看作是将文本生成的 Prefix Tuning 技术适配到 NLU 任务中,然后做了如下具体改进:
1. 移除重参数化的编码器
以前的方法利用重参数化功能来提高训练速度和鲁棒性(如:Prefix Tuning 中的 MLP、P-Tuning 中的 LSTM)。在 P-Tuning V2 中,作者发现重参数化的改进很小,尤其是对于较小的模型,同时还会影响模型的表现,所以去掉了重参数化的编码器。
2. 针对不同任务采用不同的 Prompt 长度
Prompt 长度在 P-Tuning V2 方法中起着核心作用。在实验中,作者发现不同的 NLU 任务通常用不同的 Prompt 长度来实现其最佳性能,其实这与 Prefix-Tuning 中的发现一致,不同的文本生成任务可能有不同的最佳 Prompt 长度。
3. 引入可选的多任务学习
先在多任务的 Prompt 上进行预训练,然后再适配下游任务。多任务学习对 P-Tuning v2 来说是可选的,但可能是相当有帮助的。一方面,连续提示的随机惯性给优化带来了困难,这可以通过更多的训练数据或与任务相关的无监督预训练来缓解;另一方面,连续提示是跨任务和数据集的特定任务知识的完美载体。实验表明,在一些困难的序列任务中,多任务学习可以作为 P-Tuning v2 的有益补充。
4. 回归传统的分类标签范式,而不是映射器
标签词映射器(Label Word Verbalizer)一直是 Prompt Tuning(提示优化)的核心组成部分,它将 one-hot 类标签变成有意义的词,但在全数据监督设置中 Verbalizer 并不是必须的。它阻碍了 Prompt Tuning 在无实际意义的标签和句子嵌入的场景中的应用。因此,P-Tuning v2 回归传统的 CLS 标签分类范式,采用随机初始化的分类头(Classification Head)应用于 tokens 之上,以增强通用性,可以适配到序列标注任务。
P-Tuning v2 是一种在不同规模和任务中都可与 Fine-Tuning 相媲美的方法。P-Tuning v2 对从 330M 到 10B 的模型显示出一致的改进,并在序列标注等困难的序列任务上以很大的幅度超过了 Prompt Tuning 和 P-Tuning。主要贡献如下:
近年来,随着 ChatGPT 的爆火,大语言模型以其出色的自然语言处理能力和语言生成能力在科技领域引起了巨大的关注。虽然,大语言模型能够产生流畅、连贯的文本,回答复杂的问题,进行有趣的对话,并提供各种实用的功能,并且在多个领域的应用也取得了突破性进展。但是,其前所未有的规模也带来了巨大的计算成本。这些模型通常由数十亿个参数组成,需要大量计算资源才能执行。特别是在为特定领域或者任务定制模型时,其庞大的算力需求带来了很大的挑战。那么,在有限的资源下如何微调巨大的语言模型?
参数高效微调(Parameter-efficient fine-tuning, PEFT)为大家提供了一个解决方案。PEFT 是指通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本。如此,即使计算资源受限,也可以利用预训练模型的知识来迅速适应新任务,实现高效的迁移学习。其相较于对预训练语言模型(PLM)进行全量微调的高代价,仅需要微调少量模型参数,可以显著降低了算力成本。PEFT 优势如下所示:
当前,PEFT 方法可以分为三类,不同的方法在预训练模型的不同位置添加参数进行下游任务的适配:

如上图,使用虚线边框来表示这些方法添加的模块。绿色部分是 Adapter,其将 Adapter 模块插入到预训练模型的中间层;蓝色部分是 Prefix Tuning,其在输入或者隐层添加多个可学习的前缀 tokens;红色部分是 LoRA,其通过学习两个小参数的低秩矩阵来近似权重矩阵的参数更新。
当前,Huggingface 开源社区中的高效微调大模型的库已支持 LoRA、IA3、P-tuning、Prefix tuning、Prompt tuning 等方法。
笔者实践了 xTuring、LLaMA-Factory 等一些大模型微调工具,基本都可以通过简单的操作高效地完成微调任务。
xTuring 项目旨在提供快速、高效和简单的大模型微调,例如 LLaMA、GPT-J、GPT-2、OPT 等。通过提供一个易于使用的界面来将大模型定制为你自己的数据和应用程序,xTuring 使构建和控制 LLM 变得简单。整个过程可以在本地的计算机或私有云中完成,确保数据隐私和安全。
LLaMA-Factory 集合了多种常见的大模型、微调方法和微调参数,有一个强大完善的用户界面。用户只需要按格式要求准备好自己的训练数据集,选择好所需的大模型、微调方法和微调参数,即可一键执行大模型微调,过程中还可以实时查看 loss 的变化情况。训练完可以基于自己的验证数据集进行验证,还能直接加载微调后的模型,在对话界面直接验证微调后的问答效果。


微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online