nlp - 难以理解 Roberta 模型中使用的分词器

标签 nlp pytorch huggingface-transformers bert-language-model

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', '##内存']

Bert 模型使用 WordPiece 分词器。 WordPiece 词汇表中没有出现的任何单词都会被贪婪地分解为子单词。例如,“RTX”被分解为“R”、“##T”和“##X”,其中## 表示它是一个子标记。

Roberta 使用 BPE 标记器,但我无法理解

a) BPE 分词器是如何工作的?

b) G 在每个代币中代表什么?

最佳答案

这个问题非常广泛,所以我试图给出一个专注于手头主要问题的答案。如果您觉得需要回答其他问题,请一次只针对一个问题打开另一个问题,请参阅 Stackoverflow 的 [帮助/on-topic] 规则。

本质上,正如您正确识别的那样,BPE 是现代深度网络中任何标记化的核心。我强烈建议您阅读 original BPE paper by Sennrich et al. ,其中他们还强调了 BPE 的更多历史。
在任何情况下,任何拥抱脸模型的分词器都是经过预训练的,这意味着它们通常是事先从算法的训练集中生成的。常见的实现如 SentencePiece也可以更好地理解它,但本质上该任务被定义为约束优化问题,您可以在其中指定最大数量 k允许的词汇单词(约束),然后算法尝试在不超过 k 的情况下保持尽可能多的单词完整无缺。 .

如果没有足够的单词来覆盖整个词汇表,则会使用较小的单位来近似词汇表,这会导致您在示例中观察到的 split 。
RoBERTa 使用了一种称为“字节级 BPE”的变体,最好的解释可能在 this study by Wang et al. 中给出。 .主要的好处是,根据我的理解,它可以减少词汇量,同时保持拆分的质量。

你问题的第二部分更容易解释; BERT 突出显示两个后续标记的合并(使用 ## ),而 RoBERTa 的标记生成器使用特定的 unicode 字符(在本例中为 \u0120 ,带点的 G)突出显示新标记的开始。我能找到的最好的理由是 this thread ,它认为它基本上避免了在训练中使用空格。

关于nlp - 难以理解 Roberta 模型中使用的分词器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61134275/

相关文章:

python - Huggingface的Bert的第二个输出是什么意思?

python - 在 Pytorch 中实现 SeparableConv2D

tensorflow - 删除下载的 tensorflow 和 pytorch(Hugging face) 模型

java - 树库式树解析器 python

java - RSS阅读器然后抓取页面内容

android - android中U2Net模型的使用

pytorch - 为什么在此示例中需要对变量调用 detach ?

multilingual - 什么 's the meaning of "使用 bos_token,但尚未设置。”

algorithm - 在哪里可以了解有关 Google 搜索 "did you mean"算法的更多信息?

nlp - 在 word2vec 或 Glove 中添加其他单词(也许使用 gensim)