PET,Prompt Tuning,P Tuning,Lora,Qlora 大模型微调的简介

概览

到2025年,虽然PET(Pattern-Exploiting Training)和Prompt Tuning在学术界仍有探讨,但在工业和生产环境中它们已基本被LoRA/QLoRA等参数高效微调(PEFT)方法取代 。LoRA因其实现简单、推理零开销,并能在大规模模型上以极少量参数达到与全量微调相当的效果,已成为最受欢迎的PEFT技术 。QLoRA在此基础上再结合4-bit量化,使得即便是65B级模型也能在单块48 GB GPU上完成微调,内存占用降低近3倍,性能几乎无损 。


1 PET 与 Prompt Tuning ,P-Tuning 的现状

1.1 PET(Pattern-Exploiting Training)

PET于2021年在EACL提出,通过“Pattern + Verbalizer Pair”(PVP)将分类和推理任务转换为完形填空问题来利用预训练模型 。

然而,由于其需要手工设计模板、映射词表,且在真正生产环境中难以自动化部署,PET已很少在实际项目中使用,大多数团队已转向更为通用且自动化程度更高的PEFT方法 。所以懒得写PET了。直接看后面ptuning和lora,


1.2 Prompt Tuning

Prompt Tuning(又称Soft Prompt Tuning)在2021年提出,直接对输入端添加 L 个可训练嵌入向量,仅更新这部分参数来适配下游任务 。

尽管Prompt Tuning在少样本和学术基准上表现良好,但因其训练不稳定、对超大模型需要较长的收敛时间,故在商业产品中采用的越来越少,主要用于研究和小规模试验场景 。

 


说明:Prompt Tuning 直接将一段可训练的向量拼接到输入端,冻结主模型权重,仅优化这段“软提示”及下游头部参数。

# ——— 1. 准备模型 ——————————————————————————————
model = load_pretrained_model("bert-base-uncased")      # 加载预训练模型  [oai_citation:0‡ACL Anthology](https://aclanthology.org/2021.emnlp-main.243/?utm_source=chatgpt.com)
freeze_parameters(model)                                # 冻结所有模型参数# 初始化可训练的“软提示”向量 (L × H)
L = 20                                                  # Prompt 长度
H = model.config.hidden_size
prompt = RandomTensor(shape=(L, H), requires_grad=True) # 新增一个线性分类头
classifier = Linear(H, num_labels)                      # num_labels 为类别数optimizer = AdamW([prompt, *classifier.parameters()], lr=1e-3)# ——— 2. 训练循环 ——————————————————————————————
for epoch in range(num_epochs):for input_ids, labels in dataloader:# 2.1 获取原始 token embeddings → [B, N, H]emb = model.embeddings(input_ids)              # 2.2 在序列前拼接软提示 → [B, L+N, H]pref = prompt.unsqueeze(0).expand(emb.size(0), -1, -1)inputs_embeds = concat(pref, emb, dim=1)        # 2.3 仅给 embeddings,绕过原始 token‐to‐id 过程outputs = model.encoder(inputs_embeds)         # 2.4 取第 L 个位置的输出作为 “CLS” 表示 → [B, H]cls_repr = outputs[:, L, :]                     # 2.5 分类 & 计算损失logits = classifier(cls_repr)loss   = CrossEntropy(logits, labels)# 2.6 反向只更新 prompt 和分类头loss.backward()optimizer.step()optimizer.zero_grad()

1.3 P Tuning 

说明:P-Tuning 除了学习可训练提示向量外,还通过一个小型网络(如 LSTM 或 MLP)对提示向量进一步编码,稳定并提升少样本学习效果。

