大模型的起始是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来构建词汇表。