max_length 没有修复问答模型
max_length doesn't fix the question-answering model
我的问题:
给定一个大 (>512b) .txt 文件,如何制作我的 'question-answering' 模型 运行?
上下文:
我正在使用来自 google 的词嵌入模型 BERT 创建一个问答模型。当我导入一个只有几句话的 .txt 文件时模型工作正常,但是当 .txt 文件超过 512b 个单词的限制作为模型学习的上下文时,模型将不会回答我的问题。
我尝试解决问题:
我在编码部分设置了一个max_length,但这似乎并没有解决问题(我的尝试代码如下)。
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
import torch
max_seq_length = 512
tokenizer = AutoTokenizer.from_pretrained("henryk/bert-base-multilingual-cased-finetuned-dutch-squad2")
model = AutoModelForQuestionAnswering.from_pretrained("henryk/bert-base-multilingual-cased-finetuned-dutch-squad2")
f = open("test.txt", "r")
text = str(f.read())
questions = [
"Wat is de hoofdstad van Nederland?",
"Van welk automerk is een Cayenne?",
"In welk jaar is pindakaas geproduceerd?",
]
for question in questions:
inputs = tokenizer.encode_plus(question,
text,
add_special_tokens=True,
max_length=max_seq_length,
truncation=True,
return_tensors="pt")
input_ids = inputs["input_ids"].tolist()[0]
text_tokens = tokenizer.convert_ids_to_tokens(input_ids)
answer_start_scores, answer_end_scores = model(**inputs, return_dict=False)
answer_start = torch.argmax(
answer_start_scores
) # Get the most likely beginning of answer with the argmax of the score
answer_end = torch.argmax(answer_end_scores) + 1 # Get the most likely end of answer with the argmax of the score
answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(input_ids[answer_start:answer_end]))
print(f"Question: {question}")
print(f"Answer: {answer}\n")
代码-结果:
> Question: Wat is de hoofdstad van Nederland?
> Answer: [CLS]
>
> Question: Van welk automerk is een Cayenne?
> Answer: [CLS]
>
> Question: In welk jaar is pindakaas geproduceerd?
> Answer: [CLS]
如您所见,该模型仅 returns [CLS]-token,它发生在分词器编码部分。
编辑:我发现解决这个问题的方法是遍历 .txt 文件,因此模型可以通过迭代找到答案。
编辑:我发现解决这个问题的方法是遍历 .txt 文件,因此模型可以通过迭代找到答案。模型用 [CLS] 回答的原因是因为它无法在 512b 上下文中找到答案,它必须更深入地查看上下文。
通过创建这样的循环:
with open("sample.txt", "r") as a_file:
for line in a_file:
text = line.strip()
print(text)
可以将迭代文本应用到 encode_plus。
我的问题: 给定一个大 (>512b) .txt 文件,如何制作我的 'question-answering' 模型 运行?
上下文: 我正在使用来自 google 的词嵌入模型 BERT 创建一个问答模型。当我导入一个只有几句话的 .txt 文件时模型工作正常,但是当 .txt 文件超过 512b 个单词的限制作为模型学习的上下文时,模型将不会回答我的问题。
我尝试解决问题: 我在编码部分设置了一个max_length,但这似乎并没有解决问题(我的尝试代码如下)。
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
import torch
max_seq_length = 512
tokenizer = AutoTokenizer.from_pretrained("henryk/bert-base-multilingual-cased-finetuned-dutch-squad2")
model = AutoModelForQuestionAnswering.from_pretrained("henryk/bert-base-multilingual-cased-finetuned-dutch-squad2")
f = open("test.txt", "r")
text = str(f.read())
questions = [
"Wat is de hoofdstad van Nederland?",
"Van welk automerk is een Cayenne?",
"In welk jaar is pindakaas geproduceerd?",
]
for question in questions:
inputs = tokenizer.encode_plus(question,
text,
add_special_tokens=True,
max_length=max_seq_length,
truncation=True,
return_tensors="pt")
input_ids = inputs["input_ids"].tolist()[0]
text_tokens = tokenizer.convert_ids_to_tokens(input_ids)
answer_start_scores, answer_end_scores = model(**inputs, return_dict=False)
answer_start = torch.argmax(
answer_start_scores
) # Get the most likely beginning of answer with the argmax of the score
answer_end = torch.argmax(answer_end_scores) + 1 # Get the most likely end of answer with the argmax of the score
answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(input_ids[answer_start:answer_end]))
print(f"Question: {question}")
print(f"Answer: {answer}\n")
代码-结果:
> Question: Wat is de hoofdstad van Nederland?
> Answer: [CLS]
>
> Question: Van welk automerk is een Cayenne?
> Answer: [CLS]
>
> Question: In welk jaar is pindakaas geproduceerd?
> Answer: [CLS]
如您所见,该模型仅 returns [CLS]-token,它发生在分词器编码部分。
编辑:我发现解决这个问题的方法是遍历 .txt 文件,因此模型可以通过迭代找到答案。
编辑:我发现解决这个问题的方法是遍历 .txt 文件,因此模型可以通过迭代找到答案。模型用 [CLS] 回答的原因是因为它无法在 512b 上下文中找到答案,它必须更深入地查看上下文。
通过创建这样的循环:
with open("sample.txt", "r") as a_file:
for line in a_file:
text = line.strip()
print(text)
可以将迭代文本应用到 encode_plus。