# ——— 1. 准备模型 ——————————————————————————————
model = load_pretrained_model("bert-base-uncased")      # 加载预训练模型  [oai_citation:3‡arXiv](https://arxiv.org/abs/2103.10385?utm_source=chatgpt.com)
freeze_parameters(model)                                # 冻结所有模型参数# 定义 L 个“伪 token”ID,对应潜在的提示 embedding
L          = 20
pseudo_ids = range(L)# 从模型 embedding table 提取初始向量 → [L, H]
H          = model.config.hidden_size
init_emb   = model.embeddings(pseudo_ids)              # 定义一个 Prompt Encoder(LSTM/MLP)将 init_emb 映射到最终 prompt_emb
prompt_encoder = LSTM(input_size=H, hidden_size=H)      # 新增分类头
classifier = Linear(H, num_labels)optimizer = AdamW([*prompt_encoder.parameters(), *classifier.parameters()], lr=1e-3)# ——— 2. 训练循环 ——————————————————————————————
for epoch in range(num_epochs):for input_ids, labels in dataloader:B, N = input_ids.size()# 2.1 用 Prompt Encoder 编码初始伪 token 嵌入 → [1, L, H]prompt_emb, _ = prompt_encoder(init_emb.unsqueeze(0))prompt_emb    = prompt_emb.expand(B, -1, -1)    # → [B, L, H]# 2.2 获取原始 token embeddings → [B, N, H]emb = model.embeddings(input_ids)# 2.3 拼接 prompt_emb 与 emb → [B, L+N, H]inputs_embeds = concat(prompt_emb, emb, dim=1)# 2.4 前向并行计算全序列输出outputs = model.encoder(inputs_embeds)# 2.5 取第 L 个位置的向量作为分类表示 → [B, H]cls_repr = outputs[:, L, :]# 2.6 分类 & 计算损失logits = classifier(cls_repr)loss   = CrossEntropy(logits, labels)# 2.7 反向仅更新 Prompt Encoder 与分类头loss.backward()optimizer.step()optimizer.zero_grad()

2 LoRA/QLoRA 的主导地位

2.1 LoRA(Low-Rank Adaptation)

LoRA于2021年问世,通过冻结Transformer的主干权重,在每层线性映射旁支注入两段低秩矩阵 A 与 B,仅训练 A,B,可训练参数量减少约10,000倍,且推理阶段无额外延迟 。

实际项目中,LoRA因其“插拔式”适配、易于在各种框架中集成(如Hugging Face PEFT、ColossalAI等),几乎成为所有PEFT管道的默认选择 。

# 1. 初始化
model = GPTForCausalLM.from_pretrained("gpt2")      # 加载预训练 GPT-2
freeze_parameters(model)                            # 冻结所有原有参数# 2. 注入 LoRA 适配器
r = 8                                               # 低秩矩阵秩 rank
alpha = 16                                          # 缩放因子
for layer in model.transformer.h:                   # 遍历 Transformer 每一层# 拦截自注意力和前馈层的 Linearfor name in ["c_attn", "c_proj", "mlp.c_fc", "mlp.c_proj"]:W = getattr(layer, name)                    # 原线性层# 保存原权重,用于推理时合并W.requires_grad = False                      # 新增 A、B 两段可训练矩阵A = nn.Parameter(torch.randn(W.in_features, r) * 0.01)B = nn.Parameter(torch.zeros(r, W.out_features))layer.register_parameter(f"{name}_lora_A", A)layer.register_parameter(f"{name}_lora_B", B)# 3. 前向时叠加低秩更新
def lora_forward(x, W, A, B):return x @ W.weight + (alpha / r) * (x @ A @ B)# 4. 替换每个需要微调的 Linear 层前向
for layer in model.transformer.h:for name in ["c_attn", "c_proj", "mlp.c_fc", "mlp.c_proj"]:orig_linear = getattr(layer, name)A = getattr(layer, f"{name}_lora_A")B = getattr(layer, f"{name}_lora_B")# 用闭包 Capture 原 Linear、A、Bdef new_forward(x, _orig=orig_linear, _A=A, _B=B):return lora_forward(x, _orig, _A, _B)orig_linear.forward = new_forward# 5. 训练循环:仅更新 A、B 矩阵
optimizer = AdamW(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-4)
model.train()
for batch in dataloader:outputs = model(**batch)     # 包括 input_ids, attention_mask, labelsloss = outputs.lossloss.backward()optimizer.step()optimizer.zero_grad()
LoRA 冻结预训练模型权重,在每个线性层旁路注入低秩矩阵,只训练这部分额外参数。LoRA 可在保持原模型推理效率的同时,将可训练参数减少 10,000 倍,且不增加推理延迟

2.2 QLoRA(Quantized LoRA)

QLoRA在LoRA之上先将预训练模型量化至4-bit(NF4),再冻结量化权重并仅训练LoRA分支,显存占用降低近3倍,却保持与16-bit LoRA几乎相同的性能,被用于在单块48 GB GPU上微调65B参数模型(如Guanaco)至近ChatGPT水平 。

