You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:09:21