P-tuning个人记录

简介

P-Tuning就是提示调优(Prompt Tuning),主要思想是固定预训练模型的参数,然后在模型的输入端添加可学习的"prompt"(提示)进行调整。这种方法的优点是计算成本低,因为只需要更新少量的参数。它不改变模型,而是通过对提示的优化,让模型输出最佳的结果

静态提示训练举例:

  • 首先,初始化一个或多个“提示”向量。这些向量可以随机初始化,或者使用一些先验知识来初始化。
  • 在每个输入文本前加上一个“提示标记”。例如,我们可以添加一个“[SENTIMENT]”标记,然后紧跟原始文本。如:“[SENTIMENT] This movie is great!”
  • 将这些“提示标记”与对应的提示向量关联起来。也就是说,模型在处理输入时,不仅会看到原始文本,还会看到与“[SENTIMENT]”关联的提示向量。
  • 在情感分析的训练数据上进行训练。与传统的微调不同,这里我们只更新提示向量,而不更新模型的其他参数(或者只更新很少的参数)。这意味着,我们主要是在调整这些提示向量,使它们能够帮助模型更好地执行情感分类。
  • 在测试时,我们依然在每个输入文本前加上“[SENTIMENT]”标记,并使用学到的提示向量来辅助模型进行分类。]
  • P-tuning 使用的是可学习的、参数化的提示,这意味着每个提示都对应一个嵌入向量,这个向量是在任务的训练过程中被优化的。
  • 为了使用提示,输入文本被扩展来包含这些参数化的提示。例如,一个情感分析任务的输入可能会被扩展为“[P1] [P2] [P3] This movie is great!”,其中 [P1], [P2], [P3] 是参数化的、可学习的提示。
  • 在训练过程中,模型的主要参数保持固定,而提示的嵌入会被更新。目标是找到最优的提示嵌入,使得模型在给定任务上的表现最佳。在训练过程中,模型的预训练参数不发生变化,只有提示 [P1], [P2], [P3] 的嵌入向量会被更新。

prefix-tuning 

相对于fine-tuning,在调节模型的过程中只优化一小段可学习的continuous task-specific vector(prefix)而不是整个模型的参数。

P-Tuning v1

计了一种连续可微的virtual token

用MLP+LSTM作为Prompy Encoder层去编码这些virtual token,转换为可学习的Embedding层,然后再输入模型。 相比Prefix Tuning,P-Tuning加入的可微的virtual token,但仅限于输入层,没有在每一层都加;另外,virtual token的位置也不一定是前缀,插入的位置是可选的

P-Tuning v2

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

  • Prompt Tuning论文中表明当模型规模超过100亿个参数时,提示优化可以与全量微调相媲美。但是对于那些较小的模型(从100M到1B),提示优化和全量微调的表现有很大差异,这大大限制了提示优化的适用性。尽管Prompt Tuning和P-tuning在一些 NLU 基准测试中表现出优势,但提示调优对硬序列标记任务(即序列标注)的有效性尚未得到验证。
  • 由于序列长度的限制,可调参数的数量是有限的。除了语言模型的第一层之外,其他层的prompt embddding都来自于上一层,输入embedding对模型预测只有相对间接的影响

v2 在v1的基础上进行了改进,在每一层都加入了Prompts tokens作为输入,层与层之间的continuous prompt是相互独立的,加入到更深层结构中的Prompt能给模型预测带来更直接的影响。

优化手段:

1. 移除重参数化的编码器。之前的方法(例如P-Tuning/prefix-tuning)为了增强模型鲁棒性,提升训练速度和模型表现,针对continuous prompt设计了LSTM/MLP等Reparameterization的方法。但是在实践中,作者发现这些设计并不一定有效。
2. 我们发现不同的理解任务通常用不同的提示长度来实现其最佳性能
3. 多任务学习能够很大的提升模型表现。然后再适配下游任务

 

论文中展示了,当涉及到复杂的挑战时,如:自然语言推理(RTE)和多选题回答(BoolQ),PT的效果相比于FT要差的多,而P-Tuning v2的差别则没那么大,甚至更好。P-Tuning v2在较小规模的所有任务中都与FT的性能相匹配。并且,P-tuning v2在RTE中的表现明显优于FT,特别是在BERT中。

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

