給你數據和算力,你也成不了 OpenAI
最近在研究大模型訓練和微調相關的內容,聽領導說的最多的一句話“那不是有數據有算力就能搞定的嗎”,于是調研了下 qwen 系列的訓練細節。
再整理過程中,再次感慨,怪不得有了數據和算力,也不是每家公司都是 OpenAI。
Qwen2.5-Math
QWEN2.5-MATH TECHNICAL REPORT: TOWARD MATHEMATICAL EXPERT MODEL VIA SELF- IMPROVEMENT
1. 預訓練階段
Qwen2.5-Math 的預訓練階段是在 Qwen2-Math 的基礎上進行改進的。這個階段的主要目標是構建一個高質量、數學內容豐富的預訓練數據集。
數據處理
- 數據召回:
- 使用 FastText 分類器從網絡源(如 Common Crawl)中召回數學相關數據。
- 采用迭代訓練策略,每個 epoch 使用更多數學數據來不斷提升分類器性能。
- 利用已召回數據的元信息(如 URL)擴展數據池,以識別遺漏的數學相關數據。
- 數據去重:
- 使用 MinHash 等技術對相似的數學文檔進行過濾。
- 數據質量過濾:
- 使用 Qwen2-0.5B-Instruct 模型評估潛在數據條目的質量。
- 根據語言模型給出的評分,優先選擇高質量數據納入最終數據集。
- 合成數據生成:
- 使用 Qwen2-72B-Instruct 模型生成大量數學預訓練語料。
- 利用已收集的高質量數學數據作為參考材料。
- 從參考中提取和精煉現有的數學問答數據。
- 直接生成新的數學問答對。
訓練設置
- 數據集:Qwen Math Corpus v2,包含超過 1 萬億個 token。
- 初始化:從 Qwen2.5 系列基礎模型初始化參數。
- 上下文長度:4K tokens。
- 模型規模:提供 1.5B、7B 和 72B 三種規模的模型。
2. 監督微調階段 (Supervised Fine-tuning, SFT)
SFT 階段主要針對鏈式思維 (Chain-of-Thought, CoT) 和工具集成推理 (Tool-Integrated Reasoning, TIR) 兩種能力進行訓練。
CoT 數據處理
- 數據集構建:
580K 英文和 500K 中文數學問題。
- 來源包括 GSM8K、MATH、NuminaMath 等標注數據集和 K-12 數學問題集。
- 數據合成:
- 使用 MuggleMath 方法從標注數據演化生成新問題。
- 使用難度評分模型對問題集進行分類,以保持不同難度水平的平衡分布。
- 回答生成:
- 采用迭代方法,利用拒絕采樣、獎勵建模和標注答案指導。
- 對于有標注答案的問題,從候選池中選擇 top-k 正確答案的推理路徑。
- 對于合成問題,使用加權多數投票機制推斷最可能正確的推理路徑。
TIR 數據處理
- 數據集構建:
- 190K 標注問題和 205K 合成問題。
- 來源包括 GSM8K、MATH、CollegeMath、NuminaMath 等數據集。
- 數據合成:
- 使用 MuggleMath 和 DotaMath 技術在 GSM8K 和 MATH 訓練集上進行查詢演化。
- 回答生成:
- 對于標注問題,使用在線拒絕微調 (RFT) 迭代生成工具集成推理路徑。
- 在每次 RFT 迭代中,對當前最佳模型進行多次核采樣,增加困難問題的樣本大小。
- 對于合成問題,使用從在線 RFT 過程中得到的最優模型生成推理樣本。
訓練設置
- 訓練周期:3 個 epoch
- 序列長度:4,096 tokens
- 批量大小:
72B 模型:256
1.5B 和 7B 模型:128
- 學習率:
- 72B 模型:5 × 10^-6
- 1.5B 和 7B 模型:2 × 10^-5
- 學習率調度:逐漸衰減到 7 × 10^-7
3. 獎勵模型訓練階段 (Reward Model, RM)
數據處理
- 數據集:361K 英文和 257K 中文數學問題,每個問題配對 6 個來自 Qwen2.5-Math 的樣本回答。
- 標注策略:
根據回答的最終答案正確性確定正負樣本。
正確答案標記為正樣本,錯誤答案標記為負樣本。
過濾掉所有回答全對或全錯的情況。
通過使用不同規模和版本的模型生成回答,確保數據集難度分布均衡和正負樣本比例平衡。
訓練策略
- 初始化:從監督微調模型初始化。
- 模型架構調整:
將語言建模頭替換為標量值頭(兩個線性層)。
- 損失函數:獎勵模型使用列表式排序損失:
其中, 表示獎勵模型的輸出, 是問題, 是對應的回答。
4. 強化學習階段 (Reinforcement Learning, RL)
訓練策略
采用群組相對策略優化 (Group Relative Policy Optimization, GRPO)
目標函數
群組相對策略優化 (Group Relative Policy Optimization, GRPO) 的目標函數:
獎勵塑型
結合規則驗證器和獎勵模型的獎勵:
其中, 是獎勵模型的輸出, 是規則驗證器的稀疏獎勵, 設置為 0.5。
這樣的格式化使公式更加清晰,并且符合 LaTeX 語法,可以在支持 LaTeX 渲染的 Markdown 環境中正確顯示。
實現細節
- 基于開源 RLHF 框架 ChatLearn
- 查詢選擇:從獎勵模型的訓練集中選擇,保留 2 到 5 個正確回答的查詢
- 采樣策略:每個查詢采樣 32 個回應
- 訓練設置:
- 7B 模型:每個 episode 4,096 個樣本,學習率 1 × 10^-5
- 72B 模型:每個 episode 2,048 個樣本,學習率 5 × 10^-6
- 全局 batch size:512
- KL 系數:1 × 10^-3
Qwen2.5-Coder
Technical Report Qwen2.5-Coder Technical Report
1. 預訓練階段
Qwen2.5-Coder的預訓練分為兩個主要階段:文件級預訓練和倉庫級預訓練。
1.1 數據處理
1.1.1 數據來源
- 源代碼數據:來自GitHub的92種編程語言的公共倉庫,包括Pull Requests、Commits、Jupyter Notebooks和Kaggle數據集。
- 文本-代碼對應數據:從Common Crawl中提取,包括代碼相關的文檔、教程、博客等。
- 合成數據:使用CodeQwen1.5生成的大規模合成數據集。
- 數學數據:來自Qwen2.5-Math的預訓練語料庫。
- 文本數據:來自Qwen2.5模型的高質量通用自然語言數據。
1.1.2 數據清洗
- 對GitHub數據應用了一系列基于規則的過濾方法。
- 對文本-代碼混合數據集采用了粗到細的層級過濾方法,使用較小的模型(如fastText)構建清洗管道。
- 對合成數據引入執行器進行驗證,確保只保留可執行的代碼。
1.1.3 數據混合比例
經過實驗,最終選擇了70%代碼、20%文本和10%數學的數據混合比例。最終的預訓練數據集包含5.2萬億個token。
1.2 文件級預訓練
1.2.1 訓練目標
- 下一個token預測
- 填空任務(Fill-in-the-Middle, FIM)
1.2.2 FIM格式
<|fim_prefix|>{code_pre}<|fim_suffix|>{code_suf}<|fim_middle|>{code_mid}<|endoftext|>
1.2.3 訓練參數
- 最大訓練序列長度:8,192 tokens
- 位置編碼:RoPE (Rotary Position Embedding)
1.3 倉庫級預訓練
1.3.1 目的
增強模型的長文本理解能力。
1.3.2 訓練參數
- 訓練序列長度:從8,192 tokens擴展到32,768 tokens
- RoPE基頻:從10,000調整為1,000,000
- 使用YARN機制,使模型能夠處理長達131,072 (132K) tokens的序列
1.3.3 數據
使用了約300B的高質量長代碼數據。
1.3.4 FIM格式
<|repo_name|>{repo_name}
<|file_sep|>{file_path1}
{file_content1}
<|file_sep|>{file_path2}
{file_content2}
<|file_sep|>{file_path3}
<|fim_prefix|>{code_pre}<|fim_suffix|>{code_suf}<|fim_middle|>{code_fim}<|endoftext|>
2. 指令微調階段
2.1 數據準備
2.1.1 多語言編程代碼識別
- 微調CodeBERT模型以識別近100種編程語言。
- 保留主流編程語言的指令數據,隨機丟棄長尾語言的部分指令數據。
- 移除大部分不包含代碼片段的樣本。
2.1.2 GitHub指令合成
- 使用LLM從代碼片段生成指令。
- 使用代碼LLM生成響應。
- 使用LLM評分器過濾低質量樣本。
2.1.3 多語言代碼指令數據
實施了一個多語言多代理協作框架:
- 創建特定語言的智能代理。
- 實施協作討論協議。
- 使用自適應內存系統。
- 進行跨語言討論。
- 開發協同評估指標。
- 實施自適應指令生成。
2.1.4 基于清單的指令數據評分
評估以下方面:
- 問題與答案的一致性
- 問題與答案的相關性
- 問題與答案的難度
- 代碼是否存在
- 代碼正確性
- 代碼清晰度
- 代碼注釋
- 易學性
最終得分計算:
其中是一系列預定義的權重。
2.1.5 多語言沙箱進行代碼驗證
包括以下模塊:
- 語言支持模塊
- 樣本代碼庫
- 單元測試生成器
- 代碼執行引擎
- 結果分析器
2.2 訓練策略
2.2.1 粗到細微調
- 首先使用數千萬低質量但多樣化的指令樣本進行微調。
- 然后使用數百萬高質量指令樣本進行監督微調。
- 對于同一查詢,使用LLM生成多個候選答案,然后用LLM評分選擇最佳答案進行監督微調。
2.2.2 混合調優
- 構造帶有FIM格式的指令對,以保持模型的長文本理解能力。
- 使用tree-sitter-languages解析代碼片段,提取基本邏輯塊作為中間代碼進行填充。
- 優化指令模型時,主要使用標準SFT數據,輔以少量FIM指令樣本。
3. 數據去污染
- 使用10-gram重疊方法進行數據去污染。
- 移除了關鍵數據集,如HumanEval、MBPP、GSM8K和MATH。
- 移除了與測試數據有10-gram字符串級別重疊的任何訓練數據。
4. 模型架構
Qwen2.5-Coder有兩種規模的模型:1.5B和7B參數。它們的主要特征如下:
配置 | Qwen2.5-Coder 1.5B | Qwen2.5-Coder 7B |
隱藏層大小 | 1,536 | 3,584 |
層數 | 28 | 28 |
查詢頭數 | 12 | 28 |
鍵值頭數 | 2 | 4 |
頭大小 | 128 | 128 |
中間層大小 | 8,960 | 18,944 |
詞嵌入綁定 | True | False |
詞匯表大小 | 151,646 | 151,646 |
訓練token數 | 5.5T | 5.5T |
4.1 特殊token
模型引入了幾個特殊token來更好地理解代碼:
1. 預訓練階段
1.1 數據處理
Qwen2 使用了一個新的大規模、高質量的多語言數據集進行預訓練,相比 Qwen 和 Qwen1.5,主要改進包括:
- 質量提升:
使用更復雜的啟發式和基于模型的方法進行過濾
利用 Qwen 模型篩選低質量數據和合成高質量預訓練數據
- 數據擴展:
- 收集了更大量的高質量代碼、數學和多語言數據
- 支持約 30 種語言
- 分布優化:
- 對縮小版模型進行實驗,優化不同來源和領域數據的混合比例
最終的預訓練數據集從 Qwen1.5 的 3 萬億 tokens 擴展到了 7 萬億 tokens。
1.2 模型架構
Qwen2 采用基于 Transformer 的架構,主要特點包括:
- 使用 Grouped Query Attention (GQA)
- 實現 Dual Chunk Attention (DCA)
- 采用 YARN 機制
- 使用 SwiGLU 作為激活函數
- 采用 Rotary Positional Embeddings (RoPE)
- 使用 QKV bias
- 采用 RMSNorm 和 pre-normalization
1.3 訓練細節
報告中對預訓練階段的具體超參數配置沒有詳細說明。但提到了以下細節:
- 序列長度:在預訓練的最后階段,將上下文長度從 4,096 tokens 擴展到 32,768 tokens
- RoPE 基頻:從 10,000 修改為 1,000,000
- 采用 YARN 機制和 Dual Chunk Attention 機制,使模型能夠處理長達 131,072 tokens 的序列
2. 后訓練階段
2.1 數據處理
后訓練數據包括兩部分:
- 示范數據
- 偏好數據
數據構建過程包括協作數據標注和自動數據合成。
2.2 監督微調 (SFT)
- 數據集:超過 500,000 個示例
- 訓練輪數:2 epochs
- 序列長度:32,768 tokens
- 學習率:從 逐漸降低到
- 權重衰減:0.1
- 梯度裁剪:最大值為 1.0
2.3 基于人類反饋的強化學習 (RLHF)
RLHF 訓練包括離線訓練和在線訓練兩個階段:
- 離線訓練:
- 使用預編譯的偏好數據集 P
- 采用 Direct Preference Optimization (DPO)
- 在線訓練:
- 使用獎勵模型進行實時反饋
- 每個 episode 中,從當前策略模型采樣多個回復
- 使用 DPO 進行優化
采用 Online Merging Optimizer 來緩解對齊稅。
3. 模型配置
以 Qwen2-72B 為例的主要配置:
- Hidden Size: 8,192
- 層數: 80
- Query Heads: 64
- KV Heads: 8
- Head Size: 128
- Intermediate Size: 29,568
- 詞匯表大小: 151,646
- 預訓練 tokens: 7T
4. 長上下文處理
為增強長上下文能力,Qwen2 采取了以下策略:
- 在預訓練最后階段將上下文長度從 4,096 tokens 擴展到 32,768 tokens
- 引入大量高質量的長文本數據
- 將 RoPE 的基頻從 10,000 修改為 1,000,000
- 采用 YARN 機制和 Dual Chunk Attention 機制
這些策略使模型能夠處理長達 131,072 tokens 的序列,同時保持高性能。
5. 詞匯表和分詞器
Qwen2 使用與 Qwen 相同的基于字節級字節對編碼的分詞器:
- 詞匯表大小:151,643 個常規 token 和 3 個控制 token
- 有效嵌入大小略大于詞匯表大小(出于分布式訓練考慮)
技術報告提供了 Qwen2 模型訓練的整體框架和一些關鍵細節,但對于預訓練階段的具體超參數配置并沒有詳細說明。報告更多地關注了模型的架構創新、數據處理策略、以及后訓練階段的具體實施細節。
Qwen
1. 預訓練階段
1.1 數據處理
- Qwen 使用了多樣化的數據集,包括公開網頁文檔、百科全書、書籍、代碼等
- 數據集是多語言的,主要包含英語和中文
- 對公開網頁數據進行了以下處理:
從 HTML 中提取文本
使用語言識別工具確定語言
進行精確匹配和模糊匹配的去重
使用規則和機器學習方法過濾低質量數據
使用多個模型對內容進行評分,包括語言模型、文本質量評分模型和不當內容識別模型
人工抽樣審核確保質量
有選擇地上采樣某些來源的數據
- 納入了高質量的指令數據以提高零樣本和少樣本性能
- 移除了與測試集有 13-gram 重疊的指令樣本
- 最終構建了一個包含多達 3 萬億 tokens 的數據集
1.2 分詞
- 使用字節對編碼(BPE)作為分詞方法
- 基于開源的 fast BPE tokenizer tiktoken,選擇 cl100k_base 詞表作為起點
- 增加了常用中文字符和詞,以及其他語言的詞匯
- 將數字分割成單個數字
- 最終詞表大小約為 152K
1.3 模型架構
Qwen 采用修改版的 Transformer 架構:
- 嵌入層和輸出投影層:權重不共享
- 位置編碼:使用 RoPE(Rotary Positional Embedding)
- 偏置:在大多數層移除偏置,但在注意力的 QKV 層添加偏置以增強外推能力
- 歸一化:使用 pre-norm 和 RMSNorm 代替傳統的 layer normalization
- 激活函數:使用 SwiGLU,將前饋網絡的維度從 4 倍隱藏層大小減少到 8/3 倍
1.4 訓練細節
- 使用自回歸語言建模作為訓練目標
- 訓練上下文長度為 2048
- 使用 Flash Attention 以提高計算效率和減少內存使用
- 優化器:AdamW
β1 = 0.9
β2 = 0.95
? = 10^-8
- 學習率:使用余弦衰減調度,衰減到峰值學習率的 10%
- 使用 BFloat16 混合精度訓練以保證訓練穩定性
不同規模模型的具體參數如下:
參數數量 | 隱藏層大小 | 注意力頭數 | 層數 | 學習率 | 批次大小 | 訓練 tokens |
1.8B | 2048 | 16 | 24 | 3.0e-4 | 4M | 2.2T |
7B | 4096 | 32 | 32 | 3.0e-4 | 4M | 2.4T |
14B | 5120 | 40 | 40 | 3.0e-4 | 4M | 3.0T |
1.5 上下文長度擴展
為了在推理時擴展模型的上下文長度,Qwen 采用了以下技術:
- NTK-aware interpolation:通過調整 RoPE 的基礎來防止高頻信息丟失
- Dynamic NTK-aware interpolation:動態地按塊改變尺度,避免性能嚴重下降
- LogN-Scaling:根據上下文長度與訓練長度的比例重新縮放查詢和鍵的點積
- Window attention:限制注意力范圍,防止模型關注過遠的 tokens
2. 監督微調(SFT)階段
2.1 數據處理
- 注釋了多種風格的對話數據
- 關注自然語言生成以提高模型的有用性
- 避免使用可能限制模型能力的提示模板
- 注釋了與安全相關的數據,如暴力、偏見和色情等
- 使用 ChatML 格式描述元數據(如角色)和內容
2.2 訓練細節
- 訓練目標:下一個 token 預測
- 對系統和用戶輸入應用損失掩碼
- 優化器:AdamW
β1 = 0.9
β2 = 0.95
? = 10^-8
- 序列長度:2048
- 批次大小:128
- 總訓練步數:4000
- 學習率:
- 在前 1430 步逐漸增加
- 峰值為 2e-6
- 權重衰減:0.1
- Dropout:0.1
- 梯度裁剪:1.0
3. 強化學習(RLHF)階段
3.1 偏好模型預訓練(PMP)
- 構建了包含約 6600 個詳細標簽的分類系統
- 實現了考慮多樣性和復雜性的平衡采樣算法
- 使用不同大小的 Qwen 模型和不同的采樣策略生成多樣化的響應
- 根據標注指南評估響應,并根據分數形成比較對
3.2 獎勵模型訓練
- 使用相同大小的預訓練語言模型 Qwen 初始化
- 在原始 Qwen 模型基礎上添加了一個池化層,用于基于特定結束 token 提取句子獎勵
- 學習率:固定為 3e-6
- 批次大小:64
- 序列長度:2048
- 訓練輪數:1 輪
3.3 PPO 訓練
- 使用四個模型:策略模型、價值模型、參考模型和獎勵模型
- 在開始 PPO 之前,先更新價值模型 50 步
- 對每個查詢同時采樣兩個響應
- KL 散度系數:0.04
- 基于運行平均值歸一化獎勵
- 策略模型學習率:1e-6
- 價值模型學習率:5e-6
- 價值損失裁剪:0.15
- 推理時策略 top-p:0.9
- 使用預訓練梯度緩解對齊稅
4. 代碼專用模型訓練(CODE-QWEN)
4.1 代碼預訓練
- 基于 QWEN 基礎模型繼續預訓練
- 在約 900 億 tokens 的代碼數據上訓練
- 上下文長度擴展到 8192
- 優化器:AdamW
β1 = 0.9
β2 = 0.95
? = 10^-8
- 學習率:
- CODE-QWEN-14B: 6.0e-5
- CODE-QWEN-7B: 3.0e-5
- 3% 預熱迭代,無學習率衰減
4.2 代碼監督微調
- 采用多階段 SFT 策略
- 優化器:AdamW
β1 = 0.9
β2 = 0.95
? = 10^-8
- 學習率:
- 14B 模型: 2.0e-6
- 7B 模型: 1.0e-5
- 使用余弦學習率調度(3% 預熱步數),然后保持恒定
5. 數學專用模型訓練(MATH-QWEN-CHAT)
- 在增強的數學指令數據集上進行數學 SFT
- 序列長度:1024
- 掩蔽系統和用戶輸入以加速收斂
- 優化器:AdamW
與 SFT 相同的超參數
- 峰值學習率:2e-5
- 訓練步數:50,000
Baichuan2
1. 預訓練階段
1.1 數據處理
- 數據來源:網頁、書籍、研究論文、代碼庫等多樣化來源
- 數據量:總計2.6萬億tokens
- 數據處理:
使用大規模去重和聚類系統,支持LSH和密集嵌入特征
對文檔、段落和句子進行去重和評分
評分用于預訓練中的數據采樣
1.2 模型架構
- 基于Transformer架構,但做了一些修改:
7B模型使用RoPE位置編碼,13B模型使用ALiBi位置編碼
使用SwiGLU激活函數
使用xFormers實現的內存高效注意力機制
輸入前使用Layer Normalization
使用RMSNorm實現
1.3 訓練超參數
- 優化器:AdamW
β1 = 0.9, β2 = 0.95
權重衰減:0.1
梯度裁剪:0.5
- 學習率:
- 7B模型:2e-4
- 13B模型:1.5e-4
- 2000步線性預熱,然后余弦衰減
- 批量大小:未明確說明
- 訓練步數:未明確說明,但提到訓練了2.6萬億tokens
1.4 其他訓練細節
- 使用BFloat16混合精度訓練
- 使用NormHead穩定訓練:歸一化輸出嵌入
- 使用max-z loss限制logits大小:
L_max-z = 2e-4 * z^2
其中z是最大logit值
2. 對齊階段
2.1 監督微調(SFT)
- 數據:超過10萬個人類標注的提示樣本
- 標注原則:類似Claude的有幫助性和無害性原則
- 質量控制:使用交叉驗證
2.2 強化學習(RLHF)
2.2.1 獎勵模型訓練
- 數據:按6個主類別、30個次級類別和200多個三級類別對提示進行分類
- 損失函數:與InstructGPT相同
- 評估:不同響應分數差異越大,獎勵模型區分準確率越高
2.2.2 PPO訓練
- 使用4個模型:
- Actor模型:生成響應
- Reference模型:計算KL懲罰(參數固定)
- Reward模型:提供整體獎勵(參數固定)
- Critic模型:學習每個token的價值
- 訓練細節:
- Critic模型預熱20步
- 梯度裁剪:0.5
- 學習率:5e-6(恒定)
- PPO clip閾值ε = 0.1
- KL懲罰系數β = 0.2,衰減到0.005
- 訓練350輪迭代
3. 安全性增強
- 預訓練階段:
數據過濾去除有害內容
增加正面價值領域數據的采樣概率
- 對齊階段:
- 構建紅隊測試程序
- 使用多值監督采樣方法生成不同安全級別的響應
- 使用DPO方法高效利用有限標注數據
- 使用整合Helpful和Harmless目標的Reward Model進行PPO訓練
Baichuan 2模型的訓練過程涵蓋了預訓練、監督微調和強化學習等多個階段,每個階段都有其特定的數據處理、模型架構和訓練策略。論文還特別強調了在整個訓練過程中對模型安全性的關注和改進。
本文轉載自 ??芝士AI吃魚??,作者: 芝士AI吃魚
