9012年了,你还没做过问答和阅读理解?

Intro to Reading Comprehension and Text-based Question Answering

Featured image

目前对于问答的研究,主要在研究用事实就能回答的、答案简短的问题(factoid question).
比如中国的货币是什么?人民币.
比如Musée de l’Orangerie在法国的哪里?巴黎.
比如Jean Fragonard是什么风格的画家? 洛可可.

本文也是聚焦在这种类型的问答上面.

目前三种套路思路教电脑回答问题:

本文由于篇幅有限, 先看第一种: 基于信息检索和阅读理解模型的问答.


基于信息检索的问答系统

(IR-based Question Answering)
需要一堆文本里找到一小段话、几个词(span)来回答用户的问题 .
基本框架如下:
从用户提出的问题出发(Question Processing), 使用信息检索系统找到相关的文本和段落(Document and Passage Retrieval),然后使用深度学习的阅读理解模型从一堆段落中截取(Answer Extraction)能回答问题的文段(span of text).
信息检索

接下来将分为3个步骤逐个解说

最后将聚焦到如何使用深度学习模型做答案抽取,aka如何做阅读理解任务.


对提问的处理

(Question Processing)
要将提问转化为信息检索系统能使用的查询条件,就必须从问题中抽取关键字.
有些系统还会抽取答案的类型(answer type),比如应该回答人、地点、还是对时间的描述?
抽取替换位置(focus), 也就是提问中最有可能被答案替换的位置,比如“哪里”、“什么”.

(1) Query Formulation

对原始问题做处理,有时候会使得后面的信息检索步骤更容易.
如果检索库是整个网络的话,不担心文本不够,可以直接使用原始问题.
如果检索库的文本比较少,比如是公司内部的文本或者维基百科的文章,那么为了增加找到相关文本的概率,往往会通过重写问题(query reformulation)把问题变成陈述句,或者将提问展开成很多种不同的表达形式,希望其中一种能匹配到检索库中的相关文本.

(2) Answer Type Detection

好处是如果我们能知道答案的类型,就可以在检索时跳过没提及答案那一类实体的句子.
比如提问哈利·波特的母亲叫什么名字的答案类型是人名.

标签设置
答案的类型可以直接使用命名实体识别中的类别:PERSON, LOCATION, ORGANIZATION,…
也可以使用带有树结构的answer type taxonomy
以下是一个人工设计的answer type taxonomy, 当然它也可以自动生成
信息检索

模型
现代一般使用有监督训练提问分类器,使用带有答案类型标签的数据集进行训练.
可以是依赖特征的分类器,也可以是完全依靠神经网络的分类器.
github项目: Keras示例, Torch示例

数据集

常用的特征


文本检索

(Document and Passage Retrieval)
从全部文本里选出备选文本和文本中的备选语段.
文本检索
将提问中抽取出的信息输入信息检索系统.
同时把所有备选的文本输入系统,让系统按照相关性对文本排序. 将最相关的N个文本取出. 至此Document Retrieval就做完了.
然后将这N个文本切分成段落、句子、甚至语段, 进一步筛选可能的答案, 最后输出备选语段,Passage Retrieval就做完了.

如何筛选语段

它使用了改良的注意力机制,预测文本中的每个位置作为回答的开始位置与结束位置的概率.属于有监督学习.
损失函数利用了模型对正确答案的开始位置yi1与结束位置yi2的概率预测:

\(L(\theta) = -\frac{1}{N}\sum_{i}^{N}[ log(p_{y_{i}^{1}}^{1} + log(p_{y_{i}^{2}}^{2})]\)

官方代码-Tensorflow 1.2版本


答案抽取

(Answer Extraction)
任务是从一句话或者一个段落里面找到最能回答提问的语段.
常转化为语段分类任务做: 给一个语段, 决定它里面是否包含提问的答案.

e.g. 哪家公司是湾区出了名的血汗工厂?
亚马逊尝试用各种实验性管理方式逼出员工的潜力,但部分现任和离职员工抱怨公司一些……

旧模型们

  1. 基于规则(Pattern Matching Parser)
    根据每种不同的答案类型,设计常见的pattern,然后抽取固定位置的语段.
    e.g. 答案是生日日期
    Pattern: [QP] was born on [AP]
    这个模型的一个明显问题是模型可复制性很差,换了个答案类型又要重新设计pattern了
  2. 使用训练好的命名实体识别模型(Named Entity Tagger)
    e.g. 你知道提问的答案会是一个地点,就用命名实体识别模型把文本中包含地点实体的语段都找出来.
    这个模型的一个明显问题是不能解决答案类型与命名实体类别不同的提问,比如定义类提问.
  3. 基于特征的分类(Feature-based Classifier)
    从备选语段中得到以下特征: 是否出现了属于答案类别的实体; 与提问关键字的重合词数;是否包含在提问中没有的新词;语段是否紧跟逗号句号问号感叹号;语段是否是提问中的词的同位语等.
  4. 词组拼贴 (N-gram tiling)
    从文本中生成unigram, bigram, trigram. 给N-gram们按照出现频率,有多接近答案的类型打分.
    把用词重复N-gram融合为一个更长的语段,分数叠加.
    不断地整合,同时把低分的语段去掉,直到没有可以整合的语段了,就输出最高分的语段作为答案.
    贪心的算法会先从高分的语段开始tile. 答案抽取tiling 在网络搜索中使用,因为网上重复的文本很多,可以融合很多次.

现代方法使用神经网络从文本中抽取能作为提问的答案的语段, 常被转化为阅读理解任务.


阅读理解

一种NLP任务. 使用神经网络而不是手写特征的分类器,在一堆文本中找到能回答问题的语段.
我们来看看这三年来影响这个领域的大事件,黑色为数据集,蓝色为模型
squad 图片来自论文

阅读理解模型不仅能用来评价一个模型对文本的理解程度,还可以作为问答系统中的阅读器(reader) .
神经阅读理解(Neural Reading Comprehension)模型的出发点: 提问和答案是语义上相似的两个文本.

本部分包括:

数据集

HotpotQA 火锅问答数据集
名字很接地气的大规模多步推理(multi-hop reasoning)问答数据集. 也就是说答案并不是在单一文档的单一句子中,而是需要定位多个信息来源,并基于多个相关信息进行推理才能得到.
一共12万+的英文问题. 通过Amazon Mechanical Turk收集的数据. 向众包工人展示两个维基百科选段,通过一些用户交互设计保证他们可以提问出必须基于两个选段进行多步推理才能得到答案的问题. 还标注了指向答案的支撑证据(supporting facts).
绿色高光部分是答案的支撑证据, 底下是问题和答案:
hotpotqa

SQuAD 2.0
基于英文维基百科文章内容设计提问,并文中人工抽取语段作为回答,形成的单步推理数据集.
2018年的2.0版本中加入了无法被回答的问题这一个新的类别. 一共15万个问题.(看到数据集也这么积极地迭代版本真是羡慕斯坦福有钱佩服)

左边是关于亚马逊雨林的文章,右边是提问以及黄金答案. squad

NewsQA
基于DeepMind提供的CNN Dailymail数据集中的新闻文章整理出的10万个问题. 跟SQUAD一样,问题和答案都是人设计人抽取的.包含不可回答的问题.

WikiQA
3047个问题.不包含语段答案,只包含完整句子作为答案.


双向LSTM为核心的模型

输入是一个问题q,有l个词 q1,q2,…,ql
还有一段话p,有m个词 p1,p2,…, pm
跟之前提到的BiDAF模型一样,模型的任务是预测这段话的第i个词 pi 是正确答案的开始位置的概率 pstart(i) 以及 pi 是结束位置的概率yend(i).

DrQA模型为例看一下模型设计: Bi-LSTM_model 一句话总结就是分别得到问与答的表示向量然后求相似度.
联系回我们之前提到的出发点: 提问和答案是语义相似的两个文本.

讲真这个模型图左半边比右半边好懂好多:
提问部分
先循例得到词嵌入向量,过Bi-LSTM之后加权整合hidden state向量得到提问的向量表示q.
然后跟文本的每个位置的表示向量放在一起求相似度.Totally make sense.
最后使用这个相似度分数决定答案从哪一个位置开始,哪一个位置结束.

重点看下Passage部分

\(p = \{p_1, ..., p_m\}\)

经历了什么变成了

\(\tilde{p} = \{\tilde{p}_1, ..., \tilde{p}_m\}\)

需要得到三种不同的向量,然后把它们粘起来:

负责预测功能的部分
训练两个分类器,一个负责开始位置pstart(i),一个负责结尾位置pend(i).
分类器可以就直接点积,不过效果比较好的是加入一层bilinear attention layer.


BERT为核心的模型

效果更更更好的模型.

假设我们的问题有N个词: Token1, Token2, …, TokenN ; 文章有M个词: Token1, Token2, …, TokenM .
把它们前后连接为[CLS] Token1 Token2 … TokenN [SEP] Token1 Token2 … TokenM
输入预训练过的BERT, 拿到文章中每个词对应的词向量Ti’ .
Bi-LSTM_model 图片来自论文

加入另外两个向量: 代表答案开始的S和代表答案结束的E.
用S然后E,分别与词嵌入向量Ti’ 求点积再normalize成概率, 就得到了第i个位置的词是答案的第一个词的概率 Pstarti和这个词是答案最后一个词的概率 Pendi
每个从i位置开始,从j位置结束的备选答案SPANi, j的分数= S x Ti + E x Ti
模型会选择分数最高备选语段作为提问的答案.
目标函数是每个黄金答案的开始词和结束词对应的位置被模型给予的log likelihood的和.


做多步推理的图网络模型

不同于传统的问答系统,多文档问答需要模型从数个文档中协同地寻找问题的答案,要求模型有很高的多步推理(multi-hop reasoning)能力.
这两年拿图注意力模型去做效果不错. 比如图注意力模型(graph attention network/GAT)TF代码, 图循环网络(graph recurrent network/GRN)TF代码.

动态融合图网络(DFGN)结合了图网络和BERT,我们就拿它来学习一下.
论文
pyTorch代码
模型由5个部分组成:
负责筛选段落的分类器(淡紫色),负责提取实体并构建图的模块(橘色),负责把问答转化为表示向量的编码器(黄色), 负责多步推理的混合模块(蓝色),负责预测支撑证据和答案的起始位置的分类器(绿色).
DFGN_model

筛选段落的分类器
不是全部段落都包含与答案相关的支撑证据(supporting facts),首先用一个基于BERT的二元文本分类器把不相关的段落去掉. 通过的段落会被粘起来变成背景知识 C .

构建实体图
使用了Stanford corenlp toolkitC 中提取 N 个命名实体.
那么实体之间的连接如何建立?

  1. C 中同一句话里出现的实体之间连起来
  2. 对应到C 中同一个mention的实体之间连起来
  3. 从每个段落的标题中找出一个核心实体,将核心实体 与同段落里的其他实体连起来

编码成向量
将提问 Q 与筛选后得到的 C 前后粘在一起,送进预训练过的BERT. 出来之后再送进一个bi-attention层,加强问答之间的关系.
假设 Q 有L个词,C 有M个词,得到提问的表示向量(L x d2)和背景知识的表示向量(M x d2).

多步推理
DFGN_model

  1. Doc2Graph
    先用C中的所有词找到对应的实体E
    怎么找到?使用矩阵M

  2. 图上搜索
    用注意力网络和经过MeanPool的提问向量计算soft mask
    用soft mask来代表实体与提问Q之间的相关度, 选出起始的实体节点
    使用类似GAT的模型计算两节点间的注意力分数alpha, 出发节点的向量会被更新为邻节点信息的加权平均
    每一次推理新访问到的节点会成为下一次推理的起始节点,通过这样的设计把信息一步步扩散到邻近节点去
    同时使用bi-attention网络更新提问的表示向量
    Q(t) = Bi-Attention(Q(t−1), E(t))

  3. Graph2Doc
    将相关实体E用M对应回C中的词
    因为最后的预测是基于词语的.

预测
用四个结构一样的LSTM叠在一起预测下面四样东西:

  1. 支撑答案的句子
  2. 答案开始词的位置
  3. 答案结束词的位置
  4. 答案的类型

损失函数是四个分类器自己的交叉熵的加权平均:
L = Lstart + Lend + λsLsupport + λtLtype


总结

本文完完整整地介绍了基于信息检索和阅读理解模型的问答系统可以怎么做, 从对提问的预处理,到使用文本检索筛选段落,再到使用不同的模型抽取答案语段.
常将答案抽取化为阅读理解任务去做.
其中神经阅读理解模型我们介绍了三种方向,双向LSTM为核心的模型,BERT为核心的模型,图网络模型.
开源项目或论文的代码实现,数据集的下载链接都已经在文中链接里啦.


Reference