本文主要介绍AoA reader 的模型结构,由论文《Attention-over-Attention Neural Networks for Reading Comprehension》提出,论文直通车
1 论文概述
该论文针对机器阅读理解任务,提出了AoA reader模型,在CNN/Daily Mail 和CBT数据集上取得了不错的效果。
2 模型细节
模型的结构图如上图所示,主要包含了以下几个模块:
- 上下文编码模块(Contextual Embedding)
- 两两匹配模块(Pair-wise Matching Score)
- 独立注意力模块(Individual Attentions)
- AoA模块(Attention-over-Attention)
- 最终预测模块(Final Predictions)
接下来就逐一介绍这些组成部分。
####(1)上下文编码模块
对于问题和文章的表示,整体来说使用的文本表示法中的模型1的方法(即不对文章或者问题的整体语义信息建模,而是对文本中的单词序列逐一表示)。本文中的具体做法是,首先先将文章和问题分别表示成one-hot形式,然后使用词向量矩阵将问题和文章中的one-hot形式转化为向量形式(注意,在具体实现的过程中,使用的随机初始化词向量矩阵而没有使用预训练),最后将这些向量序列送入BiRNN,最后每个单词的表示是由该单词的前向和后向隐层状态拼接得到的,这三个步骤可以用下面的几个公式来表示:
e
(
x
)
=
W
e
⋅
x
,
w
h
e
r
e
x
∈
D
,
Q
e(x)=W_e \cdot x, where \ x \in D,Q
e(x)=We⋅x,where x∈D,Q
h
s
(
x
)
→
=
G
R
U
→
(
e
(
x
)
)
\overrightarrow{h_s(x)}=\overrightarrow{GRU}(e(x))
hs(x)=GRU(e(x))
h
s
(
x
)
←
=
G
R
U
←
(
e
(
x
)
)
\overleftarrow{h_s(x)}=\overleftarrow{GRU}(e(x))
hs(x)=GRU(e(x))
h
s
(
x
)
=
[
h
s
(
x
)
→
;
h
s
(
x
)
←
h_s(x)=[\overrightarrow{h_s(x)};\overleftarrow{h_s(x)}
hs(x)=[hs(x);hs(x)
然后使用
h
d
o
c
∈
R
∣
D
∣
∗
2
d
h_{doc} \in R^{|D|*2d}
hdoc∈R∣D∣∗2d和
h
q
u
e
r
y
∈
R
∣
Q
∣
∗
2
d
h_{query} \in R^{|Q|*2d}
hquery∈R∣Q∣∗2d分别表示文章和问题的上下文表示。
(2)两两匹配模块(Pair-wise Matching Score)
这部分的操作很简单,利用点乘操作来得到文章中的一个词和问题中一个词的匹配程度。具体来说,给定文章中第i个单词以及问题中的第j个单词,将这两个向量进行点乘得到一个标量,这个标量就表示这两个向量之间的匹配程度。公式如下:
M
(
i
,
j
)
=
h
d
o
c
(
i
)
T
⋅
h
q
u
e
r
y
(
j
)
M(i,j)=h_{doc}(i)^T \cdot h_{query}(j)
M(i,j)=hdoc(i)T⋅hquery(j)
其实在这个公式里面,点乘是对应元素相乘后相加,个人感觉公式是有些问题的,公式中使用了转置,是矩阵乘法,那么就不应该再使用$\ \cdot \
了
,
而
应
该
使
用
了,而应该使用
了,而应该使用 *
,
我
也
不
清
楚
是
不
是
我
理
解
错
了
,
反
正
最
后
得
到
的
是
一
个
标
量
。
将
文
章
的
单
词
和
问
题
中
的
单
词
两
两
配
对
,
得
到
矩
阵
,我也不清楚是不是我理解错了,反正最后得到的是一个标量。 将文章的单词和问题中的单词两两配对,得到矩阵
,我也不清楚是不是我理解错了,反正最后得到的是一个标量。将文章的单词和问题中的单词两两配对,得到矩阵M(i,j) \in R^{|D|*|Q|}$,也就是下面这个:
(3)独立注意力模块
在得到文章和问题的单词两两匹配矩阵后,对每一列使用一个softmax函数,这样做的意义是,对于问题中 t t t时刻的单词,得到一个独立的文档级的注意力(通俗点理解就是对于问题中的某一个单词,文章中的每个单词与该单词的相关程度)。操作的示意图如下:
对应的公式也很简单,首先是得到每一列处理后的结果
a
(
t
)
=
s
o
f
t
m
a
x
(
M
(
1
,
t
)
,
.
.
.
,
M
(
∣
D
∣
,
t
)
a(t)=softmax(M(1,t),...,M(|D|,t)
a(t)=softmax(M(1,t),...,M(∣D∣,t)
将处理后的每一列进行拼接:
a
=
[
a
(
1
)
,
a
(
2
)
,
.
.
.
,
a
(
∣
Q
∣
)
]
a=[a(1),a(2),...,a(|Q|)]
a=[a(1),a(2),...,a(∣Q∣)]
(4)AoA模块
这个模块很有意思,也是这篇论文的亮点,利用注意力来对注意力权重进行加权求和。它首先计算一个相反的注意力,具体来说,在前面那个M矩阵的行上使用softmax函数,表示的含义就变成了给定一个文章中的单词,问题中的那些单词对其的重要性,这样的操作的话,就会得到
∣
D
∣
|D|
∣D∣个行向量,然后对这些向量求一个平均。
公式为:
β
(
t
)
=
s
o
f
t
m
a
x
(
M
(
t
,
1
)
,
.
.
.
,
M
(
t
,
∣
Q
∣
)
)
\beta (t)=softmax(M(t,1),...,M(t,|Q|))
β(t)=softmax(M(t,1),...,M(t,∣Q∣))
β
=
1
n
∑
t
=
1
∣
D
∣
β
(
t
)
\beta = \frac{1}{n}\sum_{t=1}^{|D|} \beta (t)
β=n1t=1∑∣D∣β(t)
这样就得到了上图右边的那个小向量。
接着就是重点了,
a
a
a一个注意力权重矩阵,$ \beta
是
一
个
权
重
向
量
,
将
是一个权重向量,将
是一个权重向量,将a
和
和
和 \beta $做点乘,这样就得到了**“attended document-level attention”,这个操作就是the attention-over-attention mechanism**,AoA实质上就是利用注意力来对另一个层次的注意力加权求和。
表达式为$s=a^T \beta $,这里的公式表示我也觉得有点问题。
(5)预测模块
预测模块和AS reader 的预测模块很相似,将某个单词在全文中出现地方的权重信息都加起来:
P
(
w
∣
D
,
Q
)
=
∑
i
i
n
I
(
w
,
D
)
s
i
,
w
∈
V
P(w|D,Q)=\sum_{i \ in I(w,D)} s_i, \ w \in V
P(w∣D,Q)=i inI(w,D)∑si, w∈V
其中
I
(
w
,
D
)
I(w,D)
I(w,D)表示单词w在文章D中出现的位置集合。
最后目标函数如下:
L
=
∑
i
l
o
g
(
p
(
x
)
)
,
x
∈
A
L=\sum_{i}log(p(x)), \ x \in A
L=i∑log(p(x)), x∈A
本文也使用了“N-best Re-ranking Strategy”来选择最终的答案,这里就不做介绍了。