🚀 中文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
用戶應注意:
- 模型可能反映訓練數據中存在的偏差。
- 模型性能因問題類型而異。
- 對於關鍵應用,結果應進行驗證。
- 該模型不應作為關鍵系統的唯一決策依據。