原始论文:QANet: Combining Local Convolution With Global Self-Attention For Reading Comprehension[CMU & Google]
// 待补充。
1. Abstract
目前的端到端机器阅读和问答模型主要基于包含注意力的循环神经网络,主要缺点:在训练和推理方面效率较低。
我们提出了一种名为QANet的问答架构,它的编码器仅由卷积和自注意力(self-attention)组成,其中,卷积对局部交互和自注意力模型的全局交互进行建模。
效果:在SQuAD数据集中,我们模型的训练速度提高了3至13倍,推理速度提高了4至9倍,同时达到了与循环模型相媲美精确度。加速增益(speed-up gain)使我们能够用更多的数据来训练模型。因此,我们将我们的模型,与由神经机器翻译模型的反向翻译生成的数据结合起来。在SQuAD数据集上,我们使用增强数据训练的单一模型在测试集中F1值达到 84.6,这显著优于过去公布的F1最佳值81.8。
2. Introduction
在过去几年中最成功的模型通常采用了两项关键要技术:(1)处理顺序输入的循环模型(2)应对长期交互的注意力要素。Seo等人于2016年提出的的双向注意力流(Bidirectional Attention Flow,BiDAF)模型将这两项要素成功地结合在了一起,该模型在SQuAD数据集上取得了显著的效果。这些模型的一个缺点是,它们的循环特性使得它们在训练和推理方面的效率通常较低,特别是对于长文本而言。昂贵的训练不仅会导致实验的周期延长,限制研究人员进行快速迭代,还会使模型难以被用于更大的数据集中。与此同时,缓慢的推理速度阻碍了机器理解系统在实时应用中的部署。
在本文中,为了使机器理解更高效,我们提出去掉这些模型的循环性质,仅将卷积和自注意力作为编码器的构成模块,分别对问题和语境进行编码。然后,我们通过标准注意力(standard attentions,Xiong等人于2016年提出;Seo 等人于2016年提出;Bahdanau等人于2015年提出)来学习语境和问题之间的交互。在最终对每个作为答案范围的开始或结束位置的概率进行解码之前,用我们的无循环编码器再次对结果表征进行编码。我们将该架构称为QANet。
模型设计的主要思想:卷积捕获文本的局部结构,而自注意力则学习每对单词之间的全局交互。附加语境疑问注意力(the additional context-query attention)是一个标准模块,用于为语境段落中的每个位置构造查询感知的语境向量(query-aware context vector),这在随后的建模层中得到使用。我们的架构的前馈特性极大地提高了模型的效率。在基于SQuAD数据集的实验中,我们模型的训练速度提高了3至13倍,推理速度提高了4至9倍。作一个简单的比较,我们的模型可以在3个小时的训练中达到与BiDAF模型(Seo等人于2016年提出)相同的精确度(F1值为77.0),在此之前,这一过程需花费15个小时的时间。加速增益还允许我们使用更多的迭代来训练模型,以获得比竞争模型更好的结果。例如,如果我们允许我们的模型进行18个小时的训练,它在开发集(dev set)上的F1值达到了82.7,这比Seo等人于 2016年提出的模型,表现得要好很多,并且与已发布过的最佳结果相媲美。
3. Model
模型由五层结构组成:
- input embedding layer
- embedding encoder layer
- context-query attention layer
- model encoder layer
- output layer
图1 QANet模型
3.1 Input embedding layer
word embedding+character embedding,word embedding从预先训练好的词向量中读取,每个词向量维度为
p1
p
1
,假设词
w
w
对应的词向量为;
character embedding随机初始化,维度为
p2
p
2
,将每个词的长度padding or truncating到
k
k
,则词也可以表示成一个
p2∗k
p
2
∗
k
的矩阵,经过卷积和max-pooling后得到一个
p2
p
2
维的character-level的词向量,记为
xc
x
c
。
将
xw
x
w
和
xc
x
c
拼接,得到词
w
w
对应词向量,最后将拼接的词向量通过一个两层的highway network,其输出即为embedding层的输出。训练过程中,word embedding固定,character embedding随模型一起训练。
这里简单介绍一下highway network,它主要用于解决深层网络难以训练的问题。普通的单一网络层可以表示为:
而 highway network定义如下:
3.2 Embedding Encoder Layer
由encoder block组成(这部分只用到了1个encoder block),单个encoder block结构自底向上依次包含位置编码(position encoding),卷积(conv)层,self attention层和前馈网络(fnn)层,具体参考图1右侧one encoder block。每个基本操作(conv/self-attention/ffn)都放在残差块(residual block)里,具体各层参数参考原论文。原论文对这里卷积层和self-attention层的作用解释是:卷积能够捕获上下文局部结构,而self-attention则可以捕捉文本之间全局的相互作用。
下面介绍一下各层用到的一些来源于其他论文的概念。
position encoding:
直接通过公式计算位置向量,见Google的Attention is All You Need相关部分。
depthwise separable convolutions:
相比普通卷积它所需的参数更少,泛化能力更强。它的核心思想是将一个完整的卷积运算分解为 depthwise convolution 和 pointwise convolution 两个步骤。
首先是depthwise convolution,以图2为例,假设输入是64*64的3通道图片,使用3*3*1大小的卷积核,filter 数量等于上一层的depth,对输入的每个 channel 独立进行卷积运算,得到与上层depth相同个数的feature map。对应到图里即3个filter分别对3个channel进行卷积,得到3个feature map。
然后是pointwise convolution,和常规卷积运算类似,卷积核的尺寸为 1×1×M,M等于上一层的depth。它会将上一步的feature map在深度方向上进行加权组合,生成新的feature map,有几个filter就有几个feature map。如图3所示,输入depth为3,卷积核大小为1*1*3,使用4个filter,最终生成4个feature map。

