news 2026/5/12 13:54:26

大模型高效微调--P-Tuning

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
大模型高效微调--P-Tuning

文章目录

      • P Tuning微调概述
      • 核心原理
      • 实现步骤
      • 优势与适用场景
      • 代码注释

P Tuning微调概述

P Tuning是一种参数高效的微调方法,通过引入可训练的连续提示(prompt)参数来适配下游任务,避免直接修改预训练语言模型(PLM)的全部参数。其核心思想是将离散的自然语言提示替换为可优化的连续向量,显著降低计算成本。

核心原理

传统微调需要更新整个模型的参数,而P Tuning仅优化插入的连续提示向量。这些提示通常以可学习张量的形式嵌入输入层或中间层,引导模型输出适应特定任务。数学形式可表示为:

h = PLM ( [ P ; x ] ) h = \text{PLM}([P; x])h=PLM([P;x])

其中P PP为连续提示向量,x xx为输入文本,h hh为模型输出。

实现步骤

连续提示设计
在输入序列前或中间插入可训练的张量(如维度与词嵌入相同),替代传统离散提示。例如,在分类任务中,输入可能构造为[ P 1 , P 2 , . . . , P n ; 文本 ] [P_1, P_2, ..., P_n; \text{文本}][P1,P2,...,Pn;文本]

参数冻结
保持预训练模型参数固定,仅更新提示向量P PP和任务特定头部(如分类器)。部分变体允许选择性微调部分模型层。

优势与适用场景

  • 计算高效:仅训练少量参数,适合资源受限场景。
  • 通用性:适用于文本分类、生成、问答等多种任务。
  • 小样本适配:在低数据场景下表现优于全参数微调。

代码注释

importtorchimporttorch.nnasnn# 定义PromptEncoder类,继承自nn.ModuleclassPromptEncoder(nn.Module):def__init__(self,config):super(PromptEncoder,self).__init__()# 从config中获取模型参数self.token_dim=config.token_dim# token的维度self.input_size=self.token_dim# 输入维度self.output_size=self.token_dim# 输出维度self.hidden_size=config.encoder_hidden_size# LSTM隐藏层维度self.total_virtual_tokens=config.num_virtual_tokens*config.num_transformer_submodules# 虚拟token总数# 定义embedding层,将虚拟token映射到token_dim维度self.embedding=nn.Embedding(self.total_virtual_tokens,self.token_dim)# 如果不是推理模式,初始化LSTM和MLPifnotconfig.inference_mode:lstm_dropout=config.encoder_dropout# LSTM的dropout率num_layers=config.encoder_num_layers# LSTM层数# 定义双向LSTMself.lstm_head=nn.LSTM(input_size=self.input_size,hidden_size=self.hidden_size,num_layers=num_layers,dropout=lstm_dropout,bidirectional=True,batch_first=True)# 定义MLP,包含两个线性层和ReLU激活函数self.mlp_head=nn.Sequential(nn.Linear(self.hidden_size*2,self.hidden_size*2),# 双向LSTM输出维度翻倍nn.ReLU(),nn.Linear(self.hidden_size*2,self.output_size)# 输出维度与token_dim相同)defforward(self,indices):# 将输入的indices转换为embeddinginput_embeds=self.embedding(indices)# 将embedding输入LSTM,取输出结果输入MLPoutput_embeds=self.mlp_head(self.lstm_head(input_embeds)[0])returnoutput_embeds

初始化部分

  • 从配置中获取模型参数,包括token维度、隐藏层大小等。
  • 定义embedding层,将虚拟token映射到指定维度。
  • 在非推理模式下,初始化双向LSTM和MLP结构。

前向传播

  • 将输入的虚拟token索引转换为embedding向量。
  • 通过双向LSTM处理embedding向量。
  • 使用MLP进一步处理LSTM输出,生成最终编码结果。

该模块通常用于prompt tuning或prefix tuning等场景,用于生成可学习的虚拟token表示。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 16:46:25

力诺药包荣获CMIS 2025第六届中国医药华北数智峰会两项奖项

12月18日,CMIS 2025 第六届中国医药华北数智峰会举行,力诺药包(301188.SZ)凭借在数智化转型与绿色发展方面的卓越表现,荣获“2025年度医药行业绿色供应链创新奖”,公司副总裁唐超(分管信息化建设…

作者头像 李华
网站建设 2026/5/1 11:17:55

应用——Linux进程通信与信号处理

Linux进程通信与信号处理一、命名管道(FIFO)通信1.1 FIFO通信机制概述FIFO(命名管道)是一种特殊的文件类型,它允许无亲缘关系的进程间进行通信。FIFO在文件系统中有一个路径名,进程通过打开这个文件来进行读…

作者头像 李华
网站建设 2026/5/3 4:22:44

程序突然“消失”了?C# 闪退问题排查全攻略

作为 C# 开发者,最令人头疼的莫过于程序在没有任何报错提示的情况下瞬间“闪退”。由于没有显式的错误弹窗,这种“无声的崩溃”往往让人无从下手。 本文将带你从开发环境到生产环境,由浅入深地掌握排查 C# 闪退问题的四大绝招。 招式一&…

作者头像 李华
网站建设 2026/5/10 0:10:07

哪些常量用枚举,哪些用类

枚举 vs 常量类的选择标准 使用枚举的情况有限且固定的值集合 如:[StatsTypeEnum](file://D:\Desktop\ai_wei\projects\F-XA-01\code\f-xa-01-api\f-xa-01-api-common\src\main\java\com\aiwei\common\enumeration\StatsTypeEnum.java#L7-L50)(平均值、方…

作者头像 李华
网站建设 2026/5/3 9:04:00

数据泄露危机频发,Open-AutoGLM为何成企业最后防线?

第一章:数据泄露危机的现状与挑战近年来,随着数字化转型加速,企业存储和处理的数据量呈指数级增长,数据泄露事件频发,已成为全球关注的安全焦点。攻击者利用系统漏洞、社会工程或内部权限滥用等手段窃取敏感信息&#…

作者头像 李华
网站建设 2026/5/10 4:06:39

Langchain-Chatchat如何配置跨域资源共享CORS?API安全

Langchain-Chatchat 如何配置跨域资源共享(CORS)?API 安全实战解析 在企业级 AI 应用快速落地的今天,越来越多组织选择将大型语言模型(LLM)部署于本地环境,以保障数据隐私与合规性。Langchain-C…

作者头像 李华