QANET Combining Local Convolution With Global Self-Attention For Reading Comprehension

Abstract

现在的机器阅读理解的模型都是基于循环神经网络加上Attention机制。尽管这种模型获得了很大的成功,但是因为使用了循环的结构导致训练和预测速度较慢。本文提出了不使用循环神经网络的新结构:encoder部分使用卷积和self-attention,卷积用来提取局部信息,self-attention提取全局的信息。在SQuAD数据集上,模型在训练上会快3到13倍,在推断上达到了4倍到14倍的提速。训练速度的提高可以让我们使用更多的数据去训练网络,已达到更好的效果。为了获取更多的数据,本文还提出了使用机器翻译进行数据增强的方法。

在SQuAD数据集上,使用增强数据训练的单个模型的F1score达到了84.6,在之前81.8的基础上取得了可观的提高。

Introduction

本文的两个创新点:

  • 使用了卷积和self-attention的结构代替了原来循环的结构。这样的改进,不仅提高了训练的效率,同时提高了模型的效率。训练速度的提高可以让我们使用更多的数据进行模型训练,同时也可以让我们进行更多的模型迭代实验,提高效果。
  • 提出了创新的数据增强方法,可以使用机器翻译的方式增加训练数据。

The Model

1. 符号约定

有n个词的Context paragraph的表示为 , 含有m个词的query sentence的表示为 , 输出的span的表示为 .

2. 模型总览

高屋建瓴的模型建构与大多数令人激动人心的结构很相似,包含五个主要部分:

  • an embedding layer
  • an embedding encoder layer
  • a context-query attention layer
  • a model encoder layer
  • an output layer

本文的创新之处在于,在embedding层和modeling encoders层,均只使用了卷积和self-attention,而之前的机器阅读模型大部分都是用的是循环神经网络的结构。正因此这个创新,我们可以并行处理数据。虽然self-attention早已经有人提出,但是本文是首先将卷积和self-attention结合起来使用的,并且取得了很好的效果。

模型的总体结构图如下所示:

左边是模型的整体结构图,右边是使用最多的Encoder Block的结构。模型中所有的encoder的结构都是相同的,只是卷积层的层数不同。encoder中的每一层都会使用残差连接和Layer Normalization(和Transformer中很类似),context和question部分的encoder共享权值,三个输出部分的encoder共享权值(需要参考实现,是否五个encoder都是共享权值的)。input输入进每个encoder的之前,都会加入postional encoding的信息。

下面对模型的五个部分分开介绍:

1. Input Embedding Layer

每个词的embedding是用word embedding和char embedding concat而来。

word embedding来自预训练好的300维的GloVe,训练时会被fixed住,不再进行更新。所有的未登录词使用 <UNK>来表示,<UNK>向量是随机初始化的,并且在训练过程会被更新。

char embedding是维度为200的可训练向量,具体计算过程不清楚,按正常理解是char embedding后输出m * 200维的矩阵,m是句子的长度,再和word embedding进行concat,最后每个词的维度是500维。

在embedding表示层的顶部,还会使用两层的highway Network来处理,简化起见,我们认为x来表示embedding 层的输出。

2. Embedding Encoder Layer

Encoder部分的结构如上图中右边所示,一共有三个子结构:Conv — self-attention — Feed forward layer

卷积部分,我们使用了depthwise separable convolution(可分离卷积,即不同channel采用不同的卷积核),而不是传统的卷积。kernel size 是 7,128个filter,一共4层卷积层。

self-attention部分使用multi-head attention mechanism,q、k的相似度计算使用的是dot product。

卷积部分、self-attention部分和前向网络部分均会采用残差连接和layer normalization。

3. Context-Query Attention Layer

此处的Attention策略非常类似于Dynamic Coattention Network,需要计算A 和 B矩阵。

首先计算C(context)中每个词和Q(query)中每个词的相似度,得到相似度矩阵 $S \in R^{n\times m}$。相似度计算采用trilinear function:

$\bigodot$表示的是对应位置元素相乘。

计算得到相似度矩阵S以后,分别对行和列normalize得到 $S^-, S^{-^-}$,在计算得到A和B:

A矩阵是context-to-query矩阵,表示将query的信息平均到context上;B矩阵是query-to-context,表示将query和context交互信息对context每个位置的影响是多少。

4. Model Encoder Layer

该层的encoder与前面的encoder共享参数,但是卷积层是2层,总共的block是7(这个block指的是什么)。

该层的输入是A、B、C的组合:

5. Output Layer

很简单,假设Model Encoder Layer的三层输出分别为 $M_0, M_1, M_2$,那么开始位置和结束位置的概率为:

3. Data Augmentation by BackTranslation

因为模型训练速度经过改进以后得到了大幅度的提高,所以可以使用更多的数据进行训练。数据增强主要的手段是机器翻译,可以将原始数据翻译为法语(或者其他语言),再将法语翻译回英文即可。示意图如下所示

在翻译过程中,保留了beam search的所有结果,英文到法语过程中得到了k条翻译结果,k条法语到英文的过程中得到了$k^2$个翻译结果,k是beam search的宽度。

针对SQuAD数据集

SQuAD数据集每一条数据时三元组 (d, q, a),d是文档,q是问题,a是答案。为了保证不改变问题的意思,我们不对q进行改动,只会对d进行数据增强。由翻译得到的$d^-$ 的答案a必然也有所更改,文中提出了使用2元语言模型来找到译文中的答案。计算译文中的候选答案的2元语言模型,挑选分数接近原始答案的span作为译文的answer。

总结

可以参考的点:

  1. 使用conv和self-attention,提取了局部和全局信息,提高了效果,同时也提高了训练效率
  2. 使用了不同的计算相似度的方法,可以参考
  3. 针对训练集较少的情况,可以考虑使用数据增强