寫在前面
GPT(Generative Pre-trained Transformer)是目前最廣泛應用的大語言模型架構之一,其強大的自然語言理解與生成能力背后,是一個龐大而精細的訓練流程。本文將從宏觀到微觀,系統講解GPT的訓練過程,包括數據收集、預處理、模型設計、訓練策略、優化技巧以及后訓練階段(微調、對齊)等環節。
我們將先對 GPT 的訓練方案進行一個簡述,接著我們將借助 MiniMind 的項目,來完成我們自己的 GPT 的訓練。
訓練階段概覽
GPT 的訓練過程大致分為以下幾個階段:
- 數據準備(Data Preparation)
- 預訓練(Pretraining)
- 指令微調(Instruction Tuning)
- 對齊階段(Alignment via RLHF 或 DPO)
- 推理部署(Inference & Serving)
數據收集與預處理
- 數據來源:收集海量文本(書籍、網頁、新聞、百科、代碼等),例如GPT-3使用了近45TB的原始文本。
- 數據清洗:去除噪聲(HTML標簽、重復文本、低質量內容)。過濾敏感或有害信息。
- 分詞(Tokenization):使用子詞分詞方法(如Byte Pair Encoding, BPE)將文本切分為Token(例如GPT-3的詞表大小約5萬)。將文本分割為固定長度的序列(如512個Token的段落)。
無監督學習:無需人工標注,直接從原始文本學習。
- 規模化(Scaling Law):模型性能隨數據量、參數規模、計算資源的增加而顯著提升。
- 通用性:捕捉語法、語義、常識等廣泛知識。
單卡訓練
預訓練
執行預訓練,得到 pretrain_.pth 作為預訓練的輸出權重(其中為模型的dimension,默認為512)
cd ..
python train_pretrain.py
執行后對應的輸出如下所示:LLM總參數量:25.830 百萬
預估50分鐘訓練完畢,耐心等待即可:
監督微調
執行監督微調,得到 full_sft_*.pth 作為指令微調的輸出權重(其中full即為全參數微調)
python train_full_sft.py
PS:項目官方提示:所有訓練過程默認每隔100步保存1次參數到文件./out/***.pth(每次會覆蓋掉舊權重文件)。
執行后輸出的內容如下所示:
GPU狀態
查看GPU的運行情況,可以看到已經開始工作了。
nvidia-smi
對應的結果如下所示:
測試結果
更多詳細的內容請查看:eval_model.py
model_name有如下內容:
● 0: 預訓練模型
● 1: SFT-Chat模型
● 2: RLHF-Chat模型
● 3: Reason模型
預訓練
默認為0:測試pretrain模型效果,設置為1:測試full_sft模型效果
python eval_model.py --model_mode 0
進行自動測試:
后續的輸出內容:
可以看到已經可以正常的輸出內容了。
SFT
基本介紹
SFT 是指在已有的大規模預訓練語言模型(如 GPT、LLaMA 等)基礎上,使用人工標注的數據集進行監督學習,從而進一步提升模型在特定任務上的表現。
- 類比:如果預訓練是讓模型學“語言的全部潛規則”,那么 SFT 就是“讓模型知道應該怎么說話更像人、怎么更好地完成任務”。
SFT 的主要作用
- 強化任務能力:教會模型完成具體任務,如問答、總結、翻譯、代碼生成等。
- 對齊人類意圖:通過人工標注的數據,幫助模型“更聽話”,符合人類期望。
- 打基礎為后續對齊做準備:是 RLHF(強化學習人類反饋)前的必要步驟。
原理與流程
SFT 采用指令微調(Instruction tuning),輸入和輸出通常是:
Input(Prompt): 請你幫我寫一篇關于人工智能的作文。
Output(Response): 當然可以,以下是關于人工智能的作文……
數據格式
一般是 JSON 或 JSONL 格式,結構如下:
{"instruction": "請將以下文本翻譯成英文:我喜歡跑步。","input": "","output": "I like running."
}
{"prompt": "<|user|> 請幫我寫一篇春節的作文 <|assistant|> 好的,以下是春節的作文……"
}
模型訓練方式
- 凍結大部分參數 or 全參數微調。
- 使用 交叉熵損失函數(Cross Entropy Loss):讓模型輸出盡可能接近標注的“輸出”。
- 可選擇 低秩適配(LoRA) 等高效微調技術以節省顯存。
為什么SFT很關鍵?
讓大模型變聰明的第一步;
- 讓 AI 更能聽懂人話的根基;
- 產業應用最常使用的訓練階段之一,比如微調成客服、寫作助手、代碼助手等。
監督微調
默認為0:測試pretrain模型效果,設置為1:測試full_sft模型效果
python eval_model.py --model_mode 1
對應的內容如下所示:
可以看到經過 SFT,整個回答效果質量獲得了很大的提升!