机器阅读理解算法集锦

  机器阅读理解(Machine Reading Comprehension, MRC) 是一项基于文本的问答任务(Text-QA),也是非常重要和经典的自然语言处理任务之一。机器阅读理解旨在对自然语言文本进行语义理解和推理,并以此完成一些下游的任务。具体地讲,机器阅读理解的任务定义是:

给定一个问句(question) qqq,以及对应的一个或多个文本段落(passage) ppp,通过学习一个模型 fθf_\thetafθ ,使得其可以返回一个具体的答案,记做 a=fθ(q,p)a = f_\theta(q,p)a=fθ(q,p)。根据具体下游任务的不同,输出也有所不同,通常机器阅读理解包含如下几个下游任务:

  • (1)是非问答:即回答类型为yes或no,通常属于一个二分类的任务;
  • (2)选择式问答:类似于选择题,此时模型的输入除了问句 qqq 和文本 ppp 外,也会给定候选的答案 a′a'a,此时模型的输出可以为得分,并当做一个排序类问题。当为单选时,只取Top1的得分;否则可以设置阈值来进行多选;
  • (3)检索式问答:和选择式问答类似,但候选答案需要通过启发式或端到端方法自动检索(类似于从大规模的答案库中召回一部分相关的答案),并通过语义相似匹配来寻找答案。此时也可以视为排序类任务;
  • (4)区间查找:此时标准答案出现在文本 ppp 内,即答案是 ppp 的某一个区间(span),因此任务可以视为两阶段的多类分类,即两阶段分别预测start和end位置的概率分布;
  • (5)生成式问答:该类是最为复杂的任务,即完全由模型生成答案,任务可以定义为文本生成(或机器翻译类似)的任务;

  通常机器阅读理解还可以分为单跳式问答(one-hop)和多跳式问答(multi-hop)。其中前者指只提供一个文本来寻找答案,此时问题通常比较简单;后者则需要模型能够自主地寻找多个文本,且通常需要进行多跳推理,并从多个文本中寻找答案。后者比较接近真实应用场景,但任务也相对复杂困难。
  本文接下来介绍几种算法和对应的数据。


1、DrQA:Reading wikipedia to answer open-domain questions

GitHub:https://github.com/facebookresearch/DrQA
评分:★★★☆☆

动机(Motivations):
  本篇文章是考虑到文本问答的真实场景下,应该是先从大规模的文本库中进行启发式的检索召回,然后通过深度学习模型来对小部分的文本挑选答案。即先检索,再找答案。本文的文本库则选择大规模的维基百科。任务属于上述分类的“(4)区间查找”,但也结合了检索式问答的特点。

方法(Methodology):

(1)使用Bigrame哈希和TF-IDF方法,在给定一个问句的基础上可以快速找到相关联的文章;具体的做法是:

A simple inverted index lookup followed by term vector model scoring performs quite well on this task for many question types, compared to the built-in ElasticSearch based Wikipedia Search API (Gormley and Tong, 2015). Articles and questions are compared as TF-IDF weighted bag-of-word vectors. We further improve our system by taking local word order into account with n-gram features. Our best performing system uses bigram counts while preserving speed and memory efficiency by using the hashing of (Weinberger et al., 2009) to map the bigrams to 224 bins with an unsigned murmur3 hash.

(2)使用多层神经网络检测答案的区间范围:

<1> 输入特征:

  • word embedding:300维度词向量;
  • exact match:如果passage中的token在question出现过,则该token记为1,否则为0;
  • token feature:NER、POS、TF值;
  • aligned question embedding:passage中的每个token对question进行加权求和,得到question加权后的向量

<2> 表征:
  passage和question均使用3层BiLSTM进行表征,且分别将每一层的隐向量拼接起来。
question表征向量加权求和,得到q
  输出层使用q和passage的每个位置进行注意力计算,并得到每个位置被预测为start或end的概率分布。

数据(Data):

  • SQuAD1.1:斯坦福大学2016年公开的单跳式阅读理解数据集
  • CuratedTREC:TREC问答语料;
  • WebQuestions:一种复杂的知识图谱问答数据集;
  • WikiMovies:电影类的问答数据集

2、FusionNet:Fusion via fully-aware attention with application to machine comprehension (2018)

GitHub:https://github.com/momohuang/FusionNet-NLI
评分:★★☆☆☆


动机(Motivations):
  question与passage之间通常通过attention实现信息的融合,作者总结了当前的几种融合方式,主要分为 word-levelhigh-levelself-boosted level 三层,并对先前一些方法进行了分类,如图。:


(1)word-level fusion:即在输入表征层便实现question和passage在token级别上的相互融合;
(2)high-level fusion:即在编码层上实现融合,代表性的融合方法有Match-LSTM、BiDAF,以及当今比较流行的multi-head attention和BERT等;
(3)self-boosted fusion:即question或passage的token与当前文本的其他token做融合,类似于self-attention;

方法(Methodology):
  作者认为在当时,现有的方法都只使用其中的几种,因此本文决定全部使用来提升阅读理解能力

(1)input:输入context和question,每个token使用预训练的glove词向量。contextualized向量、POS和NER向量以及一个归一化的词频。

(2)word-level fusion:

  • emi:context的第i个token如果出现在question中,则记做1;
  • 对于每一个context的token,使用注意力机制对question进行加权求和;
    结合词向量以及上述两个形成word-level fusion向量

(3)Reading:分别对context和question使用两层双向lstm进行编码。

(4)Question Uderstanding:再次使用一层BiLSTM,对question的两层编码拼接后使用BiLSTM进行编码。

  history-word:每一层进行表征时,都将之前所有层的隐向量拼接起来作为history-word,并使用注意力机制融合question表征信息。

数据(Data):

  • SQuAD1.1:斯坦福大学2016年公开的单跳式阅读理解数据集

3、QANet: Combine Local Convolution with Global Self-Attention for Reading Comprehension(2018 ICLR)

GitHub:https://github.com/BangLiu/QANet-PyTorch
评分:★★★★★

动机(Motivations):
  现如今引入端到端的方法用于解决文本问答(机器阅读理解)问题受益于成功地使用了循环神经网络和注意力机制。例如BiDAF。但缺点是其在训练时处理长文本时速度慢,不利于快速迭代、不适用大规模数据集,不利于实时反馈等。为了缓解这个问题,本文去除掉循环神经网络架构,替换为卷积网络和self-attention;

贡献(Contributions):
(1)我们的方法只需要训练3个小时,就可以达到和BiDAF训练15个小时一样的F1值。如果我们的方法继续训练到18小时,F1值则达到82.7;
(2)使用数据增强来提升模型效果。将英文语料翻译为其他语言再重新翻译回英文;

方法(Methodology):

(1) Input Embedding Layer

  输入长度为 nnn 的context和长度为 mmm 的query。使用300维度的GloVe预训练词向量,训练时固定不变。未登录词使用UNK表示并随机初始化;字符embedding维度为200,最大字符数量为16,直接拼接起来形成字符矩阵,按行进行最大池化生成固定的200维度词表示,最后向量为字符向量和词向量拼接起来形成500维度的输入。输出部分则使用两层的highway network。

(2) Embedding Encoder Layer

  包括卷积层,自注意力层和前馈网络层(如上图右侧)

  • 卷积层为深度可分离卷积网络(Depthwise Separable Convolutions),相比传统的卷积具有更好的记忆和泛化性能。卷积核大小为7,数量为128,每个encoder block包含4层卷积;

  • 自注意力层为多头注意力机制,头数为8,自注意力公式为:

  • 前馈网络层:采用一层全连接层

  每个卷积层、自注意力层和前馈层之间均采用残差连接法和layernorm:

残差连接: 某一层的输入为 xxx ,该层的函数为 fff 该层的输出则为 x+f(layernorm(x))x + f(layernorm(x))x+f(layernorm(x))
LayerNorm: 在一组batch中,对每个样本分别按照特征进行归一化,均值向量和标准差向量的维度变换为 [batch_size, feature_size] -> [batch_size],如下图。最终原始矩阵归一化后的维度为[batch_size, feature_size]。

LN与BN的区别 :BN是按照batch维度进行归一化的,即同一个特征对所有样本进行归一化,均值向量和标准差向量维度变换为 [batch_size, feature_size] -> [feature_size]。而LN则是按照特征维度进行归一化的。
参考:layer normalization讲解(及其与Batch Normal区别)https://zhuanlan.zhihu.com/p/54530247

  在Encoder部分,对应Question和Context,分别只有一个block,输出的维度则是128;

(3) Context-Query Attention Layer

  context-to-query:query的每个token与context进行相似度计算,相似度函数为 f(q,c)=W0[q,c,q⊙c]f(q,c) = W_0[q,c,q\odot c]f(q,c)=W0[q,c,qc],相似度矩阵 S∈Rn×mS\in R^{n\times m}SRn×m,按行归一化后表示为 Sr∈Rn×mS_r\in R^{n\times m}SrRn×m 。context-to-query attention为 A=SrQT∈Rn×dA=S_rQ^T\in R^{n\times d}A=SrQTRn×dddd 为特征维度);

  query-to-context:表示每个context的token与query的注意力。对上面产生的相似度矩阵 SSS 按列归一化得到 Sl∈Rn×mS_l\in R^{n\times m}SlRn×m,query-to-context attention为 B=SlSrTCT∈Rn×dB = S_l S_r^T C^T\in R^{n\times d}B=SlSrTCTRn×d

