大語言模型系列—預(yù)訓(xùn)練數(shù)據(jù)集及其清洗框架
在參與得物大語言模型(Large Language Model, LLM)項目的深度實踐中,筆者親歷了預(yù)訓(xùn)練數(shù)據(jù)的搜集與清洗全過程。這篇文章通過詳細(xì)梳理現(xiàn)有預(yù)訓(xùn)練數(shù)據(jù)集以及其清洗框架,旨在提供一個全面而實用的參考,以便為 LLM 訓(xùn)練提供快速有效的數(shù)據(jù)集落地方案。
一、內(nèi)容概要
- 梳理中英文訓(xùn)練數(shù)據(jù)集。
- 整理文本清洗框架。
- 總結(jié)現(xiàn)有框架的優(yōu)點、問題和初步解決方案。
二、預(yù)訓(xùn)練數(shù)據(jù)集
大規(guī)模的高質(zhì)量語料是訓(xùn)練大語言模型的關(guān)鍵“養(yǎng)料”。這些語料提供了世界性的知識體系,能夠提升語言模型的理解能力和生成質(zhì)量,同時也能夠支持多樣化的應(yīng)用場景。事實上,高質(zhì)量的文本對于大語言模型的訓(xùn)練和能力表現(xiàn)具有非常重要的影響。一些學(xué)者甚至認(rèn)為:“GPT、PaLM 等模型的領(lǐng)先優(yōu)勢在很大程度上源于它們使用的超大規(guī)模且高質(zhì)量的專有數(shù)據(jù)。”(Touvron et al, 2023)
英文數(shù)據(jù)集
圖片
RefinedWeb
概況
阿聯(lián)酋阿布扎比技術(shù)創(chuàng)新研究所(Technology Innovation Institute, TII)精心構(gòu)建了一個用于大模型預(yù)訓(xùn)練的數(shù)據(jù)集——RefinedWeb。這個數(shù)據(jù)集是通過對 Common Crawl(CC)網(wǎng)頁數(shù)據(jù)進行細(xì)致且深入的清洗和過濾得來的。令人驚訝的是,LLM 僅使用經(jīng)過精細(xì)處理的網(wǎng)頁數(shù)據(jù),就能達到甚至超越使用專有數(shù)據(jù)集的模型效果。RefinedWeb 的全量數(shù)據(jù)規(guī)模達到了 5T Tokens,其中,已經(jīng)向公眾開源的數(shù)據(jù)規(guī)模則達到了 600B Tokens。
依據(jù) Penedo et al.(2023)的研究,如下圖所示,即使只使用經(jīng)過嚴(yán)密清洗和過濾的網(wǎng)頁數(shù)據(jù),模型的效果也能與使用多種專有數(shù)據(jù)的混合方案相媲美。另外,RefinedWeb 數(shù)據(jù)集已成功訓(xùn)練出了 Falcon-7B、40B 和 180B 等模型。值得一提的是,目前 Falcon-180B 在 Huggingface 開源模型排行榜 OpenLLM Leaderboard 上名列前茅。同時,Shen et al.(2023)分析中指出,RefinedWeb 數(shù)據(jù)集的質(zhì)量優(yōu)于 RedPajama-1T 和 SlimPajama。
圖片
清洗規(guī)則
雖然 CC 網(wǎng)頁數(shù)據(jù)的規(guī)模達到 PB 級,但其質(zhì)量卻相對較低,必須經(jīng)過深度的清洗和過濾才能滿足模型訓(xùn)練的需要。RefinedWeb 的清洗過程包括以下幾個步驟:
- 溯源處理:對原始 HTML 網(wǎng)頁格式(使用的是 WARC 格式,而不是常見的 WET 格式)進行處理,包括去除廣告、網(wǎng)頁導(dǎo)航等無效內(nèi)容。
- URL 過濾:利用黑名單過濾掉包含不健康內(nèi)容的域名,同時也使用訓(xùn)練關(guān)鍵詞過濾工具對 URL 進行過濾。
- 英文文本提取:通過語種鑒別工具從原始數(shù)據(jù)中提取出英文文本。
- 文本校正與規(guī)范化:修正文本中的拼寫錯誤和 Unicode 亂碼。
- 文本去重:包括基于 HashLSH 的模糊去重和基于 N-Gram 的精確去重,以降低文本的重復(fù)率。
經(jīng)過深度清洗后,CC 文本的淘汰率接近 90%。盡管如此,TII 團隊仍然從近 180TB 的 CC 數(shù)據(jù)集中清洗出了大約 5T Tokens 的數(shù)據(jù),并向公眾開源了其中的 600B Tokens 數(shù)據(jù)。
圖片
RedPajama-1T
概況
RedPajama-1T 是由 Together 開源社區(qū)發(fā)起的項目,它的目標(biāo)是復(fù)現(xiàn) MetaAI 的 LLaMA 預(yù)訓(xùn)練,以推動大語言模型(LLM)開源社區(qū)的發(fā)展。
- 數(shù)據(jù)集規(guī)模
RedPajama-1T 數(shù)據(jù)集包含了 1.2T Tokens 的英文數(shù)據(jù),未經(jīng)壓縮的數(shù)據(jù)大小約為 5TB,而經(jīng)過壓縮后的下載大小約為 3TB。
- 數(shù)據(jù)集來源
RedPajama-1T 數(shù)據(jù)集的收集方式參照了 LLaMA 論文公開的思路,可從 Hugging Face 官網(wǎng)下載。
- 數(shù)據(jù)集組成
RedPajama-1T 數(shù)據(jù)集包含了來自多個不同來源的數(shù)據(jù),包括 CommonCrawl、C4、GitHub、Books、ArXiv、Wikipedia 以及 StackExchange 等。
圖片
清洗規(guī)則
RedPajama-1T 數(shù)據(jù)集的清洗過程相對簡單,主要的去重操作僅限于子集或文檔內(nèi)部。因此,這個數(shù)據(jù)集的去重并不徹底,在子集之間存在明顯重復(fù)文本(Shen et al, 2023)。
- Common Crawl 利用開源 CC-NET 框架清洗了五個 Common Crawl 快照(Dumps)數(shù)據(jù),主要包括文本提取、去重、語種分類、過濾低質(zhì)量語料以及結(jié)構(gòu)化輸出等步驟。
- C4 數(shù)據(jù)集直接從 Huggingface 下載,只進行了數(shù)據(jù)格式的轉(zhuǎn)換。
- GitHub 數(shù)據(jù)從 Google BigQuery 下載,僅在文件級別進行了去重。此外,僅保留了在 MIT、BSD 或 Apache 許可下分發(fā)的項目。
- Wikipedia 可用的 Wikipedia 數(shù)據(jù)集直接從 Huggingface 下載,數(shù)據(jù)截止至2023 年 3 月 20 日,包含 20 種不同的語言。已刪除了超鏈接、注釋以及其他格式化的文本內(nèi)容。
- Gutenberg 和 Books3 Gutenberg 和 Books3 PG19 子集直接從 Huggingface 下載,使用 Simhash 算法進行去重處理。
- ArXiv 數(shù)據(jù)從 Amazon S3 的 Arxiv Requester Pays 存儲桶中下載。僅保留了 LaTeX 源文件,同時刪除了導(dǎo)言、注釋、宏和參考文獻。
- StackExchange 僅保留了 28 個訪問量最大的帖子,并刪除了 HTML 標(biāo)記。帖子內(nèi)容被分割成問題-回答,并按照回答的點贊數(shù)量進行排序。
SlimPajama
概況
SlimPajama 數(shù)據(jù)集是由 Cerebras 基于 RedPajama-1T 數(shù)據(jù)集通過深度去重得到的英文數(shù)據(jù)集。該團隊通過過濾低質(zhì)量和重復(fù)性文本,從 RedPajama-1T 數(shù)據(jù)集中過濾掉了 49.6% 的 Tokens,從而將數(shù)據(jù)集規(guī)模從 1210B Tokens 縮減為了 627B Tokens。實驗結(jié)果表明,使用 SlimPajama 訓(xùn)練的模型性能優(yōu)于使用 RedPajama-1T 數(shù)據(jù)集訓(xùn)練的模型。
清洗規(guī)則
為了提升數(shù)據(jù)質(zhì)量,Cerebras開發(fā)了一個包含精確和模糊算法的全量去重框架,用于產(chǎn)生 SlimPajama 數(shù)據(jù)集。處理流程包括以下兩個步驟:
- 刪除短小且質(zhì)量較低的文檔:首先去除標(biāo)點符號、空格符號、換行符和制表符,然后刪除少于 200 個字符的文檔。該步驟淘汰了 1.86% 的文檔。
- 利用精確和模糊去重方法:具體來說,這包括 13-Grams 的精確去重方法和 MinHashLSH 的模糊去重方法。通過分布式并行和內(nèi)存池優(yōu)化方法,實現(xiàn)了對 1.2T Tokens 的全量去重,濾掉了 49.6% 的重復(fù) Tokens。這個步驟使用了 64 核的 CPU,耗時 2.5 天,內(nèi)存消耗 1.2TB,最終得到了包含 627B Tokens 的 SlimPajama 數(shù)據(jù)集。
圖片
MassiveText
概況
MassiveText 是由 DeepMind 構(gòu)建的大規(guī)模英文數(shù)據(jù)集,包含約 23.5 億個文檔,總共約 10.5TB 的文本(Rae et al, 2021)。這個數(shù)據(jù)集并未開源,其數(shù)據(jù)來源包括了網(wǎng)頁、書籍、新聞文章以及代碼等多個領(lǐng)域。MassiveText 數(shù)據(jù)集被用于訓(xùn)練 Gopher 模型,該模型最大參數(shù)規(guī)模達到了 280B。
清洗規(guī)則
為了確保數(shù)據(jù)的質(zhì)量,DeepMind 對 MassiveText 數(shù)據(jù)集進行了一系列的處理,包括:
- 內(nèi)容過濾:使用 Google's SafeSearch filter 來過濾非英語文檔,以確保數(shù)據(jù)集的語言統(tǒng)一性。
- 文本提取:該步驟僅針對網(wǎng)頁數(shù)據(jù)源。通過對 HTML 標(biāo)記的樹結(jié)構(gòu)進行分析,識別出在相同級別的語義標(biāo)簽組中出現(xiàn)的自包含、連貫的重要文本塊。這些標(biāo)簽組被轉(zhuǎn)換成純文本,并保留那些在格式上有意義的信息,如縮進、換行和項目符號。
- 低質(zhì)量過濾:僅針對網(wǎng)頁數(shù)據(jù)源。低質(zhì)量文本包括網(wǎng)頁自動生成的內(nèi)容或非人類閱讀的文本(如用于搜索引擎優(yōu)化的關(guān)鍵詞),以及缺乏上下文、連貫性或?qū)嵸|(zhì)意義的社交媒體內(nèi)容。為了過濾低質(zhì)量文本,采用了以下的啟發(fā)式算法:
- 移除詞數(shù)少于 50 或大于 100,000、平均詞長小于 3 或大于 10 個字符的文檔。
- 移除哈希符號或省略號占比超過 10% 的文檔。
- 移除超過 90% 的行以項目符號開頭或超過 30% 的行以省略號結(jié)尾的文檔。
- 過濾停用詞后,確保文檔中 80% 的單詞至少包含一個字母字符。
- 文檔內(nèi)去重:這一步驟僅針對網(wǎng)頁數(shù)據(jù)源。Rae et al.(2021)認(rèn)為模型生成重復(fù)文本可能源于重復(fù)的訓(xùn)練數(shù)據(jù)。為了降低重復(fù)率,移除具有高重復(fù)率的行、段落或 N-Gram 的文檔。
- 文檔間去重:使用MinHash算法計算 13-Gram 的 Jaccard 相似度,過濾相似度超過閾值(通常為0.8)的文檔。
- 測試數(shù)據(jù)過濾:確保訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)之間不存在重疊,以保證模型訓(xùn)練和測試的公正性。
The Pile
概況
The Pile 是由 Eleuther AI 社區(qū)構(gòu)建的大規(guī)模英文數(shù)據(jù)集,其規(guī)模達到 825GB,包含約 1.4 億份文檔,平均每個文檔大小為 5.9 KB(Gao et al, 2020)。這個數(shù)據(jù)集的優(yōu)勢在于其廣泛的數(shù)據(jù)覆蓋范圍和詳細(xì)的分類,由 22 個不同的高質(zhì)量子集組成。
圖片
The Pile 數(shù)據(jù)集被分為五個主要類別:學(xué)術(shù)材料、網(wǎng)頁、書籍、對話和代碼,并被進一步細(xì)分為 22 個子集。以下是其中的一些主要子集:
- Pile-CC:基于 CC WARC 格式數(shù)據(jù),包括原始網(wǎng)頁、元數(shù)據(jù)和文本提取。這些附屬信息有助于過濾掉有害、暴力、煽動犯罪等低質(zhì)量的網(wǎng)頁內(nèi)容。
- PubMed Central:這是 PubMed 生物醫(yī)學(xué)在線資源庫的一個子集,提供近 500 萬份出版物的全文。
- Books3:這是一個圖書數(shù)據(jù)集,包含來自 Bibliotik 的內(nèi)容副本。書籍?dāng)?shù)據(jù)有助于模型學(xué)習(xí)長距離的上下文關(guān)系。
- OpenWebText2:包括自 2020 年起從 Reddit 收集的多語種內(nèi)容、文檔元數(shù)據(jù)和開源代碼。
- ArXiv:這是全球知名的研究論文預(yù)印本服務(wù)器,主要集中在數(shù)學(xué)、計算機科學(xué)和物理學(xué)領(lǐng)域。
- Github:這是一個大型的開源代碼庫,提供豐富的軟件開發(fā)代碼及相關(guān)文本。
- FreeLaw:提供多種形式的法律程序文本,包括摘要、法官書目信息和其他元數(shù)據(jù),來自公共領(lǐng)域的自由法。
- Stack Exchange:包含用戶在 Stack Exchange 上貢獻的內(nèi)容,涵蓋了許多主題,如編程、園藝、佛教等。
- USPTO Backgrounds:這是美國專利商標(biāo)局授予的專利數(shù)據(jù)集,包括發(fā)明專利背景和技術(shù)概述。
- Wikipedia (English):維基百科提供了高質(zhì)量的文本數(shù)據(jù),涵蓋了各種領(lǐng)域。
- PubMed Abstracts:來自 PubMed 的 3000 萬份出版物的摘要,覆蓋生物、醫(yī)學(xué)等領(lǐng)域。
- Project Gutenberg:這是一個經(jīng)典西方文學(xué)的數(shù)據(jù)集,包含了 1 萬多本著名文學(xué)作品。
清洗規(guī)則
各個子集在構(gòu)建過程中采用了“分治”思想,根據(jù)數(shù)據(jù)特征定制清洗規(guī)則。
- Pile-CC:基于 Common Crawl 的 WARC 格式數(shù)據(jù),處理步驟包括文本提取、語言識別(采用 Pycld2 算法,而非 JusText),以及低質(zhì)量文本過濾(參考Brown et al. 2020,使用訓(xùn)練的分類器來篩選低質(zhì)量文本)。
- OpenWebText2:根據(jù) Reddit 的投票數(shù)據(jù),濾除投票數(shù)少于 3 的網(wǎng)頁,并采用 MinHashLSH 算法進行去重處理。
- ArXiv:截止到 2020 年 7 月,總計收集了 126 萬篇文章。在數(shù)據(jù)清洗過程中,移除了以:::開頭的行。
- GitHub:淘汰了獲得 Star 數(shù)量少于 100 或大小超過 1GB 的倉庫。
- Stack Exchange:僅選擇了收到超過 3 個贊的前 3 個回答,并只提取了問答中的純文本,排除了元數(shù)據(jù)。問題和答案的格式分別被格式化為 Q:\n\n 和 A:\n\n。
- PubMed Abstracts:僅保留了標(biāo)題和摘要,一共包含了 15,518,009 個標(biāo)題和摘要。在處理過程中,將標(biāo)題和摘要拼接在一起,并刪除了所有的版權(quán)信息。
- BookCorpus2:這個子集包含了 17868 本書籍。清洗規(guī)則包括:
- 保留文檔的結(jié)構(gòu),使其與章節(jié)保持一致,與目錄非常接近;
- 正確呈現(xiàn)數(shù)據(jù)表格,因為默認(rèn)的 Html 2txt 處理對表格的處理結(jié)果質(zhì)量較差;
- 正確保留代碼的結(jié)構(gòu),使源代碼在視覺上連貫;
- 將編號列表從“1.”轉(zhuǎn)換為“1.”;
- 對全文進行了 ftfy.fix_text() 處理,將 Unicode 的撇號替換為 ASCII 的撇號,并將 Unicode 的省略號擴展為“...”(三個獨立的 ASCII 字符)。
C4
概況
C4 (Colossal Clean Crawled Corpus) 是 Google 提出的一個大規(guī)模英文語料庫。這個數(shù)據(jù)集源自 Common Crawl,包含了約 3.65 億份文檔(156B Tokens)(Raffel et al, 2020)。Google 使用該數(shù)據(jù)集來訓(xùn)練 T5 和 Switch Transformer 模型(Dodge et al, 2021)。
啟發(fā)式清洗規(guī)則
在構(gòu)建 C4 數(shù)據(jù)集的過程中,研究者們制定了一系列啟發(fā)式的數(shù)據(jù)清洗規(guī)則。
- 僅保留以終止標(biāo)點符號(如句號、感嘆號、問號、結(jié)束引號、省略號)結(jié)尾的文本行。
- 丟棄包含少于 5 個句子的網(wǎng)頁,且要求每個句子至少包含 3 個單詞。
- 刪除包含“List of Dirty, Naughty, Obscene or Otherwise Bad Words”中任何詞匯的網(wǎng)頁。
- 由于網(wǎng)頁警告可能啟用 Javascript,因此刪除了包含“Javascript”詞匯的所有文本行。
- 刪除了包含“l(fā)orem ipsum”占位符短語的網(wǎng)頁。
- 刪除了包含大括號“{}”的網(wǎng)頁。
- 刪除了重復(fù)出現(xiàn)的內(nèi)容。
中文數(shù)據(jù)集
盡管如此,目前仍有一些規(guī)模超過 100GB 的中文數(shù)據(jù)集已經(jīng)開源,包括 MNBVC、SkyPile-150B、Wanjuan 1.0、WuDao 和 CLUECorpus2020。這些數(shù)據(jù)集的存在為中文 LLM 訓(xùn)練提供了資源。
MNBVC
MNBVC 數(shù)據(jù)集涵蓋了各種形式的純文本中文數(shù)據(jù),包括新聞、作文、小說、書籍、雜志、論文、臺詞、帖子、Wiki、古詩、歌詞、商品介紹、笑話、糗事、聊天記錄等。所有的數(shù)據(jù)均收集自互聯(lián)網(wǎng)。
在 HuggingFace 上,MNBVC 數(shù)據(jù)集公布的數(shù)據(jù)類別包括公司年報、Wiki、問答(含知乎最高點贊、Wikihow、Stackexchage、外交部答記者問)、新聞、法律(判決書)、政府文章(如學(xué)習(xí)強國,政府工作報告)和代碼,共 7 個類別。未經(jīng)壓縮的純中文數(shù)據(jù)總量達到了 5.4 TB。
圖片
圖片
MNBVC 數(shù)據(jù)集提供的文檔內(nèi)容是經(jīng)過初步清洗的版本,整體來說,數(shù)據(jù)質(zhì)量屬于中等水平。在數(shù)據(jù)集中,存在大量的亂碼、低質(zhì)量文本和重復(fù)性文本。這些問題會影響 LLM 訓(xùn)練效果。因此在使用之前需要對數(shù)據(jù)進行精細(xì)清洗。以下是 MNBVC 數(shù)據(jù)集的主要子集:
新聞:
圖片
知乎問答(僅包含最高贊1個回答):
外交部問答:
圖片
公司財報:
圖片
中文 Wiki:
圖片
法律判決書:
圖片
SkyPile-150B
SkyPile-150B 是昆侖萬維專門為 LLM 預(yù)訓(xùn)練任務(wù)設(shè)計的中文數(shù)據(jù)集,數(shù)據(jù)源自可公開訪問的中文網(wǎng)頁。為了保證數(shù)據(jù)質(zhì)量,數(shù)據(jù)集經(jīng)過了初步的清洗處理,同時使用了 FastText 和 BERT 等工具來過濾低質(zhì)量的文本。SkyPile-150B 包含 1.66 億個中文網(wǎng)頁,每個網(wǎng)頁平均包含 1,000 多個漢字,總的數(shù)據(jù)規(guī)模達到了 592 GB(150B Tokens)。
然而,值得注意的是,該數(shù)據(jù)集的清洗工作并未達到完全徹底的程度。在數(shù)據(jù)集中,仍存在一定數(shù)量的亂碼和不健康內(nèi)容,同時也包含了一些敏感信息,如電子郵件地址、電話號碼或IP地址等。以下是 SkyPile-150B 數(shù)據(jù)集的主要問題:
- Unicode 亂碼:數(shù)據(jù)集中存在一些無法正確解碼的 Unicode 字符。
圖片
- 拼音漢字混搭。
圖片
Wuanjuan 1.0
Wanjuan 1.0 是由上海 AI 實驗室構(gòu)建的混合數(shù)據(jù)集,包含三個主要部分:文本數(shù)據(jù)集、圖文數(shù)據(jù)集和視頻數(shù)據(jù)集。文本部分由各種來源的語料構(gòu)成,包括網(wǎng)頁、百科、書籍、專利、教材、考題等,中文規(guī)模達到了 552 GB。在 Wanjuan 1.0 的構(gòu)建過程中,Html、Text、PDF、Epub 等多種格式的數(shù)據(jù)都被統(tǒng)一處理為 Jsonl 格式。此外,數(shù)據(jù)集還經(jīng)過了細(xì)粒度的清洗、去重和價值對齊,從而形成了一份質(zhì)量較高的預(yù)訓(xùn)練語料。
然而,需要注意的是,Wanjuan 1.0 與 MNBVC 有很多相同的主要子集,因此兩者在內(nèi)容上存在較大的重疊。使用前需要在數(shù)據(jù)集之間進行徹底去重。
圖片
WuDaoCorpora
WuDaoCorpora 是由北京智源人工智能研究院(智源研究院)構(gòu)建的復(fù)合數(shù)據(jù)集,由文本、對話、圖文對三部分組成。其中,可申請使用的文本數(shù)據(jù)規(guī)模達到了 200GB。
在構(gòu)建 WuDaoCorpora 數(shù)據(jù)集的過程中,該團隊采用了 20 多種規(guī)則,從 100TB 的原始網(wǎng)頁數(shù)據(jù)中清洗出了最終的數(shù)據(jù)集。此外,該數(shù)據(jù)集包含了教育、科技等50+個行業(yè)的數(shù)據(jù)標(biāo)簽,這使得它能夠支持多領(lǐng)域預(yù)訓(xùn)練模型的訓(xùn)練。
CLUECorpus2020
CLUE 開源社區(qū)采用自定義的清洗方法從 2019 年 7 月至 12 月的 Common Crawl(CC)原始數(shù)據(jù)中提取出了 100 GB 的中文語料。該數(shù)據(jù)集已經(jīng)通過了 CLUE Organization 團隊的初步驗證,以確認(rèn)其質(zhì)量和可用性。該數(shù)據(jù)集已被成功用于從零開始訓(xùn)練 Bert-base 模型。訓(xùn)練后的模型展示了與使用同類高質(zhì)量數(shù)據(jù)集訓(xùn)練得到的模型相當(dāng)?shù)闹形奶幚砟芰Α?/p>
然而,需要注意的是,由于清洗過程的力度不夠,CLUECorpus2020 中仍然存在一些低質(zhì)量和不健康的文本。以下列出了一些需要進一步改進和完善的地方:
- 數(shù)據(jù)繁體轉(zhuǎn)簡體:
圖片
- 精細(xì)化過濾,濾除廣告彈窗文本內(nèi)容:
圖片
- 網(wǎng)站警報信息:
圖片
- 編碼亂碼:
多語種
目前,已有多個開源的多語種訓(xùn)練數(shù)據(jù)集可供研究者使用。其中包括 CC100(由Conneau 等人于 2019 年發(fā)布)、OSCAR(由Suárez等人于2019年發(fā)布)、ROOTS(由 Lauren?on 等人于 2022 年發(fā)布)、RedPajama-V2 等。
圖片
CC100
CC100 是一個包含 100 種語言的開源數(shù)據(jù)集,總規(guī)模達到了 2.5TB。這份數(shù)據(jù)集是由 Meta AI 團隊使用 CC-Net 框架清洗 2018 年 1 月-2018 年 12 月 的 CC Snapshot 得來。在 CC100 的數(shù)據(jù)格式中,每個文件都包含由雙換行符分隔的文檔以及同一文檔中由換行符分隔的段落。這樣的設(shè)計旨在方便數(shù)據(jù)的處理和使用。
CC100 數(shù)據(jù)集已被用于訓(xùn)練 XLM-R 模型,訓(xùn)練結(jié)果揭示了幾個重要的發(fā)現(xiàn):(1)擴大數(shù)據(jù)規(guī)模能顯著提升下游任務(wù)的表現(xiàn);(2)增加語種數(shù)量、擴大詞匯表、增大模型參數(shù)規(guī)模,這些都有利于提升模型的表現(xiàn),特別是對于小語種的遷移學(xué)習(xí)能力。
圖片
OSCAR
OSCAR(Open Super-large Crawled Aggregated coRpus)是一個開源項目,其主要目標(biāo)是處理 Common Crawl 的 WET 文件,以便為詞嵌入模型和大型語言模型預(yù)訓(xùn)練提供基于網(wǎng)頁的多語言數(shù)據(jù)集。該項目成功地開源了多語種的 OSCAR 數(shù)據(jù)集,總規(guī)模達到了 6.3TB。該數(shù)據(jù)集包含了 151 種不同的語言,最新版本為 OSCAR 23.01。通過基于 OSCAR 數(shù)據(jù)庫訓(xùn)練的上下文詞嵌入 ELMo 模型,研究人員發(fā)現(xiàn),清洗算法能顯著降低 Common Crawl 數(shù)據(jù)的噪聲,使其接近 Wikipedia 的質(zhì)量水平。
此外,OSCAR 項目還開發(fā)了一套專門用于分類和過濾 Common Crawl 數(shù)據(jù)的高性能并行框架(包括 Goclassy 和 Ungoliant)。這個框架重用了 FastText 的線性分類器和預(yù)訓(xùn)練的 FastText 模型進行語言識別。
ROOTS
ROOTS 是由 BigScience 團隊構(gòu)建的多語言數(shù)據(jù)集,其規(guī)模達到了 1.6TB。這個數(shù)據(jù)集被用來訓(xùn)練了一款擁有超過 1700 億參數(shù)的大型模型,即 BLOOM 模型(Scao et al, 2022)。ROOTS 數(shù)據(jù)集涵蓋了 59 種語言,這其中包括 46 種自然語言和 13 種編程語言,提供了豐富的多語種和多模態(tài)資源。在其數(shù)據(jù)來源上,62% 的數(shù)據(jù)由社區(qū)進行搜集和篩選;另外 38% 的數(shù)據(jù)則來自 OSCAR 數(shù)據(jù)集,并經(jīng)過了精細(xì)的過濾和校驗流程。
圖片
為了確保數(shù)據(jù)集的質(zhì)量,ROOTS 數(shù)據(jù)集的清洗過程采取了一系列嚴(yán)格的措施。清洗流程包括:
- 去除重復(fù)內(nèi)容:通過識別和刪除相同或幾乎相同的文本,確保數(shù)據(jù)集中的每一份文檔都是唯一的。
- 過濾頁面代碼和網(wǎng)頁組件:通過分析和識別 HTML 等頁面代碼,將這類非自然語言文本從數(shù)據(jù)集中移除。
- 過濾 SEO 頁面:SEO 頁面通常包含了大量的關(guān)鍵詞和短語,干擾模型訓(xùn)練。
- 過濾不適當(dāng)?shù)膬?nèi)容:這包括色情、暴力等可能引起不適的內(nèi)容,這些內(nèi)容不應(yīng)被包含在數(shù)據(jù)集中。
此外,ROOTS 數(shù)據(jù)集也采用了 Simhash 算法對長文本進行去重,以進一步確保數(shù)據(jù)的獨立性和多樣性。同時,也對數(shù)據(jù)進行了個人信息的去除,以遵守數(shù)據(jù)隱私和保護的相關(guān)規(guī)定。
圖片
RedPajama-V2
繼 RedPajama-1T 之后,Together 開源社區(qū)于 2023 年 10 月底發(fā)布了多語種數(shù)據(jù)集 RedPajama-V2。該數(shù)據(jù)集源自于 84 個 CommonCrawl Dump 文件,包含英語(67%)、德語(10%)、法語(9%)、西班牙語(9%)和意大利語(5%)五種語言,文本規(guī)模達到 30T Tokens(約100TB),是迄今為止最完整的CommonCrawl 清洗數(shù)據(jù)。
RedPajama-V2 數(shù)據(jù)集采用了 CC-NET 清洗框架,主要包括 URL 過濾、敏感詞過濾、語種分類、模糊+精確去重、啟發(fā)式清洗、文本質(zhì)量分類。Together 團隊融合了多種文本質(zhì)量評估方法,包括困惑度指標(biāo)、文本打分模型等,并提供了 40 多種文本質(zhì)量參考指標(biāo)。其清洗方法詳見(https://github.com/togethercomputer/RedPajama-Data)。
數(shù)據(jù)集對比和小結(jié)
- 英文語料所擁有的規(guī)模遠(yuǎn)超中文,其詳細(xì)清洗和處理方式也更為完善。與萬億級 Token 的英文開源數(shù)據(jù)集相比,公開的大型中文數(shù)據(jù)集規(guī)模尚小。
- 多語種數(shù)據(jù)集越來越受到 LLM 社區(qū)的重視。
- 目前并無開源數(shù)據(jù)集能完全滿足中文語言模型的訓(xùn)練需求,存在的問題包括清洗不徹底、規(guī)模不足、大量內(nèi)容重復(fù)等。因此,構(gòu)建一個高質(zhì)量的大規(guī)模中文數(shù)據(jù)集,是當(dāng)前的迫切需求。
三、文本清洗框架
文本語料清洗(Text Corpus Cleaning)是自然語言處理中的一項核心任務(wù),該過程對確保數(shù)據(jù)質(zhì)量和提高模型效果至關(guān)重要。語料清洗的主要步驟包括文本提取、語種分類、去重和過濾等。目前,開源語料清洗框架有 SlimPajama、MNBVC 和 CC-NET 等。
SlimPajama框架
SlimPajama 是由 Cerebras 團隊推出的一個去重工具包,為清洗 RedPajama-1T 數(shù)據(jù)集而設(shè)計。它提供了一系列的功能,包括文本規(guī)范化、生成 Minhash、匹配重復(fù)數(shù)據(jù)、劃分?jǐn)?shù)據(jù)集和去重等。而且,通過采取分布式并行和內(nèi)存池優(yōu)化技術(shù),該工具可以支持萬億級 Tokens 的同步去重。
SlimPajama 的數(shù)據(jù)清洗流程如下:
- 通過 Normalize_text 函數(shù)做文本規(guī)范化處理,包括小寫化、去標(biāo)點等。
- 通過 Filter 函數(shù)過濾掉少于 200 字符數(shù)的短文檔。
- 通過 To_Hash 函數(shù)為每個文檔生成 Minhash 簽名。
- 通過 Generate_Duplicate_Pairs 函數(shù)基于 Minhash 簽名生成候選重復(fù)對。
- 通過 Generate_Connected_Components 函數(shù)將候選重復(fù)對連接成連通圖。
- 通過 Generate_Duplicates 函數(shù)從連通圖中提取重復(fù)文檔。
- 通過 Shuffle_Holdout 函數(shù)將數(shù)據(jù)集劃分為訓(xùn)練和驗證集。
- 通過 Dedup_Train 函數(shù)去除訓(xùn)練集中與驗證集重復(fù)的文檔。
MNBVC框架
MNBVC 是來自里屋社區(qū)的一款面向中文文本清洗的工具包,專門用于處理 MNBVC 數(shù)據(jù)。其核心功能包括文本提取、去重和質(zhì)量評分等。
MNBVC 的數(shù)據(jù)清洗流程如下:
- 對外部輸入的文件進行文件 MD5 和文件大小的重復(fù)檢測,刪除不同來源但實質(zhì)相同的文件。
- 將大量文本文件(目前僅支持 txt 文件)轉(zhuǎn)換為格式化的、易于查詢的數(shù)據(jù)。
- 對百萬級別的文件進行快速去重操作。
- 文件格式重整和輸出。
格式化
功能
- 將大量文本txt轉(zhuǎn)化成格式化和易查詢 Jsonl 數(shù)據(jù)。
- 在文本內(nèi)快速去重。
用法
運行 convert.py 程序,并設(shè)置源文件路徑和目標(biāo)路徑,指定并發(fā)進程數(shù)量(--n_process)和重復(fù)率閾值(-- threshold)
python convert.py --src_dir /path/to/source/directory --dst_dir /path/to/destination/directory --n_process 4 --threshold 0.7
格式說明
文本內(nèi)段落重復(fù)率高于閾值,被視為問題內(nèi)容處理,全部保存在problem_*.jsonl,重復(fù)率低于閾值則保存在順序編號 Jsonl 文件,例如1.jsonl。
每個正常文件大小為 500MB,可根據(jù)需要通過修改./utils.py 的 mas_size 值。
Jsonl 文件格式為:
{
'文件名': '文件.txt',
'是否待查文件': False,
'是否重復(fù)文件': False,
'文件大小': 1024,
'simhash': 0,
'最長段落長度': 0,
'段落數(shù)': 0,
'去重段落數(shù)': 0,
'低質(zhì)量段落數(shù)': 0,
'段落': []
}
多進程文件去重
功能
對百萬量級文件并行處理,在文件間快速去重。
核心函數(shù)
- convert_jsonl_to_csv.py
將 Jsonl 文件轉(zhuǎn)化成對應(yīng) txt 元數(shù)據(jù)組成的 csv 文件,僅支持 Jsonl 格式輸入文件;
python convert_jsonl_to_csv.py --src_dir /path/to/source/directory --dst_dir /path/to/destination/directory
- multiprocess_deduplication.py
依賴 convert_jsonl_to_csv.py 輸出的 csv 文件。支持多進程并發(fā)處理,進程數(shù)至少為 2。
python multiprocess_deduplication.py --src_dir /path/to/source/directory --n_process 10 --simhash_threshold 3 --jaccard_thresold 0.8
參數(shù)說明:
--simhash_threshold 3:指定 Simhash 閾值,默認(rèn)為 3,出重效果較好且速度較快。值越大運行速度越慢;
--jaccard_thresold 0.8:指定 jaccard 閾值;
--n_process 10:指定并行進程數(shù)。
- reset_csv.py
清除 csv 文件去重失敗結(jié)果,multiprocess_deduplication.py 去重結(jié)果會寫入 csv 文件,如果參數(shù)出錯,可以通過 reset_csv.py 清除 csv 狀態(tài),從而再次進行去重。
python reset_csv.py --src_dir /path/to/source/directory
--src_dir 指定原始 csv 文件的路徑
- write_output_to_jsonl.py
將 csv 去重后的結(jié)果再次保存到原始 Jsonl 文件中去。
python write_output_to_jsonl.py --csv_dir /path/to/source/csvdirectory --jsonl_dir /path/to/source/jsonldirectory
--csv_dir:csv 源文件夾路徑;
--jsonl_dir:原始 Jsonl 的路徑。
示例
python convert_jsonl_to_csv.py --src_dir ./mnbvcfiles --dst_dir ./output_csv
# 假如simhash參數(shù)設(shè)置錯誤,simhash_threshold設(shè)置成12,導(dǎo)致速度極慢
python multiprocess_deduplication.py --src_dir ./output_csv --n_process 15 --simhash_threshold 12 --jaccard_thresold 0.8
# 先強行結(jié)束,在運行reset
python reset_csv.py --src_dir ./output_csv
# 正常跑一遍
python multiprocess_deduplication.py --src_dir ./output_csv --n_process 15 --simhash_threshold 3 --jaccard_thresold 0.8
python write_output_to_jsonl.py --csv_dir ./output_csv --jsonl_dir ./mnbvcfiles
CC-NET框架
CC數(shù)據(jù)下載
CC 數(shù)據(jù)包含三種格式:
- WARC,網(wǎng)頁原始數(shù)據(jù),大約 70TB。
- WAT,重要元數(shù)據(jù)和記錄,大約 17TB。
- WET,純文本信息,超過 80000 個 WET 文件,大約 8TB。
大部分用戶處理的是WET格式文本數(shù)據(jù),數(shù)據(jù)并發(fā)批量下載方式:
- 選擇 Screenshot。
- 下載 WET File List,解壓。
- 逐行讀取 WET File List 內(nèi)容,添加 https://data.commoncrawl.org/ ,獲得文件的完整 URL。
- 啟動 WGET 命令下載文件。
#!/bin/bash
filename="wet.paths" # 源文件名稱
prefix="https://data.commoncrawl.org/" # 前綴
outputfile="new-text-$1.txt" # 保存前綴添加后的數(shù)據(jù)的文件
let startline=$1*$2
let linenum=$2+2
tail -n +${startline} ${filename} | head -n ${linenum} | sed "s%^%${prefix}%" > $outputfile
# 下載數(shù)據(jù)
while read -r url; do
wget -c $url -P wet-data
done < $outputfile
echo "Successfully downloaded"
清洗流程和示例
CC-NET 的數(shù)據(jù)清洗流程主要包含以下三個步驟:
- 預(yù)處理:這一步主要從下載的數(shù)據(jù)中抽取段落,并計算每個段落的哈希值。
- 去重、分類和打分:這一步根據(jù)段落的哈希值刪除重復(fù)的段落。接著,使用基于 Wikipedia 高質(zhì)量數(shù)據(jù)訓(xùn)練的分類模型對語料進行語種分類,例如將語料分類為中文、英文、德文等。然后,利用語言模型對語料質(zhì)量進行打分,并依據(jù)困惑度(Perplexity)值將語料劃分為 Head、Middle 和 Tail 三種質(zhì)量級別,其中 Head 級別的質(zhì)量最高,約占所有語料的 15%。
- 重組:這一步將按語種和質(zhì)量分類的語料數(shù)據(jù)重組,并保存為 Json 文件。
圖片
清洗命令:
python -m cc_net --config ./config/segment.json
segment.json指定清洗文件數(shù)量、語種、清洗步驟和文件路徑
{
"hash_in_mem": 2,
"dump": "2019-09",
"num_shards": 4,
"num_segments_per_shard": 1,
"mine_num_processes": 0,
"lang_whitelist": ["en", "zh"],
"pipeline": [
"dedup",
"lid",
"keep_lang",
"sp",
"lm",
"pp_bucket",
"minify",
"split_by_segment"
],
"execution": "debug",
"output_dir": "test_data_4shards",
"mined_dir": "mined_by_segment",
"target_size": "32M",
"cache_dir": "test_data/wet_cache"
}
文本清洗框架對比和小結(jié)
- SlimPajama 框架專注于大規(guī)模數(shù)據(jù)集的去重,整套方案支持并行和內(nèi)存優(yōu)化,可處理萬億級數(shù)據(jù)。但目前僅針對英文數(shù)據(jù)。
- MNBVC 框架面向中文語料清洗,支持文本提取、去重和質(zhì)量評分。但僅支持文檔級別的去重,去重粒度有待細(xì)化。
- CC-NET 支持多語種清洗,實現(xiàn)了完整的文本清洗鏈路,包括語種分類、啟發(fā)式規(guī)則過濾、質(zhì)量評分和重組輸出。但安裝較復(fù)雜,也缺乏多粒度去重功能。
- 當(dāng)前清洗框架多局限于特定語種或數(shù)據(jù)源,沒有通用的多語種清洗系統(tǒng)。理想的清洗框架應(yīng)支持多語種多格式輸入,具備大規(guī)模并行和可擴展能力,針對不同類型數(shù)據(jù)提供自定義規(guī)則和功能,支持段落、章節(jié)、文檔等多粒度去重功能等。融合前人方法的優(yōu)勢,建立一個模塊化、可配置、可擴展的清洗框架,并提供豐富的規(guī)則庫,是值得探索的方向。
四、總結(jié)和展望
本文從快速構(gòu)建大型語言模型(LLM)訓(xùn)練數(shù)據(jù)集的角度出發(fā),全面梳理了中文、英文和多語種數(shù)據(jù)集及其清洗規(guī)則,介紹了常用的數(shù)據(jù)清洗框架和主要流程,指出現(xiàn)有數(shù)據(jù)集存在的問題及其初步解決方案。站在開源數(shù)據(jù)集的肩膀上,通過數(shù)據(jù)整合和精細(xì)治理,我們能快速產(chǎn)出落地方案和結(jié)果,從而推動 LLM 的訓(xùn)練和優(yōu)化任務(wù)。
以下是已落地的數(shù)據(jù)集及其反思:
- 數(shù)據(jù)類別:已覆蓋了所有常見的類別,包括網(wǎng)頁、書籍、企業(yè)年報、法律文書、問答、新聞、百科、考試、專利、評論、博客、歌詞、古詩文、中英平行語料等。
- 訓(xùn)練語種:訓(xùn)練集包含中英雙語。大型語言模型如 GPT 系列、PaLM 2、QWEN、BaiChuan2 等,已經(jīng)從單語種(或雙語種)轉(zhuǎn)變?yōu)槎嗾Z種。多語種訓(xùn)練可以通過遷移學(xué)習(xí)和詞表擴容來提升大型語言模型的性能,尤其是對于小語種。
- 數(shù)據(jù)規(guī)模:現(xiàn)有中英高質(zhì)量文本規(guī)模和多樣性已初步對齊開源模型。當(dāng)前全球的中英文高質(zhì)量語料上限約為 20T Tokens,而開源模型的預(yù)訓(xùn)練語料通常在 1~5T Tokens 的規(guī)模之間。
- 訓(xùn)練數(shù)據(jù)采樣方式:目前缺乏統(tǒng)一的標(biāo)準(zhǔn)。GPT、Gopher、T5 模型采用的是不均勻采樣方式,而 Llama 2、Falcon、PaLM、LaMDA、GLaM 采用的是均勻采樣方式(所有數(shù)據(jù) Epoch=1)。
- 數(shù)據(jù)清洗:追求高質(zhì)量、低重復(fù)率已成為共識。我們優(yōu)先采用精確去重和模糊去重的結(jié)合策略。啟發(fā)式過濾方法存在主觀性、片面性和低效性等問題。為改進現(xiàn)有的啟發(fā)式方法,我們一方面收集和匯總現(xiàn)有的規(guī)則,提煉并吸收,以形成更全面的統(tǒng)一規(guī)則,提高命中率;另一方面,我們將啟發(fā)式規(guī)則的落地和實現(xiàn),通過工程化手段提升清洗效率。
- 數(shù)據(jù)質(zhì)量評估和校驗:當(dāng)前缺乏統(tǒng)一的標(biāo)準(zhǔn)。常用的方法包括:(1)訓(xùn)練質(zhì)量分類器,通過閾值濾掉低質(zhì)量文本,并通過對比方法定量評估文本質(zhì)量;(2)利用文本困惑度(PPL)指標(biāo);(3)多輪人工校驗。
參考資料:
- Anil R, Dai A M, Firat O, et al. Palm 2 technical report[J]. arXiv preprint arXiv:2305.10403, 2023.
- Conneau A, Khandelwal K, Goyal N, et al. Unsupervised cross-lingual representation learning at scale[J]. arXiv preprint arXiv:1911.02116, 2019.
- Dodge J, Sap M, Marasovi? A, et al. Documenting large webtext corpora: A case study on the colossal clean crawled corpus[J]. arXiv preprint arXiv:2104.08758, 2021.
- Gao L, Biderman S, Black S, et al. The pile: An 800gb dataset of diverse text for language modeling[J]. arXiv preprint arXiv:2101.00027, 2020.
- Lauren?on H, Saulnier L, Wang T, et al. The bigscience roots corpus: A 1.6 tb composite multilingual dataset[J]. Advances in Neural Information Processing Systems, 2022, 35: 31809-31826.
- Suárez P J O, Sagot B, Romary L. Asynchronous pipeline for processing huge corpora on medium to low resource infrastructures[C]//7th Workshop on the Challenges in the Management of Large Corpora (CMLC-7). Leibniz-Institut für Deutsche Sprache, 2019.
- Penedo G, Malartic Q, Hesslow D, et al. The RefinedWeb dataset for Falcon LLM: outperforming curated corpora with web data, and web data only[J]. arXiv preprint arXiv:2306.01116, 2023.
- Rae J W, Borgeaud S, Cai T, et al. Scaling language models: Methods, analysis & insights from training gopher[J]. arXiv preprint arXiv:2112.11446, 2021.
- Raffel C, Shazeer N, Roberts A, et al. Exploring the limits of transfer learning with a unified text-to-text transformer[J]. The Journal of Machine Learning Research, 2020, 21(1): 5485-5551.
- Scao T L, Fan A, Akiki C, et al. Bloom: A 176b-parameter open-access multilingual language model[J]. arXiv preprint arXiv:2211.05100, 2022.
- Shen Z, Tao T, Ma L, et al. SlimPajama-DC: Understanding Data Combinations for LLM Training[J]. arXiv preprint arXiv:2309.10818, 2023.
- Touvron H, Martin L, Stone K, et al. Llama 2: Open foundation and fine-tuned chat models[J]. arXiv preprint arXiv:2307.09288, 2023.
- https://huggingface.co/datasets/tiiuae/falcon-refinedweb.
- https://huggingface.co/datasets/EleutherAI/pile.