1

我是抱脸变形金刚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)

RobertaForMaskedLM然后,通过创建一个使用这个标记器进行训练RobertaTokenizer,如下所示:

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:在输入上找不到 mask_token ()

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

在尝试了几件事之后,我以不同的方式加载了标记器,

roberta_tokenizer = RobertaTokenizer.from_pretrained(tokenizer_mdl)

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

4

1 回答 1

1

当您比较 propertyunique_no_split_tokens时,您会看到这是为from_pretrainedtokenizer 初始化的,但不是为另一个初始化的。

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

#__init__
t2.unique_no_split_tokens
[]

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

于 2020-11-02T06:06:57.557 回答