(4) Model Encoder Layer

  如图,一共有3层model encoder。每个输入为 [c,a,c⊙a,c⊙b][c,a,c\odot a, c\odot b][c,a,ca,cb],使用7个Embedding Encoder Block,每个block的卷积层为2,每参数均共享。3个model encoder参数共享;

(5) Output Layer

  输出部分则为start和end的概率分布,公式为:

损失函数为:

  说明:预测的start和end的概率分布中,取出ground truth位置的预测概率。最小化损失函数,即最大化ground truth位置的预测概率。在pytorch中可以写为:

ap = ... # 输入start和end的预测概率分布,维度为 [batch_size, 2, max_len]
y = use_cuda(torch.from_numpy(np.array(y))) # ground truth位置,维度为 [batch_size, 2]
prob = torch.gather(self.ap, -1, y.unsqueeze(-1)).squeeze() # [batch_size, 2] # 根据ground truth 的start和end位置,取出预测的概率值
loss = -torch.mean(torch.sum(torch.log(prob + 1e-10), -1)) # loss函数,1e-10为了防止出现log(0)。

  在推理阶段,预测的start和end位置可以取最大的 ps1pe2p_s^1p_e^2ps1pe2(两个概率的乘积值,s≤es\leq ese),使用动态规划查询。

数据(Data):

  • SQuAD1.1:斯坦福大学2016年公开的单跳式阅读理解数据集

4、Retrospective Reader for Machine Reading Comprehension(2020)

GitHub:无
评分:★★★★☆

动机(Motivations):
(1)先前的工作有些没有考虑到问题是否存在答案,有些工作则是简单的将验证模块(verification,即检测是否存在答案)与答案区间预测结合起来进行多任务训练。
(2)现如今许多机器阅读理解的Reader都关注于编码器Encoder,虽然强大的编码器对机器阅读理解有重大的影响,但现有工作很少关注解码器部分。

贡献(Contributions):

  1. 提出一种新的具有回顾性的阅读器Retrospective Reader充分有效地使用答案验证、answering verification;
  2. 实验表明在benchmark上有较好的的效果;
  3. 利用重要性检验来验证模型比其他方法好

方法(Methodology):

  • 受人类阅读的启发,先粗读,再细查。
  • 粗略阅读整个上下文和问题,以确定这个上下文是否包含答案;
  • 详细阅读验证答案并进行最终的预测
  • 使用预训练语言模型作为编码器


(1) Sketchy Reading Module
Embedding
  使用预训练语言模型作为编码器,将question和context拼接起来直接喂入encoder中,得到输出。对于每个token将词向量、位置表征向量、token type向量拼接。
Interaction
  使用多层的Transformer,输出最后一层的隐状态H

External Front Verification(EFV)
  该部分进行二分类。将h1(CLS标签)作为整个序列的表征,并进行二分类,使用cross entropy。
score表示为预测为无答案的得分,其表示预测无答案的概率与预测为有答案的概率差:
score_ext=logit_na−logit_ansscore\_{ext} = logit\_{na} - logit\_{ans}score_ext=logit_nalogit_ans

(2) Intensive Reading Module
得到根据上面获得的 HHH
Question-aware Matching
  在细读阶段针对与问题的匹配层,作者在消融实验中来判断重新使用预训练模型效果如何。但在实验提交时则不这么做。
  为了得到question和context的表征,则直接从上面得到的H中获取:
<1>根据question和context位置,获得HQ和HP;
<2>根据设置好的长度限制进行padding
<3>比较两种match方法

  • cross attention:使用multi-head attention。Q为H,K和V为H中context部分;
  • Matching Attention:使用Self-Matching
    最终得到H’。(如果不使用match,则H’=H)
    Span Prediction

使用log计算span预测的损失:


Internal Front Verification(IFV)
  再次将 H′H'Hh1h_1h1 取出作为精度的向量,并使用包括交叉信息熵、二元信息熵、逻辑回归等损失函数,判断预测的span是否是答案。该部分损失则为span的损失和IFV的损失的加权求和

Threshold-based Answerable Verification
  根据start和end的预测概率,来求可能为空答案的得分:

