学习总结

(1)陈丹琦讲到自己17年在DrQA问答系统,也算是领航人,将Open-domain (textual) question answering分为两部分:Retriever和Reader部分,前者筛选出k个维基百科文档,后者再利用BiDAF等模型进行进一步筛选出QA问答的answer。
(2)有个视频讲解BiDAF模型得不错:​​​视频​​。

文章目录

一、QA介绍

QA:构建能够自动回答人类用自然语言提出的问题的系统。

【CS224n】(lecture11)Question Answering_问答系统

1.1 QA的分类:

(本task主要讲texutal QA,不考虑KB-QA、visual-QA等)

  • 根据信息来源分类:一个文本段落,所有的Web文档,知识库,表格,图像;
  • 问题类型:Factoid vs non-factoid, open-domain vs closed-domain, simple vs compositional等等;
  • 回答类型:A short segment of text, a paragraph, a list, yes/no等等。

QA系统的类型(根据任务类型):

  • 任务型机器人
  • 用于完成用户特定任务,机器人利用语义去执行后台已对接的能力,帮用户完成特定任务。例如预订酒店,销售产品等。
  • 特点:智能决策,状态转移,槽位填充,多轮问答。
  • 解答型机器人
  • 用于解答用户的问题,机器人的回复来源于特定知识库,以特定回复回答用户。例如跟百科问答相关的机器人或者产品客服机器人。
  • 特点:问答模型,信息检索,单轮为主。
  • 闲聊型机器人
  • 跟用户的无目的闲聊,机器人回复不限制,多以趣味性跟个性化回复为主。
  • 特点:开放域,个性化,内容丰富。

根据解决方案:

  • 基于检索式的问答系统:根据问题从数据库搜索最接近的问题,返回相应答案。特点:稳定可控,缺乏灵活性。
  • 基于生成式的问答系统:根据实际问题直接生成答案。特点:回复更加丰富,相对灵活,生成答案不受控。(多用于闲聊机器人)

1.2 QA的框架

问答系统通常包括三个环节,NLU(自然语言理解),DM(中控平台),NLG(自然语言生成)。其中:

  • DM主要包括对话状态跟踪(Dialogue State Tracking)跟策略学习(Policy Learning)两个部分。
  • 如下图所示,其中NLU主要是对用户问题的解析,可以理解为把用户问题转化为机器能理解的语言。对话状态跟踪主要是获得当前的状态,可以理解为机器人所理解的用户问题的所处的状态,策略学习主要是根据当前系统的状态采取的策略(例如用户在这里可能是要询问地址,那么就返回的策略就是跟询问地址相关的),NLG是对用户的问题的回复,可以理解为用户最终会看到的机器人返回的结果。
  • 【CS224n】(lecture11)Question Answering_自然语言处理_02


【CS224n】(lecture11)Question Answering_nlp_03


IBM Watson在2011年打败Jeopardy champions

1.3 QA在深度学习领域

Open-Retrieval Question Answering一个重要方面是其表现力,能够检索开放语料库中的任何文本,而不是局限于信息检索所返回的封闭集,模型的框架如下所示:

【CS224n】(lecture11)Question Answering_自然语言处理_04


几乎所有至今最先进的QA问答系统都是建立在端到端的预训练语言模型中(如BERT等)。

1.4 Beyond textual QA problems

【CS224n】(lecture11)Question Answering_nlp_05


除了文本QA问题,今天我们要讨论问的QA如何回答基于非结构化数据文档的问题。非结构化数据,比如维基百科的文本。

二、阅读理解

2.1 reading comprehension

阅读理解reading comprehension:阅读一篇文章,并回答基于文章的相关问题。

  • 在生活中有很多实际的应用;
  • 许多NLP任务可以归结为一个阅读理解任务。
  • 一般以抽取式阅读理解(Span-extraction Reading Comprehension为例),由篇章(passage)、问题(question)和答案(answer)构成,答案要求是从篇章(passage)中抽取出一个文本片段(span),即可化简为预测篇章(passage)中的一个起始位置和终止位置。

2.2 SQuAD数据集

