大模型微调 Prompt Tuning与P-Tuning 的区别?

Prompt TuningP-Tuning 都属于 参数高效微调方法(PEFT, Parameter-Efficient Fine-Tuning),主要是为了避免对大模型全部参数进行训练,而是通过小规模参数(prompt embedding)来适配下游任务。但两者的实现方式和应用场景有一些区别:

提示微调 仅在输入嵌入层中加入可训练的提示向量。在离散提示方法的基础上,提示微调首先在输入端插入一组连续嵌入数值的提示词元,这些提示词元可以以自由形式 或前
缀形式 来增强输入文本,用于解决特定的下游任务。在具体实现中,只需要
将可学习的特定任务提示向量与输入文本向量结合起来一起输入到语言模型中。
P-tuning 提出了使用自由形式来组合输入文本和提示向量,通过双向 LSTM
来学习软提示词元的表示,它可以同时适用于自然语言理解和生成任务。另一种
代表性方法称为 Prompt Tuning ,它以前缀形式添加提示,直接在输入前拼
接连续型向量
。在提示微调的训练过程中,只有提示的嵌入向量会根据特定任务
进行监督学习,然而由于只在输入层中包含了极少量的可训练参数,有研究工作
表明该方法的性能高度依赖底层语言模型的能力 。下图 展示了提示微调算
法的示意图。

在这里插入图片描述


1. Prompt Tuning

  • 提出者:Lester et al., 2021(Google)

  • 核心思想

    • 在输入序列前面加上 可学习的“虚拟token embedding”(prompt embedding),而不是直接调模型的原始参数。
    • 这些 prompt embeddings 在训练时会被更新,而模型的其他参数保持冻结。
  • 应用方式

    • 常用于 encoder-decoder模型(如T5) 或 decoder-only(如GPT)任务。
    • 输入 [Prompt Embeddings] + [下游任务输入] → 模型输出。
  • 特点

    • 训练参数量极小(只训练 prompt embedding)。
    • Prompt 是直接加在 embedding 层,和 token embedding 维度相同。
    • 更偏向 NLP生成/分类任务

2. P-Tuning

  • 提出者:Liu et al., 2021(清华)

  • 核心思想

    • 最初的 P-Tuning v1:用 连续可学习 embedding 代替离散 prompt。
    • P-Tuning v2(改进版,ACL 2022):通过 深层插入虚拟 prompt embedding 到 Transformer 的多层中(不是只在输入层)
  • 应用方式

    • 适用于 分类、生成、信息抽取 等多种任务。
    • v2 更适合 小数据集场景,因为它的表示能力比单层 prompt tuning 更强。
  • 特点

    • P-Tuning v1 和 Prompt Tuning 类似,都是加连续 embedding。
    • P-Tuning v2 比 Prompt Tuning 更强,因为不仅在输入层,而且在 Transformer 各层都插入可学习参数。
    • 表现更接近全参数微调,但仍保持参数高效。

3. 区别总结

对比点Prompt TuningP-Tuning (v1)P-Tuning v2
参数位置输入层前加虚拟 embedding输入层前加连续 embedding各层 Transformer 插入虚拟 prompt
训练参数量极少极少较少(但比 Prompt Tuning 多)
表达能力相对较弱类似 Prompt Tuning更强,接近全量微调
适用任务NLP下游任务(分类、生成)NLP任务小数据/复杂任务,泛化更好
提出方Google (Lester et al., 2021)清华 (Liu et al., 2021)清华 (v2, ACL 2022)

一句话总结

  • Prompt Tuning:只在输入 embedding 层加可学习 prompt → 轻量但表达能力有限。
  • P-Tuning:不仅能在输入层加 embedding,还能在 Transformer 深层插入虚拟 prompt(尤其 v2) → 表达能力更强,效果接近全参数微调。

举例说明。


1. 普通 Embedding(离散 token embedding)

在 NLP 里,输入通常是离散的 token(如 “apple”、“我”、“中国”)。
这些 token 会先通过 词表查找 变成向量:

例如词表大小 = 10000,embedding 维度 = 768:

"apple"   → [0.12, -0.34, 0.98, ... , 0.45]  (768维向量)
"中国"     → [0.87, 0.22, -0.54, ... , -0.11]

这些 embedding 是模型在预训练时学好的。


2. 虚拟 embedding(virtual tokens / prompt embedding)

  • 意思:人为加一些 不存在于词表中的“假token”,但是它们有 embedding 向量。
  • 这些向量是 随机初始化 的,然后通过训练学习,而不是固定的词表 lookup。
  • 它们本身没有对应的文字,只是模型前面附加的“提示信号”。

举例:

假设我们要做 情感分类(句子 → 积极/消极),输入是:

"这部电影很精彩"

用 Prompt Tuning 时,可以加 5 个虚拟 token:

[v1][v2][v3][v4][v5] 这部电影很精彩

其中 [v1]...[v5] 就是 虚拟 embedding

[v1] → [0.01, 0.77, -0.32, ...]
[v2] → [0.55, -0.88, 0.14, ...]
...

这些 embedding 不属于词表,但会在训练过程中学会 如何引导模型输出“积极/消极”


3. 连续 embedding(continuous prompt)

  • 意思:Prompt 不再用自然语言(“Please classify the sentiment…”),而是直接用 连续向量
  • 这个概念最早是 P-Tuning v1 提的,本质和虚拟 embedding 很像,但强调它是 连续空间里的可学习向量,而不是离散 token(不可再映射回“文字”)。

举例:

离散 prompt(人写的文字)可能是:

"这部电影很精彩 [MASK]"

连续 prompt(P-Tuning)则是:

[0.12, -0.33, 0.98, ...]  (embedding1)
[0.54,  0.11, -0.66, ...] (embedding2)
[0.22, -0.77, 0.44, ...]  (embedding3)
这部电影很精彩

区别在于:

  • 离散 prompt = 用真实 token(如 “Please”, “answer”)拼出来。
  • 连续/虚拟 prompt = 直接用可训练的向量,不需要映射回文字。

4. 总结

  • 虚拟 embedding = 给模型输入前面加“假 token”,它们的 embedding 随训练调整。

  • 连续 embedding = 直接训练连续的 embedding 向量,不一定对应词表里的任何 token。

  • 本质上两者差别不大,很多时候是不同论文里对类似概念的叫法,区别主要在:

    • Prompt Tuning 强调 虚拟 token embedding
    • P-Tuning 强调 连续可学习 embedding(不依赖离散 token)

下边是一个 PyTorch 示例,演示如何在输入序列前面加上 虚拟/连续 embedding

假设我们有一个简化的模型(类似 BERT),输入是 token embedding,我们想在输入前面加几个可学习的 prompt embedding


🔹 PyTorch 示例代码

import torch
import torch.nn as nnclass SimpleModel(nn.Module):def __init__(self, vocab_size=10000, embed_dim=16, prompt_len=5):super().__init__()# 普通 embedding (词表)self.embedding = nn.Embedding(vocab_size, embed_dim)# prompt embedding (虚拟/连续向量,不属于词表)self.prompt_embedding = nn.Parameter(torch.randn(prompt_len, embed_dim))# 一个简单的分类头self.fc = nn.Linear(embed_dim, 2)  # 假设2分类任务def forward(self, input_ids):"""input_ids: [batch_size, seq_len]  (普通输入token的id)"""batch_size = input_ids.size(0)# 1. 把 token id 转换成 embeddingtoken_embeds = self.embedding(input_ids)  # [batch, seq_len, embed_dim]# 2. prompt embedding (复制到 batch 维度)prompt_embeds = self.prompt_embedding.unsqueeze(0).expand(batch_size, -1, -1)  # [batch, prompt_len, embed_dim]# 3. 拼接 prompt 和原始输入full_embeds = torch.cat([prompt_embeds, token_embeds], dim=1)  # [batch, prompt_len+seq_len, embed_dim]# 假设我们只取最后一个 token 位置做分类last_hidden = full_embeds[:, -1, :]  # [batch, embed_dim]# 分类logits = self.fc(last_hidden)return logits# ======================
# 🔹 测试
# ======================
batch_size = 2
seq_len = 4
vocab_size = 10000
embed_dim = 16
prompt_len = 5model = SimpleModel(vocab_size, embed_dim, prompt_len)# 模拟两个样本,每个长度为4
input_ids = torch.randint(0, vocab_size, (batch_size, seq_len))print("输入 token ids:\n", input_ids)logits = model(input_ids)
print("输出 logits:\n", logits)

