目录
机器阅读理解(Machine Reading Comprehension)为自然语言处理的核心任务之一,也是评价模型理解文本能力的一项重要任务,其本质可以看作是一种句子关系匹配任务,其具体的预测结果与具体任务有关。
记录一下之后用来实践的数据集:
阅读理解任务具有多种类别:单项/多项选择、完形填空以及抽取式问答。百度发布的DuReader机器阅读理解数据集涵盖了以上三种任务类型,因此选择用来实践也是非常合适的。
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 的基本结构如上图所示,实际上也比较简单,就是一个简单的细粒度注意力机制在机器阅读理解任务中的经典应用。
Impatient Reader 模型结构如下图所示:
由上图可知,我们可以总结出以下几点区别:
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
原文:https://www.cnblogs.com/sandwichnlp/p/11811396.html