- 参考于transformers tokenizer的文档
目录
- Byte-Pair Encoding (BPE) [^1]
-
- Byte-level BPE[^2]
-
- WordPiece[^3]
-
- Unigram [^4]
-
- SentencePiece [^5]
-
- References
Byte-Pair Encoding (BPE)
出发点
- 把每一个单词加入词表的话导致词表过大,因此可以把word切分成subwords加入词典。
原理
- 先进行pre-tokenization, 即通过空格得到单词,并且统计词频。
- 创建一个base vocabulary包含所有单词中的符号(字符)。之后迭代方式地学习相邻两个符号结合的规则(所以叫做Byte-pair,字节对),每次结合选择频数最高的一对。
- 具体参考文章开头的链接。
应用
- GPT: 词表大小:40,478(478个 base characters + 40,000个结合的字符)
Byte-level BPE
出发点
- BPE中包含所有单词中的符号的base vocabulary可能很大,比如unicode characters包含了不同语言的字符,是很大的。
原理
- 使用字节(bytes)而不是字符作为base vocabulary。一个字节是8位,一共256种可能,这样base vocabulary的大小就减小到了256。
- 之后的迭代操作和BPE一样,要学习相邻符号的结合规则。
应用
- GPT2: 此表大小:50257 (256 base vocabulary + 1个end-of-text token + 50000 迭代/merge次数)
WordPiece
原理
- 关键思想:先将所有字符(characters)作为base vocabulary,然后逐步学习结合字符的规则。相较于BPE每次结合符号选取频数最高的一对,WordPiece选取能够最大化训练数据集似然的一对。
- 例如:字符“u”和“g”,他们融合成一对“ug”之后的数据集的似然除以“u”和“g”分开时候的似然的比值相较于其他字符结合来说最大。
- Intuition: 相较于BPE,WordPiece验证融合某一对符号是值得的。
应用
Unigram
原理
- 相较于BPE从字符级别构建base vocabulary,Unigram相反,它先用pre-tokenization(比如空格切分)处理之后的所有词作为初始化的base vacobulary,然后逐步地裁剪符号,从而得到一个较小的词典。
- 在每一步,Unigram都定义个训练集合的loss(如log-likelihood),然后它计算去除一个符号(字典中的一个token)之后整体loss的下降,最终把10%或者20%的那些loss下降最多的符号从词典中去除。直到词典大小符合预期。
###应用
- 对于transformers的库来说,没有模型直接使用Unigram,但是它一般会和SentencePiece一起使用
SentencePiece
出发点
- 上述Tokenization方法都存在的一个问题:都假设输入的文本的pre-tokenization都利用空格来切分字词。但是并不是所有的语言都使用空格来切分字词。
原理
- 解决思路就是把整个输入作为输入流,即包含了空格。
- 之后再使用BPE或者Unigram的算法来构建词典。
- 所以SentencePiece使用的时候Tokenize的结果包含空格的信息,用
_
来表示。
from transformers import XLNetTokenizer
tokenizer = XLNetTokenizer.from_pretrained("xlnet-base-cased")
tokenizer.tokenize("Don't you love Transformers? We sure do.")
输出:["▁Don", "'", "t", "▁you", "▁love", "▁", "", "▁", "Transform", "ers", "?", "▁We", "▁sure", "▁do", "."]
应用
- 在transformers库中的所有用SentencePiece的模型中都结合使用了Unigram。
- 包括 ALBERT,XLNet,Marian,T5。
References