使用 Transformers 和 Tokenizers 从头开始训练语言模型

Hugging Face 发布了一份详细的技术指南,演示了如何使用 transformerstokenizers 库从头开始训练一个新的语言模型。通过为世界语(Esperanto)创建一个名为 "EsperBERTo" 的小型 RoBERTa 类模型,该指南展示了从数据集收集到下游任务微调的端到端流程。

模型架构与规格

EsperBERTo 被设计为一个“小型”模型,以演示在没有海量计算资源的情况下从头开始训练的可行性。其架构包括:

  • 参数量: 84 million
  • 层数: 6
  • 隐藏层大小: 768
  • 注意力头数: 12

此配置模仿了 DistilBERT 的架构。该模型使用掩码语言模型(MLM)进行训练,即模型学习预测数据集中随机掩码的 token。

训练流程

1. 数据集获取

EsperBERTo 的训练语料库包含约 3 GB 的文本。数据来源于两个主要集合:

  • OSCAR corpus: 该多语言语料库中的世界语部分,源自经过过滤的 Common Crawl 网络转储。
  • Leipzig Corpora Collection: 一个包含来自新闻、文学和 Wikipedia 的多样化文本的子语料库,用于补充 OSCAR 数据。

2. 分词器训练

Hugging Face 使用字节级字节对编码(BPE)分词器,类似于 GPT-2 中使用的分词器,词表大小为 52,000。

字节级 BPE 方法的主要技术优势包括:

  • 消除 <unk> token: 由于分词器从单字节字母表中构建词表,因此所有单词都可以分解为 token。
  • 语言优化: 为世界语训练原生分词器允许对变音符号(如 ĉ, ĝ, ĥ, ĵ, ŝ, 和 ŭ)进行原生编码。
  • 效率: 指南指出,与使用预训练的 GPT-2 分词器相比,世界语语料库的编码序列平均长度大约小 30%。

3. 语言模型预训练

该模型使用 transformers 库中的 run_language_modeling.py 脚本进行训练。为了从头开始训练而不是从检查点开始,--model_name_or_path 参数被设置为 None

训练超参数:

  • 学习率: 1e-4
  • Epochs: 5
  • Batch Size: 16 per GPU
  • Seed: 42
  • Model Type: RoBERTa

4. 验证与测试

为了验证模型是否学习到了语言模式,Hugging Face 使用了 FillMaskPipeline。这允许用户输入带有 <mask> token 的序列并观察最可能的补全结果。例如,提示词 "La suno ." 导致了排名第一的预测结果 "brilis"(意为“闪耀”),证实了模型对基础语法和语法的掌握。

下游任务微调

一旦预训练完成,模型将针对词性(POS)标注进行微调。由于世界语是一种高度规则的语言,单词结尾通常指示语法词性,因此该任务被视为一个 token 分类问题。

使用在 CoNLL-2003 格式下标注的世界语 POS 标签数据集,该模型使用 run_ner.py 脚本进行了微调。该过程包括在每个 GPU 上以 64 的 batch size 进行 3 个 epoch 的训练,最终成功分类了代词、动词、名词和形容词。

社区共享与分发

Hugging Face 鼓励通过 transformers-cli upload 命令共享训练好的模型。推荐的模型分发实践包括提供一个模型卡片(README.md),其中详细说明了:

  • 模型描述
  • 训练参数(数据集、预处理和超参数)
  • 评估结果
  • 预期用途和局限性

Sources