大模型的起始是Tokenizer,那么市面上常见的Tokenizer已经固定了:BPE、BBPE、Unigram、SentencePiece。

Tokenizer需要实现3个必要步骤:

  • 1 vocab words构建
  • 2 tokenize
  • 3 decode

本文主要集中在如何构建vocab words。

1 BPE

BPE(Byte-Pair Encoding)算法:

  • 1 词表初始化 : 不重复的单个字符
  • 2 词频统计 : 根据词表统计相邻字符串的词频
  • 3 词表合并 :将最高频的词增加到词表
  • 4 重复步骤2-3直至达到合并次数。

BPE的缺点:包含所有全部的基本字符,所以初始词表可能很大

2 BBPE

BBPE(Byte-level BPE)是BPE的改进版本,将字节作为基本Token,则初始词表小很多。

3 WordPiece

wordpice和BPE基本一致,都是先初始化一个很小的词表,慢慢加入高频词汇。不过wordpice针对高频词汇的定义不同。

4 Unigram

unigram(unique-gram)独立gram方法与BPE和WordPiece有很大区别。Unigram先初始化一个非常大的词表,然后计算慢慢缩减词表。

Unigram的步骤:

  • 1 初始化词表
  • 2 统计词频
  • 3 删除词表中一个词
  • 4 计算token的最大联合概率(unigram联合概率计算方式)
  • 5 计算Unigram loss (负对数似然loss = 词频 * -logp)
  • 6 删减使Unigram loss增加最小的词
  • 7 迭代到直到词表的大小等于预设值

Unigram的缺点:计算token的联合概率计算量太大,可以使用维特比算法替换。

5 SentencePiece

BPE、BBPE、WordPiece、Unigram的缺点也很明显,需要使用pre-tokenizer先对文本进行切词,否则无法得到token。如果是英文这种使用空格区分单词的语言,BPE、BBPE、WordPiece、Unigram是ok的,中文就需要先使用jieba库对中文进行切分,才能接这些方法。

SentencePiece将输入作为字节流,包括空格,然后使用BPE或者Unigram来构建词汇表。

6 参考文献