P-Tuning v2:一种普遍有效的提示调整方法

 人工智能咨询培训老师叶梓 转载标明出处

预训练语言模型通过微调(fine-tuning)来适应特定任务虽然效果显著,但存在训练成本高、参数存储量大等问题。为了解决这些问题,清华大学的研究者们提出了一种名为P-Tuning v2的提示调整(prompt tuning)方法,该方法在不同规模的模型和多种自然语言理解(NLU)任务中表现出与微调相媲美的性能,同时大幅减少了训练时的存储和内存使用。

图1显示在SuperGLUE开发集上,不同规模的预训练模型(从330M到10B参数)在RTE、BoolQ和CB任务上的平均得分。P-Tuning v2的关键特点包括:

  • 多层面的提示调整:与传统的仅在输入层进行提示调整的方法不同,P-Tuning v2在模型的每一层都添加了提示,使得模型能够更直接地响应任务特定的需求。
  • 参数效率:P-Tuning v2只需要调整极小比例的参数(0.1%-3%),大大降低了训练时的内存成本和任务存储成本。
  • 通用性和简单性:P-Tuning v2在不同规模的模型和多种NLU任务上都表现出色,证明了其通用性和作为未来研究强基线(strong baseline)的潜力。

论文链接:https://arxiv.org/pdf/2110.07602

方法

图 2 展示了P-Tuning v2与其他提示调整方法的区别。图中橙色块表示可训练的提示嵌入(trainable prompt embeddings),而蓝色块表示由冻结的预训练语言模型存储或计算的嵌入。这种设计使得P-Tuning v2在不同规模和任务上都能达到与微调相媲美的性能。

(a):这一部分展示了Lester et al. (2021) 和 P-tuning 方法的结构,主要用于处理简单任务,且模型规模为10亿参数级别。在这种方法中,可训练的提示嵌入被添加到输入序列中,而预训练模型的参数则被冻结。尽管Lester et al. (2021) 和 Liu et al. (2021) 在许多自然语言处理(NLP)应用中表现出色,但在模型规模和任务上的普遍性不足,限制了它们替代微调的能力。特别是对于中等规模的模型(参数量从100M到1B),提示调整的性能远不如微调。

(b):这一部分展示了P-tuning v2 方法的结构,它适用于大多数模型规模和任务。P-Tuning v2采用了深度提示调整策略。与之前的方法相比,P-Tuning v2在模型的多个层次上引入了可训练的连续提示,而不仅仅是输入层。这种策略不仅增加了可训练参数的数量,提高了任务特定性能,而且通过在更深层次添加提示,直接增强了模型预测的能力。

如图2所示P-Tuning v2的结构中,提示被添加到不同的Transformer层作为前缀标记。一方面,P-Tuning v2具有更多的可训练任务特定参数(从0.01%到0.1%-3%),这允许更多的任务特定容量,同时保持参数效率;另一方面,添加到更深层次的提示对模型预测有更直接的影响。

为了实现最佳性能,P-Tuning v2在优化和实现方面进行了细致的调整。例如:

重参数化:研究发现其对不同任务和数据集的效果不一。在某些数据集(如RTE和CoNLL04)上,使用MLP(多层感知机)作为重参数化编码器可以带来一致的性能提升;而在其他数据集(如BoolQ和CoNLL12)上,MLP的效果则不明显。

提示长度: 提示长度在P-Tuning v2中起着至关重要的作用。研究者们发现,不同的NLU任务通常需要不同长度的提示来达到最佳性能。简单分类任务倾向于较短的提示,而复杂序列标注任务则需要更长的提示。

多任务学习: P-Tuning v2支持多任务学习,这可以在微调各个任务之前,通过共享连续提示共同优化多个任务,从而提供更好的初始化,进一步提升性能。

表 1 展示了P-Tuning v2与现有提示调整方法的概念比较。表中列出了不同方法在任务、重参数化、深度提示调整和多任务学习等方面的支持情况。P-Tuning v2在这些方面都表现出了较高的灵活性和适应性。

通过这些优化和实现细节,P-Tuning v2不仅在技术上实现了显著的改进,而且在实际应用中也展现出了广泛的适用性和高效性。研究者们的这些发现为未来NLU任务的研究和应用提供了新的视角和工具。

想要掌握如何将大模型的力量发挥到极致吗?叶老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具(限时免费)。

1小时实战课程,您将学习到如何轻松上手并有效利用 Llama Factory 来微调您的模型,以发挥其最大潜力。

CSDN教学平台录播地址:https://edu.csdn.net/course/detail/39987

实验

表 2 展示了 P-Tuning v2 在不同模型规模上的表现。研究者们使用了从 335M 到 10B 不同规模的模型进行实验,包括 BERT-large、RoBERTa-large、GLMxlarge/xxlarge。

在 SuperGLUE 基准测试中,P-Tuning v2 在小于 10B 规模的模型上超越了 Lester et al. (2021) 和 P-tuning,与微调(fine-tuning)的性能相匹配。特别是在 RTE 任务上,P-Tuning v2 显著优于微调。

对于更大的模型规模(2B 到 10B),P-Tuning v2 与微调之间的性能差距逐渐缩小。在 10B 规模上,P-Tuning v2 显示出与微调相当的性能,但仅需要 0.1% 的任务特定参数。

表 3 展示了 P-Tuning v2 在命名实体识别(NER)、抽取式问答(Extractive QA)和语义角色标注(SRL)等任务上的表现。

P-Tuning v2 在所有任务上通常与微调相当。特别是在 QA 任务上,P-Tuning 和 Lester et al. (2021) 显示出较差的性能,这可能是因为 QA 任务的复杂性。多任务学习为 P-Tuning v2 在大多数任务上带来了显著的性能提升,除了 QA 任务。

