🚀 中文SQuAD v2微调版BERT-base模型
本模型是专为中文问答任务打造的利器,它基于预训练的bert-base-chinese
模型,在中文SQuAD v2.0数据集上进行了微调。它能够精准地从给定的上下文中提取答案,无论是有答案的问题,还是没有答案的问题,都能轻松应对,为中文信息提取和问答系统提供了强大的支持。
🚀 快速开始
本模型是 bert-base-chinese 在 中文SQuAD v2.0数据集 上的微调版本。
✨ 主要特性
- 架构基础:基于BERT-base中文架构构建,具有强大的语言理解能力。
- 问题类型支持:支持有答案和无答案的问题,全面覆盖SQuAD v2.0格式。
- 训练数据:使用中文问答对进行训练,更贴合中文语境。
- 任务优化:针对抽取式问答任务进行了优化,能够高效准确地从给定上下文中提取答案。
📚 详细文档
预期用途与局限性
预期用途
- 中文抽取式问答:可用于从中文文本中抽取答案,满足常见的问答需求。
- 阅读理解任务:帮助理解中文文本内容,提取关键信息。
- 中文文本信息提取:从大量中文文本中精准提取所需信息。
- 自动问答系统:作为核心模型,为自动问答系统提供支持。
局限性
- 性能差异:在无答案问题上的表现(准确率76.65%)明显优于有答案问题(准确率36.41%)。
- 任务限制:仅限于抽取式问答,无法生成新的答案。
- 领域适应性:在训练数据之外的特定领域问题上,性能可能不佳。
- 语言适用性:主要针对现代中文文本,对于文言文或方言变体的处理效果可能不理想。
训练和评估数据
该模型在中文SQuAD v2.0数据集上进行训练,数据集包含:
数据集 |
总样本数 |
有答案问题数 |
无答案问题数 |
训练集 |
90,027 |
46,529 |
43,498 |
验证集 |
9,936 |
3,991 |
5,945 |
训练过程
训练超参数
- 学习率:3e-05
- 批量大小:12
- 评估批量大小:8
- 训练轮数:5
- 优化器:AdamW (β1=0.9, β2=0.999, ε=1e-08)
- 学习率调度器:线性
- 最大序列长度:384
- 文档步长:128
- 训练设备:支持CUDA的GPU
训练结果
最终评估指标:
指标 |
整体 |
有答案问题 |
无答案问题 |
精确匹配率 |
60.49% |
36.41% |
76.65% |
F1分数 |
60.54% |
36.53% |
76.65% |
框架版本
- Transformers:4.47.0.dev0
- PyTorch:2.5.1+cu124
- Datasets:3.1.0
- Tokenizers:0.20.3
💻 使用示例
基础用法
from transformers import AutoModelForQuestionAnswering, AutoTokenizer
import torch
model_name = "real-jiakai/bert-base-chinese-finetuned-squadv2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForQuestionAnswering.from_pretrained(model_name)
def get_answer(question, context, threshold=0.0):
inputs = tokenizer(
question,
context,
return_tensors="pt",
max_length=384,
truncation=True
)
with torch.no_grad():
outputs = model(**inputs)
start_logits = outputs.start_logits[0]
end_logits = outputs.end_logits[0]
null_score = start_logits[0].item() + end_logits[0].item()
start_logits[0] = float('-inf')
end_logits[0] = float('-inf')
start_idx = torch.argmax(start_logits)
end_idx = torch.argmax(end_logits)
if end_idx < start_idx:
end_idx = start_idx
answer_score = start_logits[start_idx].item() + end_logits[end_idx].item()
if null_score - answer_score > threshold:
return "Question cannot be answered based on the given context."
tokens = tokenizer.convert_ids_to_tokens(inputs["input_ids"][0])
answer = tokenizer.convert_tokens_to_string(tokens[start_idx:end_idx+1])
if not answer.strip() or answer.strip() in ['[CLS]', '[SEP]']:
return "Question cannot be answered based on the given context."
return answer.strip()
questions = [
"本届第十五届珠海航展的亮点和主要展示内容是什么?",
"珠海杀人案发生地点?"
]
context = '第十五届中国国际航空航天博览会(珠海航展)于2024年11月12日至17日在珠海国际航展中心举行。本届航展吸引了来自47个国家和地区的超过890家企业参展,展示了涵盖"陆、海、空、天、电、网"全领域的高精尖展品。其中,备受瞩目的中国空军"八一"飞行表演队和"红鹰"飞行表演队,以及俄罗斯"勇士"飞行表演队同台献技,为观众呈现了精彩的飞行表演。此外,本届航展还首次开辟了无人机、无人船演示区,展示了多款前沿科技产品。'
for question in questions:
answer = get_answer(question, context)
print(f"问题: {question}")
print(f"答案: {answer}")
print("-" * 50)
局限性和偏差
该模型在有答案和无答案问题上表现出显著的性能差异,这可能表明:
- 数据集质量存在问题。
- 中文版本的SQuAD可能存在潜在的翻译问题。
- 对有答案和无答案问题的处理存在不平衡。
伦理与负责任的AI
用户应注意:
- 模型可能反映训练数据中存在的偏差。
- 模型性能因问题类型而异。
- 对于关键应用,结果应进行验证。
- 该模型不应作为关键系统的唯一决策依据。