机器阅读理解系列文章-BiDAF(Bi-Directional Attention Flow for Machine Comprehension)

本文详细介绍BiDAF模型,包括其独特之处及六层网络结构。该模型采用双向注意力流机制,有效解决了机器阅读理解任务中的信息损失问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 简介

BiDAF采用多阶段的、层次化处理,使得可以捕获原文不同粒度的特征。同时使用双向的attention流机制以在without early summarization的情况下获得相关问句和原文之间的表征。

1. 相关工作

现有的端-端机器阅读理解中使用到attention机制有3类。
第一类是动态attention机制。attention权重的动态更新是基于给定的query、contex及其先前的attention。 Hermann et al. (2015) 通过实验表明动态attention模型在CNN& Daily Mail数据集上比采用单一固定的query vector注意到contex中词取得更好的结果。 Chen et al. (2016)采用简单的双线性项来计算attention权重能够大大提高准确率。

第二类attention,仅仅计算attention权重一次,再将输入到输出层用以最后的预测。Attention-over-attention模型采用query和contex词之间的2D的相似度矩阵,用以计算query-contex attention的平均权重。

第三类可以视为记忆网络的变体,通过多层网络重复多次计算组合query和contex之间的注意向量,典型的代表是multi-hop。结合记忆网络采用强化学习来动态控制跳数。

本文attention机制的独到之处:
第一:并不将contex编码进固定大小的 vector,而是根据前一层的表征计算每个time stepd的attention及其attended vector。计算得到的attention可以流到后续的网络层。如此可以减缓由于早期加权( early summarization)带来的的信息损失。

第二:采用memory-less机制。迭代过程中的每一个time step的attention计算仅仅依赖于query 和当前时刻的 context paragraph ,并不直接依赖上一时刻的 attention。我们推测,这种简化导致了注意层和建模层之间的分工。注意力层专注于学习query和contex之间的attention,建模层则专注于学习query-aware context representation(attention层的输出)之间的相关作用。同时这种机制使得后面的 attention 计算不会受到之前错误的 attention 信息的影响。

第三:在两个方向上都采用了attention机制,即计算了 query-to-context(Q2C) 和 context-to-query(C2Q)两个方向的 attention 信息。C2Q 和 Q2C 实际上能够相互补充。实验发现模型在开发集上去掉 C2Q 与 去掉 Q2C 相比,分别下降了 12 和 10 个百分点,显然 C2Q 这个方向上的 attention 更为重要

2. 模型

模型框架图:
在这里插入图片描述

模型是一个分阶段的多层过程,由6层网络组成。
(1)字符嵌入层:
用字符级CNNs将每个字映射到向量空间
(2)字嵌入层:
利用预训练的词嵌入模型,将每个字映射到向量空间
(3)上下文嵌入层:
利用周围单词的上下文线索来细化单词的嵌入。这前三层同时应用于问句和原文。
(4)注意力流层:
将问句向量和原文向量进行耦合,并为原文中每个词生成一个问句相关的特征向量集合。
(5)建模层:
使用RNN以扫描整个原文
(6)输出层:
输出问句对应的回答

2.1 字符嵌入

字符嵌入是将词映射为一个高纬的向量空间。我们对每个词用CNN处理以获得字符嵌入。每个词由多个字符组成,则视为1D,将其输入到CNN。CNN的输出经过最大池化操作后即可获得每个词对应的字符级向量。具体细节可以参考Char-CNN论文的细节。

2.2 词嵌入

在词嵌入上我们采用的是预训练的词向量Glove。

将字符嵌入和词嵌入拼接后,输入到一个双层的Highway Network,输出是两个d维度的向量。将原文对应的输出记为X∈\rm X \inX Rd×TR^{d \times T}Rd×T,问句的输出记为Q∈\rm Q \inQ Rd×JR^{d \times J}Rd×J

2.3 上下文嵌入

这层采用的是LSTM以建模单词之间的交互特征。这里采用的是双向LSTM,将两个方向的LSTM结果进行拼接,于是可以从原文词向量X\rm XX得到对应的上下文向量H\rm HH ∈R2d×T\in R^{2d \times T}R2d×T,同理从问句词向量Q\rm QQ得到对应的上下文向量U\rm UU ∈R2d×J\in R^{2d \times J}R2d×J

以上3层均是从不同粒度获得问句和原文的特征。这与计算机视觉领域中卷积神经网络的多阶段特征提取类似。

2.4 注意流层

该层用于链接和融合来自原文和问句中词的信息。不同于以往的注意力机制,将问句和原文总结概括为单一的特征向量。本文每个时刻的注意力向量都与其之前层的嵌入相关,且都可以流向之后的网络层。这种设计方案可以减缓由于过早归纳总结而导致的信息缺失。