# 1. 初始化与 4-bit 量化
model = GPTForCausalLM.from_pretrained("gpt2")
freeze_parameters(model)  
# bitsandbytes 提供的 4-bit 量化函数
for name, param in model.named_parameters():param.data = quantize_4bit(param.data, dtype="nf4")  # NF4 量化# 2. 注入 LoRA(与上述 LoRA 步骤一致)
r = 8; alpha = 16
for layer in model.transformer.h:for name in ["c_attn", "c_proj", "mlp.c_fc", "mlp.c_proj"]:W = getattr(layer, name)W.requires_grad = FalseA = nn.Parameter(torch.randn(W.in_features, r) * 0.01)B = nn.Parameter(torch.zeros(r, W.out_features))layer.register_parameter(f"{name}_lora_A", A)layer.register_parameter(f"{name}_lora_B", B)# 3. 替换前向(同 LoRA)
# …(如上)# 4. 训练循环:仅更新 A、B
optimizer = AdamW(filter(lambda p: p.requires_grad, model.parameters()), lr=5e-5)
model.train()
for batch in dataloader:outputs = model(**batch)   loss = outputs.loss         loss.backward()            optimizer.step()           optimizer.zero_grad()

 

QLoRA 首先将模型权重量化到 4-bit,然后在量化模型上应用 LoRA 适配器,仅训练低秩矩阵,极大节省显存并保持性能

QLoRA 能在单卡 48 GB GPU 上微调百亿级模型,且性能与 16-bit LoRA 相当

 

 LoRA 与 QLoRA 在自回归 GPT 模型上的核心实现思路,二者的唯一区别在于 步骤 1:是否对模型权重做 4-bit 量化


小结

  • PET与Prompt Tuning:学术价值依旧,但因可用性、自动化程度及训练效率原因,已在工业界被LoRA/QLoRA等PEFT所取代;

  • LoRA/QLoRA:凭借参数效率、推理零成本及与量化结合的超低资源需求,成为2025年主流的高效微调方案。

若您正在为生产环境选择PEFT技术,建议优先考虑LoRA及其量化变体QLoRA,并辅以Hugging Face PEFT、ColossalAI等工具链来快速集成与部署。

 

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

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

相关文章

9种方法,一键美化Python图表

