基于SQuAD训练BERT问答模型时遇forward()参数'labels'错误求助
问题分析与解决方案
你的错误根源有两个核心问题:
1. 错误使用了基础BERT模型
你加载的BertModel是仅包含编码器的基础模型,没有针对问答任务的输出头,它的forward方法不接受问答任务所需的start_positions/end_positions参数(Trainer在训练时会自动把这些标签传入模型,导致报错)。
你需要使用专门针对问答任务的模型类,对于LaBSE这类预训练模型,直接用AutoModelForQuestionAnswering加载即可,它会自动添加问答任务的输出层,并且支持接收start_positions和end_positions作为训练标签。
2. 数据收集器类型不匹配
你用了DataCollatorForLanguageModeling,这是为语言建模任务设计的,而问答任务不需要这个数据收集器。你可以直接移除它,或者使用DataCollatorForQuestionAnswering(Trainer会自动处理数据拼接,所以也可以省略)。
修改后的核心代码片段
替换模型加载和数据收集器的部分:
# 替换原来的BertModel导入和加载 from transformers import AutoModelForQuestionAnswering model_checkpoint = "setu4993/LaBSE" tokenizer = AutoTokenizer.from_pretrained(model_checkpoint) # 用AutoModelForQuestionAnswering加载专门的问答模型 model = AutoModelForQuestionAnswering.from_pretrained(model_checkpoint) # ... 保留你的预处理代码不变 ... # 替换数据收集器部分,直接移除或者替换为问答专用收集器 from transformers import DataCollatorForQuestionAnswering data_collator = DataCollatorForQuestionAnswering(tokenizer=tokenizer) # ... 保留TrainingArguments和Trainer的初始化代码不变 ...
额外说明
- LaBSE本身是为跨语言句子嵌入设计的,但用它来微调问答任务是可行的,后续你可以在多语言数据集上继续微调观察效果。
- 你的预处理代码是正确的,生成了
start_positions和end_positions,这正是问答模型需要的训练标签。
内容的提问来源于stack exchange,提问作者Mateusz Pasierbek
相关产品推荐
相关产品推荐

