快訊
2026-08-12
AI 硬體

LoRA 微調是什麼?QLoRA 不用重新訓練整個模型也能改造 AI 的原理

約 13 分鐘閱讀
廣告

⚡ 站長快讀:核心重點

  • 文章屬性:科技冷知識 / 規格解析
  • 核心結論:LoRA 微調不是把模型壓小,也不是重新訓練——它把原本的權重整個凍結,另外訓練兩個很小的矩陣去代表「這次調整了多少」。官方論文的數字是:相較於用 Adam 全量微調 GPT-3 175B,可訓練參數少 10,000 倍、GPU 記憶體需求降為約三分之一。QLoRA 再往前一步,把凍結的基座壓成 4-bit 存放,讓 650 億參數的模型能在單張 48GB 顯示卡上微調。
  • 適用對象:所有對科技好奇的人,尤其是看到「LoRA」「QLoRA」「adapter」這幾個字就頭大、又想知道自己那張顯示卡到底夠不夠的人

📌 快速答案

一句話答案:LoRA 微調是凍結原模型權重、只訓練兩個小矩陣來代表權重變化的方法;QLoRA 再把凍結的基座壓成 4-bit 存放,省下更多顯示記憶體。


🔍 故事的起點

先講一個很多人不會意識到的成本問題。

2021 年,微軟研究團隊在論文裡是這樣描述當時的困境的:以 GPT-3 175B 為例,「部署多個各自獨立、每個都有 1,750 億參數的微調模型副本,成本高到難以承受」(來源:arXiv 2106.09685,預印本,第一級原始論文)。

這句話值得停下來想一下。傳統的全量微調(full fine-tuning)會更新模型的每一個參數,所以微調完的結果是「一個全新的完整模型」。你想要一個寫程式的版本、一個做客服的版本、一個整理法遵文件的版本,就要存三份 1,750 億參數的模型。不是三個小檔案,是三份完整副本。

而且訓練當下更慘。用 Adam 這類最佳化器訓練時,顯示記憶體裡除了權重本身,還要放梯度、放最佳化器狀態(Adam 每個參數要多存兩份統計量)。所以「模型有多大」跟「訓練時要多少 VRAM」根本不是同一個數字,後者通常是前者的好幾倍。

於是有人問:模型調整前後的差異,真的需要用一個跟原模型一樣大的矩陣來裝嗎?

這就是 LoRA(Low-Rank Adaptation,低秩適應)的起點。作者群 Edward J. Hu 等八人假設,語言模型適應到新任務時,那個「權重變化量」其實有很低的內在秩(intrinsic rank)——白話講就是:變化的樣態沒那麼豐富,可以用少得多的數字描述完。

廣告

在往下拆原理之前,先把中文圈最常搞混的三件事講清楚,因為後面每一段都建立在這三件事上:

  1. LoRA 不是壓縮、不是量化、也不是蒸餾。 原模型的權重一個位元都沒被改到,它只是被鎖住不動。
  2. LoRA 訓練出來的不是一個新模型,是一個 adapter(轉接器)。 檔案通常只有幾十到幾百 MB,要用的時候疊回原模型上。
  3. QLoRA 的那個 Q 省的是「基座怎麼存放」,不是省 adapter。 它把凍結的原模型壓成 4-bit 塞進顯示記憶體,adapter 本身仍然用高精度訓練。

🧪 原理拆解

低秩分解:為什麼兩個小矩陣可以代表一個大矩陣

假設模型裡某一層的權重矩陣是 W,尺寸 d×k。全量微調做的事是算出一個同樣 d×k 大的變化量 ΔW,然後把 W 換成 W+ΔW。

LoRA 做的事是:不去算那個大的 ΔW,改成用兩個瘦長的矩陣相乘去逼近它。一個是 A(尺寸 r×k),一個是 B(尺寸 d×r),兩個乘起來 BA 剛好也是 d×k。中間那個 r 就是「秩」(rank),是你自己設的,而且設得非常小。

參數量差多少?原本要練 d×k 個數字,現在只要練 r×(d+k) 個。當 d 和 k 是幾千、而 r 只有 8 或 16 的時候,這個差距是好幾個數量級。論文給的實測結論就是那句常被引用的話:相較於用 Adam 全量微調 GPT-3 175B,LoRA 可以把可訓練參數減少 10,000 倍、把 GPU 記憶體需求減少為三分之一(來源:arXiv 2106.09685 摘要,第一級原始論文)。

