# 根据已有的 tokenizer 训练新的 tokenizer

如果您感兴趣的语言中没有可用的语言模型,或者如果您的语料库与您的语言模型所训练的语料库有很大不同,您很可能希望从适合您的数据的标记器从头开始重新训练模型。这将需要在您的数据集上训练一个新的标记器。 但这究竟是什么意思? 当我们在 第二章 中第一次查看标记器时,我们看到大多数 Transformer 模型使用子词分词算法。 为了识别哪些子词是感兴趣的并且在手头的语料库中最常出现,标记器需要仔细查看语料库中的所有文本 —— 我们称之为 training 的过程。 这种训练的确切规则取决于所使用的标记器的类型,

训练标记器与训练模型不同!模型训练使用随机梯度下降使每个 batch 的 loss 小一点。它本质上是随机的(这意味着在进行两次相同的训练时,您必须设置一些随机数种子才能获得相同的结果)。训练标记器是一个统计过程,它试图确定哪些子词最适合为给定的语料库选择,用于选择它们的确切规则取决于分词算法。它是确定性的,这意味着在相同的语料库上使用相同的算法进行训练时,您总是会得到相同的结果。

# 准备语料库

ransformers 中有一个非常简单的 API,你可以用它来训练一个新的标记器,使它与现有标记器相同的特征:

AutoTokenizer.train_new_from_iterator() . 为了复现这一点,假设我们想从头开始训练 GPT-2,但使用英语以外的语言。我们的首要任务是在训练语料库中收集该语言的大量数据。为了提供每个人都能理解的示例,我们在这里不会使用俄语或中文之类的语言,而是使用在特定领域的英语语言:Python 代码。

Datasets 库可以帮助我们组装一个 Python 源代码语料库。我们将使用 load_dataset () 功能下载和缓存 CodeSearchNet 数据集。该数据集是为 CodeSearchNet 挑战而创建的并包含来自 GitHub 上开源库的数百万种编程语言的函数。在这里,我们将加载此数据集的 Python 部分:

from datasets import load_dataset
# This can take a few minutes to load, so grab a coffee or tea while you wait!
raw_datasets = load_dataset("code_search_net", "python")