09-问答模型,Transformer结构的介绍

Motivation: Question answering

问答系统(Question Answering, QA)是指对检索到的文档进行阅读理解,抽取出能回答问题的答案


Stanford Question Answering Dataset(SQuAD)

2015~2016年,几个大规模QA标注数据集的发表,极大的推动了这个领域的发展。这其中比较有名的数据集是斯坦福大学发布的Stanford Question Answering Dataset(SQuAD)。

  • 文章是来自维基百科的一段文本,系统需要回答问题,在文章中找出答案
  • 答案直接直接来自于文章,也就是提取式问答(给出答案所在的收尾位置之间的单词序列)
  • SQuAD由100k个examples构造而成

为了增加数据集的难度,斯坦福后续推出升级版本SQuAD2.0数据集中增加了没有答案的问题,可以理解为假问题,对系统造成干扰。此时就要求系统判断这个问题能否从文章描述中获得答案,如果没有答案的话,就不输出任何回答<No Answer>。


Stanford Attentive Reader

这是一个基于SQuAD数据集开发的QA架构,它比较轻量级,性能一般,常被用作解决QA问题的一个baseline模型。

对问题Q的每个词进行embedding得到词向量,然后使用双向LSTM去抽取句子的特征,把正向和反向的LSTM的最后一个隐状态拼接起来,作为对整个句子的表征$q$。

SQuAD的问题答案在P中,模型只需要找到对应答案在P中的位置就行(span)。我们对P也使用和Q一样的处理方式得到P中每个词的表征向量$\tilde{p}_i$,然后使用两次注意力机制,用$q$查询集合$p=[\tilde{p}_1,\tilde{p}_2,…,\tilde{p}_n]$,得到答案在P中的起始位置$\alpha_i$和结束位置$\tilde{\alpha}_i’$。

因为$q$和$\tilde{p}_i$的维度不一样无法直接通过点积计算注意力得分,所以引入参数$W$

Stanford Attentive Reader++

相对于上一个模型,这个模型做了两个改变,对于问题Q的表征,$q$不仅包含了双向LSTM首尾的两个输出的隐状态,它使用了$w$这个可学习的变量描述整个问题所有隐状态的加权平均,并且加深网络层数到3层;对于P部分的表征,原来的输入仅仅包含词向量,它引进了更多的语言特征,如POS标签、NER标签、词频等。这个++版本的改进相对于前一个有不少的提升。


BiDAF: Bi-Directional Attention Flow for Machine Comprehension

这个QA模型对于问题Q和描述P的建模除了引入它们的词向量,还引入了字符级别的特征,并且,在做attention时,做了双向的attention,即除了问题对描述的注意力,还有描述对问题的注意力。


Recent, more advanced architectures

之后的研究工作,大家发现,对QA系统中attention设计的改进可以获得很多的提升。

Dynamic CoattentionNetworks for Question Answering

这篇文章认为一个全面的QA模型需要更多的相互依赖,也就意味着更多更复杂的attention需要被引入。

Coattention Encoder

Coattention Encoder包括两级注意力的计算,首先对D和Q之间产生一个互注意力层(Coattention layer),然后对这个互注意力层和问题Q之间再次进行attention。

FusionNet

多层感知机(Multi-layer Perceptron,MLP),是模型结构相对简单但在工业界运用比较广泛的深度模型。MLP模型是包含多个全连接隐藏层的前向反馈模型,它计算注意力分数一种方式是(维度不一样,引入$W$参数):

它改成了双线性形式:

这样的attention消耗较少的空间,且非线性。

Multi-level inter-attention

这部分引入了self-attention在上下文中做更多的inter-attention。现如今QA问题的比较好的性能都是由Bert给出,由此引进了预训练模型。


ELMo and BERT preview

此部分内容之前已经在彻底搞懂BERT文章中学习过


补充:如何使用Bert做基于阅读理解的信息抽取

就像前面介绍的,在BERT出来之前,机器阅读理解主要用LSTM等特征抽取分别对Paragraph(P)和Question(Q)进行表征,抽取特征。再将二者的特征进行一些运算,得到相应的输出表征。

如上图所示,展示了如何用Bert来做信息抽取任务的结构图,注意以下几点即可:

  • 将Question和Paragraph分别作为BERT的text1和text2输入。
  • start/end span在Paragraph对应的输出位置表示。

通常输出会通过2个dense网络,接到start输出和end输出序列。

假设Paragraph为“周杰伦出生于台湾”,Question为“周杰伦出生于哪里?”,则laebl为:start[0,0,0,0,0,1,0],end[0,0,0,0,0,0,1]。

将上述start输出和end输出序列接一个sigmod层,然后用binary_crossentropy函数即可进行训练。
如果想要输出一个Answer是否正确的概率,可用将[CLS]的输出表征利用起来。


Reference

文章作者: Stanleylsx
文章链接: http://yoursite.com/2020/05/19/%E9%97%AE%E7%AD%94%E6%A8%A1%E5%9E%8B,Transformer%E7%BB%93%E6%9E%84%E7%9A%84%E4%BB%8B%E7%BB%8D/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LSXのBlog