Fine Tuning Huggingface RobertaForQuestionAnswering 的输入/输出格式
Posted
技术标签:
【中文标题】Fine Tuning Huggingface RobertaForQuestionAnswering 的输入/输出格式【英文标题】:Input/output format for Fine Tuning Huggingface RobertaForQuestionAnswering 【发布时间】:2021-12-01 06:55:15 【问题描述】:我正在尝试在我的自定义数据集上微调“RobertaForQuestionAnswering”,但我对它需要的输入参数感到困惑。这是示例代码。
>>> from transformers import RobertaTokenizer, RobertaForQuestionAnswering
>>> import torch
>>> tokenizer = RobertaTokenizer.from_pretrained('roberta-base')
>>> model = RobertaForQuestionAnswering.from_pretrained('roberta-base')
>>> question, text = "Who was Jim Henson?", "Jim Henson was a nice puppet"
>>> inputs = tokenizer(question, text, return_tensors='pt')
>>> start_positions = torch.tensor([1])
>>> end_positions = torch.tensor([3])
>>> outputs = model(**inputs, start_positions=start_positions, end_positions=end_positions)
>>> loss = outputs.loss
>>> start_scores = outputs.start_logits
>>> end_scores = outputs.end_logits
我无法理解模型中作为输入和变量 start_scores 和 给出的变量 start_positions 和 end_positions >end_scores正在生成。
【问题讨论】:
【参考方案1】:问答 ot 基本上是一个 DL 模型,它通过提取部分上下文(在您的情况下称为text
)来创建答案。这意味着 QAbot 的目标是识别答案的开始和结束。
QAbot 的基本功能:
首先,问题和上下文的每个单词都被标记化。这意味着它(可能分为字符/子词,然后)转换为数字。这实际上取决于标记器的类型(这意味着它取决于您使用的模型,因为您将使用相同的标记器 - 这是您代码的第三行正在执行的操作)。我建议this very useful guide。
然后,标记化的question + text
被传递到执行其内部操作的模型中。还记得我一开始说过模型会识别答案的start
和end
吗?好吧,它通过计算question + text
的每个标记来计算该特定标记是答案开始的概率。这个概率是start_logits
的softmaxed 版本。之后,对结束令牌执行相同的操作。
所以,这就是start_scores
和end_scores
的含义:pre-softmax 得分,每个标记分别是答案的开始和结束。
那么,start_position
和 stop_position
是什么?
如here 所述,它们是:
start_positions
(torch
.LongTensor
形状 (batch_size
,), 可选) – 标记跨度开始的位置(索引)的标签 计算令牌分类损失。位置被夹在 序列的长度 (sequence_length
)。位置之外 计算损失时不考虑序列。
end_positions
(torch
.LongTensor
形状 (batch_size
,), 可选) – 标记跨度结束位置(索引)的标签 计算令牌分类损失。位置被夹在 序列的长度 (sequence_length
)。位置之外 计算损失时不考虑序列。
此外,您正在使用的模型(roberta-base
,请参阅 the model on the HuggingFace repository 和 RoBERTa official paper)未针对 QuestionAnswering 进行了微调。它“只是”一个使用 MaskedLanguageModeling 训练的模型,这意味着该模型对英语有一个大致的了解,但不适合提问。您当然可以使用它,但它可能会给出非最佳结果。
我建议你使用相同的模型,在 QuestionAnswering 上专门微调的版本:roberta-base-squad2
,见it on HuggingFace。
实际上,您必须将加载模型和标记器的行替换为:
tokenizer = RobertaTokenizer.from_pretrained('roberta-base-squad2')
model = RobertaForQuestionAnswering.from_pretrained('roberta-base-squad2')
这将给出更准确的结果。
奖励阅读:what fine-tuning is and how it works
【讨论】:
感谢您的回答。我只是有一个疑问,我们如何分配变量start_positions
和start_positions
是否重要?他们在整个过程中的作用是什么?
@tarangranpara 我用更多细节更新了我的答案
非常感谢@SilentCloud。真的很有帮助,感谢您的努力!以上是关于Fine Tuning Huggingface RobertaForQuestionAnswering 的输入/输出格式的主要内容,如果未能解决你的问题,请参考以下文章
keras系列︱迁移学习:利用InceptionV3进行fine-tuning及预测完美案例