背景
论文题目:《QANet: Combining Local Convolution with Global Self-Attention for Reading Comprehension》
区别于目前大多数包含注意力机制(attention model)和循环神经网络(RNN)的阅读理解模型,QANet 的嵌入编码器和模型编码器摒弃了 RNN 的复杂递归结构,仅仅使用卷积(convolution)和自注意力机制(self-attention)构建了一个神经网络,使得模型的训练和预测的速度大大加快,并且可以并行处理输入的单词。
卷积操作可以对局部相互作用建模(捕获文本的局部结构),而使用自注意力机制则可以对全局交互进行建模(学习每对单词之间的相互作用),context-query attention则可以构建query-aware context vector
。另外,本文还提出一种数据增强方案,通过翻译模型将原文从英文翻译为其他语言,再翻译回英文,如此不仅增加了训练实例的数量,而且使语法更加多样化。
模型
模型架构图:
(1) 输入嵌入层:
每个词的嵌入层由word embedding
和character embedding
组成。word embedding
来自于预训练的300维Glove,
p
1
=
300
p_1=300
p1=300。其中OOV词用<UNK>
表示,对应的embedding
是随机初始化的。每个word可以视其所组成的character的character embedding
的拼接结果,本文选用的character embedding
维度
p
2
=
200
p_2=200
p2=200。每个word长度为16个字符,不足则进行padding,过长则丢弃。由此可知,每个word的character embedding
是一个矩阵,我们选择每一行的最大值作为该word的character embedding
结果。(所以,行方向的尺寸是200,列方向是character,其尺寸为16,如此选择出每个word中最重要的character)。
给定词
x
x
x,则其该层的最终表征结果为
[
x
w
;
x
c
]
∈
R
p
1
+
p
2
[x_w;x_c] \in R^{p_1+p_2}
[xw;xc]∈Rp1+p2,其中
x
w
x_w
xw和
x
c
x_c
xc分别是word embedding
和character embedding
结果。之后再通过一个双层的highway network
,为了简单起见,这里采用
x
x
x表示该层的输出结果。
(2)Embedding Encoder层:
该encoder
层由以下基本block组成:[convolution-layer # + self-attention-layer + feed-forward-layer]
。这对应于图1在的右上角。对于卷积层,这里我们不是采用传统的卷积,而使用内存更高效且泛化能力更强的depthwise separable convolutions
。选用的kernel size=7,filter数量d=128,一个block中的卷积层数=4。对于self-attention-layer
,我们采用的是多头attention机制。head数量=8,这个在所有层中都保持一样。其中每个子层都有残差连接,即输出为
f
(
l
a
y
e
r
n
o
r
m
(
x
)
)
+
x
f(layernorm(x))+x
f(layernorm(x))+x,
l
a
y
e
r
n
o
r
m
layernorm
layernorm为(Ba et al., 2016)提出的layer-normalization
。本文设置的encode block的数量为1。所以,对于每个word其输入向量的维度是
p
1
+
p
2
=
500
p_1+p_2=500
p1+p2=500,对应的输出向量维度是128(即为filter的数量)。
(3)Context-Query Attention层:
contex和query分别用
C
C
C和
Q
Q
Q表示,context-to-query attention
计算如下:先计算每个contex word和 query word之间的相似度,得到一个相似度矩阵
S
∈
R
n
×
m
S \in R^{n \times m}
S∈Rn×m;再对
S
S
S在行方向上用softmax进行归一化,得到
S
‾
\overline S
S;再通过
A
=
S
‾
⋅
Q
T
∈
R
n
×
d
A=\overline{S} \cdot Q^T \in R^{n \times d}
A=S⋅QT∈Rn×d计算得到context-to-query attention。相似度函数采用的是三线性函数(trilinear function):
f
(
q
,
c
)
=
W
0
[
q
,
c
,
q
⊙
c
]
f(q,c)=W_0[q,c,q \odot c]
f(q,c)=W0[q,c,q⊙c]
其中
⊙
\odot
⊙是element-wise multiplication,元素积;
W
0
W_0
W0是待学习的参数。
此外,多数的高性能模型(如BiDAF和DCN)都会采用query-to-context attention
。本文也采用该策略,具体如下:通过softmax计算
S
S
S的列归一化矩阵
S
‾
‾
\overline{\overline{S}}
S,最终得到query-to-context attention,
B
=
S
‾
⋅
S
‾
‾
⋅
C
T
B=\overline{S} \cdot \overline{\overline{S}} \cdot C^T
B=S⋅S⋅CT
(4)model encoder层:
该层在每个位置的输入为KaTeX parse error: Unexpected character: ' ' at position 16: [c, a, c \odot ̲a, c \odot b],其中
a
,
b
a,b
a,b分别是attention 矩阵A和B的行向量。该层有7个Encoder-Block,每个Encoder-Block:2个卷积层、1个Self-Attention、1个FFN。其它参数和Embedding Encoder一样。之后将3个Model-Encoder堆叠起来,3个Model-Encoder之间共享所有参数。输出依次为
M
0
,
M
1
,
M
2
M_0,M_1,M_2
M0,M1,M2。
(5)输出层:
这一层是和特定任务相关的。对于SQuAD1.1数据集是输出各个位置作为开始和结束位置的概率:
p
1
=
s
o
f
t
m
a
x
(
W
1
[
M
0
;
M
1
]
)
p^1 = \rm{softmax}(W_1[M_0; M_1])
p1=softmax(W1[M0;M1])
p
2
=
s
o
f
t
m
a
x
(
W
1
[
M
0
;
M
2
]
)
p^2 = \rm{softmax}(W_1[M_0; M_2])
p2=softmax(W1[M0;M2])
其中
W
1
和
W
2
W_1和W_2
W1和W2是待学习的参数。span的得分是其开启和结束位置的概率乘积。最终的目标函数如下:
L
(
θ
)
=
−
1
N
∑
i
N
[
log
(
p
y
i
1
1
)
+
log
(
p
y
i
2
2
)
]
L(\theta) = -\frac{1}{N} \sum_{i}^N [\log(p^1_{y_i^1}) + \log(p^2_{y_i^2})]
L(θ)=−N1i∑N[log(pyi11)+log(pyi22)]
其中
y
i
1
y^1_i
yi1和
y
i
2
y^2_i
yi2分别表示样本
i
i
i的真实起始位置和终点位置。
预测:
预测
s
p
a
n
(
s
,
e
)
span(s,e)
span(s,e)的时候选取
p
i
s
p
e
2
p^s_ip^2_e
pispe2得分最高的结果(其中
s
<
=
e
s<=e
s<=e)。