大多數人認為微調就是「把 LLM 在自己的資料上再跑幾個 epoch」。 真正的答案是:選錯策略會讓 70B 模型比 7B 更差,燒掉 $50,000 的 GPU 時間還讓對齊崩潰。 差距在於你是否理解 LoRA 降低了哪 99.85% 的參數、QLoRA 如何在 48GB 記憶體訓練 65B,以及為什麼 1,000 條高品質資料勝過 100 萬條雜訊。 這篇文章帶你從數學原理到生產工程,建立完整的微調決策框架。
這篇給已經跑過一次 LoRA 範例、但說不清 r 與 α 在調什麼、也不知道何時該選 QLoRA 的工程師看。讀完你會能算出 LoRA 省掉了哪 99.8% 的參數、說明 QLoRA 的 NF4 與雙重量化如何把 65B 塞進 48GB、用 LIMA 的結論設計資料篩選標準,並能為一個「2 台 A100 80GB、8,000 條醫生對話、SOAP 格式錯誤率 34%」的醫療摘要產品選出微調方法與評估方式。
一、核心問題:預訓練模型為什麼需要微調
1.1 預訓練的本質局限
預訓練(Pre-training)讓 LLM 學到了語言的統計規律與世界知識,但它優化的目標是下一個 token 預測(next-token prediction),而非「照我說的做」。這個差距在三種場景下最為明顯:
格式遵從性:預訓練模型傾向續寫,而非回答。給它
「請列出三個優點:」,它可能輸出「...這個問題的三個優點分別是...」然後繼續產生隨機文本,而不是乾淨的清單。領域術語精度:通用語料中醫療、法律、金融術語出現比例不到 2%,導致模型在這些領域的 token 機率分布偏移。Llama-3 8B 在 MedQA 上未微調的準確率約 58%,微調後可達 78–82%。
安全與對齊邊界:預訓練模型缺乏拒絕有害請求的能力,需要 RLHF 或 DPO 等對齊微調來建立邊界。
1.2 微調的代價與風險
| 問題 | 表徵 | 危險程度 |
|---|---|---|
| 災難性遺忘(Catastrophic Forgetting) | 通用能力下降 10–40% | ★★★★★ |
| 過擬合(Overfitting) | 驗證 loss 上升,輸出重複 | ★★★★ |
| 對齊稅(Alignment Tax) | 安全訓練效果消失 | ★★★★ |
| 資料污染(Data Contamination) | 洩漏評測集導致虛假指標 | ★★★ |
| 分布偏移(Distribution Shift) | 生產環境輸入與訓練資料不符 | ★★★ |
二、何時該升級:從單卡 LoRA 到多卡與對齊管線的觸發條件
預設起點是 BF16 LoRA:7–8B 的 base model、r=8–16、套用到所有線性層、lr 2e-4、單張 GPU、一個分離的驗證集。該改用 QLoRA 的訊號只有記憶體:BF16 的 base 權重加上啟動值放不進你手上的 GPU(例如 13B 以上塞 24GB 卡、65B 塞單張 80GB),因為 QLoRA 要付出 30–40% 的速度與 0.5–2 個百分點的精度(§5.3)。它不是「規模化」的下一階——用 2 張 A100 微調 7B,留在 BF16 LoRA 才是對的。
另外三個升級各有自己的觸發訊號,不綁在一起發生。多卡分片(FSDP,也就是 PyTorch 版的 ZeRO-3,兩者擇一):base model 到 70B 等級、單卡放不下權重,或實驗週期長到卡住迭代。SFT 後接 DPO(§7.3、Phase 9 §七 ):紅隊測試顯示安全邊界被 SFT 削弱,或輸出風格在 SFT 後仍不一致。資料飛輪(人工標注 + 合成增強 + 主動學習):驗證集指標停滯,而診斷顯示瓶頸是資料多樣性而不是模型容量(§六)。
| 從 | 到 | 觸發訊號 |
|---|---|---|
| 單卡 BF16 LoRA(r=8–16) | QLoRA(NF4 base + BF16 adapter) | BF16 base 權重 + 啟動值放不進手上的 GPU;願意以 30–40% 速度與 0.5–2 點精度換記憶體 |
| 單卡 | FSDP 多卡分片 + Flash Attention + gradient checkpointing | base model ≥ 70B;單次實驗時間長到卡住迭代週期 |
| 只有 SFT | SFT → DPO → 紅隊評估的對齊管線 | 紅隊測試顯示越獄提示重新生效;風格或拒絕行為在 SFT 後不一致 |
三、Full Fine-tuning vs 參數高效微調(PEFT)比較
3.1 方法概覽
Full Fine-tuning 更新模型的所有參數。以 Llama-3 70B 為例,這代表 700 億個參數全部需要梯度計算、Adam 優化器狀態(2× 參數量)、梯度緩存,總記憶體需求約 1.1TB GPU VRAM(BF16 權重與梯度共 4 bytes/param,加上 FP32 master weights 與 AdamW 兩個狀態共 12 bytes/param,合計約 16 bytes/param × 70B,尚未計入啟動值)——遠超單機 8×H100 的 640GB 容量。
PEFT 家族的核心思想:大多數下游任務的適應可以用低秩更新來表達,不需要觸碰原始權重的每一個元素。
| 方法 | 可訓練參數比例 | 代表技術 | 適用場景 |
|---|---|---|---|
| Full Fine-tuning | 100% | — | 充裕算力、大資料集 |
| Adapter Tuning | 0.5–3% | Houlsby Adapter | 多任務切換 |
| Prefix Tuning | 0.1–1% | P-Tuning v2 | 短文本任務 |
| LoRA | 0.01–1% | LoRA, DoRA | 主流選擇 |
| QLoRA | 0.01–1% | QLoRA | 記憶體受限環境 |
| Prompt Tuning | < 0.01% | Soft Prompt | 推理時零改動 |
3.2 為什麼 LoRA 成為主流
2023 年前,業界主要在 Full Fine-tuning 和 Adapter Tuning 之間選擇。LoRA 的突破在於:
- 無推理延遲:訓練後可合併
W = W₀ + BA,推理時與原模型完全相同 - 記憶體效率極高:7B 模型只需約 16GB VRAM 即可以 LoRA 微調
- 多 adapter 切換:生產環境可保留 base model,動態載入不同任務的 adapter
四、LoRA 低秩分解:數學原理與工程實作
4.1 數學基礎
假設預訓練模型的權重矩陣為 W₀ ∈ ℝ^{d×k},Full Fine-tuning 直接學習 ΔW,使得 W = W₀ + ΔW,其中 ΔW 與 W₀ 同維。
LoRA 的假設:ΔW 的本質秩(intrinsic rank)遠低於 d 和 k。
因此可以分解:
ΔW = B × A
其中:
A ∈ ℝ^{r×k},以高斯分布初始化
B ∈ ℝ^{d×r},初始化為零矩陣(確保訓練開始時 ΔW = 0)
r ≪ min(d, k),稱為「秩」(rank)
前向傳播時:
h = W₀x + ΔWx = W₀x + BAx
縮放因子:ΔW = (α/r) × BA,其中 α 為超參數
4.2 參數節省量化
以 Llama 3 8B 的 Attention 層為例(hidden=4096,32 層;GQA:32 個 Q heads、8 個 KV heads,head_dim=128,因此 K/V 投影是 4096×1024):
┌─────────────────────────────────────────────────────┐
│ LoRA 參數節省計算(Llama 3 8B,每層) │
│ │
│ Q_proj、O_proj:4096 × 4096 = 16,777,216 參數/個 │
│ K_proj、V_proj:4096 × 1024 = 4,194,304 參數/個 │
│ │
│ Full Fine-tuning: │
│ Q + K + V + O = 2×16.8M + 2×4.2M ≈ 41.9M 參數 │
│ │
│ LoRA r=16: │
│ Q、O:(4096×16) + (16×4096) = 131,072 參數/個 │
│ K、V:(4096×16) + (16×1024) = 81,920 參數/個 │
│ 4 個矩陣:2×131,072 + 2×81,920 = 425,984 參數 │
│ │
│ 節省比例:(41.9M - 0.426M) / 41.9M ≈ 98.98% │
│ │
│ 整個模型(32 層,僅 attention 四個投影): │
│ Full FT 可訓練:~8,000M 參數 │
│ LoRA r=16 可訓練:~13.6M 參數(0.17%) │
│ 節省比例:99.83% │
└─────────────────────────────────────────────────────┘
4.3 關鍵超參數
| 超參數 | 典型值 | 影響 | 建議 |
|---|---|---|---|
| r(秩) | 4, 8, 16, 32, 64 | 越大容量越強,記憶體越多 | 從 16 開始調整 |
| α(縮放) | 等於 r 或 2r | 學習率的隱含調節 | 設為 r 的 2 倍 |
| 目標模組 | 所有線性層(q/k/v/o + gate/up/down) | 哪些矩陣加 LoRA | QLoRA 論文發現套用到所有線性層是逼近全量微調品質的關鍵 |
| dropout | 0.05–0.1 | 正則化 | 資料少時設 0.1 |
實務建議: 對所有線性層(q_proj、k_proj、v_proj、o_proj 與 MLP 的 gate_proj、up_proj、down_proj)套用 LoRA,效果明顯優於僅 q 和 v,可訓練參數雖增加數倍,仍只佔全模型不到 1%。實作上多直接用 Hugging Face PEFT + TRL、Unsloth 或 Axolotl,而非自行實作。
五、QLoRA:4-bit 量化 + LoRA 的記憶體魔法
5.1 QLoRA 的三個核心技術
QLoRA(2023,Dettmers et al.)讓在消費者硬體上微調 65B 模型成為可能,組合了三項創新:
① NF4(4-bit NormalFloat)量化
不使用傳統的均勻量化(uniform quantization),而是針對神經網路權重的常態分布特性設計的非均勻量化格式,在相同 bit 數下信噪比更高。理論資訊量損失比 INT4 少約 20%。
② 雙重量化(Double Quantization)
對量化常數(quantization constants)本身再做一次量化,每個參數額外節省約 0.37 bits,相當於 65B 模型節省約 3GB VRAM。
③ 分頁優化器(Paged Optimizers)
利用 NVIDIA 的統一記憶體(Unified Memory),將 Adam 優化器狀態從 GPU 換頁到 CPU RAM,避免處理超長序列時的 OOM(Out of Memory)崩潰。
5.2 記憶體需求對比
┌─────────────────────────────────────────────────────────────┐
│ 不同方法訓練 65B 模型的 GPU 記憶體需求 │
│ │
│ Full Fine-tuning(BF16) │
│ ████████████████████████████████████████ 780 GB │
│ 需要 10× A100 80GB │
│ │
│ LoRA(BF16 base) │
│ ██████████████████████████████████ 640 GB │
│ 需要 8× A100 80GB │
│ │
│ QLoRA(NF4 base + BF16 adapter) │
│ ████████████ 48 GB │
│ 需要 1× A100 80GB(或 2× RTX 4090) │
│ │
│ QLoRA 相比 Full FT 節省:94% GPU 記憶體 │
└─────────────────────────────────────────────────────────────┘
5.3 QLoRA 的代價
QLoRA 不是免費的午餐:
- 訓練速度降低 30–40%:量化/反量化操作增加 compute overhead
- 精度輕微下降:相比 BF16 LoRA,通常下降 0.5–2 個百分點
- 合併複雜度增加:推理前需要反量化 base model 後才能合併 adapter
在記憶體充足的情況下(如 2× A100 80GB 訓練 7B),優先選擇 BF16 LoRA;只有當 GPU 記憶體成為硬性約束時,才選 QLoRA。
六、指令資料品質:LIMA 1000 條 vs 百萬噪音資料
6.1 LIMA 論文的震撼發現
2023 年 Meta 的 LIMA 論文(Less Is More for Alignment)用 1,000 條精心選擇的指令資料微調 LLaMA 65B,在人類偏好評估中擊敗了用 52K 條 Alpaca 資料訓練的版本。
關鍵結論:資料品質 > 資料數量
1,000 條高品質資料的核心特徵:
- 多樣性:覆蓋不同任務類型、風格、長度
- 無歧義性:每條資料的預期輸出是明確的
- 一致性:風格和格式統一,建立清晰的「模型個性」
6.2 資料品質篩選標準
| 維度 | 低品質訊號 | 高品質訊號 |
|---|---|---|
| 回應長度 | < 50 tokens 的空洞回應 | 200–800 tokens,有結構 |
| 指令清晰度 | 模糊、多重解釋 | 單一明確目標 |
| 知識密度 | 重複套話、無資訊量 | 具體事實、可驗證 |
| 格式一致性 | 混合語言、格式跳變 | 統一的 Markdown 或純文本 |
| 去重 | n-gram 重複率 > 20% | MinHash 相似度 < 80% |
6.3 合成資料的工程實踐
當標注預算不足時,可以用強模型生成合成資料:
1# 典型的自我指令(Self-Instruct)循環
2# 1. 種子任務(seed tasks):50–100 條人工撰寫的高品質範例
3# 2. 指令生成:讓強模型基於種子任務生成新指令
4# 3. 回應生成:讓強模型回應新指令
5# 4. 品質過濾:ROUGE 去重、長度過濾、人工抽檢 5–10%
6
7# 重要:合成資料需要與真實資料按 3:7 或 4:6 混合
8# 純合成資料訓練會導致「幻覺循環」——模型學到模型的偏差
經驗數字(示意): 8,000 條領域資料 + 2,000 條通用指令(防止災難性遺忘)通常是 7B 模型的甜蜜點,再加更多資料帶來的邊際收益遞減。
七、微調陷阱:災難性遺忘 / 過擬合 / 對齊稅
7.1 災難性遺忘
症狀: 微調後模型在目標任務表現提升,但通用 benchmark(如 MMLU、HellaSwag)下降 15–40%。
根本原因: 梯度更新過度強調新資料的分布,覆蓋了原始預訓練的知識表示。
解決策略:
- 混合通用資料:在微調資料集中加入 10–20% 的通用指令資料(如 OpenHermes、ShareGPT 子集)
- EWC(Elastic Weight Consolidation):對重要參數施加正則化懲罰,阻止其大幅偏移
- 降低學習率:LoRA 微調建議
lr = 2e-4;Full Fine-tuning 建議lr = 1e-5 到 5e-5,比預訓練小 100 倍以上 - 少 epoch:1–3 個 epoch 通常足夠;超過 5 個 epoch 幾乎必然過擬合
7.2 過擬合的診斷
訓練 loss 曲線的危險訊號:
正常: 過擬合:
\ \
\ \___訓練 loss 持續下降
\_______ \
驗證 loss ↑
同步下降 驗證 loss 在第 2 epoch 後上升
監控指標:
- 訓練 loss vs 驗證 loss 分歧 > 0.3:立即停止
- 輸出多樣性下降(temperature=1.0 下輸出幾乎相同):過擬合警示
- ROUGE-L 在驗證集上達到 0.95+:資料集太小或訓練過長
7.3 對齊稅(Alignment Tax)
進行 SFT(Supervised Fine-tuning)時,若訓練資料中包含可能觸發安全拒絕的話題,模型的安全對齊邊界可能被削弱。這在醫療、法律等領域尤為危險。
診斷方法: 訓練後跑紅隊(red-teaming)測試集,測試已知的越獄提示是否仍然有效拒絕。
緩解方法: 在 SFT 資料中混入安全拒絕樣本(建議 3–5%),並在 SFT 後接 DPO(Direct Preference Optimization)來重新強化安全邊界。
八、為什麼選 X 不選 Y(4 個決策表)
決策 1:LoRA vs Full Fine-tuning
| 維度 | LoRA | Full Fine-tuning |
|---|---|---|
| GPU 記憶體(7B) | ~16 GB | ~120 GB |
| 訓練速度 | 基準 | 慢 2–3× |
| 最終精度 | 與 FT 相差 < 2% | 最高上限 |
| 多任務切換 | 支援熱插拔 | 需多份模型 |
| 適合場景 | 資料 < 100K、預算有限 | 大資料集、精度敏感 |
Flip Condition: 當你有 500K+ 高品質資料、充足的 H100 預算,且目標任務與預訓練分布差異極大(如特定程式語言、罕見語言),Full Fine-tuning 的優勢才開始顯現。
決策 2:QLoRA vs BF16 LoRA
| 維度 | QLoRA(NF4) | BF16 LoRA |
|---|---|---|
| GPU 記憶體 | 節省 60–70% | 基準 |
| 訓練速度 | 慢 30–40% | 基準 |
| 精度損失 | 0.5–2% | 無損 |
| 合併難度 | 需先反量化 | 直接合併 |
| 適合場景 | < 4× A100、訓練 13B+ | 記憶體充足時 |
Flip Condition: 若你有 4× A100 80GB 訓練 7B,直接用 BF16 LoRA;記憶體不足或訓練 34B+ 時改 QLoRA。
決策 3:SFT vs DPO
| 維度 | SFT | DPO |
|---|---|---|
| 資料格式 | 指令 + 回應 | 偏好對(chosen/rejected) |
| 標注成本 | 低(單一回應) | 高(需比較兩個回應) |
| 對齊效果 | 行為模仿 | 偏好學習 |
| 安全性 | 需額外設計 | 天然強化安全邊界 |
| 適合場景 | 初次領域適應 | 安全對齊、風格精調 |
Flip Condition: 初次微調用 SFT;若 SFT 後仍有安全問題或風格不一致,接 DPO。兩者不互斥,通常 SFT → DPO 串聯使用。DPO 的損失函數推導與它和 PPO 的取捨見 Phase 9 §七 。
決策 4:r=16 vs r=64(LoRA 秩選擇)
| 秩 | 可訓練參數(Llama 3 8B,僅 q/v) | 適合場景 | 風險 |
|---|---|---|---|
| r=4 | ~1.7M | 極少資料(< 1K) | 容量不足 |
| r=16 | ~6.8M | 5K–50K 資料 | 平衡點 |
| r=32 | ~13.6M | 50K+ 資料 | 輕微記憶體增加 |
| r=64 | ~27M | 複雜多任務 | 接近 Full FT 效果/成本 |
Flip Condition: 資料量超過 100K 且任務複雜度高(如代碼生成),r=64 帶來的提升才足以補償記憶體增加。
九、系統效應(量化比較表)
9.1 訓練指標對比(以 Llama 3 8B 為基準)
| 指標 | Full Fine-tuning | BF16 LoRA (r=16) | QLoRA (r=16) |
|---|---|---|---|
| GPU 記憶體 | ~120 GB | ~28 GB | ~16 GB |
| 所需硬體 | 2× A100 80GB | 1× A100 80GB | 1× RTX 4090 24GB |
| 訓練速度(token/s) | 基準 1× | 1.3× | 0.9× |
| 訓練成本(2 epoch/50K) | ~$200 | ~$80 | ~$60 |
| 最終精度(相對 FT) | 100% | 98.2% | 96.8% |
| 可合併推理 | 是 | 是(合併後) | 需先反量化 |
| 推理延遲影響 | 無 | 無(合併後) | 無(合併後) |
示意估算,非實測數據
9.2 資料規模 vs 方法選擇的最佳實踐
┌────────────────────────────────────────────────────────────────┐
│ 資料規模 vs 推薦方法矩陣 │
│ │
│ 資料量 GPU 充足(4× A100+) GPU 受限(< 2× A100) │
│ ─────────────────────────────────────────────────────────── │
│ < 5K LoRA r=8, lr=2e-4 QLoRA r=8 │
│ 5K–50K LoRA r=16, lr=2e-4 QLoRA r=16 │
│ 50K–500K LoRA r=32 或 Full FT QLoRA r=32 │
│ > 500K Full Fine-tuning LoRA r=64(多 GPU) │
└────────────────────────────────────────────────────────────────┘
9.3 Before vs After 效能比較(醫療摘要案例)
| 指標 | 未微調 Llama-3 8B | LoRA 微調後 | QLoRA 微調後 |
|---|---|---|---|
| SOAP 格式遵從率 | 23% | 89% | 87% |
| 臨床術語錯誤率 | 34% | 6% | 7% |
| 幻覺率(人工評估) | 18% | 4% | 5% |
| 推理延遲(P99) | 320ms | 320ms | 340ms |
| GPU 記憶體(訓練) | — | 28 GB | 16 GB |
| 訓練成本(8K 樣本) | — | ~$85 | ~$55 |
示意估算,非實測數據
十、系列導航
本文是「AI 工程從零開始」系列 Phase 10 的第 3 篇。
← 上一篇: Phase 10 Part 2:LLM 預訓練 — 萬億 Token 的工程挑戰
→ 下一篇: Phase 11 Part 1:LLM 推論工程 — 從實驗到每秒千次請求
系列索引:
- Phase 1–3:數學基礎、傳統機器學習、深度學習核心
- Phase 4–6:電腦視覺、NLP、語音
- Phase 7–9:Transformer、生成模型、強化學習
- Phase 10(本階段):從頭構建 LLM(Tokenization → 預訓練 → 微調)
- Phase 11:LLM 推論工程、RAG 與評估
- Phase 12–16:多模態、MCP 與工作流程編排、Agent 系統、長時程自主系統、多 Agent 協調
- Phase 17–19:推論服務與可觀測性、AI 安全與治理、Capstone
