快速回答:LoRA 是什麼?

LoRA(Low-Rank Adaptation,低秩適應)是一種微調 AI 模型的技術。它的核心概念是:不修改模型原本的所有參數,而是在模型的每一層旁邊加上一組很小的新參數(通常只有原始參數量的 0.1% - 1%),只訓練這些新參數來達到微調的效果。

用白話說:如果完整微調像是把整本教科書重寫一遍,LoRA 像是在教科書旁邊貼便利貼——便利貼的量很少,但在需要的地方標記修改,就能讓這本書符合你的特定需求。原本的書完全不動,你可以隨時撕掉便利貼恢復原狀,也可以換一組不同的便利貼應對不同的任務。

LoRA 的正式定義

LoRA 由 Microsoft Research 的 Edward Hu 等人在 2021 年的論文《LoRA: Low-Rank Adaptation of Large Language Models》中提出。這項技術屬於 PEFT(Parameter-Efficient Fine-Tuning,參數高效微調)方法的一種,目標是在極少的可訓練參數下達到接近完整微調的效果。

LoRA 解決什麼問題

完整微調的困境

如果你要讓一個大型語言模型(例如 Llama 3 70B)學會你公司的專業知識,傳統的做法是「完整微調」(Full Fine-Tuning):讓模型看你的訓練資料,更新模型的所有參數。

問題是,70B 模型有 700 億個參數,以 FP16(半精度浮點數)儲存就需要約 140 GB 的 GPU 記憶體。訓練時還需要額外的記憶體存放梯度(gradients)和優化器狀態(optimizer states),總共可能需要 500 GB 以上的 GPU 記憶體。

這意味著你需要多張高階 GPU(例如 4-8 張 NVIDIA A100 80GB 或 H100),成本從數十萬到數百萬台幣不等。對大多數企業和個人開發者來說,這不是一個合理的投資。

LoRA 的解法

LoRA 的做法是「凍結」原始模型的所有參數(不更新它們),然後在需要調整的層旁邊插入兩個很小的矩陣(A 和 B),只訓練這兩個矩陣。

具體來說:如果原始模型某一層的權重矩陣大小是 4096 × 4096(約 1,670 萬個參數),LoRA 會加上兩個矩陣:A 是 4096 × r,B 是 r × 4096,其中 r 是「秩」(rank),通常是 4、8、16、或 32。當 r = 8 時,新增的參數量只有 4096 × 8 + 8 × 4096 = 65,536 個,大約是原始的 0.4%。

推理時,LoRA 的兩個小矩陣的乘積可以直接加到原始權重上(因為矩陣乘法的結合律),所以不會增加推理的延遲。

實際的資源節省

以 Llama 3 8B 為例:

完整微調:需要約 60-80 GB GPU 記憶體(訓練時),至少一張 A100 80GB。訓練產出的模型檔案約 16 GB。

LoRA 微調(r=16):只需要約 20-24 GB GPU 記憶體,一張 RTX 4090(24GB)就可以跑。產出的 LoRA 權重檔案約 30-100 MB。

差距很明顯:硬體需求降低了 3-4 倍,模型儲存降低了 100 倍以上。

技術原理

低秩分解的數學概念

LoRA 的數學基礎是低秩矩陣分解(Low-Rank Matrix Decomposition)。一個大矩陣可以用兩個小矩陣的乘積來近似——這在線性代數中是一個已知的技術(類似 SVD 的概念)。

LoRA 的假設是:模型在微調時的參數變化量(也就是完整微調前後權重的差異)可以用一個低秩矩陣來近似。換句話說,微調需要的「修改量」的維度遠低於參數空間的維度。

設原始權重為 W(d × d),微調後的權重變化為 ΔW,LoRA 假設 ΔW 可以分解為 ΔW ≈ B × A,其中 A 是 r × d,B 是 d × r,r 遠小於 d。

實際訓練時:

前向傳播:y = (W + B × A) × x = W × x + B × A × x

W 不更新,只更新 A 和 B。A 通常用隨機高斯初始化,B 初始化為零,這樣訓練剛開始時 B × A = 0,模型的行為和原始模型完全相同。

Rank(秩)的選擇

