為什麼生的基礎模型幫不了你
一個剛預訓練完的模型是基礎模型(base model):它學會的只有「接續文字」。問它「法國的首都是什麼?」,它也許會貼心地回答巴黎——也可能接著再丟出三道冷知識題目,因為那種模式在它的訓練資料裡一樣常見。它預測的是合理的接續,它並不知道自己應該「協助」你。
自迴歸循環示意圖:每個生成的詞元被送回以預測下一個詞元。
監督式微調(supervised fine-tuning,SFT)修正了這點。我們給模型成千上萬個「這是一個請求,這是理想回應」的範例,並訓練它產出那個回應。之所以叫「監督式」,是因為每個範例都帶著一個我們要它模仿的目標答案。
SFT 怎麼訓練
從機制上看,SFT 用的是和預訓練一樣的「下一個 token 預測」目標——只是用的是精選的提示與補全(prompt-and-completion)配對。有個關鍵細節:損失通常「只計算在回應的 token 上」。我們不希望模型把能力浪費在預測使用者的字句上;我們要的是:在給定提示後,它把「自己的答案」答對。
監督微調沿用下一詞元目標,但損失只對回覆(completion)詞元求和——提示詞被遮蔽掉。
{
"messages": [
{"role": "user", "content": "Summarize this email in one line: ..."},
{"role": "assistant", "content": "Client approved the budget; kickoff is Monday."}
]
}
# Loss is masked to the assistant tokens only — the model
# learns to *produce* the answer, not to predict the question.指令微調:教會「會聽指令」這件後設技能
如果你的 SFT 資料只涵蓋一項狹窄任務,你會得到一個只會一招的模型。指令微調(instruction tuning)是用一份「刻意多樣」的混合資料來做 SFT——摘要、翻譯、分類、寫程式、問答、改寫——每一項都寫成自然語言指令。模型不只是背下這些任務,而是學會「讀一道指令、照著做」這個通用習慣,這個習慣接著會推廣到它訓練時從沒見過的指令上。
流程圖:人類偏好訓練獎勵模型,獎勵模型再調整策略。
對話範本:格式的契約
對話模型必須知道系統指令在哪裡結束、使用者的回合從哪裡開始。這個結構由對話範本(chat template)編碼——一組固定的特殊 token 模式,把每個角色的文字包起來。你「必須」用上線時要用的同一套範本來微調,否則模型會看到陌生的格式而行為失常。
文本被切分為詞元、映射為 id,再變為嵌入向量。
<|im_start|>system You are a concise support assistant.<|im_end|> <|im_start|>user My order hasn't arrived.<|im_end|> <|im_start|>assistant I'm sorry to hear that. Could you share your order number?<|im_end|>
整理資料——品質就在這裡誕生
資料集就是程式。整理指令資料集大多是不起眼的苦工:去重複、修正不一致的格式、移除錯誤或互相矛盾的答案、平衡任務類型。幾百筆乾淨、合乎風格的範例,常常勝過幾萬筆雜訊滿滿的爬蟲資料。
當你沒辦法靠手工蒐集到足夠的量時,合成指令資料(synthetic instruction data)——由一個更強的模型生成、再加以過濾的範例——可以便宜地補上缺口。陷阱在於合成資料會繼承生成模型的盲點與怪癖,所以一定要人工檢視抽樣,並保留一份真實的留出集(held-out set)來做評估。
- 先決定你要的回應風格,寫一份簡短的風格指南——然後讓每一筆範例都遵守它。
- 去除重複與近似重複;重複的範例會悄悄地把某種行為加權過頭。
- 平衡任務類型,讓指令微調能推廣,而不是過度擬合某一種題型。
- 在你生成或擴增任何資料之前,先留出一份真實的評估集。