大模型参数高效微调技术原理综述(三)-P-Tuning、P-Tuning v2

本文详细介绍了P-Tuning和P-Tuningv2,两种在大模型参数高效微调中的技术,尤其关注它们如何解决大模型Prompt设计问题和提升模型性能。P-Tuningv2作为改进,适用于不同规模和任务,展现出与微调相当的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

随着,ChatGPT 迅速爆火,引发了大模型的时代变革。然而对于普通大众来说,进行大模型的预训练或者全量微调遥不可及。由此,催生了各种参数高效微调技术,让科研人员或者普通开发者有机会尝试微调大模型。

因此,该技术值得我们进行深入分析其背后的机理,本系列大体分七篇文章进行讲解。

本文为大模型参数高效微调技术原理综述的第三篇。

P-Tuning

背景

该方法的提出主要是为了解决这样一个问题:大模型的Prompt构造方式严重影响下游任务的效果。比如:GPT-3采用人工构造的模版来做上下文学习(in context learning),但人工设计的模版的变化特别敏感,加一个词或者少一个词,或者变动位置都会造成比较大的变化。

image.png
image.png

同时,近来的自动化搜索模版工作成本也比较高,以前这种离散化的token的搜索出来的结果可能并不是最优的,导致性能不稳定。

基于此,作者提出了P-Tuning,设计了一种连续可微的virtual token(同Prefix-Tuning类似)。

image.png
image.png

技术原理

P-Tuning(论文:GPT Understands, Too),该方法将Prompt转换为可以学习的Embedding层,并用MLP+LSTM的方式来对Prompt Embedding进行一层处理。

image.png
image.png

相比Prefix Tuning,P-Tuning加入的可微的virtual token,但仅限于输入层,没有在每一层都加;另外,virtual token的位置也不一定是前缀,插入的位置是可选的。这里的出发点实际是把传统人工设计模版中的真实token替换成可微的virtual token。

image.png
image.png

经过预训练的LM的词嵌入已经变得高度离散,如果随机初始化virtual token,容易优化到局部最优值,而这些virtual token理论是应该有相关关联的。因此,作者通过实验发现用一个prompt encoder来编码会收敛更快,效果更好。即用一个LSTM+MLP去编码这些virtual token以后,再输入到模型。

从对比实验证实看出,P-Tuning获得了与全参数一致的效果。甚至在某些任务上优于全参数微调。

image.png
image.png
image.png
image.png

并且在实验中还发现,相同参数规模,如果进行全参数微调,Bert的在NLU任务上的效果,超过GPT很多;但是在P-Tuning下,GPT可以取得超越Bert的效果。

image.png
image.png

P-Tuning v2

背景

之前的Prompt Tuning和P-Tuning等方法存在两个主要的问题:

第一,缺乏模型参数规模和任务通用性。

  • 缺乏规模通用性:Prompt Tuning论文中表明当模型规模超过100亿个参数时,提示优化可以与全量微调相媲美。但是对于那些较小的模型(从100M到1B),提示优化和全量微调的表现有很大差异,这大大限制了提示优化的适用性。
  • 缺乏任务普遍性:尽管Prompt Tuning和P-tuning在一些 NLU 基准测试中表现出优势,但提示调优对硬序列标记任务(即序列标注)的有效性尚未得到验证。

第二,缺少深度提示优化,在Prompt Tuning和P-tuning中,连续提示只被插入transformer第一层的输入embedding序列中,在接下来的transformer层中,插入连续提示的位置的embedding是由之前的transformer层计算出来的,这可能导致两个可能的优化挑战。

  • 由于序列长度的限制,可调参数的数量是有限的。
  • 输入embedding对模型预测只有相对间接的影响。

考虑到这些问题,作者提出了Ptuning v2,它利用深度提示优化(如:Prefix Tuning),对Prompt Tuning和P-Tuning进行改进,作为一个跨规模和NLU任务的通用解决方案。

技术原理

