要訓練一個模型,首先要有資料。不僅要有很大量的資料,也要有品質很好的資料。資料的品質包含:文句是否通順、格式是否合理、內容是否偏頗、資訊是否有害等等。品質越好的資料,越有機會能夠得到更好的模型。
Data quality determines model ability.
今天就來介紹一些資料集相關的資訊。
由 Hugging Face 開發的 Datasets 套件,除了可以讀寫資料集以外,也能用來下載 HF Hub 上的公開資料集。我們可以到搜尋頁面瀏覽有哪些資料集可以用。左邊的 Filter 提供各種過濾的選項,例如資料集的任務目標、子任務、資料集規模或語言等等。
如果遇到超大型資料集,但是不想要整份下載下來看的話,可以透過 Datasets 套件 Sample 幾筆資料出來:
import json
from datasets import load_dataset
ds = load_dataset(
"togethercomputer/RedPajama-Data-1T",
"arxiv", # 選擇 axXiv 子集
cache_dir="cache", # 方便清理
streaming=True, # 啟用此選項,避免整份資料集被下載到硬碟裡面
)["train"]
# 只取前 10 筆出來看看
small_ds = [data for _, data in zip(range(10), ds)]
# 內容通常很長,所以寫進檔案裡面慢慢看
with open("small.json", "wt", encoding="UTF-8") as fp:
json.dump(small_ds, fp, ensure_ascii=False, indent=4)
每種資料集都有自己特別的讀取方式,例如 RedPajama 就要求需要給子資料集的選項,但其實滿多資料集是沒有這個選項的,因此讀取前建議參考該資料集的介紹頁面。
Common Crawl 是一個大型公開的網路爬蟲專案,他會把網路上的海量資料給爬下來,並提供該網頁的文本內容,許多預訓練資料集都是在 Common Crawl (CC) 的基礎上建立的。
Project Gutenberg 谷騰堡計畫是 1971 年開始進行的電子書計畫,目標是提供免費的電子書給公眾閱讀。此計畫的名稱是用來紀念谷騰堡,發明活字印刷術並推廣印刷機的人。
The Pile 是由 Eleuther AI 提供的資料集,其主成份之一 Pile-CC 也是基於 Common Crawl 的資料集。但除此之外,還有很多其他的資料,例如書籍資料 Books3、論文 ArXiv、維基百科、GitHub 程式碼等等。另外 The Pile 也有包含 Project Gutenberg 的資料,其中的 PG-19 是包含 1919 年之前的經典文學書籍。
C4 全名為 Colossal Clean Crawled Corpus,是 Google 在 T5 論文裡面提出的資料集,基於 Common Crawl 之上做了更進一步的資料清洗,將非自然語言的成份給移除掉。之後 Google 又提出了 mT5 的論文,裡面使用了 mC4 資料集,是 C4 的多語言 (Multilingual) 版本。
Stack Exchange 是包含我們的好朋友 Stack Overflow 的一系列問答網站,除了程式設計以外還有軟硬體操作、數學、物理、化學、英文等等的領域。而 Stack Exchange Dataset 就是基於這些網站,爬取下來的網頁文本內容。
Pajama 是睡衣的意思,而 RedPajama 則是一份由 together.ai 統整的資料集,這份資料集整合了 Meta 訓練 LLaMA 時用的資料集,包含 Common Crawl, C4, GitHub, Books, ArXiv, Wikipedia, StackExchange 等等,共 1.2T Tokens 的資料集。
SlimPajama 則是由 Cerebras 提出的資料集,對 RedPajama 做了更進一步的去重複 (Deduplicate) 處理,得到更精簡的 627B Tokens 的資料集。
為什麼去 Deduplication 這麼重要呢?因為重複性的資料可能導致模型產生偏差,試想如果資料集裡面包含了 100 句「土豆是 Potato」,但只有 1 句「土豆在臺灣是 Peanut」,那模型肯定很容易偏頗在前者上。但如果這兩種資料各只有一筆的話,模型就可以較為均衡的學習到更多樣性的資訊。
🙄
The Stack 是由 BigCode 釋出的程式碼資料集,包含 358 種程式語言,有將近 6TB 的資料量。另外還有去重複的版本 The Stack Dedup 和 GitHub Issue 版的 The Stack Issues 這兩種資料集。
StarCoderData 是一份基於 The Stack 的程式碼資料集,留下 86 種程式語言,並加入 GitHub Issue 與 Jupyter Notebooks 等等,總共約 250B Tokens 的文本資料。一般在訓練 Code LLM 的時候,並不會真的只拿 Code Data 去做訓練,而是會加入一些自然語言的資料一起做訓練。
在一些論文中,會使用 PL (Programming Language) 代稱程式語言,並使用 NL (Natural Language) 代稱自然語言。
databricks-dolly-15k 是由 Databricks 提出的資料集,包含一萬五千筆問答資料,這些資料是由 Databricks 上千名員工手動寫出來的 😱
是相當少見的純人工資料集,但是只有英文。
OASST 是 Open Assistant 提出的資料集,共有 16 萬筆資料,涵蓋 35 種語言,其中就包含中文。但沒有特別說是簡體中文還是繁體中文,所以高機率就是 🙃
ShareGPT 在之前的文章有介紹過,是一個用來分享 ChatGPT 對話內容的瀏覽器插件。後來 Vicuna 團隊在 ShareGPT 的網頁上進行爬蟲獲得的 ShareGPT 資料集。但現在 ShareGPT 已經關閉爬蟲入口了,所以只剩別人整理好的 ShareGPT 資料集可以用了。
沒有 ShareGPT 沒關係,由 Vicuna 團隊釋出的 LMSYS Chat 資料集,共有一百萬組對話資料,是從 FastChat Demo 頁面蒐集而來,因此這些資料也是真實的對話資料。
TAIDE Tasks 來自國科會的 TAIDE 專案的繁體中文資料集,裡面只有 140 筆資料,應該是拿來當作種子任務用的。如果要做模型生成的資料集可以參考看看。
在沒有太多人力資源的情況下,透過模型來蒐集資料是個不錯的方法。像是 GPT-3.5 API 每生成 1000 Tokens 的資料只需要 0.002 鎂,約新台幣 0.06 塊錢。收集一百萬 Tokens 約莫只需要 60 TWD 而已,其實超便宜的!
但是透過模型輸出來蒐集資料,需要注意模型是否存在偏頗的狀況。
由 Stanford 提出的 Alpaca 專案,裡面就包含了五萬多筆模型生成的資料集。Alpaca 是最常見的一種做法,首先設定一些種子任務:
Seed 1: 請把「星爆氣流斬」翻譯成英文
Seed 2: 請問桐人的著名招式是什麼
Seed 3: 請介紹刀劍神域這部動畫
然後請 GPT 根據這些種子任務,改寫出更多問句:
Task 1-1: 請把「星爆氣流斬」翻譯成英文
Task 1-2: 請把「大玉螺旋丸」翻譯成英文
Task 1-3: 請把「龜派氣功波」翻譯成英文
Task 2-1: 請問桐人的著名招式是什麼
Task 2-2: 請問鳴人的著名招式是什麼
Task 2-3: 請問悟空的著名招式是什麼
Task 3-1: 請介紹刀劍神域這部動畫
Task 3-2: 請介紹火影忍者這部動畫
Task 3-3: 請介紹七龍珠這部動畫
最後再拿著這些問題直接去問 GPT 得到答案,這樣就能獲得完整的問答資料集了。除了一般的問答以外,有些時候也會設計一些不能回答或答不出來的問題,能夠訓練模型拒絕回答的能力。
另外使用這種方法蒐集資料的還有 BELLE 專案,前陣子釋出的 CKIP Llama 也 Reference 了 BELLE 專案。可惜 CKIP Llama 沒幾天就下架了,寥寥無幾的繁體中文模型又少了一個,相當可惜。
政府資料開放平台提供了很多來自政府提供的資料集,例如之前的全國路名資料就是來自這個平台。對於挖掘臺灣潛在的應用,是個相當好的資料來源。
維基文庫收集了許多自由文本的內容,例如一些古詩詞和散文經典等等,像是三國演義、西遊記之類的。這些文本大多沒有版權問題,所以拿來訓練是沒問題的。
開放文學是另外一個收集自由文本的網站,類似維基文庫。文本量可能稍微少一些,但是對爬蟲相對友善,可以直接分析他的 API 呼叫來取得文本。
漢籍全文資料庫是中研院建立的文本資料庫,以經、史、子、集分類,其中史書的資料相對多一點。
今天介紹了一些常見的資料集,以及一些中文相關的資料。在繁體中文資料方面,可用於 LLM 訓練的資料還是相對稀少一些。作為一個相對低資源的語言使用族群,開發出符合在地語言與文化的資料集需要相當大的努力,希望在 LLM 的影響下,可以讓大家更加重視這個領域的耕耘。