nlp - 难以理解 Roberta 模型中使用的分词器
问题描述
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 的 [help/on-topic] 规则。
本质上,正如您正确识别的那样,BPE 是现代深度网络中任何标记化的核心。我强烈建议您阅读Sennrich 等人的原始 BPE 论文。,其中他们还强调了 BPE 的更多历史。
在任何情况下,任何拥抱脸模型的标记器都是预先训练的,这意味着它们通常是预先从算法的训练集中生成的。诸如SentencePiece之类的常见实现也可以更好地理解它,但本质上,该任务被构建为一个受约束的优化问题,您可以在其中指定k
允许的最大词汇量(约束),然后算法尝试保持尽可能多的字完整而不超k
。
如果没有足够的单词来覆盖整个词汇表,则会使用较小的单位来近似词汇表,这会导致在您给出的示例中观察到分裂。RoBERTa 使用一种称为“字节级 BPE ”的变体,Wang 等人的这项研究可能给出了最好的解释。. 主要的好处是,据我了解,它可以在保持拆分质量的同时减少词汇量。
您问题的第二部分更容易解释;虽然 BERT 突出显示了两个后续标记的合并(带有##
),但 RoBERTa 的标记器却突出显示了具有特定 unicode 字符的新标记的开头\u0120
(在本例中,是带有点的 G)。我能找到的最好理由是这个线程,它认为它基本上避免了在训练中使用空格。
推荐阅读
- c# - 我打开一个旧的 ASP.NET 项目后发现错误“'/'应用程序中的服务器错误”是什么原因。
- ionic-framework - 页面更改后传单 .bindPopup() 不起作用
- c# - 使用 FindControl 在运行时更改按钮文本
- python - 当字符串更改时,如何在不同的数据框中写入初始日期和最终日期?
- css - CSS媒体智能手机
- c# - Expression.Convert() 对于 EF Core 中的日期时间数据类型无法正常工作
- java - 实现指纹登录
- android - 仅从一种风味中排除特定依赖项
- python - 如何使用 TensorFlow 2.0 打乱两个 numpy 数据集?
- python - 如何根据python中用户的语音识别输入调用特定函数?