该层的输入是原文H\rm HH和问句UUU向量,输出是 context words 的 query-aware vector $G\rm ,以及上一层传下来的contextualembeddings。做context−to−query以及query−to−context两个方向的‘attention‘。做法是一样,都是先计算相似度矩阵,再归一化计算attention分数,最后与原始矩阵相乘得到修正的向量矩阵。c2q和q2c共享相似度矩阵,原文(,以及上一层传下来的 contextual embeddings。做 context-to-query 以及 query-to-context 两个方向的`attention`。做法是一样,都是先计算相似度矩阵,再归一化计算 attention 分数,最后与原始矩阵相乘得到修正的向量矩阵。 c2q 和 q2c 共享相似度矩阵,原文(contextualembeddingscontexttoqueryquerytocontextattentionattentionc2qq2c(H)和问句)和问句)U的相似度矩阵的相似度矩阵S \in R^{T\times J}$计算如下:
Stj=α(H:t,U:j)∈R S_{tj}=\alpha(H_{:t}, U_{:j}) \in R Stj=α(H:t,U:j)R
其中Si,jS_{i,j}Si,j:第 t 个 context word 和第 j 个 query word 之间的相似度。
α\alphaα: 可训练的scalar function,用以encode两个输入向量的相似度。
H:tH_{:t}H:t : HHH 的第 t 个列向量
U:jU_{:j}U:jUUU 的第 j 个列向量
这里我们选择α(h,u)=w(S)T[h;u;h∘u]\alpha \rm (h,u)=w^T_{(S)}[h;u;h\circ u]α(h,u)=w(S)T[h;u;hu]
其中ws\rm w_{s}ws ∈R6d\in R^{6d}R6d是待训练的权重向量。
∘\circ表示element-wise multiplication。
[;][;][;]是向量在行上的拼接。隐式乘法是矩阵乘法。
下面我们介绍用SSS获得两个方向上的attentions 和attended vectors。

Context-to-query Attention:
Context-to-query (C2Q) attention计算对每一个 context word 而言哪些 query words 和它最相关。前面得到了相似度矩阵,现在 softmax 对列归一化,然后计算 query 向量加权和得到U^\hat UU^
at=softmax(St:)∈RJa_t=softmax(S_{t:}) \in R^Jat=softmax(St:)RJ,其中ata_tat表示第t个contex word对于query words的注意力权重。每个被注意到的query vector计算如下:U^:t=∑jatjU:j\hat U_{:t}=\sum_ja_{tj}U_{:j}U^:t=jatjU:j。可以看出U^\hat UU^是 2dxT 的矩阵,表示整个contex相关的query vector。

Query-to-context Attention:
query-to-context attention(Q2C): 计算对每一个 query word 而言哪些 context words 和它最相关,这些 context words 对回答问题很重要。取相似度矩阵每列最大值,对其进行 softmax 归一化得到b\rm bb,即b=softmax(maxcol(S))∈RT\rm b=softmax(max_{col}(S)) \in R^Tb=softmax(maxcol(S))RT。再通过加权和计算相关的 context 向量,h^=∑tbtH:t∈R2d\rm \hat h=\sum_tb_tH_{:t} \in R^{2d}h^=tbtH:tR2d。即在contex中将相对于query最重要的词进行加权求和。
然后h^\rm \hat hh^沿着列方向 tile T 次得到H^∈R2d×T\hat H \in R^{2d \times T}H^R2d×T

最后,contextual embeddings和attention vectors拼接起来得到G\rm GGG\rm GG中每个列向量可以视为每个contex word的query-aware表征。
G:t=β(H:t,U^:t,H^:t)∈RdG G_{:t}=\beta (H_{:t}, \hat U_{:t}, \hat H_{:t}) \in R^{d_G} G:t=β(H:t,U^:t,H^:t)RdG
其中G:t\rm G_{:t}G:t是第t个列向量(对应第t个 contex word)。β\betaβ是一个trainable vector function,它融合了3个输入向量。dG{d_G}dGβ\betaβ函数的输出维度。β\betaβ可以是任意的神经网络,如多层感知机。
不过在本文中简单的拼接效果也不错:
β(h,u^,h^)=[h;u^;h∘u^;h∘h^]∈R8d∗T \beta \rm (h, \hat u, \hat h)=[h;\hat u; h\circ \hat u; h\circ \hat h] \in R^{8d*T} β(h,u^,h^)=[h;u^;hu^;hh^]R8dT
上述公式dG=8dd_G =8ddG=8d
于是就得到了 context 中单词的 query-aware representation。

2.5 建模层

输入是G\rm GG(即context中单词的 query-aware representation结果),
再经过一个双层的 Bi-LSTM 得到$ M\in R^{2d \times T},捕捉的是在给定query下contexwords之间的关系。注意和contextualembeddinglayer区分开,contextualembeddinglayer捕获的contexwords之间关系并不依赖于query。由于每个方向的输出结果尺寸为,捕捉的是在给定query下contex words之间的关系。注意和contextual embedding layer区分开,contextual embedding layer捕获的contex words之间关系并不依赖于query。由于每个方向的输出结果尺寸为querycontexwordscontextualembeddinglayercontextualembeddinglayercontexwordsqueryd,所以,所以M$的尺寸为2d×T2d \times T2d×TMMM的每一个列向量都包含了对应单词关于整个 context 和 query 的上下文信息。

2.6 输出层

输出层是面向具体任务的,所以可以根据具体任务而做相应修改。对于在原文中选取子片段作为回答的QA任务来说,需要预测开始位置 p1 和结束位置 p2:
p1=softmax(W(p1)T[G;M]),   p2=softmax(W(p2)T[G;M2]) \rm p^1=softmax(W^T_{(p^1)}[G; M]), \ \ \ p_2=softmax(W^T_{(p^2)}[G; M^2]) p1=softmax(W(p1)T[G;M]),   p2=softmax(W(p2)T[G;M2])
对于结束位置,MMM 再经过一个 Bi-LSTM 得到M2∈R2d×TM^2 \in R^{2d \times T}M2R2d×T,用来得到结束位置的概率分布。

最后的目标函数:
L(θ)=−1N∑iN[log(pyi11)+log(pyi22)] L(\theta)=-{1 \over N} \sum^N_i[log(p^1_{y_i^1})+log(p^2_{y_i^2})] L(θ)=N1iN[log(pyi11)+log(pyi22)]

预测:
对于答案span(k,l)选择pk1pl2\rm p^1_k p^2_lpk1pl2值最大下的k和l。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值