P-Tuning v2(论文: P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks),该方法在每一层都加入了Prompts tokens作为输入,而不是仅仅加在输入层,这带来两个方面的好处:

  • 更多可学习的参数(从P-tuning和Prompt Tuning的0.01%增加到0.1%-3%),同时也足够参数高效。
  • 加入到更深层结构中的Prompt能给模型预测带来更直接的影响。
image.png
image.png

具体做法基本同Prefix Tuning,可以看作是将文本生成的Prefix Tuning技术适配到NLU任务中,然后做了一些改进:

  • 移除重参数化的编码器。以前的方法利用重参数化功能来提高训练速度和鲁棒性(如:Prefix Tuning中的MLP、P-Tuning中的LSTM))。在 P-tuning v2 中,作者发现重参数化的改进很小,尤其是对于较小的模型,同时还会影响模型的表现。
  • 针对不同任务采用不同的提示长度。提示长度在提示优化方法的超参数搜索中起着核心作用。在实验中,我们发现不同的理解任务通常用不同的提示长度来实现其最佳性能,这与Prefix-Tuning中的发现一致,不同的文本生成任务可能有不同的最佳提示长度。
  • 引入多任务学习。先在多任务的Prompt上进行预训练,然后再适配下游任务。多任务学习对我们的方法来说是可选的,但可能是相当有帮助的。一方面,连续提示的随机惯性给优化带来了困难,这可以通过更多的训练数据或与任务相关的无监督预训练来缓解;另一方面,连续提示是跨任务和数据集的特定任务知识的完美载体。我们的实验表明,在一些困难的序列任务中,多任务学习可以作为P-tuning v2的有益补充。
  • 回归传统的分类标签范式,而不是映射器。标签词映射器(Label Word Verbalizer)一直是提示优化的核心组成部分,它将one-hot类标签变成有意义的词,以利用预训练语言模型头。尽管它在few-shot设置中具有潜在的必要性,但在全数据监督设置中,Verbalizer并不是必须的。它阻碍了提示调优在我们需要无实际意义的标签和句子嵌入的场景中的应用。因此,P-Tuning v2回归传统的CLS标签分类范式,采用随机初始化的分类头(Classification Head)应用于tokens之上,以增强通用性,可以适配到序列标注任务。

image.png
image.png

论文中展示了P-tuning v2在不同模型规模下的表现。对于简单的NLU任务,如SST-2(单句分类),Prompt Tuning和P-Tuning在较小的规模下没有显示出明显的劣势。但是当涉及到复杂的挑战时,如:自然语言推理(RTE)和多选题回答(BoolQ),它们的性能会非常差。相反,P-Tuning v2在较小规模的所有任务中都与微调的性能相匹配。并且,P-tuning v2在RTE中的表现明显优于微调,特别是在BERT中。

image.png
image.png

上面讨论了P-Tuning v2无论何种规模都可以与微调相媲美。然而,GLUE和SuperGLUE的大多数任务都是相对简单的NLU问题。

为了评估P-Tuning v2在一些困难的NLU挑战中的能力,作者选择了三个典型的序列标注任务(名称实体识别、抽取式问答(QA)和语义角色标签(SRL)),共八个数据集。我们观察到P-Tuning v2在所有任务上都能与全量微调相媲美。

image.png
image.png

论文还通过消融实验研究了不同任务上Prompt Length的影响:

  • 针对简单任务:如情感分析,较短的Prompt(~20)即可取得不错的效果。
  • 针对复杂任务:如阅读理解,需要更长的Prompt(~100)。
image.png
image.png

总之,P-Tuning v2是一种在不同规模和任务中都可与微调相媲美的提示方法。P-Tuning v2对从330M到10B的模型显示出一致的改进,并在序列标注等困难的序列任务上以很大的幅度超过了Prompt Tuning和P-Tuning。P-Tuning v2可以成为微调的综合替代方案和未来工作的基线(Baseline)。

结语