数据(Data):

  • SQuAD2.0:斯坦福大学2018年公开的单跳式阅读理解数据集,包含无答案的标签;
  • NewsQA:人工生成的100000个QA对

5、Learn to Retrieve Reasoning Paths Over Wikipedia Graph Question Answering (2020 ICLR)

GitHub:https://github.com/AkariAsai/learning_to_retrieve_reasoning_paths
评分:★★★★☆

动机(Motivations):
  先前的问答系统是在基于大规模的文本(例如维基百科)上先使用非参数训练的启发式方法(TF-IDF或BM25)来检索固定数量的文档列表,再通过神经网络来寻找答案区间span,例如R3模型等。然而:
(1)这些方法在寻找答案时是对文档进行单独处理(single-hop),忽略了文档之间的关系(multi-hop);
(2)多跳问答中,每个文档通常与原始问题没有多少词汇或语义上面的重叠关系;
(3)以实体为中心的问题面临一些挑战:将必要的信息嵌入在低维度空间中很难捕捉实体之间的语义关系。

方法(Methodology):
  本文引入一种新的循环图检索方法来对相关文档进行检索并对复杂问题进行路径推理。
(1)Construct Wikipedia Graph:根据维基百科的超链接和文档结构构件不同文档段落之间的关系边,形成维基百科段落图;
(2)Retriever:使用循环神经网络来为这张图中的推理路径进行打分,最大化挑选正确的段落的似然估计,并使用BERT进行微调;
(3)Reader:使用多任务学习方法为每个推理路径进行打分并抽取正确的答案区间;
(4)采用数据增强和负采样来提升模型的鲁棒性;

  本文的想法在于,使用RNN来对整个维基百科内构件的文档图进行路径搜索,最终获得一定数量的推理路径。以这种方式检索到的文档,能够保证文档之间是有一定的语义关联性,而相比传统的基于TF-IDF和BM25检索到的文档来说能够避免词法重叠度很低但与答案十分密切相关的文档而未被检索的问题。同时检索模块也是用神经网络,能够比较好地与阅读阶段进行交互。

Learning to Retrieve Reasoning Path
(1)使用开放的维基百科,将每一篇文章以段落为单位进行划分,最终可以获得百万级别的段落。考虑到两种类型的链接,一种是内部链接,一个段落可以链接到另一篇文章;一种是文档内的链接,一个段落可以链接到同一个文章的另一个段落。最终得到的是一个稠密图,该图是离线构造的;
(2)使用RNN来进行路径的推理。在每个时间步t时,使用BERT对当前所在的候选段落中的每个段落进行编码,编码时输入问句q和段落 pip_ipi,并只取BERT的CLS标签对应的embedding,记做 wiw_iwi。其次使用一层线性层来对所有候选段落计算概率分布,对被选择的段落wiw_iwi喂入RNN计算下一时刻的隐状态 ht+1h_{t+1}ht+1;当输出EOF时终止;每到一个时刻t时,候选段落集合会更新;
(3)为了能够在大规模的图中快速检索,对初始化的段落结点,选择基于TF-IDF方法初始化最初的候选段落,TF-IDF得分最高的F个作为初始化的段落,在时刻2之后,添加EOF标记;
(4)使用Beam Search方法,最终输出B个路径

  训练检索器时,根据ground-truth path来作为目标。
(5)数据增强:对训练集进行了增强,添加一个新的训练path,这个path是在ground-truth路径的第一个位置加上TF-IDF得分最大的段落。因为第一个段落都是基于启发式的TF-IDF获得的,因此在ground-truth添加这个初始化的段落有利于在测试阶段进行测试;
(6)使用负采样方法来区分正确和错误的路径。一种是错误的TF-IDF,一种是错误的超链接;
(7)loss:

前者表示每个时刻段落被预测的概率对应的损失,后者则是负样本被预测的损失;

Reading and Answering Given Reason Paths
  采用多任务学习方法训练阅读器,主要包含机器阅读理解任务(选择传统的方法)和重排序(根据每个路径可能包含答案的概率进行重排序)
(1)将问句和所有推理路径上的段落拼接起来,并使用BERT进行编码,让模型充分学习到交互信息;(BERT的输出层提供了start和end的标记,BERT原文也提供了机器阅读理解的方法,因此本文直接使用BERT)
(2)共享上面的BERT模型,使用CLS标记对应的向量喂入线性层计算当前路径可以回答答案的概率:


选择概率最大的路径,并返回对应的答案区间

  因为在检索阶段,会获得许多路径,而只有一条路径是正确的(或者概率最大的),因此在多任务训练阶段,要分别对每个路径计算概率,并且对每个路径根据ground-truth start和end计算概率,因此总的损失为:


前者表示当前路径的答案区间的概率,后者表示该路径的概率。如果该路径包含答案,则 pr=P(E∣q)p^r=P(E|q)pr=P(Eq),否则 pr=1−P(E∣q)p^r=1-P(E|q)pr=1P(Eq) (EEE表示推理路径,qqq为问句)

数据(Data):

  • SQuAD2.0:斯坦福大学2018年公开的单跳式阅读理解数据集,包含无答案的标签;
  • HotpotQA:人工标注的大规模多跳问答数据集;
  • Natural Question:基于Natural Question和谷歌搜索API构建的问答语料;

6、SG-Net:Syntax-Guided Machine Reading Comprehension (2020 AAAI)

GitHub:https://github.com/cooelf/SG-Net
评分:★★★★★

动机(Motivations):
(1)传统的基于注意力机制的机器阅读理解方法将所有的token都进行了加权,导致模型会关注一些可有可无的没用的token;
(2)当问句或上下文很长时(lengthy question/passage context)或者包含的细节过多时(detailed riddled),传统的神经网络方法会效果会下降,因为此时神经网络很难理解句子,且过度的关注一些没用的词而不是与答案十分密切相关的;
(3)另外,对于上下文(passage)的理解时,将多个句子一同作为输入,对所有句子的每个token施加权重过于囫囵吞枣,而忽略了句子内部的语法结构;
(4)基于上述的几个因素,促使我们寻找一个更有价值的方案,来根据每个token的语法重要性来选择重要的token,提出syntax-guided方法来提升注意力的性能,降低无关的token产生的噪声影响;
(5)现如今基于RNN和Transformer的编码器常用于句子理解编码方面,由于Transformer广泛使用了self-attention,且以其为核心的BERT在各个下游任务上均达到非常好的结果,因此使用BERT作为句子编码成为首选;

相关工作(Related Works):
(1)机器阅读理解包含许多核心任务包括完形填空答案抽取以及多项选择,本文主要关注的是后两者;
(2)Attention-based的方法在机器阅读理解上广泛使用,包括attention sum reader、self-matching、gated-attention等;
(3)预训练语言模型在诸多benchmark上达到SOTA效果,尤其是现如今的BERT模型,本文也以BERT作为encoder;
(4)语法解析树成功应用在各个自然语言处理任务中。在这项工作中,我们形成了一种通用方法,可以从语法指导的表示中受益,这是我们尽最大努力在Transformer编码器中改进SAN架构的尝试。 语言学上的动机是,用依赖树中来自其邻居的信息更新一个单词的表示,这种想法得益于显式句法约束。

方法(Methodology):
(1)直接提取SAN(Self-Attention Network)的Transformer-based Encoder的输出标签;
(2)根据依存关系构建语法树并构建syntax-based SAN(Self-Attention Network)模型;
(3)将SAN和syntax-SAN和SAN 结合起来输入到预测层

(1) Syntax-Guided Network

  • 将输入embedding喂入Transformer-based Encoder获得表征,并喂入到syntax-guided network中;
  • syntax-guided network的输出与原始的Transformer-based Encoder的输出合并

  首先将原始句子喂入传统的Transformer Encoder中,得到HHH

  在syntax-guided self-attention layer中,根据依存语法树,每个token都会有一个head node,和多个child node,因此我们每表征一个token时,只会让其关注具有句法重要性的token,即从child node的角度来编码head node。简单地来说,就是不像先前的注意力机制那样对所有的token进行加权求和,而是对依存关系限制的部分token进行加权求和,例如如图,credit单词只会与其自身、losses和reflects进行加权求和。

  具体的方法是:固定n个词的序列,通过工具生成依存语法树,由于每个词对应一个或多个祖先ancestor,因此可以为每个token形成这样的一个祖先列表,并形成mask矩阵,mask矩阵是一个 n×nn\times nn×n的矩阵M\mathcal{M}MM[i,j]=1\mathcal{M}[i,j]=1M[i,j]=1 的元素代表第i个token是第j个token的祖先。例如上图中每个,credit(i=4)和reflects(j=2)和losses(j=5)以及其自身是有关系的,即M[4,2]=M[4,4]=M[4,5]=1\mathcal{M}[4,2]=\mathcal{M}[4,4]=\mathcal{M}[4,5]=1M[4,2]=M[4,4]=M[4,5]=1,其余M[4,0]=M[4,1]=M[4,3]=0\mathcal{M}[4,0]=\mathcal{M}[4,1]=\mathcal{M}[4,3]=0M[4,0]=M[4,1]=M[4,3]=0

  根据这个Mask,直接喂入到传统的Transformer的Encoder架构中,并使用多头注意力