Matplotlib、Seaborn默认参数不好看,美化需要大量代码。 本次分享9种方法,一键美化图表,看看那个是你的菜。 1 Matplotlib style sheets Matplotlib内置多类style sheets, 一行代码使用, plt.style.use(Solarize_Li…

在STM32上配置图像处理库

在STM32上配置并使用简单的图像滤波库(以实现均值滤波为例,不依赖复杂的大型图像处理库,方便理解和在资源有限的STM32上运行)为例,给出代码示例,使用STM32CubeIDE开发环境和HAL库,假设已经初始化好了相关GPIO和DMA(如果有图像数据传输需求),并且图像数据存储在一个二…

Android四大组件学习总结

​1. Activity 启动模式问题​ ​面试官​: “我看你项目里用了 SingleTask 模式,能具体说说为什么用它吗?如果从 Activity A(SingleTask)跳转到 B(Standard),再返回 A,…

基于SamOutV8的序列生成模型实现与分析

项目概述 本项目实现了基于SamOutV8架构的序列生成模型,核心组件包括MaxStateSuper、FeedForward和DecoderLayer等模块。通过结合自注意力机制与状态编码策略,该模型在处理长序列时表现出良好的性能。 核心组件解析 1. MaxStateSuper(状态编…

从脑电图和大脑记录中学习稳健的深度视觉表征

从脑电图和大脑记录中学习稳健的深度视觉表征 印度,印度,印度,印度大脑实验室,印度 例如,达拉普,克普拉萨德,山,山,新的。ac .在 摘要 解码人类大脑一直是新机器人科学家…

2025.5个人感悟

本人是一名2025级大四学生,离毕业就一个月了,目前论文终稿已写完,有多的时间可以来写一写博客了。 (1)越焦虑什么,未来就有可能变成什么样子。以前一直焦虑考不上研,秋招找不到工作&#xff0c…

使用腾讯云3台轻量云服务器快速部署K8s集群实战

一、服务器配置 1.集群数量 节点ip备注master10.0.4.9安全组放通,3节点内网互通node110.0.4.14安全组放通,3节点内网互通node210.0.4.17安全组放通,3节点内网互通 2.配置服务器(每个节点执行) 执行步骤1 #在对应的…

bitbar环境搭建(ruby 2.4 + rails 5.0.2)

此博客为武汉大学WA学院网络安全课程,理论课大作业Web环境搭建。 博主搭了2天!!!血泪教训是还是不能太相信ppt上的教程。 一开始尝试了ppt上的教程,然后又转而寻找网络资源 cs155源代码和docker配置,做到…

leetcode:2469. 温度转换(python3解法,数学相关算法题)

难度:简单 给你一个四舍五入到两位小数的非负浮点数 celsius 来表示温度,以 摄氏度(Celsius)为单位。 你需要将摄氏度转换为 开氏度(Kelvin)和 华氏度(Fahrenheit),并以数…

python 实现一个完整的基于Python的多视角三维重建系统,包含特征提取与匹配、相机位姿估计、三维重建、优化和可视化等功能

多视角三维重建系统 下面我将实现一个完整的基于Python的多视角三维重建系统,包含特征提取与匹配、相机位姿估计、三维重建、优化和可视化等功能。 1. 环境准备与数据加载 首先安装必要的库: pip install opencv-python opencv-contrib-python numpy matplotlib plotly s…

什么是国密、密评、商密

一、国密 定义与本质:国密即国家密码管理局公布认定的国产密码算法,也称为商用密码(在此语境下与国密通用),指能够实现商用密码算法的加密、解密和认证等功能的技术,涵盖密码算法编程技术和密码算法芯片、…

打卡35天

模型可视化与推理 知识点回顾: 三种不同的模型可视化方法:推荐torchinfo打印summary权重分布可视化 进度条功能:手动和自动写法,让打印结果更加美观 推理的写法:评估模式 作业:调整模型定义时的超参数&…

kafka之操作示例

一、常用shell命令 #1、创建topic bin/kafka-topics.sh --create --zookeeper localhost:2181 --replications 1 --topic test#2、查看创建的topic bin/kafka-topics.sh --list --zookeeper localhost:2181#3、生产者发布消息命令 (执行完此命令后在控制台输入要发…

网络安全基础--第七课

路由表 路由器的转发原理:当一个数据包进入路由器,路由器将基于数据包中的目标IP地址,查询本地 路由表,若表中存在记录,则将无条件按记录转发,若没有记录,路由器不能泛洪,因为路由器…

Java SpringBoot 扣子CozeAI SseEmitter流式对话完整实战 打字机效果

书接上回:springBoot 整合 扣子cozeAI 智能体 对话https://blog.csdn.net/weixin_44548582/article/details/147457236 上文实现的是一次性等待并得到完整的AI回复内容,但随着问题和AI的逻辑日趋复杂,会明显增加这个等待时间,这对…

《AVL树完全解析:平衡之道与C++实现》

目录 AVL树的核心概念数据结构与节点定义插入操作与平衡因子更新旋转操作:从理论到代码双旋场景深度剖析平衡检测与测试策略性能分析与工程实践总结 0.前置知识:BS树 代码实现部分对和BS树相似的部分会省略。 1. AVL树的核心概念 1.1 平衡二叉搜索树…

跨平台游戏引擎 Axmol-2.6.0 发布

Axmol 2.6.0 版本是一个以错误修复和功能改进为主的次要LTS长期支持版本 🙏感谢所有贡献者及财务赞助者:scorewarrior、peterkharitonov、duong、thienphuoc、bingsoo、asnagni、paulocoutinhox、DelinWorks 相对于2.5.0版本的重要变更: 通…

【Django Serializer】一篇文章详解 Django 序列化器

第一章 Django 序列化器概述 1.1 序列化器的定义 1.1.1 序列化与反序列化的概念 1. 序列化 想象你有一个装满各种物品(数据对象)的大箱子(数据库),但是你要把这些物品通过一个狭窄的管道(网络&#xff…

关于spring @Bean里调用其他产生bean的方法

背景 常常见到如下代码 Bean public TestBean testBean() {TestBean t new TestBean();System.out.println("testBean:" t);return t; }Bean public FooBean fooBean() {TestBean t testBean();System.out.println("这里看似是自己new的,但因为…

Level1.7列表

1.7_1列表(索引切片) #1.列表 students[Bob,Alice,Jim,Mike,Judy] print(students)#2.在列表(添加不同数据类型,查看列表是否可以运行?是否为列表类型?) students[Bob,Alice,Jim,Mike,Judy,123…