使用 Transformers 和 Tokenizers 從頭開始訓練語言模型
Hugging Face 發布了一份詳細的技術指南,展示如何使用 transformers 和 tokenizers 函式庫從頭開始訓練一個新的語言模型。透過為世界語(Esperanto)建立一個名為 "EsperBERTo" 的小型 RoBERTa 風格模型,該指南說明了從數據集收集到下游任務微調的端到端流程。
模型架構與規格
EsperBERTo 被設計為一個 "小型" 模型,以展示在沒有大量運算資源的情況下從頭開始訓練的可行性。其架構包含:
- 參數: 84 million
- 層數: 6
- 隱藏層大小: 768
- 注意力頭數: 12
此配置反映了 DistilBERT 的架構。該模型使用遮罩語言模型(Masked Language Modeling, MLM)進行訓練,模型學習預測數據集中隨機遮罩的 token。
訓練流程
1. 數據集獲取
EsperBERTo 的訓練語料庫包含約 3 GB 的文本。數據來源於兩個主要集合:
- OSCAR corpus: 此多語言語料庫中的世界語部分,源自經過篩選的 Common Crawl 網絡轉儲。
- Leipzig Corpora Collection: 一個包含來自新聞、文學和 Wikipedia 的多樣化文本子語料庫,用以補充 OSCAR 數據。
2. Tokenizer 訓練
Hugging Face 使用了與 GPT-2 類似的位元組級 Byte-pair encoding (BPE) tokenizer,詞彙表大小為 52,000。
位元組級 BPE 方法的主要技術優勢包括:
- 消除
<unk>token: 因為 tokenizer 從單個位元組的字母表中構建其詞彙表,所以所有單詞都可以分解為 token。 - 語言優化: 為世界語訓練原生 tokenizer 可以讓變音符號(如
ĉ,ĝ,ĥ,ĵ,ŝ, 和ŭ)被原生編碼。 - 效率: 指南指出,與使用預訓練的 GPT-2 tokenizer 相比,世界語語料庫的編碼序列平均長度縮小了約 30%。
3. 語言模型預訓練
該模型使用 transformers 函式庫中的 run_language_modeling.py 腳本進行訓練。為了從頭開始訓練而非從檢查點(checkpoint)開始,--model_name_or_path 參數被設置為 None。
訓練超參數:
- 學習率: 1e-4
- Epochs: 5
- Batch Size: 每 GPU 16
- Seed: 42
- Model Type: RoBERTa
4. 驗證與測試
為了驗證模型是否學習到了語言模式,Hugging Face 使用了 FillMaskPipeline。這允許用戶輸入帶有 <mask> token 的序列,並觀察最可能的補全結果。例如,提示詞 "La suno
下游任務微調
預訓練完成後,模型會針對詞性(Part-of-speech, POS)標註進行微調。由於世界語是一種高度規則的語言,單詞結尾通常表示語法上的詞性,因此這項任務被視為一個 token 分類問題。
使用在 CoNLL-2003 格式下標註的世界語 POS 標籤數據集,該模型使用 run_ner.py 腳本進行了微調。該過程涉及在每 GPU batch size 為 64 的情況下訓練 3 個 epochs,最終成功分類了代詞、動詞、名詞和形容詞。
社群分享與分發
Hugging Face 鼓勵透過 transformers-cli upload 命令分享訓練好的模型。建議的模型分發做法包括提供一個模型卡片(README.md),其中詳細說明了:
- 模型描述
- 訓練參數(數據集、預處理和超參數)
- 評估結果
- 預期用途與限制性