当前位置:   article > 正文

kibana 查看索引库中文档个数_关于transformers库中不同模型的Tokenizer

bpe merges.txt

不同PLM原始论文和transformers库中数据的组织格式。其实,像Roberta,XLM等模型的中<s>, </s>是可以等价于Bert中的[CLS], [SEP]的,只不过不同作者的习惯不同。


Bert
  • 单句:[CLS] A [SEP]
  • 句对:[CLS] A [SEP] A [SEP]
Roberta
  • 单句:<s> A </s>
  • 句对:<s> A </s> </s> B </s>
Albert
  • 单句:[CLS] A [SEP]
  • 句对:[CLS] A [SEP] B [SEP]
XLNet
  • 单句:[A] <sep> <cls>
  • 句对:A <sep> B <sep> <cls>
XLM
  • 单句:<s> A </s>
  • 句对:<s> A </s> B </s>
XLM-Roberta
  • 单句:<s> A </s>
  • 句对:<s> A </s> </s> B </s>
Bart
  • 单句:<s> A </s>
  • 句对:<s> A </s> </s> B </s>

关于transformers库中RobertaTokenizer和BertTokenizer的不同

我们注意到,transformers库中RobertaTokenizer需要同时读取 vocab_filemerges_file两个文件,不同于BertTokenizer只需要读取 vocab_file一个词文件。主要原因是两种模型采用的编码不同:
  • Bert采用的是字符级别的BPE编码,直接生成词表文件,官方词表中包含3w左右的单词,每个单词在词表中的位置即对应Embedding中的索引,Bert预留了100个[unused]位置,便于使用者将自己数据中重要的token手动添加到词表中。
  • Roberta采用的是byte级别的BPE编码,官方词表包含5w多的byte级别的token。merges.txt中存储了所有的token,而vocab.json则是一个byte到索引的映射,通常频率越高的byte索引越小。所以转换的过程是,先将输入的所有tokens转化为merges.txt中对应的byte,再通过vocab.json中的字典进行byte到索引的转化

对于Roberta,比如输入的文本是

What's up with the tokenizer?

首先使用merges.txt转化为对应的Byte(类似于标准化的过程)

['What', "'s", 'Ġup', 'Ġwith', 'Ġthe', 'Ġtoken', 'izer', '?']

再通过vocab.json文件存储的映射转化为对应的索引

  1. [ 'What', "'s", 'Ġup', 'Ġwith', 'Ġthe', 'Ġtoken', 'izer', '?']
  2. ---- becomes ----
  3. [ 2061, 338, 510, 351, 262, 11241, 7509, 30]

由于RobertaTokenizer是继承自GPT2Tokenizer的,所以GPT2Tokenizer也是相似的过程。

由于中文的特殊性不太适合采用byte级别的编码,所以大部分开源的中文Roberta预训练模型仍然采用的是单字词表,所以直接使用BertTokenizer读取即可, 不需要使用 RobertaTokenizer

参考
  • 关于RobertaTokenizer中的vocab.json和merge file
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/249450
推荐阅读
相关标签
  

闽ICP备14008679号