LLM小白自學筆記:1.兩種指令微調

一、LoRA

? ? ? ? ? ?簡單來說,LoRA不直接調整個大模型的全部參數(那樣太費資源),而是在模型的某些層(通常是注意力層)加個“旁路”——兩個小的矩陣(低秩矩陣)。訓練時只更新這倆小矩陣,原模型凍住不動。這樣既省內存,又能快速適配新任務。

? ? ? ?大模型就像一座豪華大宅,里面房間多、家具全,但裝修風格已經固定。LoRA就像給某些關鍵房間(比如客廳、廚房)加裝了智能化的小設備(比如智能燈、智能窗簾)。你不用翻新整個大宅,只調整這些小設備,就能讓房子適應新的生活需求,比如自動調節燈光或開窗通風。雖然改動不大,但住起來照樣舒服,甚至更適合你的習慣。

舉個例子

? ? ? ? 假設你部署的是LLaMA-7B,想讓它學會用中文寫詩:

  • 數據:收集1000首中文古詩,格式是純文本。
  • LoRA配置:r=16,?target_modules=["q_proj", "v_proj"]
  • 訓練:跑3輪,每輪500步,顯存8GB夠用。
  • 結果:輸入“春風”,它能生成“春風拂面柳絲輕”之類。
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
import torch
from datasets import load_dataset# 加載 LLaMA-7B 模型和分詞器
model_name = "meta-llama/Llama-2-7b-hf"  # 假設使用 LLaMA-7B
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")# 配置 LoRA
lora_config = LoraConfig(r=16,  # 低秩矩陣的秩lora_alpha=32,  # 縮放因子target_modules=["q_proj", "v_proj"],  # 目標模塊lora_dropout=0.05,  # Dropoutbias="none",task_type="CAUSAL_LM"
)# 應用 LoRA 到模型
model = get_peft_model(model, lora_config)# 加載中文古詩數據集(假設是純文本格式)
dataset = load_dataset("text", data_files={"train": "chinese_poetry.txt"})
def tokenize_function(examples):return tokenizer(examples["text"], padding="max_length", truncation=True, max_length=128)tokenized_dataset = dataset.map(tokenize_function, batched=True)# 配置訓練參數
from transformers import TrainingArguments, Trainertraining_args = TrainingArguments(output_dir="./lora_poetry",num_train_epochs=3,  # 訓練 3 輪per_device_train_batch_size=4,save_steps=500,logging_steps=100,learning_rate=2e-4,fp16=True,  # 使用混合精度訓練
)# 初始化 Trainer
trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_dataset["train"],
)# 開始訓練
trainer.train()# 保存微調后的模型
model.save_pretrained("./lora_poetry_model")# 測試生成
input_text = "春風"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_length=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
# 輸出示例:春風拂面柳絲輕

二、P-Tuning

? ? ? ??P-Tuning不是直接改模型的權重,而是在輸入里加一些特殊的“虛擬詞”(可訓練的嵌入向量),這些詞的作用就像給模型下個指令,告訴它接下來該怎么處理任務。訓練時,只更新這些虛擬詞的參數,原模型保持凍結。這樣既省資源,又能快速適配新需求。

? ? ? ? 大模型是個聰明但固執的廚師,P-Tuning就像在菜譜開頭加幾句特別的“口令”(比如“做中式”、“少放鹽”),廚師不用改自己的烹飪習慣,但能按你的要求調整菜的風格。

舉個例子


假設你用的是LLaMA-7B,想讓它生成更幽默的中文對話:

  • 數據:收集1000條幽默對話的文本數據。
  • P-Tuning配置:添加10個虛擬詞(prompt tokens),嵌入維度與模型一致。
  • 訓練:跑5輪,每輪300步,顯存6GB足以。
  • 結果:輸入“今天心情如何?”,它可能回復“心情像Wi-Fi信號,滿格但偶爾掉線!”