更重要的是品質沒有打折。同一份摘要寫得很清楚:LoRA 在 RoBERTa、DeBERTa、GPT-2 與 GPT-3 上的模型品質與全量微調相當或更好,而且訓練吞吐量更高。

在 Transformer 上,Hugging Face 官方的 PEFT 文件說明,原則上 LoRA 可以套用在網路裡任何一組權重矩陣,但為了簡單與參數效率,通常只套在注意力區塊(attention blocks)上(來源:Hugging Face PEFT 官方文件,第一級官方)。

廣告

B 矩陣初始化為零:為什麼開始訓練的那一刻模型不會壞掉

這一點幾乎沒有中文教學會提,但它是整個設計最巧妙的地方。

如果 BA 是隨機初始化的,那你把 adapter 掛上去的瞬間,模型的行為就被一組亂數污染了,還沒開始學就先變笨。LoRA 的解法是:A 用 Kaiming-uniform 初始化,B 直接初始化為全零(來源:Hugging Face PEFT 官方文件,第一級官方)。

B 是零,所以 BA 也是零,所以 W+BA 就等於 W。訓練開始的那一刻,模型的輸出與原模型一模一樣,PEFT 文件用的詞是「identity transform(恆等變換)」。接著訓練過程中 B 才從零慢慢長出來,模型行為也就從原點慢慢偏移到你要的方向。

這也解釋了為什麼 LoRA 訓練通常比全量微調穩定:它的起點永遠是「什麼都沒改」。

r 與 lora_alpha:中文圈最常調錯的兩個旋鈕

在 Hugging Face PEFT 裡,LoRA 的行為由 LoraConfig 控制,最常被動到的幾個參數是(來源:Hugging Face PEFT 官方文件,第一級官方):

  • r:更新矩陣的秩。秩越低,矩陣越小、可訓練參數越少。
  • target_modules:要把 LoRA 掛到哪些模組上。
  • lora_alpha:LoRA 的縮放係數。
  • bias:是否要一起訓練 bias,可設 nonealllora_only

lora_alpha 是最常被誤解的一個。很多中文文章把它講成「效果強度」,調高就會「學得更兇」——這說法不精確。官方文件寫得很明白:LoRA 架構在每一次前向傳播時,會用一個固定的純量去縮放 adapter,而原始 LoRA 方法用的縮放函數是 lora_alpha/r。也就是說它跟 r 是綁在一起的一組;你把 r 從 8 調到 64 卻沒動 alpha,實際的縮放就縮水了 8 倍。

廣告

這件事後來有專門的研究處理。PEFT 文件指出,Rank-Stabilized LoRA(rsLoRA)證明改用 lora_alpha/sqrt(r) 能穩定 adapter,並釋放高秩帶來的效能潛力,在設定裡開 use_rslora=True 即可(來源:Hugging Face PEFT 官方文件引 arXiv 2312.03732,預印本)。如果你曾經試過「把 r 調大反而變差」,這個縮放行為很可能就是原因之一。

QLoRA 多做的三件事

LoRA 已經很省,但它省的是訓練狀態——梯度與最佳化器狀態只跟著那幾個小矩陣走。問題是,凍結的基座本身還是得完整放進顯示記憶體才能做前向與反向傳播。一個 65B 的模型,光是 16-bit 權重換算下來就超過 100GB(65B × 2 bytes ≈ 130GB,此為算術換算、不是官方公布的數字),消費級顯示卡連門都摸不到。

QLoRA 就是衝著這一段來的。它由華盛頓大學的 Tim Dettmers 等人在 2023 年 5 月提出,論文後來收錄於 NeurIPS 2023。核心做法是:讓梯度反向傳播「穿過」一個凍結的 4-bit 量化模型,流進 LoRA adapter 裡(來源:arXiv 2305.14314,第一級原始論文)。

論文摘要列出三項省記憶體的創新,原文措辭如下:

  1. 4-bit NormalFloat(NF4):一種對常態分佈權重而言「資訊理論上最佳」的新資料型別。神經網路權重大致服從常態分佈,所以用一個為常態分佈量身訂做的 4-bit 格式,會比通用的 4-bit 整數保留更多資訊。
  2. 雙重量化(double quantization):量化本身會產生一堆「量化常數」,這些常數也要佔空間;QLoRA 把量化常數再量化一次,進一步壓低平均記憶體佔用。
  3. 分頁最佳化器(paged optimizers):用來吸收訓練過程中的記憶體尖峰,避免一個突波就 OOM。

