机器阅读理解系列文章-QANet(Combining Local Convolution with Global Self-Attention for Reading Comprehension)

背景

论文题目:《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。另外,本文还提出一种数据增强方案,通过翻译模型将原文从英文翻译为其他语言,再翻译回英文,如此不仅增加了训练实例的数量,而且使语法更加多样化。

模型

模型架构图:
机器阅读理解系列文章-QANet(Combining Local Convolution with Global Self-Attention for Reading Comprehension)

(1) 输入嵌入层:
每个词的嵌入层由word embeddingcharacter embedding组成。word embedding来自于预训练的300维Glove,p1=300p_1=300。其中OOV词用<UNK>表示,对应的embedding是随机初始化的。每个word可以视其所组成的character的character embedding的拼接结果,本文选用的character embedding维度p2=200p_2=200。每个word长度为16个字符,不足则进行padding,过长则丢弃。由此可知,每个word的character embedding是一个矩阵,我们选择每一行的最大值作为该word的character embedding结果。(所以,行方向的尺寸是200,列方向是character,其尺寸为16,如此选择出每个word中最重要的character)。
给定词xx,则其该层的最终表征结果为[xw;xc]Rp1+p2[x_w;x_c] \in R^{p_1+p_2},其中xwx_wxcx_c分别是word embeddingcharacter embedding结果。之后再通过一个双层的highway network,为了简单起见,这里采用xx表示该层的输出结果。

(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(layernorm(x))+xf(layernorm(x))+xlayernormlayernorm为(Ba et al., 2016)提出的layer-normalization。本文设置的encode block的数量为1。所以,对于每个word其输入向量的维度是p1+p2=500p_1+p_2=500,对应的输出向量维度是128(即为filter的数量)。

(3)Context-Query Attention层:
contex和query分别用CCQQ表示,context-to-query attention计算如下:先计算每个contex word和 query word之间的相似度,得到一个相似度矩阵SRn×mS \in R^{n \times m};再对SS在行方向上用softmax进行归一化,得到S\overline S;再通过A=SQTRn×dA=\overline{S} \cdot Q^T \in R^{n \times d}计算得到context-to-query attention。相似度函数采用的是三线性函数(trilinear function):
f(q,c)=W0[q,c,qc] f(q,c)=W_0[q,c,q \odot c]
其中\odot是element-wise multiplication,元素积;W0W_0是待学习的参数。

此外,多数的高性能模型(如BiDAF和DCN)都会采用query-to-context attention。本文也采用该策略,具体如下:通过softmax计算SS的列归一化矩阵S\overline{\overline{S}},最终得到query-to-context attention,B=SSCTB=\overline{S} \cdot \overline{\overline{S}} \cdot C^T

(4)model encoder层:
该层在每个位置的输入为KaTeX parse error: Unexpected character: '' at position 16: [c, a, c \odot ̲a, c \odot b],其中a,ba,b分别是attention 矩阵A和B的行向量。该层有7个Encoder-Block,每个Encoder-Block:2个卷积层、1个Self-Attention、1个FFN。其它参数和Embedding Encoder一样。之后将3个Model-Encoder堆叠起来,3个Model-Encoder之间共享所有参数。输出依次为M0,M1,M2M_0,M_1,M_2

(5)输出层:
这一层是和特定任务相关的。对于SQuAD1.1数据集是输出各个位置作为开始和结束位置的概率:
p1=softmax(W1[M0;M1]) p^1 = \rm{softmax}(W_1[M_0; M_1])
p2=softmax(W1[M0;M2]) p^2 = \rm{softmax}(W_1[M_0; M_2])
其中W1W2W_1和W_2是待学习的参数。span的得分是其开启和结束位置的概率乘积。最终的目标函数如下:
L(θ)=1NiN[log(pyi11)+log(pyi22)] L(\theta) = -\frac{1}{N} \sum_{i}^N [\log(p^1_{y_i^1}) + \log(p^2_{y_i^2})]
其中yi1y^1_iyi2y^2_i分别表示样本ii的真实起始位置和终点位置。

预测:
预测span(s,e)span(s,e)的时候选取pispe2p^s_ip^2_e得分最高的结果(其中s&lt;=es&lt;=e)。