关于Tokenizer总结
来源huggingface文档https://huggingface.co/transformers/tokenizer_summary.html
文本进行标记是将其拆分为词或子词,然后通过查找表将其转换为 id。Transformer包中使用三种主要类型的分词器:
字节对编码 (BPE)、WordPiece和SentencePiece
标记此文本的一种简单方法是将其按空格拆分,这将给出:
["Don't", "you", "love", "🤗", "Transformers?", "We", "sure", "do."]
这是明智的第一步,但如果我们查看标记"Transformers?"and "do.",我们会注意到标点符号附加在单词"Transformer"and 上"do",这是次优的。我们应该考虑标点符号,这样模型就不必学习一个单词的不同表示以及可能跟随它的每个可能的标点符号,这会导致模型必须学习的表示数量激增。考虑到标点符号,标记我们的示例文本将给出:
["Don", "'", "t", "you", "love", "🤗", "Transformers", "?", "We", "sure", "do", "."]
更好的。但是,不利的是标记化如何处理单词"Don't"。"Don't"代表 ,因此最好将其标记为。这就是事情开始变得复杂的地方,也是每个模型都有自己的标记器类型的部分原因。
预训练模型只有在您向其提供使用与用于标记其训练数据的相同规则标记的输入时才能正常执行。"do not"["Do", "n't"]
spaCy和Moses是两种流行的基于规则的标记器。将它们应用到我们的示例中,spaCy和Moses会输出如下内容:
["Do", "n't", "you", "love", "🤗", "Transformers", "?", "We", "sure", "do", "."]
可以看出,这里使用了空格和标点符号化以及基于规则的标记化。空格和标点标记化以及基于规则的标记化都是单词标记化的例子,松散地定义为将句子拆分为单词。虽然这是将文本拆分成更小的块的最直观的方法,但这种标记化方法可能会导致大量文本语料库出现问题。在这种情况下,空格和标点符号化通常会生成一个非常大的词汇表(使用的所有唯一单词和标记的集合)。例如,Transformer XL使用空格和标点符号化,导致词汇量大小为 267,735!
如此大的词汇量迫使模型有一个巨大的嵌入矩阵作为输入和输出层,这会导致内存和时间复杂度的增加。一般来说,transformers 模型的词汇量很少超过 50,000,尤其是当它们仅在一种语言上进行预训练时。
虽然字符标记化非常简单并且会大大减少内存和时间复杂度,但它使模型学习有意义的输入表示变得更加困难。例如,学习字母的有意义的上下文无关表示"t"比学习单词的上下文无关表示要困难得多 "today"。因此,字符标记化往往伴随着性能的损失。因此,为了两全其美,transformer 模型使用了词级和字符级标记化之间的混合,称为子词 标记化。
子词分词算法依赖于这样一个原则,即不应将常用词拆分为更小的子词,而应将稀有词分解为有意义的子词。例如,"annoyingly"可能被认为是一个罕见的词,可以分解为"annoying"和"ly"。双方"annoying"并"ly"作为独立的子词会更频繁地出现,而在同一时间的意义"annoyingly"是由复合材料的含义保持"annoying"和"ly"。这在土耳其语等粘着语言中特别有用,您可以通过将子词串在一起来形成(几乎)任意长的复杂词.
字节对编码 (BPE)
字节对编码 (BPE) 是在具有子字单元的罕见词的神经机器翻译中引入的(Sennrich 等人,2015 年)。BPE 依赖于将训练数据拆分为单词的预分词器。预标记化可以像空间标记化一样简单,例如GPT-2、Roberta。更高级的预分词包括基于规则的分词,例如XLM、 FlauBERT使用 Moses 用于大多数语言,或GPT使用 Spacy 和 ftfy,以计算训练语料库中每个单词的频率。
在预标记化之后,创建了一组独特的词,并确定了它在训练数据中出现的每个词的频率。接下来,BPE 创建一个由出现在唯一单词集中的所有符号组成的基本词汇表,并学习合并规则以从基本词汇表的两个符号形成一个新符号。它会这样做,直到词汇量达到所需的词汇量。请注意,所需的词汇量是在训练分词器之前定义的超参数。
作为一个例子,让我们假设在预标记化之后,已经确定了以下一组单词,包括它们的频率("hug", 10), ("pug", 5), ("pun", 12), ("bun", 4), ("hugs", 5)
然后 BPE 计算每个可能的符号对的频率并选择出现频率最高的符号对。在上面的例子中,"h"后面跟"u"有10 + 5 = 15次(在 10 次出现中 10 次,在"hug"5 次出现中 5 次"hugs")。
然而,最频繁的符号对"u"之后是 "g",总共出现10 + 5 + 5 = 20次。
因此,分词器学习的第一个合并规则是将所有 "u"符号"g"组合在一起,然后是一个符号。
接下来,"ug"被添加到词汇表中。这组词然后变成
("h" "ug", 10), ("p" "ug", 5), ("p" "u" "n", 12), ("b" "u" "n", 4), ("h" "ug" "s", 5)
然后 BPE 识别下一个最常见的符号对。它的"u"后面"n",发生16次。"u", "n"合并"un"并添加到词汇表中。下一个最常见的符号对,"h"随后 "ug",发生15次。这对再次合并并"hug"可以添加到词汇表中。
在这个阶段,词汇表是,我们的唯一词集表示为["b", "g", "h", "n", "p", "s", "u", "ug", "un", "hug"]
("hug", 10), ("p" "ug", 5), ("p" "un", 12), ("b" "un", 4), ("hug" "s", 5)
假设字节对编码训练将在此时停止,然后将学习到的合并规则应用于新单词(只要这些新单词不包含不在基本词汇表中的符号)。例如,单词"bug"将被标记为但将被标记为因为符号不在基本词汇表中。一般情况下,诸如此类的单个字母不会被符号替换, 因为训练数据通常每个字母至少出现一次,但对于非常特殊的字符(如表情符号)很可能会发生这种情况。["b", "ug"]"mug"["<unk>", "ug"]"m""m""<unk>"
字节级 BPE
如果例如所有 unicode 字符都被视为基本字符,则包括所有可能的基本字符的基本词汇表可能会非常大。为了获得更好的基础词汇,GPT-2使用字节作为基础词汇,这是一个巧妙的技巧,可以强制基础词汇的大小为 256,同时确保每个基础字符都包含在词汇中。With some additional rules to deal with punctuation, the GPT2's tokenizer can tokenize every text without the need for the <unk> symbol. GPT-2的词汇量大小为 50,257,对应于 256 字节的基本标记、一个特殊的文本结束标记和通过 50,000 次合并学习的符号。
词条
WordPiece 是用于BERT、DistilBERT和Electra的子词标记化算法。该算法在日语和韩语语音搜索(Schuster 等人,2012 年)中进行了概述,并且与 BPE 非常相似。WordPiece 首先初始化词汇表以包含训练数据中存在的每个字符,并逐步学习给定数量的合并规则。与 BPE 相比,WordPiece 不选择最频繁的符号对,而是选择将训练数据添加到词汇表中的可能性最大化的符号对。
那么这到底是什么意思呢?参考前面的例子,最大化训练数据的似然性相当于找到符号对,其概率除以其第一个符号后跟第二个符号的概率在所有符号对中最大。例如 "u","g"如果被"ug"除以"u",的概率"g"大于任何其他符号对的概率,则, 后跟才会被合并。直观地说,WordPiece 与 BPE 略有不同,因为它通过合并两个符号来评估它失去的东西,以确保它值得。
浙公网安备 33010602011771号