為何基礎模型還不是助手
基礎模型只用單一目標訓練:預測網路規模文本的下一個詞元(token)。它是一台強大的續寫引擎——給它半份食譜,它會把食譜寫完;給它半場筆戰,它會把筆戰打完。它不知道的是:你希望它回答你的問題,而不是去模仿「你的問題通常會出現在其中」的那種文本。後訓練(post-training)就是把這份原始的語言建模能力,重塑成會遵循指令、保持有用、該拒絕時就拒絕的東西的手藝。
示意图:模型反复采样下一个词元并回填以续写文本的循环。
後訓練的第一步是 監督式微調(supervised fine-tuning, SFT),有時也稱為指令微調(instruction tuning)。你給模型看數千筆示範——一條指令搭配一個理想回應——並繼續訓練,讓它學會產生那種形狀的回應。SFT 承擔了大部分的重活:一次做得好的 SFT,本身就已經能給你一個可用的助手。這條路徑後面的對齊方法,大多只是在打磨 SFT 所奠定的基礎。
SFT 實際在優化什麼
從機制上看,SFT 用的是與預訓練相同的交叉熵下一詞元損失——模型仍然只是在預測詞元。兩者的差別在於資料與損失遮罩(loss mask)。資料是經過策劃的「指令→回應」配對,而非爬取的文本。遮罩則告訴損失函數忽略提示(prompt)的詞元,只就回應的詞元給模型打分:你不想獎勵模型去預測使用者的問題,只想獎勵它產生答案。
监督微调沿用预训练的交叉熵下一词元损失,但掩码 m_t 将提示词元的梯度置零,只学习回复部分。
# SFT loss = next-token CE, but only on response tokens logits = model(input_ids) # prompt + response concatenated loss = cross_entropy(logits, labels) # labels = [-100, -100, ..., r1, r2, ...] # -100 masks prompt tokens
資料就是全部
SFT 裡最大的槓桿是資料品質,而非資料數量。一個著名的結果是:幾千筆精心策劃、多樣且高品質的示範,可以勝過數十萬筆平庸的示範。每一個範例教給模型的不只是一個答案,還有一種風格:該寫多長、推理該怎麼組織、何時該追問澄清、如何拒絕。風格上的垃圾會被原樣傳播。
- 選定一套對話模板(chat template) 並一致套用——用特殊詞元標記 system/user/assistant 的回合。模型會學到這些界線;推論時模板不一致會產生亂碼。
- 為多樣性策劃:涵蓋不同任務、長度與拒絕情境——而不只是簡單問答。對你想要的行為的覆蓋,比純粹的數量更重要。
- 去汙染(decontaminate):剔除與評測集重疊的資料,並去除近乎重複的範例,以免模型過度背誦某種模板措辭。
- 遮罩提示、把序列打包(pack)到固定長度以提升效率,並保留一個驗證集,觀察驗證損失是否過擬合。
決定一切的成本問題
天真的 SFT 會更新模型裡的每一個權重——也就是*全量微調(full fine-tuning)。對一個 700 億參數的模型而言,這代表要同時把權重、它們的梯度,以及優化器的兩個動量緩衝區放進記憶體:每個參數輕易就要 16 個位元組,加總遠超過一 TB 的加速器記憶體。這對多數團隊而言遙不可及,而且你每適配一個任務,就得存一份完整的模型副本*。
正是這一個限制,催生了下一份指南。參數高效微調(parameter-efficient fine-tuning, PEFT)會凍結龐大的基礎模型,改為只訓練一小組額外的權重——把記憶體削減一個數量級,並讓每個任務的產物從一 TB 縮到幾 MB。如今幾乎所有真實世界的大型語言模型適配,用的都是 PEFT,而非全量微調。
後訓練流程全貌
先看清整條路徑要去哪裡會很有幫助。現代的後訓練流程大致是:SFT 建立遵循指令的行為;接著偏好對齊把模型推向人類偏好的回應;選用的接地(grounding)教它使用檢索到的知識;而服務工程讓成果又快又省。這條路徑的其餘部分,就是沿著這道階梯往上走。
你會遇到獎勵模型訓練(reward modeling)與拒絕取樣微調(rejection-sampling fine-tuning),它們是把品質推過「單靠 SFT 所能達到」的手段,還有完全跳過強化學習的輕量對齊配方。但這一切若沒有一個扎實的 SFT 基礎都行不通——所以,先把示範資料做對。
从人类偏好数据到奖励模型再到策略调优的流程,即监督微调之后的阶段。