簡介
本文將介紹 SmolLM。它集合了一系列最尖端的 135M、360M、1.7B 引數量的小模型,這些模型均在一個全新的高質量資料集上訓練。本文將介紹資料整理、模型評測、使用方法等相關過程。
引言
近期,人們對能在本地裝置上執行的小語言模型的興趣日漸增長。這一趨勢不僅激發了相關業者對蒸餾或量化等大模型壓縮技術的探索,同時也有很多工作開始嘗試在大資料集上從頭訓練小模型。
微軟的 Phi 系列、阿里巴巴的 Qwen2 (小於 2B 引數量) 以及 Meta 的 MobileLLM 均展示了這樣的結論: 如果設計得當、訓練充分,小模型也可以獲得很好的效能。然而,這其中關於資料整理、訓練細節的相關資訊大多都未被披露。
在本文中,我們將介紹 SmolLM。這是一個包含一系列最頂尖的小語言模型的集合,這些模型的引數量包括 135M、360M 和 1.7B。這些模型基於 SmolLM-Corpus 這一仔細整理的高質量資料集而構建,該資料集包含以下三個子集:
- Cosmopedia v2: 透過 Mixtral 模型合成的、包含課文和故事等內容的資料集 (token 數量為 28B)
- Python-Edu: 資料樣本取自 The Stack 資料集、根據教育價值打分 篩選出來的資料集 (token 數量為 4B)
- FineWeb-Edu: FineWeb 資料集經過去重且 根據教育價值打分 篩選出來的資料集 (token 數量為 220B)
我們的評測結果顯示,在對應的引數量區間內,SmolLM 的模型在一系列常識性推理和世界知識評測標準上均超越了現有的模型。在本文中,我們將介紹訓練語料中三個子集的整理方法,並討論 SmolLM 的訓練和評測過程。
資料整理
Cosmopedia 資料集: 從 v1 到 v2
Cosmopedia v2 是 Cosmopedia 資料集的增強版。Cosmopedia 是當前最大的合成資料集,常被用來進行與訓練。它包含超過三百萬的課文、部落格、故事等資料,這些資料均由 Mixtral-8x7B-Instruct-v0.1 模型生成。絕大部分資料是透過這種方式生成的: 蒐集網頁內容 (稱為“種子樣本”),提供內容所屬的主題類別,然後讓模型擴寫來生成。如圖 1 就展示了其中的一個樣本示例。 這裡我們使用大量網路樣本來提高資料的多樣性,並擴充套件提示詞的話題範圍。這篇文章 詳細介紹了 Cosmopedia 資料集。
為了在 v2 版的資料集中進一步最佳化資料質量,我們曾嘗試過以下兩種策略:
- 針對同一提示詞,使用多個高效能模型去生成資料
- 最佳化提示詞本身
針對第一種策略,我們曾嘗試了 llama3-70B-Instruct、Mixtral-8x22B-Instruct-v0.1 以及 Qwen1.5-72B-Chat,但當我們在這些生成資料上訓練後,我們發現效果提升很有限。因此,下文我們將聚焦於第二種策略: 我們是怎樣改進提示詞的。
尋找更好的主題和種子樣本
每個提示詞都包含三個主要部分: 主題、種子樣本和生成風格,這三部分確定了意向受眾和我們希望模型生成的內容的型別。
為確保生成的一致性,我們需要將相關性強的種子樣本歸類到對應的主題裡面。在 Cosmopedia v1 裡,我們透過對 FineWeb 裡的樣本進行聚類,來確保主題和對應的樣本是一致的 (如圖 2)。但這種方法有兩點侷限性:
- 這些主題雖然很全面地反映了 web/FineWeb 資料的聚類結果,但可能並沒有全面反映真實世界的科目主題分佈。
- 每個聚類內部的樣本並沒有被進一步過濾,所以可能包含很多低質量樣本。
因此,在 v2 版資料集中,我們使用 BISAC 書籍分類 定義的 3.4 萬個主題來代替無監督的聚類。 BISAC 已被作為一個通用標準,來給書籍進行科目分類。所以使用這種方法不僅能全面涵蓋各類主題,也可以使得我們使用的主題在教育價值層面更有專業性。具體而言,我們先使用 BISAC 裡 51 個大類中的 5000 個主題,讓 Mixtral 模型針對每個主題生成它的多種二級子類。下圖就展示了最終各個大類別下的子類主題數量分佈。
在定義好了主題後,我們還需要找到和主題相關的資料條目。和使用搜尋引擎類似,我們製作了一個搜尋工具,用來檢索和每個主題有強相關性的資料。我們使用 BISAC 的大類和子類主題作為搜尋的關鍵詞,在 FineWeb 資料集的 CC-MAIN-2024-10 和 CC-MAIN-2023-50 資料夾中進行搜尋,兩個資料夾包含有超過 5.2 億的樣本。對於每個搜尋關鍵詞,我們檢索出 1000 條最接近的資料條目。相關程式碼可以見 這裡。
最終,我們整合了涵蓋 3.4 萬個主題的 3400 萬條資料。接下來需要確定的是,哪種生成風格效果最好。
生成風格
為了確定最有效的生成風格,我們透過訓練 1.8B 模型進行了對比實驗,其中我們使用不同的 Cosmopedia v1 子集資料,共計有 80 億 token 的資料量。在生成訓練資料時,我們只生成 20 億 token 的資料量,訓練 4 輪,以此來節省時間 (使用 Mixtral 生成 20 億 token 需要大約 1000 個 GPU 小時)。訓練和評測的各項配置和 FineWeb ablation models 一致。每個訓練我們都跑兩遍,每次用不同的隨機種子,最終評測分數取兩次的平均。
至於訓練結果對比,我們對比了 Cosmopedia v1 的這些子集:
- 兩個 web 樣本集: web_samples_v1 和 web_samples_v2
- stories 子集
- stanford 和 openstax 兩個子集
我們發現,當訓練文字是基於 stanford 和 openstax 的主題和種子樣本時,總體的效能最好,其 MMLU 和 ARC 指標均高於兩個 web 樣本集。而 stories 僅僅有助於常識性的相關指標。在實現了 v2 版資料集檢索新主題和種子樣本的程式碼後,我們也可以對比這次實驗的指標資料,來判斷我們新生成的提示詞的質量好壞。
接下來,我們還要探索哪種受眾風格最好。我們使用相同的課文類提示詞生成課文內容,但針對兩種目標受眾: 中學生和大學生。我們發現,在針對中學生受眾的生成資料上訓練,模型在除了 MMLU 的各項指標上取得了最好的分數。一個合理的解釋是,這些指標一般都是對初級或中級的科學知識進行考察,而 MMLU 則包含了針對高階甚至專家級知識的問題。
對於 v2 版本資料,我們生成的資料中,40% 面向中學生受眾,30% 面向大學生受眾,剩下 30% 混合了各種不同受眾群體,且融合了 v1 中 stories、stanford 等風格的課文風格。除此之外,我們還生成了 10 億程式碼相關的課文,這部分資料基於 AutoMathText 資料集的 Python 程式碼部分。
最終,我們生成了 3900 萬合成資料,按 token 數量算,規模達到了 20 億,涵蓋課文、故事、文章、程式碼,假想受眾的多樣性也很高,涵蓋主題超過 3.4 萬。
FineWeb-Edu 資料集
FineWeb-Edu 資料集由我們在幾個月前隨著 FineWeb 資料集的技術報告 公開,它包含 1.3 萬億 的 token。其內容來自教育相關的網頁,這些網頁資訊從 🍷 FineWeb 資料集中過濾而來。
在過濾資料的過程中,我們開發了一個 關於教育價值質量的分類器,它的訓練使用了 Llama3-70B-Instruct 生產的標註資訊。我們使用這一分類器,在 FineWeb 裡找出教育價值最高的一批網頁內容。下圖實驗表明,在過濾出來的 FineWeb-Edu 訓練的模型,在常用指標上明顯由於 FineWeb。這也說明我們的分類器是有用的。
在 Smollm-Corpus 資料集中,我們加入了 2200 億去重過的、來自 FineWeb 的 token。
Stack-Edu-Python 資料集
這裡,我們也用了和 FineWeb-Edu 一樣的方法。我們用 Llmama3 對 The Stack 資料集中 50 萬的 python 程式碼段根據教育價值進行打分,然後使用這些打過分的資料訓來年了一個 分類器。然後我們在 Starcoder 模型的訓練語料庫的 python 子集中使用這個分類器。我們只保留 4 分及以上的樣本,最終我們從 400 億的 token 中得到了一個包含 40 億 token 的新資料集。
下圖展示了模型在不同資料集上 (使用 4 或 3 作為閾值過濾的、未進行過濾的) 訓練的效果。我們可以看到,模型在 Python-Edu 上收斂速度比在未過濾資料上訓練快 3 倍還多。而且在只使用了 120 億 token 的訓練資料後,就達到了 top-1 16% 的透過率。
模型訓練
SmolLM 包含三種不同引數量大小的模型,它們均在下圖所示的混合資料上訓練:
- 引數量為 135M 和 360M 的模型,均使用 Smollm-Corpus 的 6000 億 token 資料量進行訓練
- 引數量為 1.7B 的模型,則使用 Smollm-Corpus 1 萬億 token 的資料量進行了訓練
超引數的選擇
我們使用一種梯形的學習率變化策略,總訓練時長的最後 20% 作為冷卻時間。需要注意的是,梯形學習率變化的原始驗證實驗只使用了小規模訓練,而我們的工作將其擴充套件到了大模型領域。
對於模型結構,我們的 135M 和 360M 模型均使用了和 MobileLLM 類似的設計,加入了 Grouped-Query Attention 結構,且優先深度擴充套件而不是寬度; 而 1.7T 的模型則使用了相對傳統的設計。此外,三種模型均使用了 embedding tying,上下文長度均為 2048 個 token。使用長上下文微調還可以進一步擴充套件我們模型的上下文長度。
具體模型結構細節資訊可見下表:
我們使用的分詞器 (tokenizer) 是在 Smollm-Corpus 上訓練的,其詞彙量為 49152。
實驗
使用梯形學習率的一個好處是,我們可以更快速地驗證模型在 scaling law 下的擴充套件實驗 (參考 Hägele et al. 這篇論文)。這裡我們使用 SmolLM-125M 做一個關於 scaling law 的小實驗,來驗證這一點。我們在不同的正常訓練節點上進行學習率冷卻,來結束訓練。我們觀察到,隨著模型訓練時間越來越長,效能是持續上升的,這一現象即使在 Chinchilla 最優點 (引數量和訓練資料的最優配比) 之後也存在。根據這些實驗現象,我們決定用 1T 量級 token 的資料去訓練 1.7B 的模型,而 135M 和 360M 的模型則在 600B 量級的 token 上訓練。因為在訓練了 400B 量級的 token 後,兩個較小的模型在一些指標上就已經進步緩慢了。
我們還嘗試新增指令資料集以及在學習率冷卻階段對 Cosmopedia 子集進行上取樣,但這些收效甚微。可能的原因是,我們的混合資料集質量已經足夠高了,所以這些改進效果很有限。
在訓練兩個較小模型的過程中,我們記錄了各項評測指標的變化情況。見下圖:
模型評測
我們對不同引數量的 SmolLM 模型進行了評測,並和當前最好的一些模型進行了對比。我們使用了多種指標,評測內容包括常識推理和世界知識。我們使用 lighteval
和 這些配置 進行評測。對於人類主觀評測,我們使用了 bigcode-evaluation-harness,其中 temperature 設為 0.2,top-p 為 0.95,樣本量為 20。針對未開源的 MobileLLM,其測試結果均取自論文中的資料。
我們發現:
- 在 200M 引數量以下的模型中,SmolLM-135M 在各項指標上都超越了當前最好的模型 MobileLLM-125M。相比於 MobileLLM-125M 使用 1T token 的資料量去訓練,SmolLM-135M 只使用了 600B 的資料量。
- 在 500M 引數量以下的模型中,SmolLM-360M 也超越了其它模型。相比於 MobileLLM-350M 和 Qwen2-500M,SmolLM-360M 引數量和訓練資料均更少。
- 在 2B 引數量以下的模型中,SmolLM-1.7B 也超越了包括 Phi1.5 和 MobileLLM-1.5B 等模型。
- SmolLM-1.7B 還在 Python 程式設計能力上表現搶眼 (我們測評的 Qwen2-1.5B 分數和 Qwen 團隊給出的不同,我們的實驗配置是: temperature 設為 0.2,top-p 設為 0.95,樣本量為 20)。
我們也使用公開資料集對模型進行了指令精調。三個模型均在 WebInstructSub dataset 和 StarCoder2-Self-OSS-Instruct 進行了一輪訓練。隨後,我們也進行了 DPO 訓練,其中,我們使用 HelpSteer 訓練 135M 和 1.7B 的模型,使用 argilla/dpo-mix-7k 訓練 360M 的模型。相關訓練配置和 Zephyr-Gemma 的 說明文件 相同,除了 SFT 的學習率被我們改為了 3e-4。
下表展示了經指令精調的 SmolLM 模型 (SmolLM-Instruct) 和其它模型在 IFEval 上的對比。Qwen2-1.5B-Instruct 取得了最高分,SmolLM-Instruct 模型則在模型大小和效能上取得了很好的權衡,而且僅使用了公開可用的資料集。
如何本地執行 SmolLM 模型?
我們的小模型可以在各種本地的硬體上執行。舉例來說,iPhone 15 有 6GB 的記憶體,iPhone 15 Pro 有 8GB 記憶體,從手機到膝上型電腦,諸多裝置都足以執行我們的模型。下表中,我們記錄了模型執行時實際的記憶體佔用情況:
除了 transformers
庫可以直接使用的模型權重外,我們也開放了 ONNX 模型,並計劃為 llama.cpp
提供 GGUF 版模型。此外,SmolLM-135M 和 SmolLM-360M 的 WebGPU 演示頁面也可以使用。
總結
本文介紹了 SmolLM 系列模型,透過實驗證明了,只要訓練充分、資料質量足夠好,小模型也可以取得很好的效能。本文在此用 SmolLM 提供了一個示例,強有力地證明了模型大小和模型效能可以做到完美權衡。
其它資源
- SmolLM 模型集合: https://huggingface.co/collections/HuggingFaceTB/smollm-models-6695016cad7167254ce15966
- SmolLM-Corpus 資料集: https://huggingface.co/datasets/HuggingFaceTB/smollm-corpus
- WebGPU 演示頁面: https://huggingface.co/spaces/HuggingFaceTB/SmolLM-135M-Instruct-WebGPU and https://huggingface.co/spaces/HuggingFaceTB/SmolLM-360M-Instruct-WebGPU
英文原文:
https://hf.co/blog/smollm 原文作者: Loubna Ben Allal, Anton Lozhkov, Elie Bakouch
譯者: hugging-hoi2022