本文针对讲述了来自清华大学的团队发布的两种参数高效Prompt微调方法P-Tuning、P-Tuning v2,可以简单的将P-Tuning认为是针对Prompt Tuning的改进,P-Tuning v2认为是针对Prefix Tuning的改进。

image.png
image.png

下文将对高效微调方法Adapter Tuning及其变体进行讲解。如果觉得我的文章能够能够给你带来帮助,欢迎点赞收藏加关注~~

### P-tuning v2微调原理详解 P-tuning v2 是一种针对预训练语言模型的提示微调方法,由清华大学的研究团队提出。该方法的核心目标是通过设计特定的连续型提示(continuous prompt),使模型能够更好地适应各种自然语言处理任务,尤其是对于较小规模的语言模型[^1]。 #### 提示学习的基础概念 传统的迁移学习通常依赖于全量参数微调(fine-tuning),即调整整个模型的所有权重来适配下游任务。然而,这种方法存在两个主要问题:一是计算成本高,二是容易过拟合到小型数据集上。相比之下,提示学习(prompt learning)仅优化少量可学习参数,从而显著降低资源消耗并提高泛化能力。P-tuning v2 就是在这一背景下提出的改进版本[^3]。 #### 连续型提示的设计 在 P-tuning v2 中,引入了一组虚拟标记(virtual tokens),这些标记被嵌入到输入序列中作为额外的信息源。具体来说,假设原始输入为 \(X\),则新的输入形式可以表示为 \([P, X]\),其中 \(P\) 表示一组长度固定的连续型提示向量。这些提示向量会被初始化并通过梯度下降算法进行更新,以便最大化目标任务上的表现。 以下是实现过程中的几个关键技术点: 1. **提示初始化策略** - 初始阶段,提示向量可以通过随机方式或者基于某些启发式规则设定其值域范围。 - 实验表明,采用正态分布采样的初始值往往能带来更稳定的学习曲线。 2. **联合优化机制** - 不同于早期版本只关注提示本身的质量提升,P-tuning v2 同时考虑到了如何让基础模型更好地响应所给定的提示信号。 - 此外还探索了多种损失函数组合方案以进一步增强整体框架的有效性[^2]。 3. **跨模态扩展潜力** - 鉴于当前多模态应用日益增多的趋势,研究者也尝试验证此技术能否顺利迁移到图像-文本等领域内的复杂场景之中去。 ```python import torch from transformers import BertTokenizer, BertForMaskedLM tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertForMaskedLM.from_pretrained('bert-base-uncased') def create_continuous_prompt(prompt_length=10): """创建一个指定长度的连续型提示""" return torch.randn((1, prompt_length, model.config.hidden_size)) # 假设我们有一个大小为10的连续型提示 continuous_prompt = create_continuous_prompt() input_ids = tokenizer("This is a test sentence.", return_tensors="pt")["input_ids"] inputs_embeds = model.bert.embeddings(input_ids) # 将连续型提示拼接到实际输入之前 full_inputs_embeds = torch.cat([continuous_prompt, inputs_embeds], dim=1) attention_mask = torch.ones(full_inputs_embeds.shape[:2]) outputs = model(inputs_embeds=full_inputs_embeds, attention_mask=attention_mask) logits = outputs.logits ``` 上述代码片段展示了如何构建并利用连续型提示完成一次前向传播操作。值得注意的是,在真实应用场景下还需要定义合适的反向传播路径以及相应的超参调节流程等细节部分。 --- #### 性能比较分析 通过对多个基准测试集合上的实验结果对比发现,当应用于中小规模预训练模型时,P-tuning v2 显著优于其他几种主流的方法论,包括但不限于标准 Fine-Tuning 初代 Prompt Tuning 技术。特别是在 SuperGLUE 数据集中,它能够在低于十亿参数级别的条件下达到甚至超越完全微调所带来的收益水平。 综上所述,凭借创新性的架构设计思路及其卓越的实际运用成效,使得 P-tuning v2 成为了当下极具竞争力的一项研究成果之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃果冻不吐果冻皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值