🔹 运行逻辑说明

  1. 普通 embedding:把输入 token id 转成向量。

    • 例如 [12, 87, 325, 99] → 4个 embedding
  2. prompt embedding:训练时额外引入的向量,例如 5 个虚拟 token

    • 例如 [p1, p2, p3, p4, p5] → 5个 embedding
  3. 拼接输入

    [p1, p2, p3, p4, p5, token1, token2, token3, token4]
    
  4. 模型只更新 prompt embedding,而原始模型参数可以冻结(只让 self.prompt_embedding 学习)。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920380.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

控制系统仿真之PID校正1-系统固有属性(四)

一、PID校正概述PID校正是比例(Proportional)积分(Integral)微分(Derivative)校正的简称,是历史最悠久,生命力最强的控制方式。其主要优点有:①原理简单、使用方便②适应性强,可广泛…

C语言————斐波那契数列(例题1)

小博在学习c语言时,总是会遇到一些很典型的例题,如:斐波那契数列,汉诺塔问题,冒泡排列问题,等等。小博决定汇总一下,今天讲清斐波那契数列,后续持续更新。一、斐波那契数列斐波那契数…

Text to Speech技术详解与实战:GPT-4o Mini TTS API应用指南

Text to Speech技术详解与实战:GPT-4o Mini TTS API应用指南 一、概述 Text to Speech(TTS,文本转语音)技术正在广泛应用于博客配音、多语言音频输出与实时语音流等场景。越来越多的开发者希望将自然、流畅的AI语音集成到产品中…

数字ic后端Useful Skew到底怎么玩的?

CCOpt的Useful Skew到底怎么玩的?上图里,我们可以看到,在CCOpt之前,这个chain上的slack为200ps/-100ps/200ps。我们想修复这-100ps的slack,就有两个策略了:方法1:把F1的delay提前;方…

Linux 网络配置与系统管理指南

文章目录 1. 虚拟机网络模式 1. 桥接模式 (Bridged) 2. NAT 模式 3. 仅主机模式 (Host-only) 2. 固定IP配置(桥接模式) 配置步骤: 3. 进程管理 1)查看进程:ps命令 2)终止进程 3)进程树查看 4. 服务管理 1)systemctl管理服务 2)chkconfig服务管理 5. 动态监控 top命令 …

算法学习笔记:双指针_滑动窗口专题

