昨天談的是把訓練好的模型高效「端出去服務」——推理服務層那套排程、KV cache 與批次的最佳化,前提都是「權重已經定案、不再改動」。今天往回一步:那份權重本身該不該動、怎麼動,才是微調(fine-tuning)的主場。同一個開源基座模型,想讓它學會你公司的語氣、你領域的術語、你要的輸出格式,你有三條路——寫更好的提示、外掛檢索,或真的去改權重。真的要改權重時,「全參數微調」動輒要幾百 GB 顯示記憶體,而 LoRA/QLoRA 這類參數高效微調(PEFT)能讓你在一張消費級顯示卡上,只訓練不到 1% 的參數,就把一個 65B 模型調到堪用。這篇把微調的地圖攤開:什麼時候該調、調哪一層、SFT 與偏好對齊怎麼分工。
📖 學
先分清楚:微調不是一件事,是一整條管線
「微調」這個詞被用得太籠統。實務上它至少涵蓋兩個目標截然不同的階段。指令微調(SFT,supervised fine-tuning):給模型看「輸入→理想輸出」的成對範例,教它「遇到這種問題該長成這樣回」。這一步塑造的是任務結構與輸出格式——把一個只會續寫文字的基座,調成會聽指令、會照你要的 JSON 格式回話的助手。偏好對齊(preference alignment):SFT 只能教「正確答案」,但很多時候「好與更好」沒有唯一標準答案,只有相對偏好(這個回答比那個有禮貌、更安全、更精簡)。這一步用的是成對的「較佳/較差」偏好資料,把模型往人類偏好的方向推。
兩者的先後關係很固定:先 SFT、再對齊。SFT 決定模型「會不會做這件事」,對齊決定它「做得討不討喜」。搞混這兩層,是新手最常見的誤區——用偏好資料想教格式,或用 SFT 想調語氣,都會事倍功半。
全參數微調 vs PEFT:記憶體帳算給你看
全參數微調(full fine-tuning) 就是讓模型所有權重都可訓練。效果上限最高,但代價驚人:訓練時你要在顯示記憶體裡同時放下「權重、梯度、以及優化器(如 Adam)的兩份動量狀態」。用混合精度粗估,每個參數訓練時的記憶體佔用約是推理的好幾倍——一個 7B 模型全參數微調,常常就要 60~80 GB 以上,70B 級別更是動輒要一整櫃 GPU。對絕大多數團隊,這條路的門票太貴。
參數高效微調(PEFT,parameter-efficient fine-tuning) 的核心洞見是:適配一個下游任務,其實不需要動到全部權重。凍結原始權重、只在旁邊掛上一小撮可訓練的新參數,就能達到接近全參數微調的效果,而可訓練參數常常不到總量的 1%。訓練成本、顯示記憶體、存檔大小同時大降——一個 LoRA 適配器(adapter)可能只有幾十 MB,你可以為不同客戶各存一份、隨插隨換,而共用同一份基座權重。
LoRA 原理:權重更新其實是「低秩」的
LoRA(Low-Rank Adaptation)的立論來自一個觀察:微調時權重的變化量 ΔW,雖然矩陣很大,但它的「內在秩(intrinsic rank)」其實很低——意思是這個變化可以用兩個瘦長的小矩陣相乘來逼近。於是 LoRA 不直接學那個龐大的 ΔW,而是把它拆成 ΔW ≈ B·A:A 是「降維」矩陣(把維度 d 壓到一個很小的秩 r,例如 8 或 16),B 是「升維」矩陣(再從 r 還原回 d)。原始權重 W 全程凍結,只有 A 和 B 這兩片小矩陣參與訓練。
秩 r 就是這裡最關鍵的旋鈕:r 越小,可訓練參數越少、越省,但表達能力也越受限。實務上文字任務常從 r=8 或 16 起步,搭配一個縮放係數 alpha(常設為 r 的 1~2 倍)。LoRA 一個常被忽略的好處是「推理零額外延遲」:因為 B·A 和原權重維度對得上,訓練完可以把 B·A 直接「合併」回 W,得到一份和原模型一模一樣結構的權重——上線後跑起來的速度,和沒微調過的基座完全相同,不像串接式的 adapter 會多一層計算。
QLoRA:把基座壓成 4-bit,單卡調 65B
LoRA 已經把「可訓練參數」壓到很小,但那份被凍結的基座權重仍然要完整放進顯示記憶體——65B 模型光權重就上百 GB,還是進不了單卡。QLoRA 的突破在於:既然基座全程凍結、不需要梯度,那就把它量化成 4-bit 塞進記憶體,只在反向傳播時把梯度「穿過」這個 4-bit 的凍結基座,回流到仍是 16-bit 的 LoRA 適配器上。它靠三個技巧維持精度:專為常態分佈權重設計的 NF4(4-bit NormalFloat) 資料型別、把量化常數也再量化一次的雙重量化,以及用 CPU 記憶體吸收峰值的分頁優化器。結果是把 LLaMA-65B 的微調記憶體從 780 GB 級別壓到單張 48 GB 顯示卡就跑得動,而效果幾乎不輸 16-bit 全參數微調。QLoRA 基本上是「把昨天講的量化,和今天講的 LoRA 縫在一起」的漂亮工程。
SFT、RLHF 與 DPO:對齊的三種姿勢
偏好對齊有兩條主流路線。RLHF(人類回饋強化學習) 是經典但笨重的做法:先用偏好資料訓練一個「獎勵模型」來替回答打分,再用 PPO 這類強化學習演算法,讓語言模型去最大化這個分數。它威力強,但工程上很痛——要同時擺弄好幾個大模型、RL 訓練不穩定、獎勵模型還可能被「鑽漏洞(reward hacking)」。
DPO(Direct Preference Optimization,直接偏好最佳化) 則跳過獎勵模型與 RL:它用一道數學推導,把「偏好」直接寫進一個長得很像監督式學習的損失函數,直接調高「較佳回答」的機率、壓低「較差回答」的機率。它更穩、更省、更好實作,在許多場景效果不輸甚至超過 RLHF,已成為近年開源社群對齊的預設首選。一句話記法:SFT 學「對的答案」,DPO/RLHF 學「更好的取捨」;而 DPO 是那個「像 SFT 一樣好訓、卻能做偏好對齊」的甜蜜點。
迷思破除:該微調,還是該 RAG 或改提示?
最常見的錯誤是「模型答不準,就直覺想微調」。先問一個問題:你缺的是行為還是知識?微調改的是行為與風格——語氣、輸出格式、領域慣用的推理方式、把冗長指令內化成模型的本能。RAG 補的是知識——最新的、私有的、會頻繁變動的事實資料,靠檢索在推理當下餵給模型。用微調去灌「本週最新報價」是找死:資料一變就得重訓,而且模型還可能一本正經地記錯(這正是幻覺的溫床)。反過來,想讓模型穩定輸出某種嚴格格式、學會某種罕見的專業語感,RAG 再多文件也教不會,這時才輪到微調。
還有第三條、也是最該先試的路:把提示寫好。很多「需要微調」的需求,其實一段清楚的系統提示加上兩三個 few-shot 範例就解決了,零訓練成本、當天上線。合理的升級順序是:提示工程 → RAG →(不夠再)微調,而且這三者是互補、常常疊加使用,不是三選一。
資料與陷阱:災難性遺忘與過擬合
微調的成敗,七成在資料。兩個必須盯住的風險:過擬合(overfitting)——資料集太小或訓練太多輪,模型會死背訓練範例,對沒見過的輸入反而變笨;對策是控制 epoch 數、保留驗證集看損失、資料寧缺勿濫但要多樣。災難性遺忘(catastrophic forgetting)——在一份狹窄資料上調得太猛,模型會「學了新的、忘了舊的」,原本廣泛的通用能力退化。這裡 PEFT 反而有先天優勢:因為它凍結原始權重、只動小小的適配器,通用知識被鎖在凍結的主體裡,遺忘的風險天生就比全參數微調低。這也是為什麼在資源有限、資料量不大時,LoRA 常常不只是「比較省」,而是「比較安全」的選擇。
🧠 記
- 微調是一條管線,不是單一動作:先 SFT 塑造任務結構與輸出格式,再用偏好資料做對齊;順序固定,先後不能顛倒。
- 全參數微調吃記憶體(權重+梯度+優化器狀態),PEFT 只訓練不到 1% 參數,靠凍結主體、外掛小適配器達到接近的效果。
- LoRA = 把權重更新 ΔW 拆成低秩的 B·A,只調兩片小矩陣;秩 r 是省與強的旋鈕,合併回權重後推理零額外延遲。
- QLoRA = 4-bit 凍結基座 + NF4 + 雙重量化 + 分頁優化器,把 65B 級微調塞進單張顯示卡,精度幾乎不損。
- 對齊三姿勢:RLHF(獎勵模型+PPO,強但笨重)、DPO(像 SFT 一樣好訓的直接偏好最佳化,現代首選)、SFT 只能教唯一正解。
- 選型口訣:缺行為就微調,缺知識就 RAG,先把提示寫好;三者互補疊加,不是三選一。PEFT 還能降低災難性遺忘風險。
✍️ 實踐
挑一個你手上真實、狹窄的任務,先「不微調」地逼近它。找 3050 筆代表性的輸入,寫一段明確的系統提示,附上 23 個 few-shot 範例,跑一輪看命中率。這一步的目的是替微調設一個基準線——如果提示工程就把準確率拉到夠用,你根本不需要訓練,省下的是好幾天的資料標註與 GPU 帳單。把失敗的案例分門別類記下來:是「格式錯」「語氣不對」還是「知識缺漏」?格式與語氣的錯,指向微調;知識的缺漏,指向 RAG。這份錯誤分類,就是你決定下一步走哪條路的地圖。
若判斷確實該微調,用 QLoRA 走一趟最小可行實驗。拿一個 7B 級開源基座,把剛才的失敗案例整理成 200500 筆高品質的 SFT 成對資料(寧可少而精、格式一致),用 Hugging Face 的 PEFT 加 bitsandbytes 做 4-bit QLoRA,秩從 r=16 起步、只跑 13 個 epoch,並留一份驗證集盯著損失曲線——一旦驗證損失回升就是過擬合的訊號,該停了。訓練完把適配器合併回權重、用你原本的錯誤案例重新評測,和提示工程的基準線對比。記住:能被評測數字證明的進步,才叫微調成功;調完卻說不清好在哪,通常代表你一開始就不該調。
🔗 延伸學習
- LoRA: Low-Rank Adaptation of Large Language Models(原始論文,Hu et al. 2021)
- QLoRA: Efficient Finetuning of Quantized LLMs(Dettmers et al. 2023)
- Hugging Face PEFT — 參數高效微調函式庫(官方 GitHub)
- Direct Preference Optimization: A Technical Deep Dive(Together AI)
💬 問 AI
想把「該不該微調」這個判斷練成本能,把你手上的具體任務丟給 AI,讓它逼你分清「缺行為還是缺知識」、幫你選 LoRA/QLoRA 的起始超參數,並設計一套評測方式。可複製以下提問:
我想改善一個 LLM 應用,任務是:「(描述你的任務,例如:把客服對話整理成固定欄位的 JSON 摘要)」。
現況:我用提示工程能做到約 X% 準確,剩下的錯誤主要是「(格式錯/語氣不對/知識缺漏)」。
請幫我:
1. 判斷這個任務該走「提示工程/RAG/微調」哪條路,說明理由,並指出我是缺「行為」還是缺「知識」。
2. 若該微調,區分我需要的是 SFT(教格式)還是偏好對齊(DPO,教取捨),還是兩者都要。
3. 假設用 QLoRA 在單張 24GB 顯示卡上調一個 7B 模型,給我一組合理的起始超參數(秩 r、alpha、learning rate、epoch 數、target modules)並解釋每個的取捨。
4. 設計一份最小評測方案:我該收集多少筆驗證資料、看哪些指標、怎麼判斷過擬合與災難性遺忘。
5. 列出這個任務最可能踩到的 3 個資料集陷阱。