斯坦福开发的SQuAD1.1、SQuAD2.0。这两个数据集都是抽取式问答,因此可以建模为序列标注问题(预测passage的每个token是答案开头和结尾的概率),在评价指标上可以使用F1和EM(exact match)

无论是训练集、验证集还是测试集,对于每一个问答数据样本都会有“context", "question"和“answers”三个key。我们可以使用一个下标来选择一个样本。注意answers的标注,answers除了给出了文本片段里的答案文本之外,还给出了该answer所在位置(以character开始计算,上面的例子是第515位)。

datasets = load_dataset("squad")
datasets["train"][0]
# answers代表答案
# context代表文本片段
# question代表问题
{'answers': {'answer_start': [515], 'text': ['Saint Bernadette Soubirous']},
'context': 'Architecturally, the school has a Catholic character. Atop the Main Building\'s gold dome is a golden statue of the Virgin Mary. Immediately in front of the Main Building and facing it, is a copper statue of Christ with arms upraised with the legend "Venite Ad Me Omnes". Next to the Main Building is the Basilica of the Sacred Heart. Immediately behind the basilica is the Grotto, a Marian place of prayer and reflection. It is a replica of the grotto at Lourdes, France where the Virgin Mary reputedly appeared to Saint Bernadette Soubirous in 1858. At the end of the main drive (and in a direct line that connects through 3 statues and the Gold Dome), is a simple, modern stone statue of Mary.',
'id': '5733be284776f41900661182',
'question': 'To whom did the Virgin Mary allegedly appear in 1858 in Lourdes France?',
'title': 'University_of_Notre_Dame'}

【CS224n】(lecture11)Question Answering_QA问答系统_06


​SQuAD-1.1数据集介绍​​将SQuAD数据集可视化如下草图,每一个元素表示的就是答案,问题,以及问题编号。答案中给出了答案的起始位置和答案的文本字符串。

我们要的数据包括context,这代表一个段落,而对于这个段落会有几个问题和对应的答案,所以还需要question和text以及answer start,text就是question的答案。这个数据集一个question只有一个答案。result中的字段除了id外其余的就是我们训练需要的字段。

另外SQuAD 2.0数据集可以通过​​NLP 高引论文解读两篇 | BERT模型、SQuAD数据集​​了解。

【CS224n】(lecture11)Question Answering_数据集_07

  • Passage 是来自维基百科的一段文本,系统需要回答问题,在文章中找出答案
  • 答案必须是文章中的一系列单词序列,也就是提取式问答
  • 100k examples

(1)SQuAD evaluation, v1.1

  • 系统在两个指标上计算得分
  • 精确匹配:1/0的准确度,是否匹配三个答案中的⼀个
  • F1:将系统和每个答案都视为词袋,并评估:
    【CS224n】(lecture11)Question Answering_问答系统_08
  • Precision 和 Recall 的调和平均值
  • 分数是(宏观)平均每题F1分数
  • F1测量被视为更可靠的指标,作为主要指标使用
  • 它不是基于选择是否和人类选择的跨度完全相同,人类选择的跨度容易受到各种影响,包括换行
  • 在单次级别匹配不同的答案
  • 这两个指标忽视标点符号和冠词(a, an, the only)

(2)SQuAD 2.0

  • SQuAD1.0的一个缺陷是,所有问题都有答案的段落
  • 系统(隐式地)排名候选答案并选择最好的一个,这就变成了一种排名任务
  • 你不必判断⼀个span是否回答了这个问题
  • SQuAD2.0中 1/3 的训练问题没有回答,大约 1/2 的开发/测试问题没有回答
  • 对于No Answer examples, no answer 获得的得分为1,对于精确匹配和F1,任何其他响应的得分都为0
  • SQuAD2.0最简单的系统方法
  • 对于一个 span 是否回答了一个问题有⼀个阈值评分
  • 或者可以有第二个确认回答的组件
  • 类似 自然语言推理 或者 答案验证

2.3 神经网络模型

(1)LSTM-based vs BERT models

【CS224n】(lecture11)Question Answering_自然语言处理_09

(2)带注意力机制的seq2seq模型

  • 除了源句和目标句,我们还有两个序列:段落和问题(长度不平衡)
  • 我们需要建模找出文章中哪些词与问题最相关(以及哪些疑问词)
  • 我们不需要一个自回归解码器来逐字生成目标句子。相反,我们只需要训练两个分类器来预测答案的开始和结束位置。

