1. LLM 訓練基礎概念
1.1 預訓練(Pretrain)
LLM 首先要學習的並非直接與人交流,而是讓網絡參數中充滿知識的墨水,“墨水” 理論上喝的越飽越好,產生大量的對世界的知識積累。 預訓練就是讓 Model 先埋頭苦學大量基本的知識,例如從 Wiki 百科、新聞、書籍整理大規模的高質量訓練數據。 這個過程是“無監督”的,即人類不需要在過程中做任何“有監督”的校正,而是由模型自己從大量文本中總結規律學習知識點。 模型此階段目的只有一個:學會詞語接龍。例如我們輸入“秦始皇”四個字,它可以接龍“是中國的第一位皇帝”。
1.2 有監督微調(Supervised Fine-Tuning)
經過預訓練,LLM 此時已經掌握了大量知識,然而此時它只會無腦地詞語接龍,還不會與人聊天。
SFT 階段就需要把半成品 LLM 施加一個自定義的聊天模板進行微調。例如模型遇到這樣的模板【問題-> 回答,問題-> 回答】後不再無腦接龍,而是意識到這是一段完整的對話結束。 稱這個過程為指令微調,就如同讓已經學富五車的「牛頓」先生適應 21 世紀智能手機的聊天習慣,學習屏幕左側是對方消息,右側是本人消息這個規律。
1.3 人類反饋強化學習(Reinforcement Learning from Human Feedback, RLHF)
在預訓練與有監督訓練過程中,模型已經具備了基本的對話能力,但是這樣的能力完全基於單詞接龍,缺少正反樣例的激勵。 模型此時尚未知什麼回答是好的,什麼是差的。
希望模型能夠更符合人的偏好,降低讓人類不滿意答案的產生概率。 這個過程就像是讓模型參加新的培訓,優秀員工作為正例,消極員工作為反例,學習如何更好地回覆。可以使用 RLHF 系列之-直接偏好優化(Direct Preference Optimization, DPO)或與 PPO(Proximal Policy Optimization)。DPO 相比於 PPO:
- DPO 通過推導 PPO 獎勵模型的顯式解,把在線獎勵模型換成離線數據,Ref 模型輸出可以提前保存。
- DPO 性能幾乎不變,只用跑 actor\_model 和 ref\_model 兩個模型,大大節省顯存開銷和增加訓練穩定性。
RLHF 訓練步驟並非必須,此步驟難以提升模型“智力”而通常僅用於提升模型的“禮貌”,有利(符合偏好、減少有害內容)也有弊(樣本收集昂貴、反饋偏差、多樣性損失)。
GRPO(Generalized Reinforcement Preference Optimization)是一種改進的強化學習方法,用於優化模型輸出更符合人類偏好。它是對 PPO(Proximal Policy Optimization)+ RLAIF(Reinforcement Learning from AI Feedback)等方法的泛化和增強,本質上是對 RLHF(人類反饋強化學習)的一種高效實現。GRPO 的目標:從兩個或多個候選輸出中,優化模型朝更高偏好方向移動,而不是隻學單個“正確答案”。
1.4 知識蒸餾(Knowledge Distillation, KD)
經過預訓練、有監督訓練、人類反饋強化學習,模型已經完全具備了基本能力,通常可以學成出師了。
知識蒸餾可以進一步優化模型的性能和效率,所謂知識蒸餾,即學生模型面向教師模型學習。 教師模型通常是經過充分訓練的大模型,具有較高的準確性和泛化能力。 學生模型是一個較小的模型,目標是學習教師模型的行為,而不是直接從原始數據中學習。
在 SFT 學習中,模型的目標是擬合詞 Token 分類硬標籤(hard labels),即真實的類別標籤(如 0 或 100)。 在知識蒸餾中,教師模型的 softmax 概率分佈被用作軟標籤(soft labels)。小模型僅學習軟標籤,並使用 KL-Loss 來優化模型的參數。
通俗地説,SFT 直接學習老師給的解題答案。而 KD 過程相當於“打開”老師聰明的大腦,儘可能地模仿老師“大腦”思考問題的神經元狀態。知識蒸餾的目的只有一個:讓小模型體積更小的同時效果更好。 然而隨着 LLM 誕生和發展,模型蒸餾一詞被廣泛濫用,從而產生了“白盒/黑盒”知識蒸餾兩個派別。 GPT-4 這種閉源模型,由於無法獲取其內部結構,因此只能面向它所輸出的數據學習,這個過程稱之為黑盒蒸餾,也是大模型時代最普遍的做法。黑盒蒸餾與 SFT 過程完全一致,只不過數據是從大模型的輸出收集。
1.5 LoRA (Low-Rank Adaptation)
LoRA 是一種高效的參數高效微調(Parameter-Efficient Fine-Tuning, PEFT)方法,旨在通過低秩分解的方式對預訓練模型進行微調。 相比於全參數微調(Full Fine-Tuning),LoRA 只需要更新少量的參數。 LoRA 的核心思想是:在模型的權重矩陣中引入低秩分解,僅對低秩部分進行更新,而保持原始預訓練權重不變。
2. LLM 訓練流程簡介
訓練任何模型,需要清楚兩個問題:
- 明確模型的輸入與輸出
- 定義模型的損失函數
LLM,即大語言模型,本質上是一個“token 接龍”高手,它不斷預測下一個詞符。這種推理生成方式被稱為自迴歸模型,因為模型的輸出會作為下一輪的輸入,形成一個循環。
剛開始,一個隨機大模型,面對輸入,它預測的下一個字符完全是隨機的
那麼,它是如何學習的呢?在自注意力機制中,通過為 qk 增加掩碼,softmax 後將負無窮對應到 0,隱藏掉 n 字符以後的內容。這樣,輸出的第 n+1 個字符只能關注到前 n 個字符,如同戴上了一副“只看過去”的眼鏡。
通過訓練,大模型從一個隨機混沌的狀態,逐漸學會輸入與下一個詞符之間的潛在聯繫。
以上是為了便於理解而抽象出來的過程。
大模型的輸入是由數字組成的張量,而非自然語言字符。自然語言通過 tokenizer(可以理解為一種詞典)映射到詞典的頁碼數字 ID,進行輸入計算。得到的輸出數字再利用詞典進行解碼,重新得到自然語言。
大模型的輸出是一個 N*len(tokenizer)的多分類概率張量,在 Topk 中選出的有概率的 token,得到下一個詞。
損失函數:交叉熵損失
學習率:與 batchsize 成倍數關係,batchsize 變大一倍,學習率也增大一倍
參考鏈接
https://github.com/jingyaogong/minimind
https://developer.horizon.auto/blog/13043