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_positionsend_positions >end_scores正在生成。

【问题讨论】:

【参考方案1】:

问答 ot 基本上是一个 DL 模型,它通过提取部分上下文(在您的情况下称为text)来创建答案。这意味着 QAbot 的目标是识别答案的开始结束


QAbot 的基本功能:

首先,问题和上下文的每个单词都被标记化。这意味着它(可能分为字符/子词,然后)转换为数字。这实际上取决于标记器的类型(这意味着它取决于您使用的模型,因为您将使用相同的标记器 - 这是您代码的第三行正在执行的操作)。我建议this very useful guide。

然后,标记化的question + text 被传递到执行其内部操作的模型中。还记得我一开始说过模型会识别答案的startend 吗?好吧,它通过计算question + text 的每个标记来计算该特定标记是答案开始的概率。这个概率是start_logits 的softmaxed 版本。之后,对结束令牌执行相同的操作。

所以,这就是start_scoresend_scores 的含义:pre-softmax 得分,每个标记分别是答案的开始和结束。


那么,start_positionstop_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_positionsstart_positions 是否重要?他们在整个过程中的作用是什么? @tarangranpara 我用更多细节更新了我的答案 非常感谢@SilentCloud。真的很有帮助,感谢您的努力!

以上是关于Fine Tuning Huggingface RobertaForQuestionAnswering 的输入/输出格式的主要内容,如果未能解决你的问题,请参考以下文章

fine-tuning

fine-tuning:预训练中的迁移

keras系列︱迁移学习:利用InceptionV3进行fine-tuning及预测完美案例

fine-tuning

Pytorch Note56 Fine-tuning 通过微调进行迁移学习

深度学习前沿应用图像分类Fine-Tuning