(3)BiDAF: the Bidirectional Attention Flow model

《BiDAF: the Bidirectional Attention Flow model》 是RNN时代的一篇经典工作,可以参考​​知乎上的一篇解读​​。多年来,BiDAF architecture有许多变体和改进,但其核心思想是 the Attention Flow layer。

【CS224n】(lecture11)Question Answering_QA问答系统_10

1)encoder
  • 为上下文(context)和查询问题(query)中的每个单词,使用单词embedding(Glove)和字母字符embedding(基于CNNs的字符embedding):
    【CS224n】(lecture11)Question Answering_数据集_11【CS224n】(lecture11)Question Answering_问答系统_12
  • 然后使用2个双向LSTM分别为上下文context和查询query生成上下文嵌入embedding,即Contextual Embedding,这样就得到BiDAF的embedding层。
    【CS224n】(lecture11)Question Answering_数据集_13
2)attention 双向注意流

idea:attention应该双向流动,从上下文到问题,从问题到上下文。

【CS224n】(lecture11)Question Answering_nlp_14

  • 首先计算每一对的相似度分数,即令相似矩阵(【CS224n】(lecture11)Question Answering_QA问答系统_15的维度为6H)【CS224n】(lecture11)Question Answering_自然语言处理_16【CS224n】(lecture11)Question Answering_问答系统_17
  • Context-to-Question (C2Q) 注意力 (哪些查询词与每个上下文词最相关),即对每一个context word,哪些query words和它最相关。通过softmax得到attention distribution(如下公式),最终是得到加权求和的每个词向量表示:【CS224n】(lecture11)Question Answering_问答系统_18
  • 【CS224n】(lecture11)Question Answering_nlp_19

  • Question-to-Context (Q2C) 注意力(上下文中最重要的单词相对于查询的加权和——通过max略有不对称),即对于query来说,哪些context words和它最相关。
  • 通过max取得上下文中的每个单词对于问题的相关度
    【CS224n】(lecture11)Question Answering_自然语言处理_20
  • 其中:【CS224n】(lecture11)Question Answering_数据集_21

【CS224n】(lecture11)Question Answering_数据集_22

3)Modeling and output layers
  • Modeling layer:
    【CS224n】(lecture11)Question Answering_自然语言处理_23
  • attention层是query和context的交互层;
  • modeling层是context words之间的交互层。
  • Output layer(两个分类器预测答案的起始点和终点位置):
    【CS224n】(lecture11)Question Answering_问答系统_24
4)BiDAF在SQuAD数据集上的表现

在SQuAD v1.1数据集上的F1值为77.3:

  • 如果没有context-to-query attention,则F1值为67.7;
  • 如果没有query-to-context attention,则F1值为73.7;
  • 如果没有character embeddings,则F1值为75.4。

【CS224n】(lecture11)Question Answering_QA问答系统_25

(4)BERT应用在阅读理解上

BERT用在来阅读理解时,最朴素的做法就是,将一个样本的passage和Question作为两个原始的segment用【sep】拼接起来作为BERT的输入

【CS224n】(lecture11)Question Answering_QA问答系统_26

  • BERT是一种深度双向transformer的编码器encoder部分,在大量文本上进行了预训练(维基百科+ BooksCorpus)。
  • BERT在两个任务上进行预训练:
  • MLM:Masked language model
  • NSP:Next sentence prediction
  • BERTbase版本有12 layers and 110M个参数;BERTlarge有24 layers 和 330M 的参数量。

【CS224n】(lecture11)Question Answering_nlp_27


这里BERT的作用可以理解为一个提取特征的encoder,其对于每个passage的token都生成了一个包含上下文信息以及篇章同问题之间的交互信息(具体去了解transformer,它是BERT的backbone)的向量(representation)。接下里针对QA任务构建简单的下游网络,其实就是两个预测层,分别预测该representation对应的token是答案开头或者起始的概率。训练目标:将起始位置和终止位置的交叉熵损失平均,得到模型最终的总损失。

【CS224n】(lecture11)Question Answering_数据集_28