A′=Softmax(M⋅(Qi′Ki′T)(dk))A'=Softmax(\frac{\mathcal{M}\cdot (Q_i'K_i'^T)}{\sqrt{(d_k)}})A=Softmax((dk)

M(QiKiT))

Wi′=Ai′Vi′W_i'=A_i'V_i'Wi=AiVi

H′={h1′,h2′,....,hn′}H'=\{h_1',h_2',....,h_n'\}H={h1,h2,....,hn}

最后得到两个表征向量 HHHH′H'H,最后采用加权求和方法进行合并 H‾={h‾1,h‾2,...,h‾n}\overline{H} = \{\overline{h}_1, \overline{h}_2, ..., \overline{h}_n\}H={h1,h2,...,hn}

h‾i=αhi+(1−α)hi′\overline{h}_i = \alpha h_i + (1-\alpha)h_i'hi=αhi+(1α)hi

(2) Task-Specific Adaptation

  本文在两个机器阅读理解任务上进行测试,一个是以SQuAD2.0为主的答案区间抽取任务,一个是以RACE为主的选择题。
(1)SQuAD2.0

  在输出层部分,使用一个全连接线性层和softmax,得到start和end的输出概率分布,并使用ground-truth aware的cross entropy作为目标函数。另外有些问题可能没有答案,因此还需要对是否存在答案进行预测,得分为:

采用动态规划来判断当前答案是否可回答。当可回答时,返回答案区间,否则返回null
(2)RACE:
  将 H‾\overline{H}H 的首个字符(CLS对应的)作为整个表征喂入到前馈网路,并计算其与n个选项的概率,使用交叉信息熵作为目标函数。

数据(Data):

  • SQuAD2.0:斯坦福大学2018年公开的单跳式阅读理解数据集,包含无答案的标签;
  • RACE:多项选择题数据集;

7、Enhancing Pre-Trained Language Representations with Rich Knowledge for Machine Reading Comprehension(2019ACL)

摘要:
  机器阅读理解是一个重要和富有挑战的自然语言处理任务。最近包括BERT等预训练语言模型得以成功应用,并在机器阅读理解任务上达到最佳效果。本文我们调查充分利用外部知识库对提升机器阅读理解的潜力,并提出KT-Net,使用一个注意力机制动态从知识库中选择知识并充分利用到BERT提取的文本特征中进行预测。

动机:
(1)语言模型在MRC任务上得以成功达到SOTA,得益于其大规模在无监督语料上使用深度Transformer进行训练,因此其可以捕捉比较复杂的语言背景信息,并比先前的表征方法更好的理解语言;
(2)除了语言模型外,还需要引入外部的知识来支撑复杂的推理;因此我们引入外部知识做增强;使用包括WordNet以及NELL两个知识库。

方法概述:

  • 使用BERT编码层为question和passage进行深度编码;
  • knowledge integration层动态挑选KB的embedding的信息并融合到BERT的编码层中;
  • self-matching层充分利用融合后的BERT和KB信息;
  • 输出层预测最终结果

贡献:

  • 调查并展示了引入外部知识库和预训练模型进行增强对MRC任务提升的灵活性和效果;
  • 提出KT-Net并在benchmark上达到最优解效果;

方法:

BERT Encoder Layer

  给定问句Q个段落P,BERT的输入表示为 S=[[CLS],Q,[SEP],P,[SEP]]S = [[CLS],Q,[SEP],P,[SEP]]S=[[CLS],Q,[SEP],P,[SEP]],每个token包括word-piece emebdding,position embedding和segment embedding;

Kowledge Integration Layer

  该层的目标是将knowledge-aware和context-aware融合起来。遍历每一个token,对于每个token,从BERT中获取其表示 hih_ihi 后,并从知识库中检索与之相应的实体,并分别通过双线性模型进行计算attention:

  另外额外添加一个向量 c‾\overline{c}c 防止当所有KB embedding都与token不相关时。对所有的KB embedding以及 c‾\overline{c}c 一同进行加权求和,得到 kik_iki,最终每个token将BERT和KB得到的向量拼接ui=[hi;ki]u_i = [h_i; k_i]ui=[hi;ki]

Self-matching Layer

  根据 uuu 计算self-attention,得到任意两个token之间的权重,并进行加权求和;


作者还考虑对于两个token i和j,可以通过中间结点k实现交互。

Output Layer

  使用BERT自带的原始的方法,输出start和end的概率分布

