参考于transformers tokenizer的文档
目录
Byte-Pair Encoding (BPE) [^1]出发点原理应用 Byte-level BPE[^2]出发点原理应用 WordPiece[^3]原理应用 Unigram [^4]原理 SentencePiece [^5]出发点原理应用 ReferencesByte-Pair Encoding (BPE)1
出发点
把每一个单词加入词表的话导致词表过大,因此可以把word切分成subwords加入词典。原理
先进行pre-tokenization, 即通过空格得到单词,并且统计词频。创建一个base vocabulary包含所有单词中的符号(字符)。之后迭代方式地学习相邻两个符号结合的规则(所以叫做Byte-pair,字节对),每次结合选择频数最高的一对。具体参考文章开头的链接。应用
GPT: 词表大小:40,478(478个 base characters + 40,000个结合的字符)Byte-level BPE2
出发点
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次数)WordPiece3
原理
关键思想:先将所有字符(characters)作为base vocabulary,然后逐步学习结合字符的规则。相较于BPE每次结合符号选取频数最高的一对,WordPiece选取能够最大化训练数据集似然的一对。例如:字符“u”和“g”,他们融合成一对“ug”之后的数据集的似然除以“u”和“g”分开时候的似然的比值相较于其他字符结合来说最大。Intuition:相较于BPE,WordPiece验证融合某一对符号是值得的。应用
BERT,DistlBERT,Electra。Unigram4
原理
相较于BPE从字符级别构建base vocabulary,Unigram相反,它先用pre-tokenization(比如空格切分)处理之后的所有词作为初始化的base vacobulary,然后逐步地裁剪符号,从而得到一个较小的词典。在每一步,Unigram都定义个训练集合的loss(如log-likelihood),然后它计算去除一个符号(字典中的一个token)之后整体loss的下降,最终把10%或者20%的那些loss下降最多的符号从词典中去除。直到词典大小符合预期。###应用对于transformers的库来说,没有模型直接使用Unigram,但是它一般会和SentencePiece一起使用
SentencePiece5
出发点
上述Tokenization方法都存在的一个问题:都假设输入的文本的pre-tokenization都利用空格来切分字词。但是并不是所有的语言都使用空格来切分字词。原理
解决思路就是把整个输入作为输入流,即包含了空格。之后再使用BPE或者Unigram的算法来构建词典。所以SentencePiece使用的时候Tokenize的结果包含空格的信息,用_
来表示。from transformers import XLNetTokenizertokenizer = 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
/abs/1508.07909 ↩︎
/better-language-models/language_models_are_unsupervised_multitask_learners.pdf ↩︎
/media//ja//pubs/archive/37842.pdf ↩︎
/pdf/1804.10959.pdf ↩︎
/pdf/1808.06226.pdf ↩︎