(5)BiDAF 和 BERT 之间的区别

  • BERT模型有更多的参数(110M或330M), BiDAF有 大约 2.5M 参数;
  • 两者的backbone不同。BiDAF是建立在几个双向lstm之上的,在训练和推理时都是线性的;而BERT是建立在transformer(没有递归架构,更容易并行化)。
  • BERT是大规模语料预训练得到的,而BiDAF只是建立在GloVe之上(所有剩余的参数需要从监督数据集学习),从头训练。

(6)针对下游任务设计更好的预训练目标

danqi这里用QA做例子很好地渗透了一种思想:预训练为什么work,其实就是因为其任务本身和下游任务之前存在overlap(当然也要加上充足的数据量),比如MLM任务可以很好地锻炼模型的“理解能力”,所以BERT在NLU任务上刷榜了,又比如自回归和生成类任务天然更搭,所以GPT在生成类任务上更好一些。因此,其提出了一个针对阅读理解任务的预训练目标,即span-BERT。

【CS224n】(lecture11)Question Answering_QA问答系统_29

  • 掩蔽连续的单词跨度,而不是15%的随机单词
  • 利用span的两个端点预测中间的所有掩码词=将span的信息压缩到它的两个端点【CS224n】(lecture11)Question Answering_问答系统_30

(7)存在的问题

我们的模型在SQuAD上的表现已经超过人类的水平,但不代表其已经具有阅读理解能力了。当前系统在对抗性示例或领域外分布的示例上仍然表现不佳,模型很容易被其他候选项迷惑。下图的栗子源自《Adversarial Examples for Evaluating Reading Comprehension Systems》,是文本对抗领域的开山之作,

论文地址:https://arxiv.org/pdf/1707.07328.pdf

【CS224n】(lecture11)Question Answering_问答系统_31

  • 黑色字体为原文本中的内容;
  • 蓝色字体为根据文本内容所产生的的干扰片段(adversarial distracting sentence)。
  • 在加入干扰片段后,人类可以判断出,问题所对应的答案并不会产生改变,但阅读理解模型的回答却由原来的John Elway(绿色字体)变为了Jeff Dean(红色字体)。

领域(不同数据集)间迁移能力差:

【CS224n】(lecture11)Question Answering_问答系统_32

(Sen and Saffari, 2020): What do Models Learn from Question Answering Datasets?


这里提到了acl2021的best paper:《Beyond Accuracy: Behavioral Testing of NLP Models with CheckList》

这篇论文认为模型在held-out集合上的测评结果不能真正的代表这个模型的能力,因为测试集规模小并且往往和训练集有相似的分布,同时一些指标也不见得合理,并且将模型表现聚合到一个指标上,就不能很好地发现模型在哪些case上比较差进而进行针对性的改进。因此,本文提出了一套基于软件工程领域的“黑箱测试”理论的模型评估套件——checklist 。更多的内容可以参看论文,这里只截取danqi课程相关的内容,即checklist针对BERT-large(在SQuAD上微调)的测试结果:

【CS224n】(lecture11)Question Answering_QA问答系统_33


从这里可以看出来,虽然bert在SQuAD上的表现超过了人类表现,但是却经不起checklist的检验,主要体现在双重否定,属性、人和物品之间的比较级,指代分辨,主客体区分上。可见QA问题远远没有被解决。

三、Open-domain (textual) question answering

开放域文本问答,与阅读理解不同,Open-domain (textual) QA并不会基于给定的文章给出答案,而是从大规模的知识库或者文本集合(如维基百科等)中返回答案。

DrQA是一个开放域问答系统。陈丹琦在Facebook时发表了《Reading Wikipedia to Answer Open-Domain Questions(阅读维基百科来回答开放域问题)》,DrQA即要完成大规模阅读MRS,在一个非常庞大的非结构化文档语料库中寻找问题的答案。最大的挑战就是文档检索与文本的机器理解如何更好的结合。论文中结合了基于二元语法哈希(bigram hashing)和TF-IDF匹配的搜索组件,以及一个训练用来在维基百科段落中寻找答案的RNN模型。

3.1 Retriever-reader framework

【CS224n】(lecture11)Question Answering_数据集_34


