目录web
机器阅读理解(Machine Reading Comprehension)为天然语言处理的核心任务之一,也是评价模型理解文本能力的一项重要任务,其本质能够看做是一种句子关系匹配任务,其具体的预测结果与具体任务有关。数组
记录一下以后用来实践的数据集:网络
阅读理解任务具备多种类别:单项/多项选择、完形填空以及抽取式问答。百度发布的DuReader机器阅读理解数据集涵盖了以上三种任务类型,所以选择用来实践也是很是合适的。ide
DuReader数据集的样本可用一个四维数组表示:{q, t, D, A},其中q表示问题,t表示问题类型,D表示文档集合,A表示答案集合。一半的样原本源于百度搜索引擎,一半来源于百度知道。下图展现了DuReader数据集的不一样类型样本。(这里记录一下数据集,以后要是出了实践代码这里再补上)
函数
这里记录一下比较经典的机器阅读理解模型,或者说记录一下各类花式 Attention,想要了解细节的小伙伴也能够去看看原文,这里也都附上了连接。性能
原文连接:Teaching Machines to Read and Comprehend搜索引擎
这篇文章提出的模型有三个:The Deep LSTM Reader、The Attentive Reader 和 The Impatient Reader。最主要的贡献仍是 Attentive Reader 和 Impatient Reader 这两个模型,这两个模型也是机器阅读理解一维匹配模型和二维匹配模型的开山鼻祖。
编码
Attentive Reader 的基本结构如上图所示,实际上也比较简单,就是一个简单的细粒度注意力机制在机器阅读理解任务中的经典应用。spa
Impatient Reader 就是在 Attentive Reader 的一种变体,模型结构以下图所示:
.net
由上图可知,咱们能够总结出如下几点区别:
Impatient Reader 在计算注意力的时候,将每一个单词看成一个单独的 Query 从而计算该单词对于 doc 中每一个词的注意力加权表征,并用非线性变换将全部的 r 进行反复累积(单词的重阅读能力),即:
\[y_q(i) = \overrightarrow{y_{q}}(i)||\overleftarrow{y_{q}}(i)\\m(i,t) = \tanh{(W_{dm}y_d(t)+W_{rm}r(i-1)+W_{qm}y_q(i))}, 1\leq i \leq |q|\\ s(i,t) \propto \exp{(W^\mathrm{T}_{ms}m(i,t))}\\r(0) = r_0\\ r(i) = y^\mathrm{T}_ds(i)+\tanh{(W_{rr}r(i-1))}, 1\leq i \leq |q|\]
最后将最后一个文档表示 r(|q|) 和问题表示 u 进行非线性组合用于答案预测。
\[g^{IR}(d,q) = \tanh{(W_{rg}r(|q|)+W_{qg}u)}\]
介绍了模型结构以后,咱们就能够从两个模型的区别来总结一下一维匹配模型与二维匹配模型的区别:
原文连接:Text Understanding with the Attention Sum Reader Network
这篇文章的模型主题基本与 Attentive Reader 十分相似,是一种一维匹配模型,主要是在最后的 Answer 判断应用了一种 Pointer Sum Attention 机制,模型结构以下图所示:
对该模型作一个简单的解释:
这样一个将注意力分数累加的操做将受到一个词出现次数的影响,一般,出现次数越多的词越可能成为问题的答案,这样是不是合理的呢?实验数据代表这样的假设确实是合理的。该模型的结构以及Attention的求解过程明显比 Attentive Reader 更简单,却取得了更好的效果,这也意味着并非越复杂的模型效果会更好,简单的结构在合适的场景下能取得很是好的结果。
该模型一样是对 Attentive Reader 的改进,属于一种一维匹配模型,咱们先来看看熟悉的模型结构:
模型主体这里就不讲了,主要记录一下其与 Attentive Reader 不同的部分:
注意力计算方式为bilinear(较点积的方式更灵活):
\[\alpha_i = softmax(q^TW_sp_i)\\o = \sum_i\alpha_ip_i\]
获得注意力加权输出\(o\)以后,而后直接用\(o\)进行分类预测,而 Attentive Reader 是用输出与 query 又作了一次非线性处理以后才预测的,实验证实移除非线性层不会伤害模型性能。
原来的模型考虑全部出如今词汇表V中的词来作预测。而该模型只考虑出如今文本中的实体(进一步减小参数)
上述三点中,第一点是比较重要的,然后面两点都是对模型的一个简化处理。
原文连接:Attention-over-Attention Neural Networks for Reading Comprehension
AOA Reader 属因而一种二维匹配模型,该论文的亮点是将另外一种注意力嵌套在现有注意力之上的机制,即注意力过分集中机制,其主要模型结构以下图所示:
利用双向GRU对 Document 和 Query分别编码,获得编码后的隐藏层表征,即
\[e(x) = W_e \cdot x, \ where \ x \in D, Q\\ \overrightarrow{h_s}(x) = \overrightarrow{GRU}(e(x))\\ \overleftarrow{h_s(x)} = \overleftarrow{GRU}(e(x))\\ h_s(x) = [\overrightarrow{h_s}(x); \overleftarrow{h_s}(x)]\]
利用pair-wise matching matrix来计算获得注意力匹配分数:
\[M(i,j)=h_{doc}(i)^T ·h_{query}(j)\]
在列方向上进行 Softmax 归一化,注意上一个公式,每一列表示 query 一个词对 doc 全部词的注意力分数大小,获得所谓的 query-to-document attention
\[\alpha(t) = softmax(M(1, t), ..., M(|D|, t))\\ \alpha = [\alpha(1), \alpha(2), ..., \alpha(|Q|)]\]
在行的方向进行 Softmax 归一化,获得 document-to-query attention
\[\beta(t) = softmax(M(t, 1), ..., M(t, |Q|))\]
将 document-to-query attention 做平均获得最终的 query-level attention:
\[\beta = \frac{1}{n}\sum_{t=1}^{|D|}\beta (t)\]
最后,用每一个query-to-document attention和刚刚获得的query-level attention作点乘,获得document中每一个词的score。
\[s = \alpha^T\beta\]
与Attentive Sum Reader相似,最后预测答案词的方式是将同类型的词的分数累加,得分最高的词即为答案,下式中,V为词表:
\[P(w|q, d) = \sum_{i \in I(w, d)}s_i, \ w \in V\]
对于损失函数,咱们能够直接最大化正确词的几率分数便可,下式中,A为标注答案词:
\[L = \sum_i log(p(x)), \ x \in A\]
Match-LSTM:Learning Natural Language Inference with LSTM
Pointer Networks:Pointer Networks
Match-LSTM and Answering Point:Machine Comprehension Using Match-LSTM and Answer Pointer
由论文标题可知,该论文利用 Match-LSTM 以及 Answer Pointer 模型来解决机器阅读理解问题,Match-LSTM也属于二维匹配模型的一种,注意力求解方法咱们下面再详细介绍,该论文的主要贡献在于将Pointer Net中指针的思想首次应用于阅读理解任务中。首先,咱们分别看看两个模型的结构:
Match-LSTM最初提出是用于解决文本蕴含任务的。文本蕴含任务的目标是,给定一个 premise(前提),根据此 premise 判断相应的 hypothesis(假说)正确与否,若是今后 premise 可以推断出这个 hypothesis,则判断为 entailment(蕴含),不然为 contradiction(矛盾)。文本蕴含任务也能够看做是句子关系判断任务的一种。
模型的主要结构如上图所示,图中,\(H^S\)为 premise 通过LSTM编码后的隐藏层表征,同理,\(h_k^t\)为 hypothesis 中第 \(k\) 个词的隐藏层表征。整个模型的计算以下:
Pointer Net的提出解决了一类特殊问题:若是生成的输出序列中的字符必然出现于输入序列,则咱们能够采用Pointer Net的结构来获得输出,而不须要事先规定固定词表。这类模型在文本摘要任务中获得了普遍的应用,主要思路以下图所示:
对于左边的传统模型,若是给定的词汇表已经限定,则模型没法预测大于4的数字,而对于右边的Ptr-Net,咱们不须要给定词汇表,只须要在预测的时候每一步都指向输入序列中权重最大的那个元素,因为输出序列彻底来自于输入序列,则解空间彻底能够随着输入序列变化。而咱们在求 Attention 过程当中的 Softmax 分数,正是每个输出位置对输入序列的注意力大小,直接将最大分数的位置做为该输出位置的指针便可。
将二者结合起来,在机器阅读理解任务中,能够将 question 看成 premise,将 passage 看成 hypothesis,整个模型的思路以下:
原文连接:Bidirectional Attention Flow for Machine Comprehension
在 Match-LSTM 提出以后,question-aware 表征的构造方式开始出如今各个论文之中。该论文中的 Attention 计算主要有如下三个特征;
模型结构如上图所示,由图可知,模型主要有如下几个部分:
字符嵌入层:字符嵌入层负责将每一个单词映射到高维向量空间。使用卷积神经网络(CNN)在字符级别上对每一个单词进行编码,该卷积网络的应用原理参考Kim在2014年发表的TextCNN。CNN的输出在整个宽度上被max-pooled,以得到每一个单词的固定大小向量。
词嵌入层:使用预训练的 Glove 词向量。并将字符嵌入层获得的词向量与预训练词向量拼接以后,输入一个2层的Highway层,获得整合以后的词表征。
上下文嵌入层:使用BiLSTM对 Context 和 Query 分别进行编码。值得注意的是,上述这三层提取了三个不一样粒度的特征对 Context 以及 Query 进行编码,获得矩阵 \(H \in R^{2d\times T}\) 和 \(U \in R^{2d \times J}\)。
建模层:这一层的输入为以前获得的\(G\),Context 的 query-aware 表示。这一层能够看做利用 Bi-LSTM 对含 Context 及 Query 信息的矩阵G进行进一步的信息提取,获得输出矩阵大小为\(M \in R^{2d\times T}\),将其用于预测答案。
损失函数为开始和结束位置的交叉熵之和,与 Match-LSTM 中的 Boundary Model 相似。
原文连接:R-NET: MACHINE READING COMPREHENSION WITH SELF-MATCHING NETWORKS
R-Net主要是在 Match-LSTM 的基础上进行的,的主要结构如上图所示,结构已经很是清楚了,主要包括Encoding Layer,Gated Matching Layer,Self-Matching Layer,Boundary Prediction Layer四个部分,咱们先把结构展开讲一下,再对该论文的贡献进行总结。
Question and Passage Encoder:该层将Word Embedding 以及 Character Embedding 拼接,在输入一个双向GRU对 Question 以及 Passage 进行编码,即
\[u^Q_t = BiRNN_Q(u^Q_{t−1}; [e^Q_t ; c^Q_t])\\ u^P_t = BiRNNP (u^P_{t−1}; [e^P_t ; c^P_t])\]
Gated Attention-based Recurrent Networks:论文提出了一种门限注意力循环网络来将 Question 的信息整合到 Passage 的表征中,它是基于注意力的循环网络的一种变体,具备一个附加的门来肯定段落中有关问题的信息的重要性。由 Question 与 Passage 的表征 \(u^Q_t, u^P_t\) 获得 Sentence-Pair 表征 \(v^P_t\):
\[v^P_t = RNN(v^P_{t-1}, c_t)\]
其中,\(c_t = att(u^Q, [u^P, v^P_{t-1}])\),能够将其看做一个注意力池化向量,具体计算以下:
\[s_t^j = v^T tanh(W_u^Qu^Q_j + W_u^P u^P_t + W_v^P v_{t−1}^P)\\ a^t_i = exp(s^t_i)/sum^m_{j=1}exp(s^t_j) \\ c_t = \sum^m_{i=1}a^t_iu^Q_i\]
则获得的每个 Sentence-Pair 向量都动态整合了整个问题的匹配信息,借鉴 Match-LSTM 的思想,将 Passage 的表征输入到最后的RNN中,获得 Question-aware Passage 表征 :
\[v^P_t = RNN(v^P_{t-1}, [u^P_t, c_t])\]
为了动态判断输入向量与 Question 的相关性,还额外加入一个门机制,对RNN的输入进行控制,所以将其称为 Gated Attention-based Recurrent Networks:
\[[u_t^P, c_t]^* = g_t \cdot [u_t^P, c_t]\\ g_t = sigmoid(W_g[u_t^P, c_t])\]
Self-Matching Attention:上一层输出的 Question-aware 表征肯定了段落中与问题相关的重要部分,但这种表征的一个重要问题是其很难包含上下文信息,然而一个答案的肯定不少时候都是很依赖于上下文的。为了解决这个问题,论文提出了 Self-Matching Attention,其动态地收集整个段落的信息给段落当前的词语,把与当前段落词语相关的信息和其匹配的问题信息编码成段落表示:
\[h^P_t = BiRNN(h_{t-1}^P, [v_t^P, c_t])\]
这里的\(c_t = att(v^P ; v_t^P )\)为对整个 Passage 的自注意力池化:
\[s^t_j = v^Ttanh(W_v^P v_j^P + W_v^{\tilde{P}}v_t^P )\\ a^t_i = exp(s^t_i)/\sum^n_{j=1}exp(s^t_j)\\ c_t = \sum^n_{i=1}a^t_iv_i^P\]
一样,对\([v_t^P, c_t]\)增长与上一层输入一样的门控机制,来自适应控制 RNN 的输入。
根据给定段落表示,把 Attention 权重分数做为一个 Pointer 来选取答案在段落中的起始位置,也就是基于初始语境信息,计算段落中每一个词语的 Attention 权重,权重最高的做为起始位置:
\[s^t_j = v^Ttanh(W_h^P h_j^P + W_h^{a}h_{t-1}^a)\\ a^t_i = exp(s^t_i)/\sum^n_{j=1}exp(s^t_j)\\ p^t = argmax(a_1^t, ..., a_n^t)\]
上式中,\(h^a_{t-1}\) 为 Point Network 最后的隐藏状态
在获得起始位置以后,用注意力分数对 Self-Matching 的 Passage 表征进行加权,而后利用以前的Question Attention-Pooling表征,做为RNN的初识状态,对加权后的Passage 表征进行再处理,获得新的语境,新的语境信息计算方式以下:
\[c_t = \sum^n_{i=1}a^t_ih^P_i\\ h^a_t = RNN(h^a_{t-1}; c_t)\]
当预测开始位置的时候,将对 Question 的表征使用 Attention-Pooling的向量做为 Pointer Network 的初始语境。
\[s_j = v^Ttanh(W_u^Q u_j^Q + W_V^{Q}V_r^Q )\\ a_i = exp(s_i)/\sum^m_{j=1}exp(s_j)\\ r_Q = \sum^m_{i=1}a_iu_i^Q\]
上式中\(V_r^Q\)为参数向量
一样选择交叉熵做为模型的损失函数
了解了模型的主要结构,咱们来看看该模型的创新点在什么地方:
原文连接:QANET
深度可分离卷积:Xception: Deep Learning with Depthwise Separable Convolutions
DCN:Dynamic Connection Network for Question Answering
最后一个模型QANet,是预训练模型发布以前排名最优的一个阅读理解模型了,其与以前模型明显的不一样就是,抛弃了RNN,只使用 CNN 和 Self-Attention 完成编码工做,使得速度与准确率大大赠强。模型的主要结构以下图(左)所示
该模型与大多与之模型的结构都是相同的,,由五个部分组成:Embedding layer, Embedding encoder layer, Context-query attention layer, Model encoder layer 和 Output layer。其中,整个模型中使用相同的编码器块(图右),仅改变每一个块的卷积层数,该编码器块主要由以下几个特色:
下面来看看总体结构:
Embedding Encoder Layer:编码层就是编码器块堆叠造成的,此处的编码器块层数为1,将 Input Embedding Layer 输出的长度为 500 的向量 映射为一个长度为 128 的向量。
Context-Query Attention Layer:咱们用 C 和 Q 分别表示编码后的 Context 和 Question,根据二维匹配模型,首先计算出 C 和 Q 的类似矩阵 \(S \in R^{n \times m}\),而后对其进行 Softmax 归一化,获得 Context 中每一个词对 Question 全部词的注意力分数,再将归一化后的矩阵 \(\bar{S}\) 对问题表征 Q 进行加权,从而获得问题的context-to-query attention表征:
\[A=S \cdot Q^T \ \in R^{n\times d}\]
类似度矩阵的计算方法也是比较传统的方法:
\[f(q, c) = W_0[q; c; q \cdot c]\]
另外,做者还借鉴了当时高性能的模型中求解双向注意力的方法(如BiDAF),计算了上下文的 query-to-context attention 表征,计算方式借鉴的是 DCN 中的计算方法,首先对类似度矩阵 \(S\) 进行列归一化,获得 Question 的每一个词对 Context 全部词的注意力分数 \(\bar{\bar{S}}\) ,则 query-to-context attention 表征为
\[B=\bar{S} \cdot \bar{\bar{S}}^T \cdot C^T \ \in R^{m\times d}\]
Model Encoder Layer:这部分继续沿用了与 BiADF 中相似的结构,输入为 Contest 的 query-aware 表征 \([c, a, c \cdot a, c \cdot b]\) ,其中 \(a, b\) 为矩阵 \(A, B\) 中的一行。而编码器块处了卷积层数为2,总的块数是7之外,其他与 Embedding Encoder Layer 中的结构相同,总共堆叠3组编码器块(共有 3*7 个Encoder Block)。
Output layer:这一层一样沿用与 BiADF 相似的结构,仅仅答案开始以及结束的位置进行预测。
\[p^1=softmax(W_1[M_0;M_1])\\ p^2=softmax(W_2[M_0;M_2])\]
其中,\(W_1, W_2\) 均为可训练矩阵,而\(M_0, M_1, M_2\) 分别为3组编码器块的输出
损失函数一样为交叉熵。固然,经过改变输出层的网络结构,该模型可以适应其余类型的阅读理解任务,如单项多项选择等。
若是你看到了这里,就会发现 QANet 基本融合以前全部模型的优势,从而获得了当时的最优效果(即便模型性能以后仍是被预训练模型吊打),在这篇文章的基础上,最后咱们总结一下机器阅读理解模型的一些已被证明的十分有效的技巧:
参考连接
https://zhuanlan.zhihu.com/p/22671467
https://zhuanlan.zhihu.com/p/52977813
https://zhuanlan.zhihu.com/p/53132772
https://zhuanlan.zhihu.com/p/53324276
https://zhuanlan.zhihu.com/p/21349199
https://zhuanlan.zhihu.com/p/48959800
https://blog.csdn.net/zhang2010hao/article/details/88387493
https://zhuanlan.zhihu.com/p/53626872
https://zhuanlan.zhihu.com/p/35229701
https://zhuanlan.zhihu.com/p/61502862
https://zhuanlan.zhihu.com/p/58961139