wHy DoNt YoU jUsT uSe ThE lLaMa ToKeNiZeR?? (你为什么不直接用 Llama Tokenizer?)
总而言之:训练你自己的定制分词器!
尽管分词器选择对模型性能有显著影响,但它在语言模型研究中相对未受重视。偶尔会有一些与分词器相关的故事流传,比如ChatGPT 无法告诉你“strawberry”中有多少个“r”,或者多模态模型区分大小写。但其他研究领域受到了更多关注,这可以从今年 ACL 摘要中“tokenization”(分词)出现的次数(25 次,而“adapter”为 63 次,“multimodal”为 476 次,“benchmark”为 1,103 次)中看出。
由于对分词器缺乏兴趣,经常可以看到模型使用为其他模型开发的分词器进行训练。一个值得注意的分词器重用示例是 Llama 3(.1) 分词器,它改编自用于 GPT-4 等 OpenAI 模型的 tiktoken
分词器。与此同时,LLM 设计的标准化程度越来越高,Llama 正在迅速成为领先的训练方法。这导致许多开放模型以及训练和推理框架简单地重用 Llama 分词器,而没有给予太多关注。例如,vLLM 只支持 Llama 风格的分词器。
在我自己的测试中,我发现当我在模型训练数据的代表性样本上从头开始训练分词器,并为所需的语言和领域设计分词器时,能获得最佳结果。这样做可以实现更好的压缩,从而降低模型训练的时间和成本。过度依赖特定类型的分词器或重用分词器的做法可能会以我们不完全理解的方式损害性能。
分词器训练数据
分词器训练所用的数据会影响分词质量。在没有任何其他优化的情况下,当我使用基于我们数据训练的分词器时,所有语言的压缩率都得到了改善。在某些情况下,现有分词器对我们数据的压缩率极差。
在代表性数据上进行训练可确保分词器词汇表最具相关性,而无需手动向现有分词器添加词汇项。这样做需要提前确定领域的相关术语。手动添加相关子词的可能性也很低,而这些子词对于在所需领域获得良好压缩也很重要。
这在具有高度专业词汇的领域中可能尤为重要,例如临床 NLP,或处理不同语言。
预分词器
预分词比分词本身更是一个未被充分研究的课题。此步骤涉及将文本分成离散的单元,这些单元可以进一步分成子词。最常见的预分词方法之一是空白预分词。OLMo、Mistral、Gemma 和 Claude 都使用空白预分词的某种变体。
一个例外是 GPT-4 和 Llama 3.1 预分词器。这两者都使用正则表达式预分词,根据几个不同的标准来分割文本。
这个预分词器有两个部分可能存在问题。
(?i:'s|'t|'re|'ve|'m|'ll|'d)
:常见的英语缩写,例如 's, 've, 'll|\p{N}{1,3}|
:任何由 1 到 3 个数字字符组成的序列
根据英语缩写进行分段会过度优化英语,这对其他语言几乎没有益处。它还可能对其他语言或代码产生意想不到的后果。例如,在 Python 等编程语言中,撇号用于分隔字符串。这意味着如果字符串以列出的缩写中的字母开头,字符串的内容将包含初始撇号。这意味着单引号内的文本将被不同地分词。
数字序列的分段也是一个重要的考虑因素。这种方法允许最多三位数字的序列,这与原始 Llama 方法不同,原始 Llama 方法中所有数字在预分词时都进行了分离。这可能会影响算术和其他数字推理任务,例如评估9.11 是否大于 9.9 或乘法。
对 GPT-4o1-mini 乘法能力的分析显示,当两个因子之一超过三位数字时,能力会急剧下降。然后,在六位数字之后会进一步下降,这对应于一个长度超过 2 个标记的字符串。在此之后,随着数字数量的增加,准确性会非常迅速地降至零。这可能是此预分词步骤的结果。
后续步骤
在 PleIAs,我们一直在研究一些新的高效分词方法,例如修改 BPE 算法。我们最大的难题之一是如何评估我们的分词器。如果你想优化模型在每个训练批次中看到的信息量或最小化推理延迟,压缩是一个很好的指标。一些研究表明,压缩可以预测模型性能,但也有证据表明情况并非如此。
另一种流行的方法是假设标记的“有意义性”是分词器质量的衡量标准。一方面,这似乎直观正确。有许多研究表明,明确地使分词器在形态学上更具感知性,从而产生更有意义的标记,可以提高性能。我很快会有一篇预印本发表,其中展示了一些可能与此假设相反的证据。
最终,有意义的标记是否更好可能并不那么直观。使分词器对一种语言更有意义,意味着它对另一种语言或另一个领域可能意义不大。明确要求形态分词可能会损害分词器的通用性。我们很高兴能在不久的将来解决这个问题。
鉴于此,我们为什么不完全放弃分词呢?不依赖分词的语言建模最流行的方法之一是基于字符和字节的分词,它有一些主要缺点。由于序列被分成单个字节或字符,序列长度非常长。这导致训练和推理的计算需求很高。而且,基于字节/字符的分词也引入了语言之间的差异。由于词长和不同书写系统在 UTF-8 编码中的呈现方式不同,有些语言需要比英语多达 5 倍的字节量来传达相同的信息。因此,除了序列长度长之外,有些语言可能需要比其他语言长几倍的序列。虽然子词分词已被证明存在类似问题,但它至少没有很高的计算需求。
尽管无分词语言建模一直不太流行,但最近有一些关于这方面的工作。此外,状态空间模型和长上下文语言建模的进步可能很快意味着长序列不再是问题。
分词是一个非常有趣的研究领域,特别是对于小型模型而言。我们相信这个领域还有很大的改进空间。
感谢 PleIAs 研究团队的反馈,特别是 Pierre-Carl Langlais 和 Ivan Yamshchikov。