極客時間:在 Google Colab 上嘗試 Prefix Tuning

??每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領域的領跑者。點擊訂閱,與未來同行! 訂閱:https://rengongzhineng.io/

Prefix Tuning 是當前最酷的參數高效微調(PEFT)方法之一,它可以在無需重新訓練整個大模型的前提下對大語言模型(LLM)進行任務適配。為了理解它的工作原理,我們先了解下背景:傳統微調需要更新模型的所有參數,成本高、計算密集。隨后出現了 Prompting(提示學習),通過巧妙設計輸入引導模型輸出;Instruction Tuning(指令微調)進一步提升模型對任務指令的理解能力。再后來,LoRA(低秩適配)通過在網絡中插入可訓練的低秩矩陣實現任務適配,大大減少了可訓練參數。

而 Prefix Tuning 則是另一種思路:它不會更改模型本體參數,也不插入額外矩陣,而是學習一小組“前綴向量”,將它們添加到每一層 Transformer 的輸入中。這種方法輕巧快速,非常適合在 Google Colab 這樣資源受限的環境中實踐。

在這篇博客中,我們將一步步地在 Google Colab 上,使用 Hugging Face Transformers 和 peft 庫完成 Prefix Tuning 的演示。


第一步:安裝運行環境

!pip install transformers peft datasets accelerate bitsandbytes

使用的庫包括:

  • transformers: 加載基礎模型

  • peft: 實現 Prefix Tuning

  • datasets: 加載示例數據集

  • acceleratebitsandbytes: 優化訓練性能


第二步:加載預訓練模型和分詞器

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import get_peft_model, PrefixTuningConfig, TaskTypemodel_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

這里我們使用 GPT-2 作為演示模型,也可以替換為其他因果語言模型。


第三步:配置 Prefix Tuning

peft_config = PrefixTuningConfig(task_type=TaskType.CAUSAL_LM,inference_mode=False,num_virtual_tokens=10
)model = get_peft_model(model, peft_config)
model.print_trainable_parameters()

上述配置在每層 Transformer 中加入了 10 個可學習的虛擬前綴 token,我們將對它們進行微調。


第四步:加載并預處理 Yelp 數據集樣本

from datasets import load_datasetdataset = load_dataset("yelp_review_full", cache_dir="/tmp/hf-datasets")
dataset = dataset.shuffle(seed=42).select(range(1000))def preprocess(example):tokens = tokenizer(example["text"], truncation=True, padding="max_length", max_length=128)return {"input_ids": tokens["input_ids"], "attention_mask": tokens["attention_mask"]}dataset = dataset.map(preprocess, batched=True)

第五步:使用 Prefix Tuning 訓練模型

from transformers import TrainingArguments, Trainertraining_args = TrainingArguments(output_dir="./prefix_model",per_device_train_batch_size=4,num_train_epochs=1,logging_dir="./logs",logging_steps=10
)trainer = Trainer(model=model,args=training_args,train_dataset=dataset
)trainer.train()

第六步:保存并加載 Prefix Adapter

model.save_pretrained("prefix_yelp")

之后加載方法如下:

from peft import PeftModelbase_model = AutoModelForCausalLM.from_pretrained("gpt2")
prefix_model = PeftModel.from_pretrained(base_model, "prefix_yelp")

第七步:推理測試

訓練完成后,我們可以使用調優后的模型進行生成測試。

input_text = "This restaurant was absolutely amazing!"
inputs = tokenizer(input_text, return_tensors="pt")output = prefix_model.generate(**inputs, max_new_tokens=50)
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print("\nGenerated Output:")
print(generated_text)

示例輸出

這是在訓練 3 個 epoch 并使用 20 個虛擬 token 后的輸出示例:

This restaurant was absolutely amazing!, a the the the the the the the the the the the the the the the the the the the the the the the the the the the the the a., and the way. , and the was

雖然模型初步模仿了 Yelp 評論的風格,但輸出仍重復性強、連貫性不足。為獲得更好效果,可增加訓練數據、延長訓練周期,或使用更強的基礎模型(如 gpt2-medium)。


完整代碼

以下是經過改進的完整代碼(包含更大前綴尺寸和更多訓練輪次):

