“断言错误:如果没有>定义填充令牌,则无法处理批量大小> 1”并且pad_token = eos_token

Len*_*art 10 python neural-network data-science pytorch

我正在尝试微调预训练的 GPT2 模型。当应用相应的标记生成器时,我最初收到错误消息:

使用pad_token,但尚未设置。

因此,我将代码更改为:

GPT2_tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
GPT2_tokenizer.pad_token = GPT2_tokenizer.eos_token
Run Code Online (Sandbox Code Playgroud)

当调用trainer.train()后者时,我最终出现以下错误:

AssertionError:如果未定义填充标记,则无法处理批量大小 > 1。

由于我在上面具体定义了 pad_token,因此我希望这些错误(或者更确切地说,我对原始错误和这个新错误的修复)是相关的 - 尽管我可能是错的。这是 eos_token 和 pad_token 以某种方式干扰的已知问题吗?有简单的解决方法吗?

多谢!

小智 22

我遇到了类似的问题,产生了与您收到的相同的错误消息。我无法确定您的问题和我的问题是否是由同一个问题引起的,因为我看不到您的完整堆栈跟踪,但我会发布我的解决方案,以防它可以帮助您或其他人。

您通过使用提供的代码设置其填充令牌来解决您使用标记生成器描述的第一个问题是完全正确的。但是,我还必须设置模型配置的 pad_token_id 才能使我的 GPT2 模型正常运行。我通过以下方式做到了这一点:

# 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
Run Code Online (Sandbox Code Playgroud)

我想这是因为标记生成器和模型分别运行,并且都需要了解用于填充标记的 ID。我不知道这是否能解决你的问题(因为这篇文章已经发布了 6 个月,所以可能并不重要),但希望我的答案可以帮助其他人。

  • 为了匹配分词器,您还可以考虑“model.config.pad_token_id = GPT2_tokenizer.pad_token_id” (4认同)