First published on indexfziq.github.io at 2019-04-10 17:00:00
目前,本文是MARCO数据集NLG任务的第一名,作者是NTT公司的Nishina等人。文章突破了抽取式阅读理解模型的束缚,采用摘要的方式生成指定风格的答案,这两个突破算是GMRC的一个里程碑。在此篇文章之后,分析选手榜可以发现,沿用此方法的模型也都取得了比较好的效果。还有一点值得一提,本文没有用BERT,只用了Transformer和ELMo,效果就已经很不错了,说明BERT在生成式阅读理解上并不是那么的强大。
本文针对的是MARCO数据集,简单介绍一下该数据集的特点。用一句话来概括就是——开放域、多文档、生成式的大规模阅读理解数据集,问题和答案都来自于真实数据,所有问题的答案都是人类生成的,有一定的答案还需要额外的人工评估,也就是well-formed的答案,这个在我的另一个MARCO分析上有详细的解释。数据集的质量很好,并且是很符合人类查找答案回答问题的过程,因为这个数据集的眼光是看的很远的,在此数据集上训练的模型应该很好地迁移到真实的用户场景中。
作者发现,之前在MARCO上刷榜的模型大都是抽取式的模型。S-Net除外,但是先抽取再生成的pipeline框架是有点弱了。并且,现有模型不能根据给定的风格生成相应的答案,论文发现,通常Q&A任务的答案比较简短,NLG任务的答案比较详细。本文想从这两个点入手,提出了两个很新奇的点子:
提出了一个端到端的模型——masque【风格可控的多源头摘要式模型】,模型根据给定的风格生成答案序列,生成词的来源可以是问题、段落和词表。下图是Masque生成答案的可视化样图:
模型大体是Transformer和PG-Net的组合,并且利用了两个二分类任务来辅助生成答案序列,整个模型的框架如下图所示:
整个模型的输入是问题、所有段落、答案风格,输出是答案序列、段落是否用到的概率分布以及问题是否可回答的概率分布。
一共分为四个部分:
The question-passages reader: 建模问题与段落之间的关系;
The passage ranker: 找寻与问题相关的段落;
The answer possibility classifier: 识别出可回答的问题;
The answer sentence decoder: 根据给定的风格生成词序列。
问题和段落的每个token取其Glove和ELMo词表示串联,因为ELMo是自带位置信息的,因此也就没用Position Embedding,过共享的Highway Net再经过线性映射到d维。把最后得到的向量用x表示。
之后,每个x过一个blocks=3的共享的Transformer Encoder,分别得到问题和段落的表示 E q ∈ R d × J E^q \in {\mathbb R}^{d \times J} Eq∈Rd×J, E p k ∈ R d × L E^{p_k}\in {\mathbb R}^{d \times L} Epk∈Rd×L,具体的运算不详细说明了,详见参考文献 [2]。d是词表示的维度,J和L分别是答案和段落的序列长度。这一层作用更多在于语义分析【词法、句法】。
Dual Attention层的运算比较复杂,不过大致是co-attention的运算,详见参考文献 [4]。首先算每个段落与问题的相似度矩阵,然后用相似度矩阵及其转置对问题和段落进行重表示,得到 G q → p k ∈ R 5 d × J G^{q \rightarrow p_k} \in {\mathbb R}^{5d \times J} Gq→pk∈R5d×J, G p k → q ∈ R 5 d × L G^{p_k \rightarrow q}\in {\mathbb R}^{5d \times L} Gpk→q∈R5d×L。这部分更多在于计算交互信息,多角度地观察问题更关注段落的哪些部分。
最后问题和段落分别过blocks=2、blocks=5的Transformer Encoder,进行融合和降维,最终该模块的输出是问题表示 M q ∈ R d × J M^q \in {\mathbb R}^{d \times J} Mq∈Rd×J, M p k ∈ R d × L M^{p_k} \in {\mathbb R}^{d \times L} Mpk∈Rd×L。
该模块是一个二分类器,输入每个段落初始时刻的隐藏层状态,过一个sigmoid函数得到每个段落与问题的相关程度 β p k {\beta}^{p_k} βpk。算出来之后,一用来对段落做二分类,二用来加强段落的表示,这个在Decoder部分还要用到。
该模块也是一个二分类器,输入每个段落初始时刻隐藏层状态的串联,过一个sigmoid函数得到问题是否可回答的概率 P ( a ) P(a) P(a)。
核心部分,用Transformer代替Seq2Seq,输入词的表示与Encoder端的唯一区别是用的单向ELMo。
之后先过Masked多头Attention,接着分别对问题和段落的表示做多头Attention,最后过一个GLEU前馈。在得到Transformer Decoder的t-th时刻隐藏层状态 s t s_t st后,分别对Encoder得到的表示做加法式的Attention。
之后的运算稍微有点复杂,还是上公式吧:
P v ( y t ) = s o f t m a x ( W 2 T ( W 1 s t + b 1 ) ) P^v(y_t)=softmax(W^{2T}(W^1s_t+b^1)) Pv(yt)=softmax(W2T(W1st+b1))
P q ( y t ) = ∑ j : x j q = y t α t j q P^q(y_t)=\sum_{j:x^q_j=y_t} {\alpha^q_{tj}} Pq(yt)=j:xjq=yt∑αtjq
P p ( y t ) = ∑ l : x l p k ( l ) = y t α t l q P^p(y_t)=\sum_{l:x^{p_k(l)}_l=y_t} {\alpha^q_{tl}} Pp(yt)=l:xlpk(l)=yt∑αtlq
这里段落的权重还要继续算一下,用passage ranker得到的每个段落与问题的相关程度再一次加强Attention,用的就是简单的标量乘和归一化。
最后得到PG-Net的联合概率分布:
P ( y t ) = λ v P v ( y t ) + λ q P q ( y t ) + λ p P p ( y t ) P(y_t)=\lambda_v P^v(y_t)+\lambda_qP^q(y_t)+\lambda_pP^p(y_t) P(yt)=λvPv(yt)+λqPq(yt)+λpPp(yt)
其中 λ v , λ q , λ p = s o f t m a x ( W m [ s t ; c t q ; c t p ] + b m ) \lambda_v,\lambda_q,\lambda_p=softmax(W^m[s_t;c^q_t;c^p_t]+b^m) λv,λq,λp=softmax(Wm[st;ctq;ctp]+bm)。
模型训练的目标函数包括三个部分,decoder端的负对数似然和两个二分类交叉熵。
文章把数据集做了处理,分成三种:
作者把实验参数也列举的比较详细,batch大小为80,一共训练8轮,在8个P100型GPU上跑整个MARCO 2.1数据集花了6天,可见模型还是比较庞大的。
本文实验结果在MARCO两个任务上在发表的时候都是最高的,算是MARCO里程碑式的模型。
从去除实验可以分析到:
从上图可以看出,Masque可以有效地控制生成答案序列的风格。
Masque较适合回答 (a) natural language, (b) cloze-style, and © keywords questions这类问题。
Masque对 (d) The Q&A was incorrect. (e) The answers were not consistent
between the styles. (f) Copying from numerical words这类问题解决的不好,或者说模型不是很敏感这类问题。