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

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. 模型

模型框架图:
机器阅读理解系列文章-BiDAF(Bi-Directional Attention Flow for Machine Comprehension)_第1张图片

模型是一个分阶段的多层过程,由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 \in X R d × T R^{d \times T} Rd×T,问句的输出记为 Q ∈ \rm Q \in Q R d × J R^{d \times J} Rd×J

2.3 上下文嵌入

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

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

2.4 注意流层

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

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

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

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

最后,contextual embeddings和attention vectors拼接起来得到 G \rm G G G \rm G G中每个列向量可以视为每个contex word的query-aware表征。
G : t = β ( H : t , U ^ : t , H ^ : t ) ∈ R d G 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个输入向量。 d G {d_G} dG β \beta β函数的输出维度。 β \beta β可以是任意的神经网络,如多层感知机。
不过在本文中简单的拼接效果也不错:
β ( h , u ^ , h ^ ) = [ h ; u ^ ; h ∘ u ^ ; h ∘ h ^ ] ∈ R 8 d ∗ 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
上述公式 d G = 8 d d_G =8d dG=8d
于是就得到了 context 中单词的 query-aware representation。

2.5 建模层

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

2.6 输出层

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

最后的目标函数:
L ( θ ) = − 1 N ∑ i N [ l o g ( p y i 1 1 ) + l o g ( p y i 2 2 ) ] 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)选择 p k 1 p l 2 \rm p^1_k p^2_l pk1pl2值最大下的k和l。

你可能感兴趣的:(NLP,机器阅读理解)