對應原題(Common ‧ Fine-Tuning, Post-Training and Alignment)
- Compare LoRA, prefix tuning, prompt tuning and full fine-tuning. When would you choose each?
— Asked at: Sarvam AI, Apple
🎯 什麼情境該想到我
當你「要在一堆 PEFT 方法裡選一個,而它們看起來都差不多」的時候。
★ 關鍵認知:PEFT 的「P」省的是「可訓練參數」,不是計算量、不是啟動值記憶體。 搞錯這點,所有記憶體估算都會錯。
⚙️ 怎麼用
五種方法,五個不同的介入點
輸入 ──▶ [軟提示 token] ──▶ Embedding
│
┌─────────▼─────────┐
│ Attention │ ◀── Prefix Tuning:在每層的 K/V 前加向量
│ Q K V O │ ◀── LoRA:在權重矩陣旁加低秩旁路
└─────────┬─────────┘
│ ◀── Adapter:插入一個 bottleneck MLP
┌─────────▼─────────┐
│ FFN │ ◀── LoRA 也可掛這裡
└───────────────────┘
▲
Prompt Tuning:只動最前面的輸入 embedding
| 方法 | 動什麼 | 介入的層 |
|---|---|---|
| Full FT | 全部權重 | 全部 |
| Prompt Tuning | 前置的軟提示向量 | 只有輸入層 |
| Prefix Tuning | 每層 attention 的 K/V 前綴 | 每一層 |
| Adapter | 插入的 bottleneck MLP | 每一層(串在主路徑上) |
| LoRA | 權重矩陣的低秩旁路 | 每一層(並聯在主路徑旁) |
★ 對照表
| Full FT | Prompt Tuning | Prefix Tuning | Adapter | LoRA | |
|---|---|---|---|---|---|
| 可訓練參數 | 100% | ~0.01% | ~0.1–1% | ~0.5–5% | ~0.1–1% |
| 表達力 | ★★★★★ | ★★ | ★★★ | ★★★★ | ★★★★ |
| 推論額外延遲 | 無 | 小(吃上下文) | 小(吃 KV) | ❌ 有(串列多一段) | ✅ 無(可合併) |
| 吃上下文預算 | ❌ | ✅ 會 | ✅ 會(佔 KV cache) | ❌ | ❌ |
| 可熱插拔多任務 | ❌ | ✅ | ✅ | ✅ | ✅ |
| 訓練穩定性 | 高 | ⚠️ 低 | 中 | 高 | 高 |
| 小模型上有效嗎 | ✅ | ❌ 要很大才行 | ⚠️ | ✅ | ✅ |
| 災難性遺忘 | ⚠️ 嚴重 | 輕微 | 輕微 | 輕微 | 輕微 |
| checkpoint 大小 | 整個模型 | KB 級 | MB 級 | 數十 MB | 數十 MB |
各方法的關鍵細節
Prompt Tuning(Lester et al., 2021)
只學一組連續的「軟提示」向量接在輸入前面——不是文字,是直接學出來的 embedding。
⚠️ 最大的限制:論文發現它要到約 10B 以上的模型才追得上全量微調。小模型上明顯較差。
另外它佔用上下文預算(20–100 個 token 的位置永遠被佔走),而且訓練不穩定(對初始化與學習率敏感)。
Prefix Tuning(Li & Liang, 2021)
在每一層 attention 的 K、V 前面加上可學的前綴。
比 prompt tuning 強,因為作用在每一層而不只是輸入層。
代價:前綴佔用 KV cache(見 KV Cache),長度直接加在每個請求的記憶體成本上。
Adapter(Houlsby et al., 2019)
在 transformer 層之間插入小的 bottleneck MLP(降維 → 非線性 → 升維)。
★ 它被 LoRA 取代的關鍵原因:推論延遲。
Adapter 是串在主路徑上的額外計算,無論如何都省不掉。
LoRA 是並聯的低秩旁路,推論時可以直接加回權重(),變回一個普通矩陣——零額外開銷。在大批次服務下,adapter 那一小段串列計算會實實在在地吃掉吞吐。
其他輕量方法:
- (IA)³ —— 只學幾個縮放向量(對 K、V、FFN 做逐元素縮放),參數比 LoRA 還少
- BitFit —— 只訓練 bias 項,參數量 <0.1%。極簡,效果有限
★ 選擇指引
| 情境 | 選什麼 | 理由 |
|---|---|---|
| 預設 | LoRA | 沒有特別理由就選它——表達力夠、無推論開銷、穩定、生態成熟 |
| 顯存極度吃緊 | QLoRA | 見 LoRA 與 QLoRA |
| 一個底座服務多個客製版本 | LoRA(不合併,熱插拔) | 底座只存一份,每個客戶一個幾十 MB 的 adapter |
| ★ 裝置端多任務(Apple 的場景) | LoRA adapter 熱插拔 | 手機上底座只能存一份。多個任務 = 多個小 adapter 按需載入。全量微調在裝置端完全不可行 |
| 資料量大 + 要深度改變行為 + 資源夠 | Full FT | 表達力天花板最高。但要接受遺忘風險與每任務一份完整 checkpoint |
| 極大模型 + 極少樣本 | Prompt Tuning 可考慮 | 參數最少,但先確認模型夠大 |
| ★ 新語言 / 大量新知識(Sarvam 的場景) | ⚠️ PEFT 可能不夠 | 新語言需要新的詞彙與新的知識,這超出低秩更新的能力範圍。 正解通常是擴充 tokenizer + 持續預訓練,再做 SFT/PEFT |
★ 最後那一列是這題的高分點:
能認出「這個任務 PEFT 做不到」比背熟四種方法更重要。
PEFT 適合「調整既有能力」,不適合「灌入大量新知識」(見 工具-微調與RAG的取捨)。
★ PEFT 省的到底是什麼(最常見的誤解)
| 省了嗎 | |
|---|---|
| 優化器狀態 + 梯度 + fp32 主權重 | ✅ 這就是 PEFT 省的 14 bytes/param |
| 底座權重 | ❌ 仍要完整載入(QLoRA 靠量化另外省) |
| ★ 啟動值(activation) | ❌ 完全不省——梯度仍要反向穿過整個網路 |
| 前向計算量 | ❌ 幾乎一樣(甚至略多) |
| 訓練速度 | ⚠️ 只快一點(約 20–30%),不是數量級 |
→ 完整推導見 GPU 記憶體估算。
⚠️ 注意 / 什麼時候不適用
- PEFT 的比較結果高度依賴任務與模型規模。論文的排名不能直接搬到你的場景——自己跑一次 LoRA vs Full 的小規模對照通常幾小時就有答案。
- Prompt / Prefix tuning 會吃上下文。長上下文應用要把這個成本算進去。
- Adapter 在高吞吐服務下有實質成本,不只是「理論上多一點延遲」。
- 多 adapter 熱插拔需要推論框架支援(vLLM 的 multi-LoRA、S-LoRA 等),不是所有棧都有。
- 全量微調的 checkpoint 管理很痛。10 個任務 = 10 份完整模型;LoRA 是 1 份底座 + 10 個小檔案。這個營運差異常常比訓練成本更關鍵。
- 別混用太多方法。同時上 LoRA + prefix + adapter 只會讓除錯變地獄。
- 先確認真的需要微調。提示工程與 RAG 通常更快更便宜(見 工具-微調與RAG的取捨)。
🧪 我實際套用的紀錄
- 2026-09-20:從面試題庫展開,尚未實際套用。
🔗 相關
- LoRA 與 QLoRA —— 預設選項的細節
- GPU 記憶體估算 —— PEFT 到底省了哪一塊
- 災難性遺忘 —— 為什麼 PEFT 比全量微調不容易遺忘
- KV Cache —— prefix tuning 佔用的就是它
- 工具-LLM微調實作路線 —— 決策層
- 工具-微調與RAG的取捨 —— 上游決策