断言错误: 如果未定义填充令牌(pad_token = eos_token),则无法处理批大小大于1的情况。

10

我正在尝试微调一个预训练的GPT2模型。当应用相应的分词器时,我最初收到了以下错误信息:

使用了pad_token,但是它还没有被设置。

因此,我更改了我的代码为:

GPT2_tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
GPT2_tokenizer.pad_token = GPT2_tokenizer.eos_token

在稍后调用 trainer.train() 时,我遇到了以下错误:

断言错误:如果没有定义填充标记,则无法处理批大小> 1。

由于我在上面明确定义了 pad_token,因此我期望这些错误(或者说我对原始错误的修复和这个新错误)是有关联的 - 尽管我可能会错。 eos_token 和 pad_token 是否会产生某种干扰?是否有简单的解决方法?

非常感谢!

1个回答

19
我遇到了类似的问题,产生了你所收到的相同错误信息。我不能确定你的问题和我的问题是否由相同的问题引起,因为我看不到你的完整堆栈跟踪,但我会发布我的解决方案,以防它可以帮助你或其他遇到类似问题的人。
你通过使用提供的代码来设置标记器的填充标记,以修复第一个描述的问题是完全正确的。然而,为了使我的GPT2模型正常工作,我还必须设置模型配置中的pad_token_id。我是这样做的:
# instantiate the configuration for your model, this can be imported from transformers
configuration = GPT2Config()
# set up your tokenizer, just like you described, and set the pad token
GPT2_tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
GPT2_tokenizer.pad_token = GPT2_tokenizer.eos_token
# instantiate the model
model = GPT2ForSequenceClassification(configuration).from_pretrained(model_name).to(device)
# set the pad token of the model's configuration
model.config.pad_token_id = model.config.eos_token_id

我认为这是因为分词器和模型分别进行处理,而且两者都需要知道用于填充标记的ID的信息。我无法确定这是否会解决您的问题(因为此帖子已经6个月了,可能已经不重要了),但希望我的答案能够帮助其他人。


4
为了匹配分词器,您还可以考虑 model.config.pad_token_id = GPT2_tokenizer.pad_token_id - derekchen14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接