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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82187.shtml
英文地址,請注明出處:http://en.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…