結果就是那句招牌宣稱:在單張 48GB GPU 上微調 650 億參數的模型,同時保持完整 16-bit 微調的任務表現。論文同時發表了以此訓練的 Guanaco 模型族,在 Vicuna benchmark 上達到 ChatGPT 99.3% 的表現水準,而訓練只花了單張 GPU 24 小時。

⚠️ 這裡要提醒一句:Vicuna benchmark 與「99.3% ChatGPT」是 2023 年當時的評測結果,論文自己在摘要裡也直言「現行聊天機器人 benchmark 不足以準確評估聊天機器人的表現水準」。把它當作「QLoRA 沒有嚴重犧牲品質」的證據可以,拿它當今天的模型排名就不合適了。

全量微調、LoRA 與 QLoRA 在基座權重處理、可訓練參數、GPU 記憶體與產出檔案四個面向的比較表

🎮 硬體門檻:那張顯示卡到底夠不夠

這是最多人想問、卻最容易被隨口回答的一段。站長把「有官方出處的數字」跟「自己換算的數字」分開講,因為兩者的可信度完全不同。

有官方出處的數字有這幾個:

情境官方數字出處
LoRA 對比全量微調 GPT-3 175BGPU 記憶體需求約降為 1/3arXiv 2106.09685
QLoRA 微調 65B單張 48GB GPUarXiv 2305.14314
FSDP-QLoRA 微調至 70B雙卡 24GB 系統Hugging Face bitsandbytes 官方文件

最後一列值得多說兩句。FSDP-QLoRA 把資料平行(FSDP 可把模型參數、最佳化器狀態與梯度切片分散到多張 GPU)、4-bit 量化與 LoRA 三者結合,能在雙 24GB GPU 系統上訓練最大 70B 的 LLM,這項技術由 Answer.AI 與 bitsandbytes 合作釋出(來源:Hugging Face bitsandbytes 官方文件,第一級官方)。對台灣玩家來說這個組合很有現實感——兩張 24GB 級距的卡,比一張 48GB 專業卡好取得得多。

再來是換算,請當估算用:

4 bit 就是 0.5 byte,所以純算術上,4-bit 量化後每 10 億(1B)參數的權重約佔 0.5 GB。一個 8B 模型的 4-bit 權重大約 4GB、一個 13B 大約 6.5GB。

千萬不要拿這個數字當作「我的卡夠不夠」的答案。這只是權重的靜態佔用,實際訓練時還要疊上:activation(跟批次大小與序列長度直接相關)、LoRA adapter 的梯度與最佳化器狀態、以及框架本身的開銷。這也正是 QLoRA 要專門設計分頁最佳化器來處理記憶體尖峰的原因——尖峰是真的會發生的。實務上的態度是:用換算值抓下限,然後留出明顯餘裕,再用小批次實測

關於量化本身怎麼吃 VRAM、Q4 與 Q8 各自的取捨,站長在〈本地 LLM 模型怎麼選?7B/70B、Q4/Q8 量化與 VRAM 一次搞懂〉裡有完整的估算公式與對照表,那篇談的是推論端,和這裡的訓練端可以互相對照著看——你會發現同一個模型,「拿來聊天」跟「拿來微調」需要的記憶體完全是兩個量級。

順帶一提,微調吃 VRAM 的原因和推論不完全一樣。推論端的瓶頸多半在記憶體頻寬與 KV cache,這也是 Flash Attention 這類技術要處理的問題;訓練端則是多了梯度與最佳化器狀態這兩塊固定成本。兩者的最佳化手段不能互相取代。


🧩 實際上長什麼樣子?

Hugging Face 官方文件給的 QLoRA 標準流程,大致是這三段設定(來源:Hugging Face PEFT 官方文件,第一級官方)。先用 BitsAndBytesConfig 決定基座怎麼量化:

from transformers import BitsAndBytesConfig
config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
)

四個參數剛好對應前面講的三件事:load_in_4bit 開 4-bit、bnb_4bit_quant_type="nf4" 指定用 NF4 這個為常態分佈設計的型別、bnb_4bit_use_double_quant 開雙重量化,而 bnb_4bit_compute_dtype實際運算時要解回哪種精度——注意這代表 4-bit 只是「存放格式」,算的時候還是會解回 bfloat16。

模型載入後要先呼叫 prepare_model_for_kbit_training() 做前處理,接著才是 LoraConfigget_peft_model()。有一個細節值得記住:官方文件在「QLoRA-style training」一節明講,QLoRA 是把可訓練權重加到 Transformer 架構裡的所有線性層,而各家架構的層名稱不同,所以直接把 target_modules 設成 "all-linear" 即可。這跟一般 LoRA 只掛注意力層的預設做法不一樣,是 QLoRA 論文本身的設定。

