垃圾進來,垃圾出去。在Reddit上訓練的模型與在科學論文上訓練的模型對話方式會有所不同。這就是我們為Sarah精心整理自己的語料庫的原因—通用的網頁爬蟲產生了混亂且不連貫的結果。
建立語料庫在概念上看似簡單,但在實踐中卻極其複雜。最基本層面,你只是收集文字、清理它,然後餵給模型。但「清理」才是真正的重點所在。原始的網頁抓取資料包含重複頁面、模板導航文字、SEO 垃圾資訊、編碼錯誤、截斷文件,以及大量低品質的機器生成內容。Common Crawl 這樣的專案雖然提供了數 PB 的原始網頁資料,但要將這些轉化為可用的訓練語料庫,需要進行強烈的去重(精確與近似重複移除)、語言識別、品質過濾與內容分類。The Pile、RedPajama、FineWeb 和 DCLM 各自代表了不同的過濾哲學,而下游模型的品質差異也是可以測量的。
語料庫的組成會直接且常常令人驚訝地影響模型的能力。如果你的訓練資料有 80% 是英文,即使技術上存在法文文字,模型在法文上的表現也會很一般。如果語料庫中代碼內容佔比很高,模型即使在非代碼任務上也會表現出更好的結構化推理能力 — 這就是 OpenAI 早期 Codex 訓練中的一個意外發現。不同領域的資料比例也很重要:太多社群媒體文字會讓模型變得油嘴滑舌;太多學術文字則會讓模型變得生硬。大多數前沿實驗室會將資料組成視為嚴格保密的機密,因為這已經是少數幾個不單純依賴更多 GPU 的競爭優勢之一。
分詞是連接原始語料庫與模型實際所見資料的橋樑。在訓練前,每一份文件都會被拆解成 token — 由 BPE(Byte Pair Encoding)或 SentencePiece 等演算法學習到的次字元單位。分詞器是根據語料庫本身訓練而來,因此以代碼為主的語料庫會產生能有效表達程式結構的分詞器,而多語言語料庫則會產生對非拉丁文字有更好覆蓋率的分詞器。這一步通常只做一次,之後就凍結:你會將整個語料庫分為二進位分片,以便在訓練期間高效載入。對於大型語料庫,這本身就需要多天、多 TB 的運算。例如,一個 1850 億 token 的語料庫,可能會產生數百 GB 的分詞分片。
品質與規模的爭議是目前領域中最重要的持續討論之一。多年來,主流觀點認為資料越多越好 — 只要將所有東西丟進去,讓模型自行處理。但實證結果一再顯示,一個較小但精心策劃的語料庫,可能比一個規模遠大但品質混亂的語料庫表現更好。微軟的 Phi 系列模型證明了高品質的「教科書式」資料可以產生令人驚訝的強大小型模型。另一方面,Chinchilla 擴展定律則顯示,大多數模型的訓練資料量相對於參數數量來說都過於稀少。實際的教訓是:資料品質與資料數量並非可以互相取代,最好的結果來自於同時正確掌握兩者。