knowledge embedding检索策略

  首先映入WordNet和Nell知识库,并使用KBE进行知识表示预训练;其次进行检索,对于question或passage中的每个token,在WordNet中,直接根据token返回对应的候选三元组;对于NELL中,则使用实体识别和链接(字符串匹配)从而获得候选实体。

  相比先前工作(先检索,在根据检索得到的子图进行表征),我们的工作是先在整个图上预训练表征,在检索,这样获得的子图的embedding包含了全局信息

小计

  需要说明的是,SQuAD2.0版本的数据集相比SQuAD1.1的差别在于其新增了大量的QA样本,这些新增的样本是没有答案的(no answer),因此这需要模型除了具备挑选答案区间的能力外,还要有判断该问题是否存在答案,或是否是answerable的。上述的几个算法以及先前的方案总结出两种启发式的判别方法:

(1)第一阶段的判断: 不进行答案区间的预测,只用来判断是否存在答案:
  假设我们使用BERT来对Question和Passage进行了表征后,其输出部分记做 H\mathbf{H}H ,其中第一个token h0∈Hh_0\in\mathbf{H}h0H 对应的是[CLS],根据BERT原文,该隐状态向量可作为整个序列的聚集向量,我们可以将 h0h_0h0 喂入一个线性层和softmax层获得两维度的概率分布 [logithas,logitno][logit_{has}, logit_{no}][logithas,logitno],其中前者表示存在答案的概率,后者为不存在答案的概率,并可以使用二元的交叉信息熵作为目标函数进行反向梯度计算,同时用两者的差值表示一个得分 score=logithas−logitnoscore = logit_{has}- logit_{no}score=logithaslogitno ,这个得分其实很好理解,如果存在答案的概率远远大于不存在答案的概率,理应得分很高,如果存在答案的概率小于不存在答案的概率,得分是负数。我们可以设置一个阈值 θ\thetaθ 来判断当前的答案是否存在;

(2)第二阶段的判断: 在预测答案区间之后,根据答案区间的概率启发式判断是否存在答案:
  另一种是去预测答案区间。如果使用BERT对Q和P进行表征,则输出部分记做 H\mathbf{H}H ,我们可以直接将其喂入一个线性层和softmax层得到每个位置的概率分布,即预测start和end的概率分布。我们可以根据start和end的ground truth来作为损失函数,即:loss=−1N∑iN[log(pyiss)+log(pyiee)]loss=-\frac{1}{N}\sum_i^N[log(p_{y_i^s}^s) + log(p_{y_i^e}^e) ]loss=N1iN[log(pyiss)+log(pyiee)] 。此时我们可以利用预测的start和end的概率作为得分。假设序列长度为 nnn, 则start和end的概率可记做 sk,els_k, e_lsk,el ,其中 (0<k≤l<n)(0<k\leq l< n)(0<kl<n)

scorehas=max(sk+el),(0<k≤l<n)score_{has} = max(s_k+e_l), (0<k\leq l< n)scorehas=max(sk+el),(0<kl<n)

scoreno=s0+e0score_{no} = s_0 + e_0scoreno=s0+e0

第一个式子表示所有的start和end组合中,概率和最大的值作为存在答案的得分,而第一个位置的token(即[CLS])的概率则认为是不存在答案的得分,两者差作为最终认为存在答案的概率 score=scorehas−scorenoscore = score _{has}- score _{no}score=scorehasscoreno,同样可以设置阈值 θ\thetaθ 来判断当前的答案是否存在。这部分的理解即是根据预测答案的情况来启发式判断,不像第一阶段那样带有神经网络的训练。上面第6篇文章则只用到第二阶段的判断。

(3)两者合并? 如果可以的话,可以在第一阶段进行一次打分,第二阶段进行一次打分,两个阶段的loss进行加权求和训练模型,两个阶段的score也加权求和与阈值进行判断。最终大于阈值的返回预测的start和end位置区间,否则返回一个null。这也是上面第4篇文章的思路。


  持续更新,更多算法敬请期待,转发此文请注明出处:https://blog.csdn.net/qq_36426650/article/details/110309423