微調完怎麼用? 兩條路。一是把 adapter 跟基座分開放,用的時候疊上去——好處是同一個基座可以掛好幾個不同任務的 adapter,官方文件把這個特性列為 LoRA 的主要優點之一。二是用 merge_and_unload() 把 adapter 權重合併回基座,得到一個可以獨立使用的新模型;PEFT 文件說明這麼做的目的正是消除「同時載入基座與 LoRA」造成的延遲問題。這也呼應了 LoRA 論文那句常被引用的宣稱:與 adapter 類方法不同,LoRA 不會增加額外的推論延遲


💡 總結:冷知識延伸

站長我覺得 LoRA 最有意思的地方,是它其實在賭一件哲學層面的事:大模型學新東西的時候,腦袋裡真正動到的部分沒有想像中多。原本大家默認「要調整一個 1,750 億參數的模型,就得有 1,750 億個自由度」,LoRA 說不用,幾百萬個就夠了,而且效果一樣好。這個假設居然成立,本身就是關於「大模型到底學了什麼」的一條線索。

第二個延伸是:LoRA 完全不限於語言模型。PEFT 官方文件就寫著,雖然原始論文聚焦在語言模型,但這套技術可以套用到深度學習模型裡任何的密集層(dense layers),擴散模型(diffusion model)也適用——你在 AI 繪圖社群看到滿天飛的那些「LoRA 檔」,底層原理就是這一套,同一個底模掛不同 LoRA 換畫風,道理跟同一個基座掛不同任務 adapter 一模一樣。

第三個是關於「4-bit 會不會傷到成果」。PEFT 文件提到,量化基座做 LoRA 訓練時可以考慮 LoftQ 初始化,做法是讓 LoRA 權重的初始值去抵消量化誤差,官方說法是「已證實能改善量化情境下的表現」。也就是說,量化帶來的誤差是被正視、而且有專門手段處理的,不是靠「應該還好吧」硬撐過去。

最後提醒一個現實面:本文引用的官方數字都來自論文與官方文件,站長沒有第一手實測資料可以佐證你那張卡的實際表現。要不要投入,建議先用最小的模型(1B 級距)在你自己的機器上跑一次完整流程,確認環境沒問題,再往上加。


❓ 常見問題

Q:LoRA 微調完之後,原本的模型會被改壞嗎?

不會。LoRA 的定義就是凍結預訓練權重、另外注入可訓練的秩分解矩陣,原始權重檔案完全沒有被寫入。這也是為什麼你可以在同一個基座上掛很多個不同的 adapter,彼此不互相污染。除非你自己主動呼叫 merge_and_unload() 把結果合併並另存,原模型都是原封不動的。

Q:QLoRA 訓練出來的成果,是一個 4-bit 的模型嗎?

不是。4-bit 是「訓練期間基座的存放格式」,不是產出。你得到的仍然是一個 LoRA adapter。基座怎麼存,跟 adapter 是什麼,是兩件獨立的事。

Q:r 要設多少?

沒有標準答案,官方文件只說「秩越低,更新矩陣越小、可訓練參數越少」,並未給定一個推薦值。可以參考的是 Hugging Face 文件範例本身的差異:一般量化 LoRA 範例用 r=16lora_alpha=8,而 FSDP-QLoRA 訓練範例用 r=64lora_alpha=16。這正好說明它是隨任務與資源調整的參數。要調高 r 的時候記得一併考慮前面講的 lora_alpha/r 縮放問題,或直接開 use_rslora=True

Q:LoRA 跟 MoE(混合專家)是不是同一種「只用一部分參數」的技巧?

不是,兩者解決的問題完全不同。MoE 是模型架構,每次推論只啟動部分專家,但所有專家的權重都得放在記憶體裡(這點站長在〈MoE 混合專家是什麼?為何 235B 模型只算 22B、卻還是很吃 VRAM〉裡拆解過);LoRA 是訓練方法,不改架構,只改「哪些參數可以被更新」。一個模型可以同時是 MoE 架構、又用 LoRA 來微調。

Q:一定要用 Hugging Face 的工具嗎?

不一定,但 PEFT 是目前生態最完整、文件最清楚的一套,而且與 Transformers、bitsandbytes、TRL 深度整合。本文引用的參數與行為都以 PEFT 官方文件為準;若你用的是其他框架,實作細節可能不同,請以該框架自身文件為準。


🔗 延伸閱讀


📎 參考資料來源

📖 第一級|原始論文與官方文件:

📖 第二級|延伸研究(預印本):


廣告