# 安裝依賴
!pip install -U fsspec==2023.9.2
!pip install transformers peft datasets accelerate bitsandbytes# 加載模型與分詞器
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import get_peft_model, PrefixTuningConfig, TaskTypemodel_name = "gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained(model_name)
model.config.pad_token_id = tokenizer.pad_token_id# 配置 Prefix Tuning
peft_config = PrefixTuningConfig(task_type=TaskType.CAUSAL_LM,inference_mode=False,num_virtual_tokens=20  # 使用更多虛擬 token
)
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()# 加載和預處理數據集
from datasets import load_dataset
try:dataset = load_dataset("yelp_review_full", split="train[:1000]")
except:dataset = load_dataset("yelp_review_full")dataset = dataset["train"].select(range(1000))def preprocess(examples):tokenized = tokenizer(examples["text"], truncation=True, padding="max_length", max_length=128)tokenized["labels"] = [[-100 if mask == 0 else token for token, mask in zip(input_ids, attention_mask)]for input_ids, attention_mask in zip(tokenized["input_ids"], tokenized["attention_mask"])]return tokenizeddataset = dataset.map(preprocess, batched=True, remove_columns=["text", "label"])# 配置訓練參數
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(output_dir="./prefix_model",per_device_train_batch_size=4,num_train_epochs=3,  # 增加輪次logging_dir="./logs",logging_steps=10,report_to="none"
)trainer = Trainer(model=model,args=training_args,train_dataset=dataset
)trainer.train()# 保存和加載前綴
model.save_pretrained("prefix_yelp")
from peft import PeftModel
base_model = AutoModelForCausalLM.from_pretrained("gpt2")
prefix_model = PeftModel.from_pretrained(base_model, "prefix_yelp")# 推理
input_text = "This restaurant was absolutely amazing!"
inputs = tokenizer(input_text, return_tensors="pt")
output = prefix_model.generate(**inputs, max_new_tokens=50)
print(tokenizer.decode(output[0], skip_special_tokens=True))

不同微調技術如何選擇?

方法特點適合場景
Prompting零樣本/少樣本,無需訓練快速實驗、通用模型調用
Instruction Tuning統一風格指導多個任務多任務模型,提示兼容性強
Full Fine-Tuning全模型更新,效果最好但成本高數據量大、計算資源充足場景
LoRA插入低秩矩陣,性能和效率平衡中等規模適配任務、部署靈活
Prefix Tuning訓練前綴向量,模塊化且輕量多任務共享底模、小規模快速適配

真實應用案例

  • 客服機器人:為不同產品線訓練不同前綴,提高回答準確性

  • 法律/醫學摘要:為專業領域調優風格和術語的理解

  • 多語種翻譯:為不同語言對訓練前綴,重用同一個基礎模型

  • 角色對話代理:通過前綴改變語氣(如正式、幽默、親切)

  • SaaS 多租戶服務:不同客戶使用不同前綴,但共用主模型架構


總結

Prefix Tuning 是一種靈活且資源友好的方法,適合:

  • 有多個任務/用戶但希望復用基礎大模型的情況

  • 算力有限,但希望實現快速個性化的場景

  • 構建模塊化、可熱切換行為的 LLM 服務

建議從小任務入手測試,嘗試不同 prefix 長度與訓練輪次,并結合任務類型進行微調策略選擇。

如果你想將此教程發布到 Colab、Hugging Face 或本地部署,歡迎繼續交流!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908726.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908726.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908726.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android設備推送traceroute命令進行網絡診斷

文章目錄 工作原理下載traceroute for android推送到安卓設備執行traceroutetraceroute www.baidu.com Traceroute(追蹤路由) 是一個用于網絡診斷的工具,主要用于追蹤數據包從源主機到目標主機所經過的路由路徑,以及每一跳&#x…

【Linux應用】Linux系統日志上報服務,以及thttpd的配置、發送函數