目录 1.长度最小的子数组 2.无重复字符的最长子串 3.将x减少到0的最小操作数 4.最大连续1的个数Ⅲ 5.找到字符串中所有字母异位词 6.水果成篮 7.串联所有单词的子串 8.最小覆盖子串 1.长度最小的子数组:209. 长度最小的子数组 - 力扣(LeetCode&a…

Witsbb健敏思是哪个国家的品牌?澳洲纯净溯源,100+过敏原排除的敏宝专研品牌

在为敏感体质宝宝挑选营养补充品时,“品牌来源是否可靠”“品控标准是否严格”往往是宝爸宝妈的首要考量。源自澳大利亚的Witsbb健敏思,作为澳企Forestpark旗下的综合膳食营养补充品牌,从诞生起便根植于澳洲严苛的保健品监管体系,…

gdbserver远程调试和交叉编译gdb

1、交叉编译gdb 1.1下载源码 Gdb源码:wget https://ftp.gnu.org/gnu/gdb/gdb-15.2.tar.xz Gdb依赖的源码:GMP、MPFR、ncurses(图形库) GMP源码:wget https://ftp.gnu.org/gnu/gmp/gmp-6.3.0.tar.xz MPFR源码&#xff1…

UE5.5模型导入FBX强制x轴向前Force Front XAxis

很多软件轴向都是不同的 , 所以模型导入虚幻的时候 可以勾选Force Front XAxisUE5.5 在右上角设置 点击右上角三个点就可以看到强制前X轴

Docker中如何记录非交互式连接ssh用户操作的所有命令记录?

网罗开发(小红书、快手、视频号同名)大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方…

涡旋场和挠场的对偶性方程组

要将涡旋场与挠场的动态对偶性以麦克斯韦方程组的形式嵌入爱因斯坦-嘉当理论的弯曲时空框架中。一、符号与几何基础1. 基本张量定义 度规张量: g_{\mu\nu} (描述时空弯曲, \mu,\nu 0,1,2,3 )。仿射联络: \Gamma^\la…

8.28日QT

思维导图#include <iostream>using namespace std;int main() {int a0,b0,c0,d0;string i;cout << "请输入一个字符串" << endl;getline(cin,i);int yi.size()-1;while(1){if(a<i[y]&&i[y]<z){aa1;}else if(A<i[y]&&i[y]…

跨网络通信:路由器如何实现全球互联

目录 一、跨网络的两台主机通信 二、采用不同通信标准的两个局域网内的主机通信 三、路由器实现的“认路”功能、数据传输&#xff1a;封装与解封装 四、认识IP地址 五、为什么访问目标主机需要经过路由器&#xff1f; 1、网络划分 2、寻址与转发 六、目的IP地址的核心意…

HTTP 头

HTTP 头&#xff08;HTTP Header&#xff09;是 HTTP 请求/响应中用于传递元数据的关键部分&#xff0c;分为 请求头&#xff08;Request Header&#xff09;、响应头&#xff08;Response Header&#xff09;、通用头&#xff08;General Header&#xff09; 和 实体头&#x…

vue 海康视频插件

背景&#xff1a; 在vue项目中&#xff0c;需要在pc端播放视频&#xff0c;播放的视频包括视频实时、视频回放等。 写文思路&#xff1a; 海康视频对接流程&#xff0c;了解海康视频插件&#xff0c;前端开发项目并引入依赖&#xff0c;前端开发封装的组件&#xff0c;组件的调…

【URP】Unity 插入自定义RenderPass

【从UnityURP开始探索游戏渲染】专栏-直达 自定义渲染通道是一种改变通用渲染管道&#xff08;URP&#xff09;如何渲染场景或场景中的对象的方法。自定义呈现通道(RenderPass)包含自己的Render代码&#xff0c;可以在注入点将其添加到RenderPass中。 添加自定义呈现通道(Rend…

DevSecOps 集成 CI/CD Pipeline:实用指南

就在你以为软件开发已无简化的余地时&#xff0c;新的解决方案应运而生 随着软件开发几乎每天都在攀升&#xff0c;组织不断尝试以前所未有的速度交付新功能和应用程序。虽然持续集成和持续交付 &#xff08;CI/CD&#xff09; Pipeline 彻底改变了软件部署&#xff0c;但它们…

vue2+elementui 表格单元格增加背景色,根据每列数据的大小 颜色依次变浅显示

注释&#xff1a; vue2elementui 表格列实现一个功能&#xff0c;给定两个颜色&#xff1a;红色 #f96d6f 和 绿色 #63be7b&#xff0c;列数据正数时表格单元格背景色为红色&#xff0c;列数据负数时表格单元格背景色为绿色&#xff0c;根据数据的大小颜色依次越来越淡&#xff…

【JavaEE】(19) MyBatis-plus

一、MyBatis Generator 为 MyBastis 框架设计的代码生成工具&#xff0c;简化持久层编码工作。根据数据库表自动生成 Java 实体类、Mapper 接口、SQL 的 xml 文件。让开发者专注于业务逻辑。 1、引入插件 MyBatis 官网搜索 MyBatis Generator 插件&#xff1a;Running MyBatis…

Android之腾讯TBS文件预览

文章目录前言一、效果图二、实现步骤1.去官网注册并创建应用[腾讯官网](https://console.cloud.tencent.com/tbs/client)2.下载arr文件并引入[腾讯TBS](https://download.csdn.net/download/Android_Cll/91764395)3.application实例化4.activity实例化5.下载网络文件6.PreviewA…