Introduciton
? ? ? ? transformer类型的预训练模型层出不穷,其中的tokenizer方法作为一个非常重要的模块也出现了一些方法。本文对tokenizer方法做一些总结。参考来自hunggingface。
? ? ? ? tokenizer在中文中叫做分词器,就是将句子分成一个个小的词块(token),生成一个词表,并通过模型学习到更好的表示。其中词表的大小和token的长短是很关键的因素,两者需要进行权衡,token太长,则它的表示也能更容易学习到,相应的词表也会变小;token短了,词表就会变大,相应词矩阵变大,参数也会线性变多。所以token的粒度通常分为word和char,中文则对应为词级别和字级别;目前比较流行的是subword-子词级别,将词进一步分为有意义的子词,这在英文中比较常见(词根,词缀),其中在transformers模型中常用的subword tokenizer有三种:BPE、WordPiece、SentencePiece。
Byte-Pair-Encoding
? ? ? ? BPE(byte-pair-encoding)基于pre-tokenization对训练数据进行切分。Pre-tokenization可以使用简单的空格分割,比如GPT2、RoBERTa;可以使用规则分词方法,如XLM、FlauBERT,GPT;进行完pre-tokenization之后,需要对词进行频率统计,之后会将一批symbol作为基础vocabulary,根据之前的词频统计结果或者别的规则方法作为合并方法对symbol进行合并,并扩充入vocabulary。如此循环直至词表大小达到预先设置值或者合并结束。
Byte-Level BPE
? ? ? ? 代表模型:GPT。如果将所有unicode字符视为基本字符,则包含所有可能的基本字符的基本词汇表可能相当大。为了获得更好的基础词汇表,GPT-2使用字节作为基础词汇表,这是一个巧妙的技巧,可以强制基础词汇表的大小为256,同时确保每个基础字符都包含在词汇表中。使用一些额外的规则来处理标点符号,GPT2的标记器可以标记每个文本,而不需要<unk>符号。
WordPiece
????????WordPiece代表模型:BERT、DistilBERT和Electra,与BPE非常相似。WordPiece首先初始化词汇表以包含训练数据中的每个字符,并逐步学习给定数量的合并规则。与BPE相反,WordPiece并没有选择最频繁的符号对,而是选择一个一旦将训练数据添加到词汇表中,就可以最大化训练数据可能性的符号对。下图为词表的生成流程:
Unigram
? ? ? ? Unigram也是一种子词的tokenization,虽然在transformer模型中没有直接使用,但是在SentencePiece中会有用到,所以学习一下。unigram方法和上面两种分词器方法相反,先初始化一个包含大量的symbol的基础vocabulary,其中包含预分词生成的word和高频的子词,然后通过修剪方法缩小词表大小。unigram的修剪方法是训练一个语言模型来计算word修剪前后的loss变化,选择去除loss增加最少的词。为了防止out-of-vocabylary,词表会始终保留单个字符。具体流程如下图:
? ? ? ? 由于unigram没有合并规则,所以在对句子进行tokenizer时会有很多可能的情况。unigram方法会在生成词表时记录每个词的概率,所以可以在tokenizer时会可能出现的情况计算其概率选择概率最大的情况作为最终tokenizer方案。
SentencePiece
? ? ? ? SentencePiece代表模型:XLNet、marian、T5、ALBERT。前面描述的tokenizer算法都有相同的问题:假设输入文本使用空格分隔单词。然而,并非所有语言都使用空格分隔单词。一种可能的解决方案是使用特定于语言的预标记器,例如,XLM使用特定的中文、日文和泰文预标记器。为了更普遍地解决这一问题,SentencePiece将输入视为原始输入流,从而包括要使用的字符集中的空间。它一般使用BPE或unigram算法来构造适当的词汇表。
????????
|