通過這些虛擬詞,模型就像被“調教”出幽默風格,效果精準又高效。

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PromptTuningConfig, get_peft_model, PromptTuningInit
import torch
from datasets import load_dataset# 加載模型和分詞器
model_name = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")# 配置 P-Tuning
ptuning_config = PromptTuningConfig(task_type="CAUSAL_LM",prompt_tuning_init=PromptTuningInit.RANDOM,num_virtual_tokens=10,  # 10 個虛擬詞tokenizer_name_or_path=model_name,
)# 應用 P-Tuning
model = get_peft_model(model, ptuning_config)# 加載幽默對話數據集
dataset = load_dataset("text", data_files={"train": "humor_dialog.txt"})
def tokenize_function(examples):return tokenizer(examples["text"], padding="max_length", truncation=True, max_length=128)tokenized_dataset = dataset.map(tokenize_function, batched=True)# 訓練參數
from transformers import TrainingArguments, Trainertraining_args = TrainingArguments(output_dir="./ptuning_humor",num_train_epochs=5,per_device_train_batch_size=4,save_steps=300,logging_steps=100,learning_rate=3e-4,fp16=True,
)# 初始化 Trainer
trainer = Trainer(model=model,args=training_args,train_dataset=tokenized_dataset["train"],
)# 訓練
trainer.train()# 保存模型
model.save_pretrained("./ptuning_humor_model")# 測試生成
input_text = "今天心情如何?"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_length=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
# 輸出示例:心情像Wi-Fi信號,滿格但偶爾掉線!

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

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

相關文章

2026《數據結構》考研復習筆記一(C++基礎知識)

C基礎知識復習 一、數據類型二、修飾符和運算符三、Lambda函數和表達式四、數學函數五、字符串六、結構體 一、數據類型 1.1基本類型 基本類型 描述 字節(位數) 范圍 char 字符類型,存儲ASCLL字符 1(8位) -128…

基于骨骼識別的危險動作報警分析系統

基于骨骼識別的危險動作報警分析系統 【包含內容】 【一】項目提供完整源代碼及詳細注釋 【二】系統設計思路與實現說明 【三】基于骨骼識別算法的實時危險行為預警方案 【技術棧】 ①:系統環境:Windows 10/11、macOS Ventura、Ubuntu 20.04 ②&#x…

【雙指針】四數之和(medium)

四數之和(medium) 題?描述:解法(排序 雙指針)算法思路: C 算法代碼:Java 算法代碼: 題?鏈接:18. 四數之和 題?描述: 給你?個由 n 個整數組成的數組 num…

Flask+Influxdb+grafna構建電腦性能實時監控系統

Influx下載地址,這里下載了以下版本influxdb-1.8.5_windows_amd64.zip 運行前需要先啟動Influx數據庫: 管理員方式運行cmd->F:->cd F:\influxdb\influxdb-1.8.5-1->influxd -config influxdb.conf,以influxdb.conf配置文件啟動數…

如何在Keil中配置國民技術N32G系列MCU開發環境

如何在Keil及Jlink中搭建國民技術N32G系列MCU開發環境 根據自己的MCU型號(我這里的型號是N32G452REL7)訪問國民技術官網,依次從N32G通用MCU-技術資源-固件和軟件-軟件開發套件,獲取對應MCU型號的SDK,也可點擊這里從網盤…

微軟承認Win11出現極端錯誤,只能強制關機或重裝系統

最近,不少使用 Windows 11 的用戶反映,在系統更新后,“Windows Hello”突然失效,原本便捷的人臉識別和PIN登錄功能統統無法使用。更糟的是,有人在重置系統后直接被擋在系統門外,這讓人不禁發問:…

【android bluetooth 協議分析 02】【bluetooth hal 層詳解 1】【uart 介紹】

一、什么是 UART? UART(Universal Asynchronous Receiver/Transmitter) 是一種 串行通信協議,它的特點是通信時不需要專門的時鐘信號(叫做“異步”通信),常用于兩個設備之間的簡單數據通信&…

天元證券|奶粉行業結構性回暖 乳企競速全齡化、國際化

在過去幾年中,中國嬰配粉市場經歷了量價齊增,量減價增,量減價減的三個周期。歷經多年行業深度洗牌與競爭格局重塑,2024年中國嬰配粉市場回暖態勢愈發清晰可辨。 日前,包括中國飛鶴、澳優、健合集團在內的多家奶粉股披露…

