最近在训练LLM,发现不同tokenizer的分词结果和效率都不太一样,因此做实验探究一下,顺便把结果在这里做一个记录。

实验是使用各tokenizer在NewsCommentary的中英平行语料(各25w条)上进行处理,记录处理出的token长度以及处理时间等,结果如下:

名称 词表长度↑ 中文平均长度↓ 英文平均长度↓ 中文处理时间↓ 英文处理时间↓
LLaMA 32000 62.8 32.8 02:09 01:37
BELLE 79458 24.3 32.1 00:52 01:27
MOSS 106072 24.8 28.3 07:08 00:49
GPT4 50281 49.9 27.1 00:07 00:08
BLOOM/Z 250680 23.4 27.6 00:46 01:00
ChatGLM 130344 23.6 28.7 00:26 00:39

实验结果

  1. LLaMA的词表长度是最短的,其在中英文的平均长度上效果都不佳,同时处理时间也较长。
  2. BELLE的词表是在LLaMA基础上进行扩增的,通过观察可以发现,扩增的主要是中文的token,因此中文平均长度和LLaMA相比有较大的下降。
  3. 对比MOSS和BELLE的中英文平均长度可以发现,MOSS相比于BELLE多出的token主要降低了英文的平均长度。
  4. GPT4的tokenizer在英文上效果最佳,但在中文上效果一般。另外由于GPT4采用的是OpenAI实现的高效tokenizer库tictoken,可以看到GPT4的tokenizer在10s内可以分别过完25w的中英文数据。
  5. BLOOM/Z的词表长度是几个对比的tokenizer中最长的,这使得其在中文平均长度上有着最佳表现,同时英文平均长度也接近于最短的GPT4。从优秀的中文平均长度和最长的词表数上看,我们可以推测该tokenizer在别的语言上表现也不错。
  6. ChatGLM是平衡中英文平均长度和处理效率最佳的tokenizer。

出现UNK的数量

以往我们在考虑tokenizer的时候,会考虑它出现unk的数量。但现在因为基本采用sentencepiece来构建词表,而sentencepiece是将输入都转换成unicode再进行处理。而词表中会含有组成所有unicode字符的基本byte,就像如果词表中有26个字母,那这个词表理论上可以组成所有单词而不会出现OOV(out of vocabulary) 问题。因此上述tokenizer在测试数据上都没有出现UNK的现象。

原文