有什么理由要保存预训练的BERT令牌生成器?

问题描述

说我正在使用tokenizer = BertTokenizer.from_pretrained('bert-base-uncased',do_lower_case=True),而在微调新模型期间,我使用该令牌生成器所做的就是标准的tokenizer.encode()

我在大多数地方都看到人们在保存模型的同时保存了该令牌生成器,但是我不清楚为什么有必要保存,因为它看起来像是一个现成的,没有现成的令牌生成器在训练期间以任何方式进行修改

解决方法

在您的情况下,如果仅使用令牌生成器来标记文本(encode()),则不必保存令牌生成器。您始终可以加载预训练模型的令牌生成器。

但是,有时您可能希望使用预训练模型的标记器,然后在其词汇表中添加新标记,或者重新定义特殊符号,例如“ [CLS]”,“ [MASK]”,“ [SEP]” ,“ [[PAD]””或任何此类特殊标记。在这种情况下,由于您已对令牌生成器进行了更改,因此保存令牌生成器以供将来使用将很有用。

,

您始终可以通过以下方式唤醒令牌生成器:

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased',do_lower_case=True)

这可能只是例程的一部分,不是必需的。

,

分词器根据训练语料库中单词(或byte pair encoding中的子单词)的出现频率来创建词汇表。相同的令牌生成器可能具有不同的词汇,具体取决于其接受训练的语料库。

由于这个原因,您可能希望在对语料库进行“训练”并随后训练使用该词法分析器的模型之后保存该词法分析器。

拥抱面Tokenizer Summary介绍了如何建立这些词汇表。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...