第3.1節 調用鏈路分析簡介

調用鏈路(Call Chain / Call Path) 是程序在執行過程中,按照調用順序形成的函數、模塊或組件之間的依賴關系鏈條,完整記錄了從程序入口到當前執行點的動態調用路徑。它反映了代碼執行的邏輯流程,是分析程序行為、調試問…

System.Security.Cryptography.CryptographicException“填充無效,無法被移除。”

這個異常通常發生在以下幾種情況: 1.密文損壞:密文在傳輸或存儲過程中被篡改或損壞。 2.密鑰不匹配:用于解密的密鑰與加密時使用的密鑰不同。 3.填充模式不匹配:加密時使用的填充模式與解密時指定的填充模式不一致。 4.使用了不正…

【網絡入侵檢測】Suricata之數據包內容匹配

【作者主頁】只道當時是尋常 【專欄介紹】入侵檢測。專注網絡、主機安全,歡迎關注與評論。 1. 概要 本文詳細介紹了網絡入侵檢測系統(如 Suricata)中用于檢查數據包或流有效載荷的 Payload 關鍵字。content 用于匹配數據包內容,默…

Spring Boot 整合 Redis 實現點贊功能:從基礎到實踐

在當今互聯網應用開發中,點贊功能幾乎成為了各類內容平臺的標配。它不僅能增加用戶與內容之間的互動,還能直觀地反映內容的受歡迎程度。本文將詳細介紹如何使用 Spring Boot 整合 Redis 來實現一個簡單的文章點贊功能,讓你輕松掌握這一實用技…

openGauss DataVec + Dify,快速搭建你的智能助手平臺

在當今數字化和智能化的時代,大語言模型(LLM)的應用正以前所未有的速度改變著各個領域的工作方式和用戶體驗。Dify 作為一個開源的大語言模型應用開發平臺,為開發者們提供了便捷且強大的工具,助力構建從基礎智能體到復…

OpenLayers:extent與view extent 介紹

一、范圍的概念 1.什么是范圍? 在Openlayers中范圍(Extent)是用于表示地理空間區域的一種概念。它通常由一個數字數組構成,數組中的內容為:[最小x坐標,最小y坐標,最大x坐標,最大y坐…

can‘t set boot order in virtualbox

Boot order setting is ignored if UEFI is enabled https://forums.virtualbox.org/viewtopic.php?t99121 如果勾選EFI boot order就是灰色的 傳統BIOS就是可選的 然后選中任意介質,通過右邊的上下箭頭調節順序,最上面的應該是優先級最高的 然后就…

如何在 Kali 上解決使用 evil-winrm 時 Ruby Reline 的 quoting_detection_proc 警告

在使用 Kali Linux 運行 Ruby 工具(例如 evil-winrm)時,你可能會遇到以下警告: Warning: Remote path completions is disabled due to ruby limitation: undefined method quoting_detection_proc for module Reline這個警告會導…

工資管理系統的主要功能有哪些

工資管理系統通過自動化薪資計算、稅務處理、員工數據管理、報表生成等功能,極大地提升了薪資發放的效率和準確性。在傳統的人工薪資管理中,HR人員需要手動計算每位員工的薪資,并確保符合稅務要求,極易出錯且耗時。而現代工資管理…

C++語言程序設計——02 變量與數據類型

目錄 一、變量與數據類型(一)變量的數據類型(二)變量命名規則(三)定義變量(四)變量賦值(五)查看數據類型(六)數據類型的字節長度&…

咋用fliki的AI生成各類視頻?AI生成視頻教程

最近想制作視頻,多方考查了決定用fliki,于是訂閱了一年試試,這個AI生成的視頻效果來看真是不錯,感興趣的自己官網注冊個賬號體驗一下就知道了。 fliki官網 Fliki生成視頻教程 創建賬戶并登錄 首先,訪問fliki官網并注…

文章記單詞 | 第32篇(六級)

一,單詞釋義 inferior [?n?f??ri?(r)] adj. 較差的;次的;下級的;n. 下屬;次品joy [d???] n. 歡樂;喜悅;樂趣;樂事;v. 因… 而高興resemble [r??zembl] vt. 類…