机器阅读理解算法集锦相关推荐

  1. 什么是机器阅读理解?跟自然语言处理有什么关系?

    导读:机器阅读理解(Machine Reading Comprehension,MRC)是一种利用算法使计算机理解文章语义并回答相关问题的技术.由于文章和问题均采用人类语言的形式,因此机器阅读理解属于 ...

  2. 机器阅读理解论文必读论文(二): Teaching Machines to Read and Comprehend

    本文是机器阅读理解论文的第二篇,发表于2015年.论文提出了新的训练集,即CNN和每日邮报的新闻语料库,并针对此数据集构建了新的深度学习模型.以下是对论文的部分翻译和解读 摘要: 让机器阅读自然语言文 ...

  3. 科大讯飞刷新纪录,机器阅读理解如何超越人类平均水平? | 技术头条

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」明日开启,扫码咨询 ↑↑↑ 记者 | 琥珀 出品 | AI科技大本营(公众号ID:rgznai100) 对于日常从事模型训练的研究人员来 ...

  4. ACL 2021 | 为什么机器阅读理解模型会学习走捷径?

    ©PaperWeekly 原创 · 作者 | Maple小七 学校 | 北京邮电大学硕士生 研究方向 | 自然语言处理 虽然当前的 MRC 模型在不少阅读理解 benchmark 上接近甚至超越了人类 ...

  5. 博士学位论文 | 机器阅读理解与文本问答技术研究

    作者丨胡明昊 学校丨国防科技大学博士生 研究方向丨机器阅读理解 引言 文本问答是自然语言处理中的一个重要领域,随着一系列大规模高质量数据集的发布和深度学习技术的快速发展,文本问答技术在近年来引起了学术 ...

  6. 卖萌屋福利场:《机器阅读理解》免费送送送!

    一只小狐狸带你解锁 炼丹术&NLP 秘籍 在送书之前,先来了解一下机器阅读理解是什么-已经很熟悉的小伙伴可以快速下拉进入福利场~ 机器阅读理解是什么 机器阅读理解(Machine Readin ...

  7. 百度机器阅读理解比赛赛后总结

    百度机器阅读理解比赛赛后总结 <!-- 文章内容 --><div data-note-content="" class="show-content&qu ...

  8. 机器阅读理解首次超越人类!云从刷新自然语言处理新纪录

    媒体动态发展历程资质荣誉人才招聘 机器阅读理解首次超越人类!云从刷新自然语言处理新纪录 2019-03-11 10:06 浏览:454 近日,云从科技和上海交通大学在自然语言处理领域取得重大突破,在卡 ...

  9. 搜狗开源最新NLP研究成果,打造业内最全机器阅读理解工具包SMRC

    晓查 发自 凹非寺 量子位 出品 | 公众号 QbitAI 上周,搜狗在GitHub低调发布了机器阅读理解工具包SMRC(Sogou Machine Reading Comprehension). 这 ...

最新文章

  1. Windows和linux双系统——改动默认启动顺序
  2. JS Math的几个方法使用实例
  3. 亿条数据读取工具_仅需1秒!搞定100万行数据:超强Python数据分析利器
  4. java如何计算时间天数差,java计算两个时间相差天数的方法汇总
  5. 神经网络中的激活函数的比较
  6. mysql 控制台全是_Mysql控制台命令大全
  7. Android kotlin基础语法
  8. cpu线程_CPU核数和线程数有什么用?什么意思?CPU核数和线程的关系与区别
  9. 如何对系统日志中事件 ID 9、事件 ID 11 和事件 ID 15 错误消息进行故障排除
  10. 怎样修改用户的计算机配置文件,计算机本地用户配置文件如何迁移至域账户
  11. 鼠标测试软件m,罗技M525鼠标使用测试_罗技 M525鼠标_键鼠评测-中关村在线
  12. xfce实现桌面图标透明
  13. 局域网访问虚拟机里的应用,以可道云 kod为例
  14. 读《期货市场计算机分析指南》笔记
  15. Geek ? 什么是 Geek ? 谁是 Geek ?
  16. 目标跟踪OTB评估指标(OP, CLE, FPS)与matlab代码
  17. j90度度复数运算_虚数i的运算公式及实际意义
  18. 计算机应用大学排名,计算机应用技术专业大学排名 2020全国排行榜
  19. miniGUI 3.0.2 在Hi3535平台上的移植
  20. 《航空系统》项目研发总结

热门文章

  1. java dataoutputstream_Java DataOutputStream类
  2. 《上海市工业互联网创新发展专项支持实施细则》政策解读
  3. 沃尔玛中国CIO:要明确IT基本使命
  4. 输入法切不出来中文,只能打英文字母的问题
  5. [已解决]win11家庭版安装软件提示,系统策略禁止安装此设备。请与系统管理员联系
  6. 安装Python遇到“0x80070643发生严重错误”
  7. 学习笔记--RTOS信号量
  8. 灵魂拷问!原生Android开发的路该怎么走?内含福利
  9. Service粘性启动方式
  10. 日复一日对着电脑何谈健康?想要改善如何做