使用 Transformers 和 Tokenizers 从头开始训练语言模型
Hugging Face 发布了一份详细的技术指南,演示了如何使用 transformers 和 tokenizers 库从头开始训练一个新的语言模型。通过为世界语(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
下游任务微调
一旦预训练完成,模型将针对词性(POS)标注进行微调。由于世界语是一种高度规则的语言,单词结尾通常指示语法词性,因此该任务被视为一个 token 分类问题。
使用在 CoNLL-2003 格式下标注的世界语 POS 标签数据集,该模型使用 run_ner.py 脚本进行了微调。该过程包括在每个 GPU 上以 64 的 batch size 进行 3 个 epoch 的训练,最终成功分类了代词、动词、名词和形容词。
社区共享与分发
Hugging Face 鼓励通过 transformers-cli upload 命令共享训练好的模型。推荐的模型分发实践包括提供一个模型卡片(README.md),其中详细说明了:
- 模型描述
- 训练参数(数据集、预处理和超参数)
- 评估结果
- 预期用途和局限性