动画见 https://www.slideshare.net/DongWonShin4/depthwise-separable-convolution。
self-attention:
先简单介绍下Attention机制。Attention机制的基本原理如图4所示,对于给定的Query,计算Query和各个Key之间的相似度(常用的相似度函数有点积,拼接,感知机等),得到每个Key对应的Value的权重,用softmax函数对权重进行归一化,最后将权重和对应的Value进行加权求和得到Attention数值。用公式表示就是:

目前在NLP任务中,Key和Value一般都是同一个,即 Key=Value。而self-attention则更进一步,令Q=K=V,使得对于输入的句子,它的任意两个单词之间都要计算Attention,所以两个单词之间无论有多长距离,最大的路径长度也都只是1,因此self-attention可以有效捕获长距离依赖关系,如图5(来源于原论文附录部分)所示。另外self-attention不像RNN一样依赖于前一时刻的状态,因此它有利于并行计算。

multi-head attention:
将Q、K、V通过参数矩阵映射为多个不同的Q、K、V并分别计算Attention,最后将结果拼接到一起,这里借用Attention is All You Need里的表示方法:
通过降维可以使h个Attention的计算量总和与原来1个Attenion计算量相当,但h个Attention可以并行,因此大大加快了计算速度。至于mutil-head attention的作用,论文原话是
Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.
residual block:
出自微软的Deep Residual Learning for Image Recognition,主要用于缓解深层神经网络梯度消失/爆炸问题和degradation现象(具体见原论文)。
residual block结构如图6。假定神经网络层的输入是
x
x
,期望输出是,显然
H(x)
H
(
x
)
学习难度是较大的。但如果我们直接把输入
x
x
传到输出作为初始结果,那么此时我们需要学习的目标就变成了,相当于将优化目标从完整输出替换为为最优解
H(x)
H
(
x
)
和全等映射
x
x
的差值,有效降低了学习难度。
另外在本论文中,由于encoder block中每层之间还用到了layer normalization,因此对于一个给定的输入和一个操作 f f ,其输出为。
layer normalization:
参考详解深度学习中的Normalization,不只是BN.
3.3 Context-Query Attention Layer
根据上一层得到的context和query的encoder表示来计算context-to-query attention和query-to-context attention矩阵。分别用
C
C
和来表示编码后的context和query,
C∈Rd∗n
C
∈
R
d
∗
n
、
Q∈Rd∗m
Q
∈
R
d
∗
m
。
1. 首先计算context和query单词之间的相似度,结果矩阵记为
S
S
,。其中相似度计算公式为:
f(q,c)=W0[q,c,q⊙c]
f
(
q
,
c
)
=
W
0
[
q
,
c
,
q
⊙
c
]
,
q
q
、分别为单个单词的中间表示,
W0
W
0
是一个可训练的参数。
2. 用softmax对
S
S
的行、列分别做归一化得到、
S¯¯
S
¯
¯
,则 context-to-query attention矩阵
A=S¯⋅QT∈Rn∗d
A
=
S
¯
·
Q
T
∈
R
n
∗
d
,query-to-context attention矩阵
B=S¯⋅S¯¯T⋅CT∈Rn∗d
B
=
S
¯
·
S
¯
¯
T
·
C
T
∈
R
n
∗
d
(参考DCN模型)。
3.4 Model Encoder Layer
由3个model encoder block组成,每个model encoder block由7个encoder block(见3.2节)堆叠而成,3个model encoder block之间共享参数。与BIDAF类似,每个位置的输入是 [c,a,c⊙a,c⊙b] [ c , a , c ⊙ a , c ⊙ b ] , a a 和分别为attention矩阵 A A 和的行, c c 是context对应位置的单词中间表示。
3.5 Output layer
分别预测每个位置是answer span的起始点和结束点的概率,分别记为、
p2
p
2
,计算公式如下:
目标函数:
对测试集进行预测时,span(s, e)的选取规则是:、 p2e p e 2 最大且 s≤e s ≤ e 。
参考文献:
[1] Seo, Minjoon, et al. “Bidirectional attention flow for machine comprehension.” arXiv preprint arXiv:1611.01603 (2016).
[2] Srivastava, R. K., Greff, K., & Schmidhuber, J. (2015). Highway networks. arXiv preprint arXiv:1505.00387.
[3] Vaswani, Ashish, et al. “Attention is all you need.” Advances in Neural Information Processing Systems. 2017.
[4] He, Kaiming, et al. “Deep residual learning for image recognition.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2016.参考博客:
[1] 深度学习中的注意力机制
[2] 详解深度学习中的Normalization,不只是BN
[3] 《Attention is All You Need》浅读(简介+代码)
[4] 论文笔记 - Fast and Accurate Reading Comprehension by Combining Self-Attention and Convolution附:
Tensorflow实现:https://github.com/NLPLearn/QANet
Pytorch实现:https://github.com/hengruo/QANet-pytorch