《NEURAL READING COMPREHENSION AND BEYOND》解读(陈丹琦博士论文)
之前在听standford的cs224n自然语言处理课程的时候,就有一段是请陈丹琦来这边讲她最近的一些工作,我记得还是在embedding上的进展。听的时候,就觉得像是一个中国小姐姐,后面在这篇爆款博士论文出来的时候,就特意去查了一下,果然是大神~
陈丹琦的博士论文是关于机器阅读理解的,这是近期的一个研究热点,与笔者的专业也比较相关,因此就拜读了一下,并将其主要内容梳理如下:
文章目录
-
- Chapter 1
-
- 1.1 为啥要研究RC?
- 1.2 论文研究点
- Chapter 2
-
- 2.1 RC的历史发展
- 2.2 RC任务定义
- 2.3 RC和QA的区别
- 2.4 数据集和模型
- Chapter 3
-
- 3.1 基于特征的模型
- 3.2 深度学习模型SAR
- 3.3 SAR实验
- 3.4 模型各个模块可以改进的点
- Chapter 4
-
- 4.1 数据集
- 4.2 模型
- 4.3 未来研究点
- Chapter 5
-
- 5.1 DRQA
- 5.2 DRQA实验
- 5.3 未来的工作
- Chapter 6
-
- 6.1 CoQA任务定义
- 6.2 CoQA数据集
- 6.3 CoQA模型
- 6.4 CoQA实验
- 6.5 一些讨论
- Chapter 7
- 传送门
Chapter 1
这一章主要是对整个thesis的一个overview:
1.1 为啥要研究RC?
介绍了为什么要研究Reading Comprehension,阐述了两点动机:
a. Reading Comprehension可能是评估机器是否理解语言的最合适的任务(可以从人的角度来理解,你说我看了一篇文章,那么怎么证明我理解了这篇文章,可以通过回答关于这篇文章的问题来证明)
b. Reading Comprehension研究好了之后,将会是一个重要的技术,可以用于问答和对话系统领域
1.2 论文研究点
介绍了这篇论文主要研究的东西,主要有两点:
a. Reading Comprehension任务本身,包括问题的形式化定义、组成部分、系统的关键趴,并look deeper into系统所擅长和欠缺的地方
b. 基于在Reading Comprehension系统上所取得的成功,看怎么应用到实际的应用当中去,主要有两个实际应用方向:
1) 开放域的问答任务:主要是结合了信息检索和阅读理解的一个任务,从Web或者百科中找到通用问题的回答
2) 对话中的问答任务:主要结合了对话和阅读理解,着力解决文章是多轮对话时的QA问题(好像不是为了研究对话系统?而是有大量对话上下文的QA?)
PS: 作者主要研究的是Neural Reading Comprehension,这与我们现在Deep Learning的发展强烈相关,也与笔者的专业强相关。
Chapter 2
这一章主要是对RC的一个overview,包含几点内容:
2.1 RC的历史发展
Automatic Reading Comprehension的历史发展:
a. 早期的系统主要是基于规则的,可能会结合一些浅层的语言处理,包括词干提取、指代消解,或者词法分析等。这种的在检索可能包含正确答案的句子这种任务上,大概是能达到30%~40%的准确率。
b. 13~15年涌现了一批机器学习的方法,主要还是基于一些手提特征,包括句法依赖、共指消解、词向量等,来建立模型。这种模型相对于前面的基于规则的方法得到了一些提升,但仍有几点不足:1)过多地依赖于现有的语义分析工具,如依赖关系分析等,这种的可能是在别的专有语料上训练,扩展性差,同时可能会引入噪声;2)很难提取有效的模拟人类水平的特征;3)数据集太小,不足以进行训练
c. 15年以后,数据集也涨上来了(SQuAD等),也同时涌现了一大批深度学习模型(端到端模型,即Neural Reading Comprehension),相比于基于手提特征的分类器,这种模型具有几点优势:1)不需要任何的先验语义特征,减少噪声,也具有可扩展性;2)特征十分稀疏,泛化性能较差;3)解放手提特征的人力
2.2 RC任务定义
主要还是定义成三元组的形式,即(P, Q, A),具体可以参见论文中2.2节的详细定义。
根据Answer的不同形式,可以分为几种问题的定义:1)完形填空:可以从预先设定的选项中或者整个词表集中选出合适的词语或或者实体;2)选择题:从预设答案中选择一个合适的答案;3)抽取式QA:直接从文章中选取一小短句作为答案;4)自然语言回答:直接从词表集中选择词语组成一句话进行回答
评估方式:对于完形填空和选择题,可以用准确率来衡量;对于抽取式QA,可以用是否完全匹配和词语重合度的F1计算;对于自然语言的,可以用BLEU、Meteor、ROUGH这种NLG相关的指标进行衡量。一般对于每个问题,都会设定多个golden的答案,计算这些指标的时候,是选择最大的那个
2.3 RC和QA的区别
RC可以看做是QA的一种?但在其最终目标上,还是强调了不同的东西。总结来看就是,QA是为了实现无指定文本依赖的这种问答,它需要完成很多事情:1)搜寻相关的资料;2)从大量的资料中生成答案;3)考虑用户经常问什么问题等,但RC的主要精力还是在文本理解上,它需要依赖指定的文本,主要测试对这段文本的理解程度。
2.4 数据集和模型
现有RC的成功主要离不开两个因素的驱动:一个是大数据集的出现,一个是端到端模型的演进。这两者是互惠互利的关系,好的数据集驱动了好的模型的发展,而模型的发展又促使更有挑战的数据集的出现。
下面是它们之间发展的时间线:
PS:NRC才兴起了3年,真的是一个巨大的热点了,赶紧入坑啊~
Chapter 3
这一章就开始进入到了大家最关心的模型部分,包括以下几点:
3.1 基于特征的模型
在深度学习模型兴起之前,传统的方法基本都是集中在如何提取更有效的语言特征上,后面就用一些机器学习算法来解决即可,比如LambdaMART、SVM等。作者以他们16年发的论文举了一个例子,里面就提取了8种类型的语言特征,比如在文章中出现的次数啊,单词距离啊,出现的位置等等,这种还是要很靠手工的,所以也就比较麻烦。
3.2 深度学习模型SAR
深度学习模型和大数据集的出现,可以说是带动了MRC的高速发展,各种模型层出不穷,在各个数据集上的分数也越来越高。这里主要介绍一个作者在17年提出的一个比较base的模型:SAR(Stanford Attentive Reader)。它长下面这样:
这里的SAR主要用来解决的是span prediction的MRC问题。设给定一篇文章ppp,由lpl_plp个tokens组成,记为(p1,p2,…,plp)(p_1, p_2, …, p_{l_p})(p1,p2,...,plp),同时给定一个问题qqq,由lql_qlq个tokens组成,记为(q1,q2,…,qlq)(q_1, q_2, …, q_{l_q})(q1,q2,...,qlq)。目的是预测一个span (astart,aend)(a_{start}, a_{end})(astart,aend),满足1<=astart<=aend<=lp1 <= a_{start} <= a_{end} <= l_p1<=astart<=aend<=lp,并且这个span是这个问题的答案。模型将这个任务转化为序列上的二分类问题,即对于文章中的每个词,都预测这个词分别是start和end的得分,最后用这个分数来预测(astart,aend)(a_{start}, a_{end})(astart,aend)。
下面来一步一步看这个模型结构:
- 首先是左侧的question编码部分
主要是对question进行编码,先经过embedding层,而后用BiLSTM进行序列建模,最终每个词的表征为:
q1,q2,…,qlq=BiLSTM(E(q1),E(q2),…,E(qlq);Θ(q))∈Rhq_1, q_2, …, q_{l_q} = BiLSTM(E(q_1), E(q_2), …, E(q_{l_q}); \Theta^{(q)}) \in \R^hq1,q2,...,qlq=BiLSTM(E(q1),E(q2),...,E(qlq);Θ(q))∈Rh
然后用一个类似self-attention的东西,将这些词编码成一个向量qqq:
bj=exp(wqTqj)∑j′exp(wqTqj′)b_j = \frac{exp(w^{qT}q_j)}{\sum_{j'}exp(w^{qT}q_{j'})}bj=∑j′exp(wqTqj′)exp(wqTqj)
q=∑jbjqjq = \sum_j b_j q_jq=j∑bjqj
为啥这里要用self-attention?而不用更简单的比如两个方向的最后一个表示拼接之类的?实践证明,这种可学习的能捕捉到所有词信息,并能进行重要性建模的方式会更好!因为总有些词在回答问题的时候会相对重要一些。
- 接着是右侧下半部分的passage编码部分
主要是对passage进行编码,在编码的过程中融入了question的信息,可以形象地理解为带着问题找答案。它是先经过输入表征层(可理解为embedding+一堆其他的feature),而后用BiLSTM进行建模,最终每个词的表征为:
p1,p2,…,plp=BiLSTM(p~1,p~2,…,p~lp);Θ(p))∈Rhp_1, p_2, …, p_{l_p} = BiLSTM(\tilde p_1, \tilde p_2, …, \tilde p_{l_p}); \Theta^{(p)}) \in \R^hp1,p2,...,plp=BiLSTM(p~1,p~2,...,p~lp);Θ(p))∈Rh
这里的表征p~i\tilde p_ip~i由两部分组成:词本身的特征及词与question之间的联系。
其中对于第一部分,词本身的特征,包含:
1)embedding特征femb(pi)f_{emb}(p_i)femb(pi);
2)词本身的语言特征ftoken(pi)f_{token}(p_i)ftoken(pi),包括POS(词性)、NER(命名实体)和TF(频率),都是用离线工具计算好的。
而对于第二部分,包含:
1)完全匹配特征fexact_match(pi)=I(pi∈q)∈Rf_{exact\_match}(p_i) = I (p_i \in q) \in \Rfexact_match(pi)=I(pi∈q)∈R,即pip_ipi是否出现在question里面,可以是小写后的或者lemma后的;
2)embedding对齐特征falign(pi)=∑jai,jE(qj)f_{align}(p_i) = \sum_j a_{i, j} E(q_j)falign(pi)=∑jai,jE(qj),其实就是将passage中的每个词作为query,然后在question上得到的一个attention特征。这里的E(qj)∈RdE(q_j) \in \R^dE(qj)∈Rd是question中词的embedding,ai,ja_{i, j}ai,j是词的权重,计算公式为:
ai,j=exp(MLP(E(pi))TMLP(E(qj)))∑j′exp(MLP(E(pi))TMLP(E(qj′)))a_{i, j} = \frac{exp(MLP(E(p_i))^TMLP(E(q_j)))}{\sum_{j'}exp(MLP(E(p_i))^TMLP(E(q_{j'})))}ai,j=∑j′exp(MLP(E(pi))TMLP(E(qj′)))exp(MLP(E(pi))TMLP(E(qj)))
这里的MLP(x)=max(0,WMLPx+bMLP)MLP(x) = max(0, W_{MLP}x + b_{MLP})MLP(x)=max(0,WMLPx+bMLP),就是一个加了ReLU的全连接层。
最终passage中每个词的表示,是前面这些特征的拼接:
p~i=(femb(pi),ftoken(pi),fexact_match(pi),falign(pi))∈Rd~\tilde p_i = (f_{emb}(p_i), f_{token}(p_i), f_{exact\_match}(p_i), f_{align}(p_i)) \in \R^{\tilde d}p~i=(femb(pi),ftoken(pi),fexact_match(pi),falign(pi))∈Rd~
- 然后是右侧上半部分的prediction部分
这里其实就是二分类,分别预测每个词是start及end的概率:
pstart(i)=exp(piW(start)q)∑i′exp(pi′W(start)q)p^{start}(i) = \frac{exp(p_i W^{(start)} q)}{\sum_{i'} exp(p_{i'} W^{(start)}q)}pstart(i)=∑i′exp(pi′W(start)q)exp(piW(start)q)
pend(i)=exp(piW(end)q)∑i′exp(pi′W(end)q)p^{end}(i) = \frac{exp(p_i W^{(end)} q)}{\sum_{i'} exp(p_{i'} W^{(end)}q)}pend(i)=∑i′exp(pi′W(end)q)exp(piW(end)q)
用双线性计算passage中每个词的表示与question向量的相似度。整个流程就可以理解为,先带着问题(的特征)去读文章,然后最后要回答的时候,再看着问题进行回答。
- 最后是训练和预测部分
损失函数,用的是二分类的交叉熵损失:
L=−∑logP(start)(astart)−∑logP(end)(aend)L = – \sum log P^{(start)} (a_{start}) – \sum log P^{(end)} (a_{end})L=−∑logP(start)(astart)−∑logP(end)(aend)
在预测阶段,选择满足i<=i′<=i+max_leni <= i' <= i + max\_leni<=i′<=i+max_len并且P(start)(i)∗P(end)(i′)P^{(start)}(i) * P ^ {(end)}(i')P(start)(i)∗P(end)(i′)最大的位置作为start和end的点。max_lenmax\_lenmax_len是一个控制答案长度的超参数。
当然这个SAR可以扩展到其他的RC场景,比如:
1)完形填空,这种的是预测词表中的概率,需要一个编码后的向量。对于前面得到的question的编码向量qqq,可作为query,去对前面得到的passage中每个词的表征pip_ipi计算attention,并得到一个最终的向量,如下:
αi=exp(piWq)∑i′exp(pi′Wq)\alpha_i = \frac{exp(p_i W q)}{\sum_{i'} exp(p_{i'} W q)}αi=∑i′exp(pi′Wq)exp(piWq)
o=∑iαipio = \sum_i \alpha_i p_io=i∑αipi
然后用这个最终输出的向量,去预测缺失词的概率:
P(Y=e∣p,q)=exp(We(a)o)∑e′∈ϵexp(We′(a)o)P(Y = e | p, q) = \frac{exp(W_e^{(a)} o)}{\sum_{e' \in \epsilon} exp(W_{e'}^{(a)} o)}P(Y=e∣p,q)=∑e′∈ϵexp(We′(a)o)exp(We(a)o)
后面就可以用熟悉的交叉熵损失进行学习了。
2)多选题,这种是预测每个答案的概率。用第三个BiLSTM对每个answer进行编码,仿照question的那个编码方式,得到aia_iai向量。然后用前面完形填空任务的方法得到 ooo 向量,将这两者用一个双线性函数计算相似度:
P(Y=i∣p,q)=exp(aiW(a)o)∑i′=1,…,kexp(ai′W(a)o)P(Y = i | p, q) = \frac{exp(a_i W^{(a)} o)}{\sum_{i' = 1, …, k} exp(a_{i'} W^{(a)} o)}P(Y=i∣p,q)=∑i′=1,...,kexp(ai′W(a)o)exp(aiW(a)o)
然后也是用交叉熵进行分类学习即可。
3)自然语言回答,这种就是生成模型了。一种简单的处理方式就还是像完形填空任务中一样,先生成最终的表示ooo,而后接一个decoder,进行答案的生成:
p(a∣p,q)=P(a∣o)=∏j=1lap(aj∣a<j,o)p(a | p, q) = P(a | o) = \prod_{j=1}^{l_a} p(a_j | a_{<j}, o)p(a∣p,q)=P(a∣o)=j=1∏lap(aj∣a<j,o)
学习的损失为:
L=−logP(a∣p,q)=−log∑j=1lap(aj∣a<j,o)L = -log P(a | p, q) = -log \sum_{j=1}^{l_a} p(a_j | a_{<j}, o)L=−logP(a∣p,q)=−logj=1∑lap(aj∣a<j,o)
就是典型的seq2seq模型。当然也可以借鉴CopyNet的思路,从passage和question里面copy一部分词用于回答,这样可以减小答案的搜索空间。
3.3 SAR实验
作者主要是在CNN\DAILY MAIL和SQuAD数据集上进行评估,前者是完形填空任务,后者是抽取式问答任务。这俩数据集的统计信息为:
在模型的具体实现上,作者强调了几点:1)多层的BiLSTM模型在训练时,每层都是先拼接左右的表征,然后再送入到下一层,而不是像ELMo那样分开单独训练;2)dropout在使用的时候,对于LSTM里面的单元,在每个时间步上都使用同样的dropout mask;3)embedding在训练的时候,用预训练好的,对于小数据集可以固定不动,对于大数据集可以打开finetune,或者都只finetune高频的那些。
CNN\DAILY MAIL数据集的结果如下:
这里比较有意思的是,同样的模型,跑5个不同的初始化版本的,直接ensemble在一起,效果就能很好,与笔者之前的经验也非常一致。
SQuAD数据集的结果如下:
这些对比的model,这里就不一一赘述了(其实主要也是论文里面介绍的比较少,笔者也没有完全理解),感兴趣的读者可以去看论文3.3.3节的介绍,或者直接refer相关的论文。
其他的一些对比实验,比如对于passage的输入特征的ablation study:
通过进一步的分析,作者发现深度学习模型在识别词汇匹配和释义上要比传统模型强很多,但在需要更多推理的问题上还是较弱。
3.4 模型各个模块可以改进的点
- 首先是词表征上:这部分近期的研究比较多,比如各种pretrain模型,如ELMo、BERT等,还可以用char embedding(主要是结合multi-scale的CNN进行encode)。
- 接着是attention上:可以用双向的attention,比如前面SAR里面在passage的输入时,加入了与question的对齐关系,同样在question的输入时,也可以用同样的公式,去加入与passage中各个词的对应关系;或者可以在passage上利用self-attention:
ai,j=exp(gMLP(pi,pj))∑j′exp(gMLP(pi,pj′))a_{i, j} = \frac{exp(g_{MLP}(p_i, p_j))}{\sum_{j'}exp(g_{MLP}(p_i, p_{j'}))}ai,j=∑j′exp(gMLP(pi,pj′))exp(gMLP(pi,pj))
ci=∑jai,jpjc_i = \sum_j a_{i, j} p_jci=j∑ai,jpj
将这个self-attention的向量与BiLSTM的输入进行拼接hi(p)=BiLSTM(hi−1(p),[pi,ci])h_i^{(p)} = BiLSTM(h_{i-1}^{(p)}, [p_i, c_i])hi(p)=BiLSTM(hi−1(p),[pi,ci])后作为最终的表示。
- LSTM的替换:可以用transformer啊,QANet(多conv层+self-attention+fc),SRU等对LSTM进行替换。
- 训练目标:比如span预测的任务,直接用交叉熵与真实的目标相差较远,这时就可以用一些强化学习的策略,来将最终评测用的F1作为reward进行训练。对于自然语言回答的任务,就可以用一些sentence-level的损失函数进行训练。
- 数据增强:比如用backtranslation,先翻译过去,再翻译回来,生成伪数据。
下面是一些感性的结果认识:
并不一定可比,只看相对变化就好。
Chapter 4
这一章主要是讲了些RC的后续发展,主要从数据集和模型两大块入手。
作者分析了一些badcase,然后发现对于SQuAD这个数据集来说,尽管大家的分数都已经刷的很高了,甚至超越了人类。但模型仅仅还是停留在一些表面的文本信息上,并且在需要对文章进行深入理解的时候,就会犯低级错误,甚至在文章最后加上一句完全不会迷惑人类,但与问题重复度较高的误导句子,都会严重削弱模型的效果。而且SQuAD这个数据集的任务相对来说比较简单,推理问题的占比很少很少。所以后面要探索更具挑战性的数据集,以及更有效的模型。
4.1 数据集
SQuAD数据集的局限在哪里?
1)问题与文章的词重复度较高,无形降低了难度
2)问题的答案一定只是一个单独的span,并且是可回答的,事实类的短回答很多,how和why的问题较少
3)大部分都不需要推理,只有13.6%是需要推理的,这其中还有一些是用共指消解系统可以解决的
针对这些问题,又衍生出了很多的数据集:
- TriviaQA:先收集QA对,然后再检索相关的文章去构建,优点是解决了问题对文章的依赖,缺点就是可能不一定包含答案。
- RACE:多选题数据集,都是学生的题目,26%的数据需要进行推理。
- NarrativeQA:是基于wikipedia里面书或者是电影的摘要进行提问,内容比较复杂多样。
- SQuAD2.0:包含了一些不可回答的负样本,但与正样本很相似。
- HotpotQA:需要基于更多文章进行回答。
4.2 模型
不考虑模型结构,模型的一些必要考虑的东西还包括:
1)速度和可扩展性。要build在训练和预测时速度都很快的模型,以及能扩展到长文档的上下文中。可用的方法包括:将LSTM替换为transformer或SRU等;跳着读文档;硬件加速等。
2)鲁棒性。目前的模型都仅适用于各自的域中,可以改进的点包括:加入一些对抗样本;迁移学习或多任务学习等。
3)可解释性。要给出你回答这个问题的依据,可用的方法有:让模型学习如何抽取支撑观点;学习生成依据,不仅仅是抽取,还要表示它们之间的联系等;收集人类在做阅读理解时的解释依据等。
一些模型上可有的发展:
1)加入更多的linguistic feature,但要面临是一起train,还是用tool的问题,后者就需要考虑tool的质量。
2)分模块解决:将问题进行步骤拆分,用module的思想去处理,比如“What is the population of the second largest city in California”,就可以先拆解初second largest city,然后解决population。
4.3 未来研究点
1)如何衡量进展?在一个数据集上刷分,真的能代表RC的实际水平吗?首先要与人类评估阅读理解能力的方式对齐,然后还要在多个数据集上一起评估。总的来说,就是要首先区分出不同问题的难度,然后理解数据集需要什么,最后要知道我们现有的系统能做什么,不能做什么。
2)表征和结构,哪一个更重要?随着近期BERT、ELMo等的大规模进展,表征学习也为RC任务带来了新一轮的高潮,但到底是探索这种无监督的表征呢?还是继续去研究更有效的模型呢?其实最好的方式,就是两者结合,先用无监督进行pretriain,然后加上一个精细设计的模型,进行finetune。
3)需要多少数据量?更多的数据肯定会更好,但很难弄,所以也要探索迁移学习和无监督学习的潜力。
Chapter 5
从这一章开始就进入到了RC的应用阶段。
这一章主要是关于开放域QA的内容。作者在这里研究的主要是基于Wikipedia进行问答的系统,就像人类遇到问题时搜索Wikipedia一样,他们的系统称为DRQA。
5.1 DRQA
这里只研究基于Wikipedia纯文本的,目的是凸显RC的作用,当然加上其他的知识源或者信息之后,效果肯定会有所提升。而且作者希望构建的是通用领域的事实类问答。
DRQA的整体其实还是pipeline式的,长下面这样:
主要包含两部分:1)文档检索模块(Document Retriever),主要用来寻找相关的文章;2)阅读理解模块(Document Reader),用于从上一步得到的相关文档中(可能是一篇或多篇),提取出最终的答案。下面一个一个来看:
- Document Retriever:文档检索,可以用倒排文档、ElasticSearch、n-gram特征进行搜索,每次返回Top-5的Wikipedia文章。
- Document Reader:这部分就是利用前面的SAR,阅读每篇文章中的每个段落,得到一个最有可能的span,而后从这些span里面取得分最高的作为最终的答案。
在定义完pipeline之后,要如何训练呢?简单来说,仍然可以用之前的SQuAD作为训练数据,但其与真实的场景和分布有很大不同,比如SQuAD的问题普遍都是提问者在看完了文章之后,进行提出的,但实际中是带着问题去找文章,文章不是固定的,问题也不完全依赖于文章提出,而且SQuAD的数据集很小(只有80k样本)。
所以作者提出了一种自动获取数据的方法:在拿到了qa数据之后,检索模块可以找到与问题q相关的文章,同时也能找到包含答案a的。那么就将这个 (p,q,a)(p,q,a)(p,q,a) 作为数据:
f:(q,a)=>(p,q,a)f: (q, a) => (p, q, a)f:(q,a)=>(p,q,a)
ifp∈Document_Retriever(q)andaappearsinpif\ p\ \in \ Document\_Retriever(q)\ and\ a\ appears\ in\ pif p ∈ Document_Retriever(q) and a appears in p
他们称这种方式为distant supervision。
5.2 DRQA实验
作者选用了如下的数据集进行训练和评估:
- TREC:好像是一个评测的数据集
- WebQuestions:先从Google Suggest上抓一堆问题,然后找AMT来标
- WikiMovies:关于电影的
这些数据集里面,TREC是主要基于文本问答的,而WebQuestions和WikiMovies是基于知识库的(后面作者将其改造为基于文本的问题,实际是有些提高难度的),把这些放到一起进行评测,可以验证QA的general特性。
下面来看这些数据集的一些统计结果:
这里面的DS表示的是用distant supervision进行扩充后的结果。
下面来看下Document Retriever的表现:
这里面的值表示的是百分之多少的问题的答案,出现在了返回的Top-5的文章里面。
最后来看DRQA整体的表现:
这里的:
- SQuAD方法:只在SQuAD上训练的单模型,用于所有的评测集。
- Fine-tune(DS)方法:先在SQuAD上进行pretrain,然后在每个任务上进行独立finetune,并结合DS。
- Multitask(DS)方法:同时在SQuAD和所有评测集的DS数据集上进行训练。
后面的DRQA*是改进版本的,主要变化就是直接在所有的Wikipedia的文章上进行训练,而不是段落,因此整个文本长度是原来的40倍。
5.3 未来的工作
一些改进点(有些是已经实现了的):
- 从多文章中整合信息。前面的pipeline在最后有一个问题就是,各个文章之间的span分数是否是可比的?前面的DRQA*在所有的wikipdia文章上训练就可以解决这个问题,但会很慢。后面还有提出rerank的思路。
- 使用更多更好的数据。DS的一个问题就是会引入噪声,要考虑如何去噪。或者也可以加入一些对抗负样本。
- 让Retriever可训练。联合训练Retriever和Reader,形成一个end2end的可能会有较好的帮助。
- 采用更好的Reader模型。
- 需要更多分析bad case啊之类的。
Chapter 6
这一章主要讲的是对话中的QA,其实感觉还不太像我们正常过程中的对话,就还是基于一篇文章,然后下面的人基于这篇文章,循环的问问题和回答,与前面的基本RC任务不一样的地方在于,这里可能会有较多要考虑对话上下文的地方。作者将他们的这个东西称为CoQA(Conversational Question Answering),主要是想要是实现question和answer的自然性,并且也能在多个域之间更鲁棒。
6.1 CoQA任务定义
给定一篇文章PPP,以及多轮对话(Qi,Ai,Ri),i=1,…,n(Q_i, A_i, R_i), i=1,…,n(Qi,Ai,Ri),i=1,...,n,目的就是基于PPP和Q1,A1,…,Qi−1,Ai−1Q_1, A_1,…,Q_{i-1},A_{i-1}Q1,A1,...,Qi−1,Ai−1,来回答下一个问题QiQ_iQi,同时也会提供原因RiR_iRi,用来帮助训练模型,但在预测阶段不会有。
比如数据集可以是下面这样:
6.2 CoQA数据集
这样的数据当然也是要找人标啦,questioner和answerer都有好多限制条件,比如question不能跟passage重复太多啊,answer的用词不能偏离passage太多啊之类的,而且还要给出reason,以及测试集还要给出多个答案,估计标起来也挺贵的。
一些CoQA的统计信息:
下面是一些CoQA数据集与SQuAD2.0的比较:
这个是trigram的分布,基本能看出SQuAD的一半都是what类的问题,CoQA的问题种类比较多一些。
还有长度及答案类型分布:
最后是CoQA的问题信息:
6.3 CoQA模型
模型可以是对话模型(生成类),也可以是阅读理解模型。
- 对话模型
用的是seq2seq模型,加上copy机制,encode的时候是用的passage和所有对话历史。他们称这个模型为PGNET(Pointer-Generator network),长下面这样:
这里其实就是用一个pgenp_{gen}pgen来控制当前步是生成,还是copy。计算公式如下:
pgen=σ(w(c)Tc+w(x)Txt+w(h)Tht+b)p_{gen} = \sigma (w^{(c)^T} c + w^{(x)^T} x_t + w^{(h)^T} h_t + b)pgen=σ(w(c)Tc+w(x)Txt+w(h)Tht+b)
P(w)=pgenPvocab(w)+(1−pgen∑i:wi=wαi)P(w) = p_{gen} P_{vocab}(w) + (1 – p_{gen} \sum_{i: w_i = w} \alpha_i)P(w)=pgenPvocab(w)+(1−pgeni:wi=w∑αi)
- 阅读理解模型
要用SAR模型的话,得先构造span,因此从CoQA里面找到与answer重合度最高的span作为target进行训练。
- 联合模型
同时结合对话模型和阅读理解模型,先用SAR找到一堆span,然后用PGNET从这些span里面生成最终的答案。
在训练的时候,对于SAR来说,是直接用reasons作为问题的答案,PGNET用的是oracle span进行抽取答案?(这里没理解oracle span的含义,是原始的reason,还是SAR生成的伪span?有大神理解的话,求解答~)
6.4 CoQA实验
下面是实验结果:
基本还是hybrid的比较好。
下面是更细粒度的分类结果:
还有一些分析,比较有意思的是关于对话历史的依赖结果:
发现用all历史的效果反而比较差,可能是noise过多。
6.5 一些讨论
- 前面都是直接把对话历史进行拼接,其实还能有更好的方法。
- hybrid模型还是一种pipeline,当然也可以探索e2e的方法啦。
- reasons应该是能更好的被利用的。
Chapter 7
这一章是对论文内容做的一个总结,其实没什么可说的,因为笔者在前面也是做的总结。
传送门
论文:https://stacks.stanford.edu/file/druid:gd576xb1833/thesis-augmented.pdf
源码:https://github.com/danqi/rc-cnn-dailymail
https://github.com/facebookresearch/DrQA
https://github.com/stanfordnlp/coqa-baselines
https://paperswithcode.com/sota/question-answering-on-coqa