蒸餾:用大模型教小模型
蒸餾(distillation)把一個昂貴而能幹的「老師」模型,變成一個便宜又快速、模仿老師的「學生」。在最常見的大型語言模型版本裡,你只是讓老師對許多提示生成高品質回應,再拿這些回應去微調學生——老師成了你的資料工廠。更精緻的變體則訓練學生去匹配老師對「下一個 token」的完整機率分布,這比單一選定的字詞傳遞了更多細微差異。
\mathcal{L}_{\text{KD}} = (1-\alpha)\,\mathrm{CE}(y,\, p_s) \;+\; \alpha\,T^{2}\,\mathrm{KL}\!\left(p_t^{T}\,\big\|\,p_s^{T}\right),\qquad p^{T}=\mathrm{softmax}(z/T)
蒸餾損失:學生在擬合真實標籤的同時,匹配教師經溫度 T 軟化後的機率分佈。
# Distillation by imitation (the common LLM recipe)
for prompt in many_prompts:
answer = teacher.generate(prompt) # strong, expensive model
dataset.add(prompt, answer)
student = sft(small_base_model, dataset) # cheap to run afterward模型合併:平均權重,而非重新訓練
模型合併(model merging)是個令人意外的把戲:拿兩個或更多從「同一個基礎」微調出來的模型,直接把它們的權重結合——通常只是加權平均——就能得到一個同時繼承各家長處的單一模型,完全不需要額外訓練。一個擅長寫程式的模型,和一個擅長多語對話的模型,有時能合併成一個兩者兼擅的模型。
\theta_{\text{merge}} = \sum_{i} \lambda_i\,\theta_i,\qquad \sum_{i} \lambda_i = 1
模型合併一行公式:對源自同一基座的多個微調模型的權重做加權平均。
選擇你的配方
你現在握有整套工具。在它們之間做選擇,主要是把方法對上你面對的「那一種」差距——當你需要不只一種時,再用正確的順序把它們疊起來。
- 格式或風格差距 → 監督式/指令微調,幾乎總是透過 PEFT。
- 缺少耐久的領域知識 → 持續預訓練,再用 SFT 找回聽指令的能力。
- 缺少快速變動的事實 → 別微調;改用檢索(RAG)。
- 需要更小/更便宜 → 把一個強模型蒸餾成一個小模型。
- 手上有好幾個不錯的微調 → 在花錢重訓一個合體模型之前,先試試合併。
評估,否則你只是在猜
上面每一種方法都可能在一小撮精挑細選的範例上「看起來」變好,卻在別處悄悄退步。對微調做評估(evaluating)是不容妥協的:留出一份模型從未訓練過的真實測試集,為目標任務評分,「同時」也跑一套通用評測來抓遺忘。當回應是開放式時,以大型語言模型當評審(LLM-as-judge)能大規模地評分——但要抽查它的判決,對照人類的判斷。
資料被劃分為獨立的訓練集、驗證集與測試集,以進行誠實的留出評估。
用代價換來的忠告
- 先把提示與檢索用到極限。微調很強大,但它是建置與維護成本最高的那根槓桿。
- 資料品質勝過任何巧妙的方法。一份乾淨、一致、用心整理的資料集,是一個好微調最強的單一預測指標。
- 預設用 PEFT 與小的秩;只有當評估說你非得這麼做時,才往上加。
- 永遠和原始的基礎模型對照測試——有時誠實的結果是:你根本不需要微調。