表 4 比较了在 RoBERTa-large 模型上使用 [CLS] 标签与线性头和使用 verbalizer 与语言模型头的效果。研究者们发现,使用 [CLS] 标签与线性头与使用 verbalizer 与语言模型头在性能上没有显著差异。

图 3 展示了在 BERT-large 模型上进行的关于提示深度的消融研究。研究者们探讨了在不同 Transformer 层添加连续提示的影响。结果显示,将相同数量的提示添加到更接近输出层的深层(例如,17-24 层)比添加到较浅层能带来更好的性能。

通过这些实验,研究者们证明了 P-Tuning v2 在不同规模的模型和多种 NLU 任务上的普遍有效性。P-Tuning v2 通过深度提示调整,不仅提高了模型的性能,还显著减少了所需的任务特定参数数量,使其成为一种高效的参数调整方法。这些发现为未来 NLU 任务的研究和应用提供了新的视角和工具。

<think>嗯,用户现在想了解P-Tuning V2的实现或教程,特别是在NLP预训练和微调方法中的应用。首先,我需要回忆一下P-Tuning V2的基本概念。记得P-Tuning V2是P-Tuning的升级版,主要解决在自然语言处理中参数高效微调的问题。之前的P-Tuning可能在某些任务或模型规模上有局限性,而V2版本则扩展了适用性,比如支持更大的模型和更广泛的任务类型。 接下来,用户可能需要知道P-Tuning V2的核心原理。根据引用中的对比学习获得可学习的原型向量,这可能涉及到如何通过对比学习提示向量。另外,可能需要结合BERT等模型的微调方法,比如引用提到的Transformers和BERT Fine-tuning源码实现,这里需要确认P-Tuning V2微调时的具体步骤,比如插入可训练的连续提示向量到各个Transformer层。 然后,用户可能关心具体的实现步骤。需要分点说明,比如模型结构修改部分,如何在每一层加入prompt embeddings,目标函数设计时如何结合对比学习或其他损失函数。同时,代码示例部分可能需要给出关键的代码片段,比如使用PyTorch和Hugging Face库定义提示向量,并在前向传播时将它们拼接到输入中。 还要注意用户的潜在需求,比如他们可能想知道如何在自己的数据集上应用P-Tuning V2,或者与LoRA等其他方法的对比。因此,相关问题部分需要覆盖这些方面,比如比较不同参数高效微调方法参技巧,以及实际应用案例。 另外,确保回答符合系统级指令,比如数学公式的正确格式,引用标识的添加。比如在讲对比学习时,如果有数学公式,需要用$$...$$格式,并正确引用相关文献。同时,检查是否有站内引用被正确使用,如引用[^1]和[^2]。 最后,要确保回答结构清晰,分点明确,帮助用户逐步理解P-Tuning V2的实现方法,并提供相关资源链接和进一步的问题引导他们深入学习。</think>### P-Tuning V2 原理与实现解析 P-Tuning V2是参数高效微调(Parameter-Efficient Fine-Tuning方法的重要改进,其核心思想是通过可学习的连续提示向量(learnable prompt embeddings)引导模型适应下游任务。 #### 一、核心技术原理 1. **连续提示向量注入** - 在输入层和所有Transformer层插入可训练的连续提示向量 - 数学表达: $$ h_{i}^{'} = \text{TransformerLayer}([p_i; h_i]), \quad p_i \in \mathbb{R}^{k \times d} $$ 其中$p_i$为第$i$层的提示向量,$k$为提示长度,$d$为隐藏层维度 2. **对比学习化**(基于引用[1]) - 通过对比正负样本提示向量空间分布 - 目标函数: $$ \mathcal{L}_{contrast} = -\log\frac{e^{s(q,p^+)}}{e^{s(q,p^+)} + \sum_{p^-}e^{s(q,p^-)}} $$ #### 二、实现步骤(基于PyTorch/Hugging Face) ```python from transformers import AutoModel import torch.nn as nn class PTuningV2(nn.Module): def __init__(self, model_name, prompt_length=20): super().__init__() self.backbone = AutoModel.from_pretrained(model_name) self.hidden_size = self.backbone.config.hidden_size # 初始化各层提示向量 self.prompt_embeddings = nn.ParameterList([ nn.Parameter(torch.randn(prompt_length, self.hidden_size)) for _ in range(self.backbone.config.num_hidden_layers + 1) ]) def forward(self, input_ids, attention_mask): embeddings = self.backbone.embeddings(input_ids) # 输入层提示拼接 inputs_embeds = torch.cat([ self.prompt_embeddings[0].expand(input_ids.size(0), -1, -1), embeddings ], dim=1) # 逐层处理 hidden_states = inputs_embeds for i, layer in enumerate(self.backbone.encoder.layer): # 添加层提示 prompt = self.prompt_embeddings[i+1].expand(hidden_states.size(0), -1, -1) hidden_states = torch.cat([prompt, hidden_states], dim=1) hidden_states = layer(hidden_states, attention_mask=attention_mask)[0] return hidden_states ``` #### 三、关键配置参数 | 参数 | 推荐值 | 作用 | |-------|---------|------| | `prompt_length` | 20-100 | 提示向量长度 | | `learning_rate` | 1e-4 | 提示向量学习率 | | `contrastive_weight` | 0.2 | 对比损失权重 | #### 四、应用场景 1. 少样本学习(<100训练样本) 2. 多任务联合微调 3. 领域适应(医疗/法律等专业领域)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值