OpenQA论文阅读(一) Reading Wikipedia to Answer Open-Domain Questions
2022-03-01 15:38:43

OpenQA论文集阅读笔记

参考资料

danqi/acl2020-openqa-tutorial: ACL2020 Tutorial: Open-Domain Question Answering

说明

本文为学习 Danqi Chen 大佬的giuhub教程以及Reading List所做笔记,主要内容为OpenQA。

论文 Reading Wikipedia to Answer Open-Domain Questions

论文地址:https://arxiv.org/pdf/1704.00051.pdf

模型结构

本文的架构十分的清晰,系统DrQA 主要包含两个部分,一部分是文献检索,这部分主要是从wiki中抽取和问题最匹配的top的文档,另一部分是一个阅读理解的神经网络架构,主要完成任务是在给定的文章中,找到给定问题的答案。其架构整体如下图所示:

image-20220301170935820

文章检索部分,作者指出基本的倒排表在这个任务上的表现已经足够的好,文章还采用了基于TD-IDF权重的词袋向量模型来比较文章和问题。在此基础上作者采用了bigram哈希进行了优化,从实验结果上来看,作者的方法比wiki内建的搜索提升10%+。

机器阅读部分,从架构上来看,是当时非常流行的Bi-LSTM + attention。作者采用了三层的Bi-LSTM ,attention部分也是做了问题和段落的对齐。这里主要的Trick,我觉得是做段落编码是,使用的段落的特征向量。

段落编码

  1. Word embeddings:

f(pi)=E(pi)f(p_i)=\mathbf{E}(p_i)

使用了300维的Glove词向量,并且fine-tune最常见的1000个问句出现词向量,而保持其他词向量不变。这是因为一些常见的when,what,many,which等等关键词包含了重要的信息。

  1. Exact match:

    fexact_match(pi)=I(piq)f_{exact\_match}(p_i)=I(p_i\in q)

    定义了三个binary特征来表示pi是否精确匹配q中的疑问词,无论是原字母、小写字母还是lemma。这个简单的特征将在之后的试验中证明非常

  2. Token features:

ftoken(pi)=(POS(pi),NER(pi),TF(pi))f_{token}(p_i)=(POS(p_i), NER(p_i), TF(p_i))

对于每个token还加入了POS,NER以及normalized TF特征.

  1. Aligned question embedding:

faligh(pi)=jaijE(qj)f_{aligh}(p_i)=\sum_{j}a_{ij}\mathbf{E}(q_j)

这部分特征表示了段落和问题之间的匹配度,采用了attention机制来捕捉段落每个token pi 和问题每个token qi 之间的相关度。attention权重是根据词向量之间的非线性映射点积来计算:

aij=exp(α(E(pi))α(E(qj)))jexp(α(E(pi))α(E(qj)))a_{ij}=\frac{exp(\alpha(\mathbf{E}(p_i))\cdot\alpha(\mathbf{E}(q_j)))}{\sum_{j'}exp(\alpha(\mathbf{E}(p_i))\cdot\alpha(\mathbf{E}(q_{j'})))}

其中 alpha(.)alpha(.)是一个带有ReLU的非线性全连接层。与exact match特征相比,此特征在相似但不相同的单词之间增加了软对齐,例如单词car 与 vehicle(交通工具;车辆)。

问题编码

用另外一个RNN网络作用于问题的词向量qjq_j输入,然后将最后一层的隐层输出通过加权合成一个向量作为问题的编码: {q1,q2,...,ql}q\mathbf{ \{q_1,q_2,...,q_l\}\rightarrow q} 其中q=jbjqj\mathbf{q}=\sum_jb_j\mathbf{q}_jbjb_j 表示各个 qjq_j的重要程度

bj=exp(wqj)jexp(wqj)b_j=\frac{exp(\mathbf{w\cdot q_j})}{\sum_{j'}exp(\mathbf{w\cdot q_{j'} })}

其中 w\mathbf{w} 是需要学习的变量。

预测:在段落的层面,我们需要找到一个span范围内的tokens最有可能成为答案。我们将编码好的一组表示段落p的向量{p1,p2,...,pm}\mathbf{ \{p_1,p_2,...,p_m\} } ,以及问题向量 作q\mathbf{q}为输入,分别训练两个二元分类器来预测答案span的开始和结束位置。具体来说就是使用一个双线性项来捕获pi\mathbf{p_i}q\mathbf{q}之间的相似性,并且计算每一个token作为开始或结束的概率:

数据

实验采用了三种数据集:(1)维基百科作为寻找答案的知识源;(2)SQuAD用于训练document reader;(3)三个QA datasets (CuratedTREC, WebQuestions and WikiMovies)用于测试整个系统开放领域QA的能力,并且评估模型在多任务和远程监督中学习的能力。

Distant supervision CuratedTREC, WebQuestions 和 WikiMovies数据集中只包含QA pairs,不像SQuAD那样含有相关的文档或段落。因此不能直接拿来训练document reader。为此,作者使用一个程序自动为每一个训练样本关联相关段落,然后将这些例子加入到我们的训练集中。首先对问题运行document retriver选出最相关的5篇维基百科的文章,这些文章的所有段落与已知答案不能精确匹配的,太长和太短的都直接丢弃。如果在问题中检测到命名实体,丢弃任何不包含它们的段落。在剩余段落中,对匹配答案的位置使用unigram和bigram在问题和20个token窗口之间的重叠来打分,保留重叠最高的5个段落。如果有零重叠的段落,则丢弃这个样本。否则,将每个找到的段落添加到我们的训练数据集中。

实验部分

先分别评测retriever和reader两部分,再将两部分结合起来测试。

1.retriever查找相关文章:

比较了两种方法的表现。具体来说,我们计算与问题答案相关的文本跨度出现在每个系统返回的相关页的前5名中的比率。所有数据集的测试结果都显示我们的方法优于维基百科的搜索。

image-20220301174322222

2.reader 评测

在标准SQuAD数据集上评测reader部分。

实施细节:使用3层128个隐藏单元的双向LSTM模型对问题和段落做编码。作者使用斯坦福corenlp工具包来产生词性和命名实体标记。最后,对所有训练示例按段落长度进行排序,并分为32个minibatches实例。使用Adamax作为目标函数。

结果分析:表4展示了几种目前效果较好的几种方法与本文提出的方法的结果。

image-20220301174334580

3.整体系统测试

比较三个版本的QrQA,评价使用距离监督和多任务学习对reader的影响(retriever部分保持不变)。

  • SQuAD: 仅使用SQuAD训练集训练document reader模型。

  • Fine-tune (DS): 先使用SQuAD预训练document reader模型,对每个数据集独立使用其远程监督(DS)训练集进行微调。

  • Multitask (DS):使用SQuAD和所有DS数据训练document reader模型

    image-20220301174347517

    总的来说,Multitask(DS)在各个数据集上表现都比较好。

结论

本文解决的问题是Machine Reading at Scale,使用维基百科作为唯一知识源,提出了一种解决开放式问题的方法,使得机器能以更加灵活的方式回答问题。这个大规模机器阅读 (machine reading at scale MRS) 的任务结合了文件检索(找相关文章)和机器文本理解(识别答案所对应文本)。相比较于单任务学习,使用多任务学习 (multitask learning) 和distant supervision可以在多个任务上实现性能提升。

参考资料

  1. 对话系统(三)Reading Wikipedia to Answer Open-Domain Questions_从网络到AI,从学术界到产业界,随着兴趣去逐梦-CSDN博客
  2. 【本文主要来源】Reading Wikipedia to Answer Open-Domain Question解读 - 知乎 (zhihu.com)