【Linux應用】Linux系統日志上報服務,以及thttpd的配置、發送函數 文章目錄 thttpd服務安裝thttpd配置thttpd服務thttpd函數日志效果和文件附錄:開發板快速上手:鏡像燒錄、串口shell、外設掛載、WiFi配置、SSH連接、文件交互(RADX…

Linux 內核內存管理子系統全面解析與體系構建

一、前言: 為什么內存管理是核心知識 內存管理是 Linux 內核最核心也最復雜的子系統之一,其作用包括: 為軟件提供獨立的虛擬內存空間,實現安全隔離分配/回收物理內存資源,維持系統穩定支持不同類型的內存分配器,最優…

鼠標的拖動效果

1、變量的設置 let isDragging false; let startX; let startY; let endX; let endY; let box null;isDragging : 表示是否推拽startX、startY:表示起始坐標,相對于元素endX、endY:表示結束坐標,相對于元素box&…

SwaggerFuzzer:一款自動化 OpenAPI/Swagger 接口未授權訪問測試工具

SwaggerFuzzer 🌐 一款自動化 OpenAPI/Swagger 接口未授權訪問測試工具🚀 工具介紹:SwaggerFuzzer? 核心功能亮點🚀 快速使用🧰 支持參數 📌 項目結構📥 獲取與下載 🌐 一款自動化 …

文獻閱讀:Exploring Autoencoder-based Error-bounded Compression for Scientific Data

目錄 論文簡介動機:為什么作者想要解決這個問題?貢獻:作者在這篇論文中完成了什么工作(創新點)?規劃:他們如何完成工作?離線訓練階段:在線壓縮階段 理由:通過什么實驗驗證它們的工作…

【業務框架】3C-相機-Cinemachine

概述 插件,做相機需求,等于相機老師傅多年經驗總結的工具 Feature Transform:略Control Camera:控制相機參數Noise:增加隨機性Blend:CameraBrain的混合列表指定一個虛擬相機到另一個相機的過渡&#xff…

設計一個算法:刪除非空單鏈表L中結點值為x的第一個結點的前驅結點

目錄 單鏈表的存儲結構定義如下 快慢指針法 三指針法版本① 三指針法版本② 單鏈表的存儲結構定義如下 typedef struct{Elemtype data;struct Node* next; }LNode,*LinkList; 快慢指針法 void deleteprex(LinkList L, Elemtype e) {if (L NULL || L->next NULL ||…

【Qt】:設置新建類模板

完整的頭文件模板 #ifndef %FILENAME%_H #define %FILENAME%_H/*** brief The %CLASSNAME% class* author %USER%* date %DATE%*/ class %CLASSNAME% { public:%CLASSNAME%();~%CLASSNAME%();// 禁止拷貝構造和賦值%CLASSNAME%(const %CLASSNAME%&) delete;%CLASSNAME%&a…

?**?CID字體?**? 和 ?**?Simple字體?**?

在PDF中,字體類型主要分為 ??CID字體?? 和 ??Simple字體?? 兩大類,它們的主要區別在于編碼方式和適用場景。以下是它們的詳細對比: ??1. CID字體(CID-keyed Fonts)?? CID(Character Identifie…

計組_導學

2025.05.31:老湯講408計組學習筆記 導學 第1章計算機系統概述:對計算機系統有全局的認識第2章總線系統:簡單且獨立,不會依賴其他內容,它是被依賴的第3章主存儲器:只有了解主存儲器的內部結構,才能理解在主存中是如何存儲二進制的第4章數據的表示與運算:各種編碼以及計算…

【GPT模型訓練】第二課:張量與秩:從數學本質到深度學習的基礎概念解析

這里寫自定義目錄標題 張量(Tensor)的定義關鍵特點:示例: 張量的秩(Rank)示例:“秩”的拼音常見混淆點 總結 張量(Tensor)的定義 在數學和物理學中,張量是一…

RabbitMQ work模型

Work 模型是 RabbitMQ 最基礎的消息處理模式,核心思想是 ??多個消費者競爭消費同一個隊列中的消息??,適用于任務分發和負載均衡場景。同一個消息只會被一個消費者處理。 當一個消息隊列綁定了多個消費者,每個消息消費的個數都是平攤的&a…

【Linux操作系統】基礎開發工具(yum、vim、gcc/g++)

文章目錄 Linux軟件包管理器 - yumLinux下的三種安裝方式什么是軟件包認識Yum與RPMyum常用指令更新軟件安裝與卸載查找與搜索清理緩存與重建元數據 yum源更新1. 備份現有的 yum 源配置2. 下載新的 repo 文件3. 清理并重建緩存 Linux編輯器 - vim啟動vimVim 的三種主要模式常用操…

73常用控件_QFormLayout的使用

目錄 代碼?例: 使? QFormLayout 創建表單. 除了上述的布局管理器之外, Qt 還提供了 QFormLayout , 屬于是 QGridLayout 的特殊情況, 專 ??于實現兩列表單的布局. 這種表單布局多?于讓??填寫信息的場景. 左側列為提?, 右側列為輸?框 代碼?例: 使? QFormLayout 創…

蘭亭妙微 | 醫療軟件的界面設計能有多專業?

從醫療影像系統到手術機器人控制界面,從便攜式病原體檢測設備到多平臺協同操作系統,蘭亭妙微為眾多醫療設備研發企業,打造了兼具專業性與可用性的交互界面方案。 我們不僅做設計,更深入理解醫療場景的實際需求: 對精…

鴻蒙開發修改版本幾個步驟

鴻蒙開發修改版本幾個步驟 比如:5.0.4(16)版本改為5.0.2(14)版本 一、項目下的build-profile.json5 "products": [{"name": "default","signingConfig": "default&qu…

Flask 基礎與實戰概述

一、Flask 基礎知識 什么是 Flask? Flask 是一個基于 Python 的輕量級 Web 框架(微框架)。 特點:核心代碼簡潔,給予開發者更多選擇空間。 與 Django 對比: Django 創建空項目生成多個文件,Flask 僅需一個文件即可實現簡單應用(如 "Hello, World!")。 Flask …

Linux安全加固:從攻防視角構建系統免疫

Linux安全加固:從攻防視角構建系統免疫 構建堅不可摧的數字堡壘 引言:攻防對抗的新紀元 在日益復雜的網絡威脅環境中,Linux系統安全已從被動防御轉向主動免疫。2023年全球網絡安全報告顯示,高級持續性威脅(APT)攻擊同比增長65%,平均入侵停留時間縮短至48小時。本章將從…