相关疑难解决方法(0)

如何向标记器添加新的特殊标记?

我想构建一个多类分类模型,将会话数据作为 BERT 模型的输入(使用 bert-base-uncased)。

提问:我想问一个问题。
答:当然可以,问吧。
询问:今天天气怎么样?
答:天气很好,阳光明媚。
问题:好的,很高兴知道。
回答:您还想了解其他信息吗?

除此之外,我还有两个输入。

我想知道是否应该在对话中添加特殊标记,以使其对 BERT 模型更有意义,例如:

[CLS]QUERY:我想问一个问题。[EOT]
答案:当然可以,问吧。[EOT]
查询:今天天气怎么样?[EOT]
答案:天气很好,阳光明媚。[EOT]
查询:好的,很高兴知道。[EOT]
解答:您还想了解其他信息吗?[九月]

但我无法添加新的 [EOT] 特殊令牌。
或者我应该为此使用 [SEP] 令牌?

编辑:重现步骤

from transformers import AutoTokenizer, AutoModelForSequenceClassification
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased")

print(tokenizer.all_special_tokens) # --> ['[UNK]', '[SEP]', '[PAD]', '[CLS]', '[MASK]']
print(tokenizer.all_special_ids)    # --> [100, 102, 0, 101, 103]

num_added_toks = tokenizer.add_tokens(['[EOT]'])
model.resize_token_embeddings(len(tokenizer))  # --> Embedding(30523, 768)

tokenizer.convert_tokens_to_ids('[EOT]')  # --> 30522

text_to_encode = '''QUERY: I want to ask a question. [EOT]
ANSWER: Sure, ask away. …
Run Code Online (Sandbox Code Playgroud)

bert-language-model huggingface-tokenizers sentencepiece

10
推荐指数
1
解决办法
2万
查看次数

在微调期间如何正确设置 pad token(不是 eos)以避免模型无法预测 EOS?

**太长了;我真正想知道的是设置 pad token 进行微调的官方方法是什么,它在原始训练期间没有设置,这样它就不会学习预测 EOS。**

colab:https://colab.research.google.com/drive/1poFdFYmkR_rDM5U5Z2WWjTepMQ8h ​​vzNc?usp=sharing


HF falcon 教程有以下行:

tokenizer.pad_token = tokenizer.eos_token
Run Code Online (Sandbox Code Playgroud)

我觉得很奇怪。pad 和 eos 是相同的,但为什么首先要在它们之间做出区分呢?

请注意,这样做 pad = eos. 这意味着在微调期间,模型永远不会被训练为输出 eos(最有可能),因为 eos 被视为填充令牌并且不会反向传播:

I just observed that when I set tokenizer.pad_token = tokenizer.eos_token during training, the model won't stop generating during inference, since it was trained to not output the eos token (per discussions above).
Run Code Online (Sandbox Code Playgroud)

我看到了这个(这里https://github.com/huggingface/transformers/issues/22794):

tokenizer.add_special_tokens({'pad_token': '[PAD]'})
Run Code Online (Sandbox Code Playgroud)

但这假设模型有 pad_token。我认为必须进行额外的检查,确保它确实具有 pad_token 的嵌入,以便不存在运行时错误(〜从嵌入“表”/矩阵提取矩阵中的类型错误)。

但如果这样做,可能需要注意初始化新令牌,以便它主导生成: https: //nlp.stanford.edu/~johnhew/vocab-expansion.html


代码:

tokenizer.pad_token = tokenizer.eos_token
Run Code Online (Sandbox Code Playgroud)

修改模型会出现问题

该死的,这仍然不起作用:

 UserWarning: You …
Run Code Online (Sandbox Code Playgroud)

machine-learning pytorch huggingface-transformers huggingface-tokenizers huggingface

7
推荐指数
1
解决办法
4274
查看次数