from transformers import AutoModel, AutoTokenizer
tokenizer1 = AutoTokenizer.from_pretrained("roberta-base")
tokenizer2 = AutoTokenizer.from_pretrained("bert-base-cased")
sequence = "A Titan RTX has 24GB of VRAM"
print(tokenizer1.tokenize(sequence))
print(tokenizer2.tokenize(sequence))
输出:
['A','ĠTitan','ĠRTX','Ġhas','Ġ24','GB','Ġof','ĠVR','AM']
['A','Titan','R','## T','## X','has','24','## GB','of','V','##内存']
伯特模型使用WordPiece标记程序。WordPiece词汇表中未出现的任何单词都会贪婪地分解为子单词。例如,“ RTX”分为“ R”,“ ## T”和“ ## X”,其中##表示它是一个子令牌。
Roberta使用BPE令牌生成器,但我听不懂
a)BPE令牌生成器如何工作?
b)G在每个令牌中代表什么?
这个问题非常广泛,因此我想给出一个针对当前主要问题的答案。如果您需要回答其他问题,请一次打开一个重点关注一个问题的问题,请参阅Stackoverflow的[help / on-topic]规则。
本质上,正如您已经正确地确定的那样,BPE对于现代深度网络中的任何标记化都是至关重要的。我强烈建议您阅读Sennrich等人的原始BPE论文。,其中还重点介绍了BPE的历史。
在任何情况下,任何拥抱模型的令牌生成器都是经过预训练的,这意味着它们通常是事先从算法的训练集中生成的。诸如SentencePiece之类的常见实现也可以更好地理解它,但是从本质上讲,该任务被构造为一个约束优化问题,在该问题中,您指定了k
允许的最大词汇量(约束),然后算法尝试保留尽可能多的词汇完整无缺的单词k
。
如果没有足够的单词来覆盖整个词汇表,则使用较小的单位来近似词汇表,这将导致您在给出的示例中观察到分裂。RoBERTa使用一种称为“ 字节级BPE ” 的变体,Wang等人的这项研究可能给出了最好的解释。。据我所知,主要好处是,它可以减少词汇量,同时保持拆分的质量。
问题的第二部分更容易解释。BERT突出显示两个后续令牌(带有)的合并##
,而RoBERTa的令牌生成器则突出显示具有特定unicode字符(在本例中为带有点的G 的新令牌\u0120
)的开头。我为此找到的最佳原因是该线程,该线程认为它基本上避免了在训练中使用空格。