Transformers PreTrainedTokenizer add_tokens 功能

2023-11-29

参考文档在 Huggingface 的很棒的变形金刚库中,我发现了add_tokens功能。

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
num_added_toks = tokenizer.add_tokens(['new_tok1', 'my_new-tok2'])
model.resize_token_embeddings(len(tokenizer))

我通过在默认词汇表中添加以前缺少的单词来尝试上述操作。然而,在保持其他所有不变的情况下,我注意到使用此更新的微调分类器的准确性有所下降tokenizer。即使只添加了 10% 之前缺失的单词,我也能够复制类似的行为。

我的问题

  1. 我错过了什么吗?
  2. 不是整个单词,而是add_tokens函数需要屏蔽标记,例如:'##ah', '##red', '##ik', '##si', ETC。?如果是,是否有生成此类屏蔽令牌的程序?

任何帮助,将不胜感激。

提前致谢。


如果你向分词器添加标记,你确实会让分词器以不同的方式对文本进行分词,但这不是 BERT 训练时使用的分词,所以你基本上是在向输入添加噪声。词嵌入未经训练,网络的其余部分从未在上下文中看到过它们。您需要大量数据来教 BERT 处理新添加的单词。

还有一些方法可以计算单个词嵌入,这样就不会像下面那样损害 BERT这张纸但这看起来很复杂,应该没有什么区别。

BERT 使用基于单词片段的词汇表,因此单词是否作为单个标记出现在词汇表中或拆分为多个单词片段并不重要。该模型可能在预训练期间看到了分割词,并且知道如何处理它。

关于##-前缀标记,这些标记只能作为另一个单词的后缀。例如。,walrus被分成['wal', '##rus']你需要这两个单词都在词汇表中,但不需要##wal or rus.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Transformers PreTrainedTokenizer add_tokens 功能 的相关文章

随机推荐