本文提出了双向注意力流(BIDAF)网络,是一种分层的多阶段架构,在不同粒度等级上对上下文进行建模。BIDAF包括字符级(character-level)、单词级(word-level)和上下文(contextual)的embedding,并使用双向注意力流来获取query-aware的上下文表示。
论文地址:
https://arxiv.org/abs/1611.01603
代码地址:
https://allenai.github.io/bi-att-flow/
引言
Machine Comprehension,即机器理解,简记为MC,针对给定的一个上下文,回答一个问题,这需要我们对复杂的交互过程进行建模。近来,注意力机制(Attention Mechanisms)成功地在MC领域进行了应用,典型做法是通过注意力机制来关注上下文并最后生成一个固定大小的向量。
模型
BIDAF模型包括六大基本模块,以下为该模型的基本层级式架构图:
在上图中,左侧灰色图框显示了六大基本模块,右侧显示了Embed Layer和Attention Flow Layer的具体操作。
下面对六个模块分别进行叙述。
Character Embedding层
对于context paragraph和query,均利用character level CNN将每个词映射到一个高维向量空间。
Word Embedding层
对于context paragraph和query,均利用GloVe将每个词映射到一个高维向量空间。
把character embedding和word embedding拼接起来,通过两层的Highway Network生成两个矩阵:表示context的
X
∈
R
d
×
T
X\in\mathbb{R}^{d\times{T}}
X∈Rd×T,表示query的
Q
∈
R
d
×
J
Q\in\mathbb{R}^{d\times{J}}
Q∈Rd×J。
Contextual Embedding层
使用双向LSTM分别对X和Q进行编码,捕捉X和Q各自单词间的局部关系,拼接双向LSTM的输出,得到
H
∈
R
2
d
×
T
H\in\mathbb{R}^{2d\times{T}}
H∈R2d×T和
U
∈
R
2
d
×
J
U\in\mathbb{R}^{2d\times{J}}
U∈R2d×J。
以上三层用来捕捉context 和query各自不同粒度(character, word, phrase)上的特征。
Attention Flow层
输入是H和U,输出是context words的query-aware的向量表示G以及上一层传下来的contextual embedding。
具体实现方式为:在context-to-query以及query-to-context两个方向计算attention。即先计算相关性矩阵,再归一化得到 attention系数,最后与原始矩阵相乘得到修正后的向量矩阵。
两种attention共享相似度矩阵
S
∈
R
T
×
J
S\in\mathbb{R}^{T\times{J}}
S∈RT×J
,计算方式为:
其中
S
t
j
S_{tj}
Stj表示第t个context word与第j个query word的相似度。
Context-to-query Attention
计算对每一个context word而言,哪些query words和它最相关。基于相关性矩阵S,经softmax归一化得到attention矩阵,计算query向量的加权和得到
U
^
∈
R
2
d
×
T
\hat{U}\in\mathbb{R}^{2d\times{T}}
U^∈R2d×T。
Query-to-context Attention
计算对任一query word而言,哪些context words和它最相关,即说明这些context words对回答问题很重要。基于相关性矩阵S,按列比较,取每行的最大值,进行softmax归一化,计算context向量加权和,将结果平铺T次得到
H
^
∈
R
2
d
×
T
\hat{H}\in\mathbb{R}^{2d\times{T}}
H^∈R2d×T。
最后通过contextual embedding、C2Q、Q2C计算得到G,即context中单词的query-aware representation。
β
\beta
β可以是多层perceptron,本文使用了简单的拼接。
5.Modeling层
输入是G,经过两层双向LSTM编码得到 M ∈ R 2 d × T M\in\mathbb{R}^{2d\times{T}} M∈R2d×T,捕捉的是考虑query的context word间的关系。M的每一个列向量都包含了对应单词关于整个context和query的上下文信息。
6.Output层
输出层可以根据实际任务进行设计,此处以QA为例,即从context中找到答案的开始位置
p
1
p_1
p1和结束位置
p
2
p_2
p2。将其看作一个多分类问题,预测每个位置是正确位置的概率。计算公式如下:
其中
W
(
p
1
)
T
∈
R
10
d
W_{(p^1)}^T\in\mathbb{R}^{10d}
W(p1)T∈R10d随模型一起训练。
接下来把M输入到一个双向LSTM之中,得到一个新的用于预测结束位置的矩阵
M
2
∈
R
2
d
×
T
M^2\in\mathbb{R}^{2d\times{T}}
M2∈R2d×T,同样地,
W
(
p
2
)
T
∈
R
10
d
W_{(p^2)}^T\in\mathbb{R}^{10d}
W(p2)T∈R10d随模型一起训练。
模型整体的损失函数定义为:
其中
y
i
1
y_i^1
yi1和
y
i
2
y_i^2
yi2分别是第i个样本的groundtruth的开始和结束位置,
p
k
p_k
pk代表向量p的第k个分量。
最终的answer span (k, l)由
p
k
1
p
l
2
p_k^1p_l^2
pk1pl2的最大值决定,可在线性时间内完成计算。
实验
1. Question Answering Experiments
基于BIDAF模型在SQuAD数据集进行了QA的实验,实验结果如下所示:
可以看出,BIDAF(ensemble)在所有评价指标上均表现最优。文章进一步通过实验分析了模型中各个模块的作用大小,如下所示:
可以看出,在embedding方面,word embedding更为重要;在attention方面,C2Q方向的attention对结果影响更大。
2. Cloze Test Experiments
基于BIDAF模型在CNN/DailyMail数据集上进行了cloze的实验,实验结果如下所示:
实验表明,BIDAF的single model在所有评价指标上均表现最优,甚至在DailyMail test上超过了其他的ensemble模型。
结论
本文提出了一种双向注意力流的机制,主要有三个特点:
- 没有把context编码成固定大小的vector,而是让vector可以流动,减少早期加权和带来的的信息损失。
- 使用了Memory-less的机制,即在每一次迭代时,仅对query和当前的context进行计算,并不直接依赖之前的 attention,这使得后面的attention计算不会受到之前错误的 attention信息的影响。
- 计算query-to-context和context-to-query两个方向的 attention信息,认为二者能够相互补充。