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

news2025/5/24 9:12:35

概览

到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 每一层
    # 拦截自注意力和前馈层的 Linear
    for 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、B
        def 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, labels
    loss = outputs.loss
    loss.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 = False
        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. 替换前向(同 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.coloradmin.cn/o/2384491.html

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

相关文章

02-jenkins学习之旅-基础配置

0 配置主路径 jenkins安装目录下找到jenkins.xml文件,C:\ProgramData\Jenkins\.jenkins目录下会存放jenkins相关的配置信息。 1 jdk配置 jenkins是java开发开源的项目,进而服务器需要jdk环境 1.1 服务器安装jdk 1.2 jenkins jdk配置 2 git配置 在je…

Appium+python自动化(三)- SDK Manager

简介 一开始打算用真机做的,所以在前边搭建环境时候就没有下载SDK,但是考虑到绝大多数人都没有真机,所以顺应民意整理一下模拟器。SDK顾名思义,Android SDK Manager就是一个Android软件开发工具包管理器,就像一个桥梁&…

3D Gaussian Splatting for Real-Time Radiance Field Rendering——文章方法精解

SfM → Point-NeRF → 3D Gaussian Splatting 🟦SfM Structure-from-Motion(运动恢复结构,简称 SfM)是一种计算机视觉技术,可以: 利用多张从不同角度拍摄的图像,恢复出场景的三维结构和相机的…

【Unity实战笔记】第二十四 · 使用 SMB+Animator 实现基础战斗系统

转载请注明出处:🔗https://blog.csdn.net/weixin_44013533/article/details/146409453 作者:CSDN|Ringleader| 1 结构 1.1 状态机 1.2 SMB 2 代码实现 2.1 核心控制 Player_Base_SMB 继承 StateMachineBehaviour ,控制变量初始…

【Java高阶面经:消息队列篇】22、消息队列核心应用:高并发场景下的解耦、异步与削峰

一、消息队列:分布式系统的核心枢纽 在分布式架构日益普及的今天,消息队列(Message Queue, MQ)已成为解决系统复杂性的核心组件。它通过异步通信、系统解耦和流量控制等能力,有效应对高并发场景下的数据流动挑战。 1.1 核心特性:异步、解耦与弹性 1.1.1 异步通信:释放…

软媒魔方——一款集合多种系统辅助组件的软件

停更4年,但依旧吊炸天! 亲们,是不是觉得电脑用久了就像老牛拉车,慢得让人着急?别急,我今天要给大家安利一个超好用的电脑优化神器——软媒魔方! 软件介绍 首先,这货真心是免费的&a…

多路径可靠传输协议(比如 MPTCP)为什么低效

可靠就不能多路径,多路径求可靠必然要多费劲。这不难理解,多路径必异步,这无疑增加了可靠性判断的难度。 前文 多路径传输(比如 MPTCP)对性能的意义 阐述了作为单连接的多子流 MPTCP 对传输性能的意义是无意义,本文接着阐述作为隧…

塔能高温冰蓄冷技术:工厂能耗精准节能的创新之路

在工厂的能耗构成中,制冷系统是重要的耗能环节。传统的水蓄冷和冰蓄冷技术在实际应用中存在一些局限性,难以满足工厂对节能和成本控制的更高要求。塔能科技的高温冰蓄冷技术,凭借其独特的优势,为工厂能耗精准节能提供了创新的解决…

内存优化笔记1

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 问题提出 在很多工业软件中,需要对对象进行微分细化,这样会产生很多(几百万到几千万)对象。随着业务的发展&#xff0c…

人脸识别,使用 deepface + api + flask, 改写 + 调试

1. 起因, 目的, 感受: github deepface 这个项目写的很好, 继续研究使用这个项目,改写 api。增加一个前端 flask app 2. 先看效果 3. 过程: 大力改写原始项目中 api 这部分的代码, 原始项目的文件结构太繁杂了: 我把…

代码管理平台Gitlab如何通过快解析实现远程访问?

一、Gitlab功能介绍 Gitlab是被广泛使用的基于git的开源代码管理平台,用于管理、存储开发人员代码,同时可以协同开发 二、外网试用Gitlab遇到的问题 运维人员将Gitlab服务器部署在总部机房,而分公司开发人员和出差运维人员就无法访问Gitlab…

基于SpringBoot+Vue的足球青训俱乐部管理后台系统的设计与开发

项目背景与概述 随着足球青训行业的快速发展,如何高效、规范地管理学员、教练以及课程等日常工作,成为了青训俱乐部运营的重要课题。为了提升俱乐部的管理效率与用户体验,基于 Spring Boot 和 Vue.js 开发了一个 足球青训俱乐部管理后台系统…

线程调度与单例模式:wait、notify与懒汉模式解析

一.wait 和 notify(等待 和 通知) 引入 wait notify 就是为了能够从应用层面,干预到多个不同线程代码的执行顺序,可以让后执行的线程主动放弃被调度的机会,等先执行的线程完成后通知放弃调度的线程重新执行。 自助取…

MySQL中TCP和套接字SSL加密连接行为分析

目录 一、前言 二、背景 三、参数介绍 3.1、 have_openssl 3.2、have_ssl 3.3、require_secure_transport 四、--ssl-modemode 五、CREATE USER SSL/TLS选项 六、问题验证 6.1、使用套接字连接 6.2、使用TCP连接 七、分析与总结 一、前言 SSL(Secure S…

php本地 curl 请求证书问题解决

错误: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for 解决方案 在php目录下创建证书文件夹, 执行下面生成命令, 然后在php.ini 文件中配置证书路径; 重启环境 curl --eta…

爱普生晶振赋能UWB汽车数字钥匙,解锁未来出行新方式

随着科技的发展,尤其是国产新能源汽车的崛起,相信大家对数字钥匙的概念已经不陌生了,通过手机、智能穿戴实现对汽车的多功能控制已经是很多汽车的标配。但是目前数字钥匙也有一定的局限性,比如定位不准、安全性不强等等&#xff0…

电子电路:深入理解电磁耦合的定义与应用

电场和磁场是独立存在的吗?,但实际上根据麦克斯韦理论,它们是同一现象的两个方面,通过变化相互产生。这时候需要强调时变场的重要性,以及静态场和动态场的区别。 通过电磁波的概念,说明电磁耦合如何导致电…

宝塔安装的 MySQL 无法连接的情况及解决方案

宝塔安装的 MySQL 无法连接的情况及解决方案 宝塔面板是一款流行的服务器管理工具,其中集成的 MySQL 数据库有时会出现连接问题。本文详细介绍两种最常见的 MySQL 连接错误:“1130 - Host is not allowed to connect” 和 “1045 - Access denied”&…

今日行情明日机会——20250523

上证指数缩量下跌,个股下跌超过4000个,总体跌多涨少,日线总体处于高位,注意风险。 深证60分钟级别下跌趋势线压制,总体日线转下跌的概率大,注意风险。 2025年5月23日涨停股主要行业方向分析 一、核心主…

微服务项目->在线oj系统(Java版 - 4)

相信自己,终会成功 目录 B端用户管理 C端用户代码 发送验证码: 验证验证码 退出登录 登录用户信息功能 用户详情与用户编辑 用户竞赛接口 用户报名竞赛 用户竞赛报名接口查询 用户信息列表 ThreadLocalUtil Hutool工具库 常用功能介绍 B端用户管理 进行列表显示与…