RobertaTokenizer() 和 from_pretrained() 初始化 RobertaTokenizer 的方式有什么区别?

What is the difference in RobertaTokenizer() and from_pretrained() way of initialising RobertaTokenizer?

我是 huggingface transformers 的新手,在从头开始训练 RobertaForMaskedLM LM 时遇到以下问题:

首先,我训练并保存了一个ByteLevelBPETokenizer如下:

tokenizer = ByteLevelBPETokenizer()
print('Saving tokenizer at:', training_file)
tokenizer.train(files=training_file, vocab_size=VOCAB_SIZE, min_frequency=2, 
special_tokens=["<s>","<pad>","</s>","<unk>","<mask>"])
tokenizer.save_model(tokenizer_mdl_dir)

然后,通过创建 RobertaTokenizer 使用此分词器训练 RobertaForMaskedLM,如下所示:

roberta_tokenizer = RobertaTokenizer(tokenizer_mdl + "/vocab.json", tokenizer_mdl + "/merges.txt")

但是现在,当我尝试使用填充蒙版管道测试经过训练的 LM 时,

fill_mask_pipeline = pipeline("fill-mask", model=roberta_model, tokenizer=roberta_tokenizer)

我收到以下错误:

PipelineException: No mask_token () found on the input

所以,我意识到,我加载的分词器也在分词 <mask> 分词。但我不明白为什么要这样做。请帮助我理解这一点。

尝试了几种方法后,我以不同的方式加载了分词器,

roberta_tokenizer = RobertaTokenizer.from_pretrained(tokenizer_mdl)

并且,现在 fill_mask_pipeline 运行没有错误。那么,使用 RobertaTokenizer() 和使用 .from_pretrained() 方法加载分词器有什么区别?

当您比较 属性 unique_no_split_tokens 时,您会发现这是针对 from_pretrained 分词器初始化的,但不是针对其他分词器初始化的。

#from_pretrained
t1.unique_no_split_tokens
['</s>', '<mask>', '<pad>', '<s>', '<unk>']

#__init__
t2.unique_no_split_tokens
[]

这个 属性 由 from_pretrained 调用的 _add_tokens() 填充,而不是由 __init__ 调用。我实际上不确定这是错误还是功能。 from_pretrained 是从预训练分词器初始化分词器的推荐方法,因此应该使用。