将问题分解为两阶段,首先检索出最相关的passage,然后转化为一个阅读理解问题。这里danqi很快地过了两篇论文:

【CS224n】(lecture11)Question Answering_nlp_35

Lee et al., 2019. Latent Retrieval for Weakly Supervised Open Domain Question Answering


  • 输入和输出:
  • Input: a large collection of documents【CS224n】(lecture11)Question Answering_问答系统_36and【CS224n】(lecture11)Question Answering_nlp_37
  • Output: an answer string【CS224n】(lecture11)Question Answering_问答系统_38
  • 模型的两个部件:
  • Retriever:【CS224n】(lecture11)Question Answering_问答系统_39
  • Reader:【CS224n】(lecture11)Question Answering_自然语言处理_40
  • 在陈丹琦的DrQA模型中:
  • Retriever = A standard TF-IDF information-retrieval sparse model (a fixed module)
  • Reader = a neural reading comprehension model that we just learned
  • Trained on SQuAD and other distantly-supervised QA datasets
    Distantly-supervised examples:【CS224n】(lecture11)Question Answering_数据集_41

【CS224n】(lecture11)Question Answering_QA问答系统_42

Karpukhin et al., 2020. Dense Passage Retrieval for Open-Domain Question Answering


小结:这两个区别简单来说就是,前者需要question和passage联合输入模型,这样经过排列组合后,模型的计算量就大大增加了。后者直接将question和passage编码为固定向量,然后直接计算相似度,减少了复杂度。这样训练出来的Retriever比传统的 IR 检索模型强很多。

PS:传统的 IR 信息检索模型介绍:​​博客​​。

3.2 Dense retrieval + generative models

之前提到的都是从已有的文本中抽取答案,随着研究的进展,生成式问答出现了。这篇论文提出,先通过检索找到和问题强相关的上下文,然后将其输入给seq2seq模型,训练模型直接生成正确答案。

【CS224n】(lecture11)Question Answering_自然语言处理_43

Izacard and Grave 2020. Leveraging Passage Retrieval with Generative Models for Open Domain Question Answering


最近的研究工作表明,生成答案代替抽取答案会更好。

随着预训练的发展,人们发现一些“巨无霸”模型(如T5模型)甚至不需要上下文信息,只需要给其输入问题,它就能从自身参数保存的知识中寻找到正确答案。

【CS224n】(lecture11)Question Answering_问答系统_44

Roberts et al., 2020. How Much Knowledge Can You Pack Into the Parameters of a Language Model?


  • 谷歌提出的T5和之前模型不同,是将不同形式的任务统一转化为条件式生成任务;
  • 使用同套模型参数完成不同的条件式生成任务有2个关键因素:
  • 要给模型注入任务信息(这也是迁移学习常用的方法),T5则是使用自然语言描述 or 简短提示(Prompt)作为输入文本的前缀表示目标任务,如对于英语到汉语的机器翻译,可以在输入文本的头部加上“translate English to German”;
  • 模型的容量:transformer层数、注意力头的数目和隐含层向量的维度等都会影响。

3.3 不需要 reader 模型

这篇论文直接将知识库切分为phrases(60 billion),然后encoding,再将question进行encoding,最后进行phrase vector和question vector之间的相似度评估(近邻搜索),返回最相似的phrase作为答案。这种做法的效果竟然也很好。

【CS224n】(lecture11)Question Answering_问答系统_45

Reference

(1)课程ppt:https://web.stanford.edu/class/cs224n/slides/
(2)Speech and Language Processing :https://web.stanford.edu/~jurafsky/slp3/
(3)课程官网:https://see.stanford.edu/Course/CS224N#course-details
(4)https://zhuanlan.zhihu.com/p/451347191
(5)​​​基于维基百科的开放域问题问答系统DrQA​​​ (6)https://www.zhihu.com/people/xiao-guo-zhen-60
(7)b站课程视频:https://www.bilibili.com/video/BV18Y411p79k?p=11
(8)​​论文笔记 | Adversarial Examples for Evaluating Reading Comprehension Systems​​ (9)​​知识库问答KB-QA——非结构化知识篇​​ (10)squad数据集:https://rajpurkar.github.io/SQuAD-explorer/