r 的大小直接影響 LoRA 的效果。r 越大,LoRA 能表達的修改空間越大,但參數量和記憶體使用也越多。r 越小,效率越高但可能無法充分捕捉微調需要的知識。

實務上的參考值:

  • r = 4:適合輕度的風格調整或語調微調
  • r = 8:通常的預設值,在大多數任務上表現足夠好
  • r = 16:需要學習較多新知識的任務(例如新領域的專業術語)
  • r = 32 或更高:很少需要,只有在微調效果明顯不足時才考慮

研究顯示,在很多任務上 r = 8 的 LoRA 效果已經接近完整微調的 90-95%。繼續增加 r 帶來的邊際效益遞減,但增加的計算成本是線性的。

應用在哪些層

LoRA 不一定要加在模型的每一層。常見的策略是加在 Transformer 架構中的注意力層(attention layers)的 Q、K、V 投影矩陣上。有些實作也會加在 FFN(前饋網路)層。

加在哪些層會影響效果:

  • 只加在 Q 和 V:最常見的設定,效果穩定,參數量最小
  • 加在 Q、K、V:略微更好的效果,參數量增加 50%
  • 加在所有線性層(Q、K、V、O、FFN):效果最好但參數量最大

LoRA vs 完整微調

比較項目 完整微調 LoRA
可訓練參數量 100% 0.1% - 1%
GPU 記憶體需求 很高 低 3-4 倍
訓練速度 快 2-3 倍
儲存大小 整個模型 數十 MB
微調品質 最佳 接近完整微調 (90-95%)
多任務切換 需要多份完整模型 切換 LoRA 權重即可
災難性遺忘風險 較高 較低

LoRA 特別適合的場景:你需要一個基礎模型服務多個不同的任務或客戶。例如你的基礎模型是 Llama 3 8B,你幫客戶 A 訓練了一組 LoRA 做客服回覆,幫客戶 B 訓練了另一組 LoRA 做文件摘要,幫客戶 C 訓練了第三組 LoRA 做翻譯。你只需要部署一個基礎模型,在推理時動態載入不同的 LoRA 權重即可。

LoRA 不適合的場景:如果你需要讓模型學會和原始訓練資料差異非常大的新知識(例如讓一個英文模型從零學中文),LoRA 的修改能力可能不夠,完整微調會是更好的選擇。

QLoRA:更省記憶體的 LoRA

QLoRA(Quantized LoRA)是 LoRA 的進階版本,由 Tim Dettmers 等人在 2023 年發表。它在 LoRA 的基礎上加入了模型量化:把基礎模型的參數從 16-bit 壓縮到 4-bit,進一步降低記憶體需求。

QLoRA 的三個關鍵技術:

4-bit NormalFloat(NF4)量化。一種專門為神經網路權重設計的 4-bit 量化格式,比一般的 4-bit 整數量化更精確。

雙重量化(Double Quantization)。對量化的常數也做量化,進一步減少記憶體使用。

分頁優化器(Paged Optimizers)。利用 CPU 記憶體來處理 GPU 記憶體不足的情況。

實際效果:QLoRA 可以在一張 24GB 的消費級 GPU(例如 RTX 4090)上微調 65B 參數的模型,而且效果接近在 16-bit 下做完整微調。在 QLoRA 出現之前,這是不可能的——65B 模型光是載入就需要超過 100 GB 的 GPU 記憶體。

常見的實作工具

Hugging Face PEFT

PEFT(Parameter-Efficient Fine-Tuning)是 Hugging Face 提供的 Python 套件,支援 LoRA 和其他參數高效微調方法。和 Hugging Face Transformers 整合良好,是目前最常用的 LoRA 實作。

Unsloth

專門為 LoRA 微調做效能優化的工具,訓練速度比 PEFT 快約 2 倍,記憶體使用減少約 50%。對 Llama、Mistral 等主流模型有特別的優化。適合個人開發者和小團隊。

LLaMA-Factory

開源的微調工具,提供圖形介面和命令列兩種操作方式,支援 LoRA、QLoRA 和多種訓練策略,對中文模型的支援較好。適合不想寫太多程式碼的使用者。

