在Wikipedia上用BERT构建QA系统(三)

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

维基百科页面上的QA

我们已经试着用一个问题和一段短文来试验我们的模型,但是如果我们想从一个较长的文档中检索答案呢?一个典型的Wikipedia页面比上面的例子要长得多,在我们可以在更长的上下文中使用我们的模型之前,我们需要做一些修改。

让我们先打开一个维基百科页面。

image.pngimage.pngimage.pngimage.png

标记器接收文本格式的输入并返回标记。通常,标记器将单词或单词片段转换为模型可接收格式。特定的标记和格式取决于模型的类型。例如,BERT标记单词的方式与RoBERTa不同,因此一定要始终使用适合您模型的关联标记器。

在这种情况下,标记器将输入文本转换为8824标记,但这远远超过了一次可以输入到模型的最大标记数。大多数BERT风格的模型一次只能接受512标记,因此上面的警告(有点令人迷惑)(10如何大于512?)。这意味着我们必须将输入分成块,并且每个块总共不能超过512标记

在回答问题时,每个块都必须遵循以下格式:

[CLS]问题标记[SEP]上下文标记[SEP]

这意味着,对于维基百科文章的每一部分,我们必须在最初的问题之前加上下一个文章标记的“块”。

image.pngimage.pngimage.pngimage.png

每个块(最后一个块除外)都具有以下结构:

[CLS],12个问题标记,[SEP],维基百科文章的497个标记,[SEP]标记=512个标记

现在,这些块中的每一个都可以传递到模型中,并且不会导致索引错误。我们会得到每个部分的“答案”,但是并不是所有的答案都有用,因为不是维基百科文章的每个部分都能为我们的问题提供信息。当模型确定上下文不包含问题的答案时,它将返回[CLS]标记。

image.png

把所有的东西放在一起

让我们回顾一下。我们基本上建立了一个简单的基于IR的质量保证系统!我们使用维基百科的搜索引擎返回一个候选文档列表,然后将其输入到文档阅读器中(在本例中,SQuAD 2.0BERT进行了微调)。让我们通过将文档读取器打包到一个类中,使代码更易于阅读和更具有自包含性

image.pngimage.pngimage.png

以下是我们干净、全面的QA体系!请随意添加您自己的问题。

image.pngimage.pngimage.png

三个问题对了两个

   注意,至少对于我当前问题,QA系统失败是因为Wikipedia的默认搜索引擎,而不是BERT!它为我们的两个问题翻错了页:一页是关于老巴拉克奥巴马(Barack Obama Sr.)而不是前美国总统,另一页是关于美国国防部(department of Defense)建设“五角大楼”(the Pentagon)而不是关于几何学的。在后一种情况下,我们碰巧得到了正确的答案!这说明任何成功的基于IRQA系统都需要一个与文档阅读器一样好的搜索引擎(文档检索器)。

总结

我们到了!基于维基百科文章的QA系统。这很棒,但不可否认,它不是非常复杂。此外,我们还有很多问题没有得到解答:

        为什么要对SQuAD 数据集进行微调而不是其他的?还有其他的选择吗?

        伯特回答问题有多在行?我们如何定义“好”?

        为什么是伯特而不是另一个Transformer 模型?

        目前,我们的QA系统可以为Wiki文章的每个部分返回一个答案,但并非所有的答案都是正确的——我们如何改进get-answer方法?

        另外,用我们现在的分块方法我们可能会语句的中间结束一个分块——我们可以改进分块方法吗?

  在这个项目的过程中,我们将处理这些问题以及更多。在本系列的最后,我们希望展示一个更加时髦的QA模型,它包含了我们一路学习到的所有东西。敬请期待!



英文原文:https://qa.fastforwardlabs.com/pytorch/hugging%20face/wikipedia/bert/transformers/2020/05/19/Getting_Started_with_QA.html
译者:阿布铥