Tokenization Algorithm

1 BPE

Byte-Pair Encoding (BPE),一种词表压缩算法,核心思想是合并频繁出现的字符对来创建新的词汇,逐步建立起一个子词的词表。
bpe_compress.gif

from tokenizers import Tokenizer
from tokenizers.models import BPE
from tokenizers.trainers import BpeTrainer
from tokenizers.pre_tokenizers import Whitespace

# 创建一个基本的BPE模型
tokenizer = Tokenizer(BPE(unk_token="[UNK]"))

# 使用 Whitespace作为预处理器
tokenizer.pre_tokenizer = Whitespace()

# 创建一个 BPE trainer,设置vocab_size为5000
trainer = BpeTrainer(vocab_size=5000, special_tokens=["[UNK]", "[CLS]", "[SEP]", "[PAD]", "[MASK]"])

# 指定文件路径列表来训练tokenizer
files = ["your_text_file_1.txt", "your_text_file_2.txt"]
tokenizer.train(files, trainer)

# 保存tokenizer到文件
tokenizer.save("bpe.tokenizer.json")

1.1 Reference

自然语言处理之Subword子词算法 – 标点符
ChatGPT 举例合并时态例子

2 BBPE

Chatgpt 2
字节级别的合并

BPE的算法最开始的基础词表也可能会很大,比如如果将所有的unicode 字符都放入基础词表,一开始的词表大小就有十几万了。在GPT-2论文中使用了bytes作为基础词表,因此它就可以表示任意单词,并且其基础词表只有256的大小,再加上一个特殊的结束符号,使用50000大小的merge,最终GPT-2的词表大小为50257.(GPT-2在merge的时候还有一些特殊规则,比如不将不同类型的bytes合并等)

由于所有的字符都可以转换成字节序列,所以BBPE的词表中可以包含所有可能的单字节符号,这样就确保了模型不会出现任何未登录词,同时也可以有效地控制词表的规模。

BBPE的主要优点在于,它可以实现真正的无UNK处理,同时也能较好地处理多语言文本。因为它基于字节,所以可以很好地处理任何UTF-8编码的文本,无论这些文本是哪种语言,都不需要做任何特殊处理。

2.1 Reference

子词分词器BPE和WordPiece理解_wordpeice-CSDN博客
自然语言处理之Subword子词算法 – 标点符

3 WordPiece

Bert
初始化:每个单词最初通过在单词内的所有字符前添加前缀# 来分割例如 :“word” 被分割为:

w ##o ##r ##d

合并的规则变化为:

score=freqofpairfreqoffirstelement×freqofsecondelement

该规则认为合并后出现的频率越高,这个组合就越应该发生;这是合理的
但是为了形成常见后缀、前缀、复数等,添加了限时:那就是本身这种后缀、前缀、复数出现的概率,他们概率越高,说明不被合并的意义越高

4 Unigram Language Model (ULM)

Unigram Language Model是减量法,即先初始化一个大词表,根据评估准则不断丢弃词表,直到满足限定条件。

对于句子SX=(x1,x2,,xm) 为句子的一个分词结果,由m个子词组成。所以,当前分词下句子S的似然值可以表示为:

P(X)=i=1mP(xi)

对于句子S,挑选似然值最大的作为分词结果,则可以表示为:

x=argmaxxUP(X)

这里U(x)包含了句子的所有分词结果。在实际应用中,词表大小有上万个,直接罗列所有可能的分词组合不具有操作性。针对这个问题,可通过维特比算法得到x

每个字词的概率P(xi)用最大期望的方法计算,假设当前词表V,则M步最大化对象是如下似然函数:

L=∑s=1|D|log(P(X(s)))=∑s=1|D|log(∑x∈U(X(s))P(x))

其中,|D|是语料库中语料数量。上述公式的一个直观理解是,将语料库中所有句子的所有分词组合形成的概率相加。

5 SentencePiece

核心有点:unicode 实现跨越语言、多种字词算法的嵌入,端到端,不假设已经有了基本的字符集,

#待研究 数据驱动-SmilesPE