LoRA 的變體

DoRA(Weight-Decomposed Low-Rank Adaptation)

2024 年提出,把 LoRA 的權重更新拆成幅度(magnitude)和方向(direction)兩個部分分別學習,在某些任務上表現比標準 LoRA 好。

AdaLoRA

自適應地分配不同層的 rank 大小——對微調影響大的層用更高的 rank,影響小的層用更低的 rank。避免了手動選擇 rank 的困擾。

LoRA+

把 A 和 B 矩陣使用不同的學習率來訓練,研究顯示 B 矩陣使用較高的學習率通常效果更好。

安全考量

LoRA 降低了微調的門檻,也帶來了新的安全議題。

惡意微調的風險。因為 LoRA 訓練成本很低(一張消費級 GPU 就夠了),攻擊者可以輕易地對開源模型做惡意微調,例如移除安全防護機制(safety guardrails)讓模型產出有害內容。這也是為什麼模型發布者會在模型的使用條款中限制某些用途。

LoRA 權重的供應鏈安全。從社群平台下載別人訓練的 LoRA 權重,就像安裝別人寫的 npm 套件一樣,你不完全確定裡面有什麼。惡意的 LoRA 權重可能包含後門,讓模型在特定觸發條件下產出攻擊者指定的內容。建議只從可信來源取得 LoRA 權重,或自己訓練。

資料隱私。LoRA 的訓練資料如果包含敏感資訊(客戶資料、內部文件),這些資訊可能被模型「記住」並在推理時洩露。訓練前要確認資料已做去識別化處理,或使用差分隱私技術。

知識檢測

讀完文章後,測試一下你對這個主題的理解。

常見問題

LoRA 微調需要多少資料?

取決於任務的複雜度。對話風格調整可能只需要 100-500 筆範例;特定領域的知識學習可能需要 1,000-10,000 筆;多語言或多任務的微調可能需要更多。資料品質比數量重要——500 筆高品質的訓練資料通常比 5,000 筆低品質的效果好。

LoRA 微調要跑多久?

以 Llama 3 8B 在單張 RTX 4090 上用 QLoRA 微調為例,1,000 筆訓練資料跑 3 個 epoch 大約需要 30-60 分鐘。資料量越大、rank 越高、epoch 越多,時間越長。相比完整微調需要數小時到數天,LoRA 的訓練時間非常短。

我不是工程師,可以用 LoRA 嗎?

如果你完全沒有程式基礎,獨立使用 LoRA 會比較困難。但如果你有基本的 Python 知識和命令列操作能力,搭配 LLaMA-Factory 這類有圖形介面的工具,按照教學文件操作是可行的。另一個選擇是使用雲端微調服務(例如 OpenAI 的 fine-tuning API、Together AI),這些服務把底層的 LoRA 細節封裝起來,你只需要準備好訓練資料並上傳。

LoRA 和 RAG 要選哪一個?

如果你要讓模型學會的是「風格」或「行為模式」(例如用特定的口吻回答、遵循特定的回答格式),用 LoRA。如果你要讓模型能取用「最新的知識」(例如公司最新的產品規格、政策文件),用 RAG。很多場景需要兩者結合:用 LoRA 微調模型的回答風格和領域理解,用 RAG 提供最新的事實資訊。

多個 LoRA 可以同時載入嗎?

可以。在推理時可以同時載入多個 LoRA 並合併(merge),或用 LoRA 路由器(router)根據輸入的不同動態選擇要用哪個 LoRA。vLLM、TGI 等推理引擎都支援多 LoRA 的動態載入和切換。

LoRA 微調的模型可以商用嗎?

取決於基礎模型的授權條件。例如 Llama 3 使用的是 Meta 自訂的授權,允許商用但有一些限制。你用 LoRA 微調後的模型繼承原始模型的授權限制。務必在微調前確認基礎模型的授權條件。

延伸閱讀

  • Fine-Tuning 是什麼?讓 AI 模型學會你的任務(what-is-fine-tuning)
  • Quantization 是什麼?壓縮 AI 模型的技術(what-is-quantization)
  • RAG 是什麼?檢索增強生成讓 AI 讀你的資料(what-is-rag)