P-Tunning V2简单理解

本文介绍了P-tunningV2的思想,它通过微调连续的虚拟Token并在模型内部进行深层调整,不同于P-tunningV1的浅层方式。作者详细解释了如何利用KVCache机制实现深层参数调整,扩展了嵌入层之外的参数空间,以提高模型性能。

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

之前看过P-tunning V2, 知道他的思想,最近突然想到了这件事,仔细看了一下他的代码实现,重新看了一遍,记录一下。
图片源于:https://zhuanlan.zhihu.com/p/423902902
在这里插入图片描述
P-Tunning V2的思路,仅仅通过微调连续的一些虚拟Token进行训练,固定模型的其它参数,从而实现低成本微调。但是P-Tunning V2采用一种模型内部继续微调,上图(b)所示,是一种深层的微调方式,而不是像P-Tunning v1,仅仅微调embeding 层的一些嵌入的虚拟Token,直观上理解,这种是一种比较浅层的方式。而P-tunning V2具体是怎么实现呢?可以参考,以下内容大量参考:P-tuning V2论文和代码实现解析

简单表述一下思路:

就是利用KVCache的方式进行深入微调

  • 确定微调参数数量
self.embedding = torch.nn.Embedding(
                config.pre_seq_len,
                config.num_hidden_layers * 2 * config.hidden_size)

pre_seq_len虚拟token数量
config.num_hidden_layers * 2 * config.hidden_size因为是深层的,和你模型层数是一致的,所以config.num_hidden_layers,2 其实表示深层微调,类似于KV的方式,所以是2,最后是隐藏层维度。

  • 将维度进行拆解,拆成KVCache的方式,利用past_key_values进行传参,从而是实现深度调参的方式,所谓深度调参即不仅仅局限于embedding 层的参数,我理解本质上就是嵌入层的参数,不过,他把虚拟token参与注意力的计算。

简单模拟一下:
原来的Q, K, V维度为:batch seq dim
通过past_key_values,则使K, V维度变为,batch new_seq(pre_seq_len+seq) dim
Q K T QK^T QKT维度为batch seq new_seq
Q K T V QK^TV QKTV batch seq dim
就是以上原理,从而实现深度调参。

### P-Tuning 技术介绍 P-Tuning 是一种用于预训练大型语言模型 (LLM) 的高效微调方法[^3]。传统上,在使用提示(prompt)引导 LLM 完成特定任务时,提示通常是固定不变的文本序列。然而,P-Tuning 将这些静态提示转化为可以被优化算法更新的学习型嵌入向量。 具体来说,该技术引入了一个额外的小型神经网络来生成连续空间中的软提示表示形式。这个小型网络能够接收输入并输出一组初始化后的虚拟标记(token),它们会被注入到标准 Transformer 架构之中作为前缀(prefix)[^1]。因此,当执行下游任务时,不仅原始的语言模型权重保持冻结状态,而且仅需调整少量新增加的参数即可实现良好的泛化能力。 #### 应用场景 由于 P-Tuning 方法具有较低资源消耗以及快速适应新领域的能力,所以在多个自然语言处理(NLP)子域得到了广泛应用: - **问答系统**:通过定制化的提示设计,使得机器能够在理解上下文的基础上更精准地给出答案; - **情感分析**:利用可调节的前置条件帮助识别不同类型的语义倾向; - **文本分类/聚类**:借助灵活多变的任务导向型线索提高类别划分准确性; - **对话生成**:增强聊天机器人对于复杂交互情境的理解力与回应质量。 ```python import torch from transformers import BertTokenizer, BertForMaskedLM tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertForMaskedLM.from_pretrained('bert-base-uncased') def p_tuning_example(input_text): inputs = tokenizer(input_text, return_tensors="pt") # 假设我们有一个预先定义好的 soft prompt embedding matrix `soft_prompt_embeddings` soft_prompt_embeddings = ... # 这里省略具体的加载方式 # 将 soft prompt embeddings 插入到 input_ids 中 prefix_length = soft_prompt_embeddings.shape[0] batch_size = inputs['input_ids'].shape[0] # 创建带有 prefix 的 attention mask 和 position ids ... outputs = model(**inputs) predictions = torch.argmax(outputs.logits, dim=-1) decoded_output = tokenizer.decode(predictions[0], skip_special_tokens=True) return decoded_output ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值