在模型的5-24层添加prompt能够达到和所有层都添加prompt一致的效果。另外,在深层添加prompt的效果总是好于在浅层添加。 

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

对于简单的NLU任务,较短的提示足以获得最佳性能;对于较难的序列任务,通常,超过 100 的提示会有所帮助。

 可以简单的将P-Tuning认为是针对Prompt Tuning的改进,P-Tuning v2认为是针对Prefix Tuning的改进。

 

参考:https://blog.csdn.net/chattyfish/article/details/132051461?ops_request_misc=&request_id=&biz_id=102&utm_term=P-Tuning&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-132051461.nonecase&spm=1018.2226.3001.4187

 大模型参数高效微调技术原理综述(三)-P-Tuning、P-Tuning v2_ptuning和 全量微调对比-CSDN博客

### P-Tuning 的原理 P-Tuning 是一种用于改进大规模预训练语言模型性能的技术,主要通过引入虚拟标记(virtual tokens)来增强模型的表现力和稳定性。这些虚拟标记被嵌入到输入序列中,并通过特定机制进行优化[^1]。 具体而言,P-Tuning 使用了一个生成器网络来动态生成这些虚拟标记的嵌入向量。该生成器可以学习如何根据具体的任务需求调整这些嵌入向量,从而使得它们能够更好地适应下游任务的要求[^3]。 相比于传统的离散型提示词(discrete prompts),P-Tuning 提供了一种更加灵活的方式,允许连续空间中的梯度更新操作,这不仅提升了模型的效果,还增强了其在不同场景下的鲁棒性和一致性[^2]。 --- ### P-Tuning 的实现方式 在实际实现过程中,P-Tuning 主要依赖于以下几个核心组件: #### 虚拟标记的设计 虚拟标记是一种特殊的 token,通常不会对应任何真实的单词或子词单元。相反,它们的作用是在输入序列中充当额外的信息载体,帮助引导模型完成目标任务。这些标记会被放置在标准输入之前或者中间位置,视具体应用场景而定。 #### 连续可微性的保障 为了使整个过程具备端到端的学习能力,所使用的 virtual embeddings 需要是完全可导的。这意味着可以通过反向传播算法直接对其权重施加影响,进而逐步逼近最优解。 以下是简单的 Python 实现框架示例: ```python import torch from transformers import AutoModelForCausalLM, AutoTokenizer class PTuningGenerator(torch.nn.Module): def __init__(self, model_name_or_path, num_virtual_tokens=10): super(PTuningGenerator, self).__init__() # 加载基础模型与分词工具 self.model = AutoModelForCausalLM.from_pretrained(model_name_or_path) self.tokenizer = AutoTokenizer.from_pretrained(model_name_or_path) # 定义生成器结构 (MLP 或其他形式均可) hidden_size = self.model.config.hidden_size self.virtual_embeddings_generator = torch.nn.Sequential( torch.nn.Linear(hidden_size, hidden_size), torch.nn.ReLU(), torch.nn.Linear(hidden_size, num_virtual_tokens * hidden_size) ) def forward(self, input_ids): batch_size = input_ids.size(0) generated_virtuals = self.virtual_embeddings_generator(input_ids.mean(dim=1)).view(batch_size, -1, self.model.config.hidden_size) concatenated_inputs = torch.cat([generated_virtuals, self.model.get_input_embeddings()(input_ids)], dim=1) outputs = self.model(inputs_embeds=concatenated_inputs) return outputs.logits ``` 在此代码片段中,`PTuningGenerator` 类封装了完整的逻辑链条——从初始化阶段定义必要的超参数配置,再到运行时计算新增部分的具体数值表示以及最终融合至原有架构之中。 --- ### P-Tuning 的应用领域 由于其高效性及普适性强的特点,P-Tuning 已经广泛应用于多个自然语言处理方向上,包括但不限于以下几类典型任务: - **文本分类**:借助精心设计过的 prompt 结构,即使面对类别分布极度不平衡的数据集也能取得不错的结果; - **命名实体识别(NER)** :通过对句子内部关系建模进一步挖掘潜在规律,提高标注精度; - **机器翻译(MT)** :作为源语言侧补充材料辅助理解复杂句法现象; 值得注意的是,在某些情况下还可以与其他轻量化策略相结合形成复合方案,比如 LoRA(P-LORA)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值